Laffer Curve Tax Revenue Calculator
The Laffer curve tax revenue calculator turns a familiar economic idea into a transparent numerical scenario.
Run — free
Enter a starting tax base, a tax rate, and a behavioral elasticity to estimate revenue after the tax base responds to the rate. The result shows revenue at your selected rate, the model’s revenue-maximizing rate, the maximum modeled revenue, and a series of points that makes the curve’s rise and fall easy to inspect. It is designed for teaching, sensitivity analysis, and clearly stated hypothetical comparisons rather than real-world revenue forecasting.
Define a transparent tax-revenue scenario
The calculator uses the deliberately simple equation R = B × t × (1 − t)<sup>e</sup>. In that expression, B is the tax base before behavioral adjustment, t is the tax rate written as a decimal, and e is the behavioral elasticity parameter. The first two factors describe the mechanical revenue calculation: a larger base or rate initially raises collections. The final factor reduces the available base as the rate increases, standing in for changes such as less taxable activity, greater use of deductions, shifting between activities, or avoidance. Enter the tax base in any currency unit, provided you interpret every monetary result in that same unit. Enter the rate as a percentage between zero and one hundred. Because the model is stylized, its inputs should be labeled as assumptions whenever results are shared. A tax base of one million does not mean the calculator has measured an economy; it means the scenario begins from one million units of taxable activity before the assumed response. This separation keeps the arithmetic reproducible and makes competing assumptions straightforward to compare.
Understand why revenue peaks and then falls
At a zero tax rate, revenue is zero because no fraction of the base is collected. At a one-hundred-percent rate, this model also produces zero because the behavioral term reduces the taxable base to zero. Between those endpoints, revenue first rises as the government collects a larger share, reaches a maximum, and then falls as the modeled contraction of the base outweighs the higher statutory rate. For this equation, the peak is not guessed from the plotting samples: it is calculated analytically as t* = 1 / (e + 1). An elasticity of one places the peak at fifty percent, while a larger elasticity moves it lower because taxable activity is assumed to respond more strongly. The reported position tells you whether the selected rate lies below or above that peak, and revenue versus peak expresses the selected result as a percentage of the theoretical maximum. The sampled curve is for visualization and explanation; changing the number of points makes a chart smoother but does not change the exact peak calculation or the revenue evaluated at your chosen rate.
Interpret results without turning the model into a forecast
Use the output as a sensitivity exercise, not as a policy prescription. Real tax systems contain multiple rates, thresholds, deductions, enforcement rules, timing effects, interactions with other taxes, and behavioral responses that differ across people and activities. A single elasticity compresses all of those mechanisms into one assumption, so a precise-looking peak is only precise within the stated equation. A useful workflow is to hold the starting tax base constant, run several plausible elasticity values, and observe how both the peak rate and peak revenue move. You can also compare several proposed rates under the same elasticity, recording the estimated retained base and revenue for each scenario. If empirical evidence supports a different response function, use a model fitted to that evidence instead of treating this curve as universal. When presenting the result, include the formula, tax-base assumption, elasticity, selected rate, and currency scale. The capability is deterministic: identical inputs return identical results, which is valuable for classroom demonstrations, reproducible reports, automated scenario tables, and tests of downstream charting code. API use costs $0.002 per request, while the browser version can run locally.
What you can do with it
Teach the Laffer curve
Show students how a mechanical rate effect and a shrinking modeled tax base combine to create an interior revenue maximum.
Compare behavioral assumptions
Run several elasticity values to see how stronger or weaker responses change the peak tax rate and maximum revenue.
Build a reproducible chart
Generate evenly spaced curve points for a dashboard, lesson, report, or automated economics demonstration.
FAQ
What formula does the calculator use?
It uses R = B × t × (1 − t)^e, where B is the initial tax base, t is the tax rate as a decimal, and e is the positive behavioral elasticity parameter.
How is the peak tax rate calculated?
For this specific equation, differentiating revenue with respect to the rate gives an exact peak at t = 1 / (e + 1). It is not estimated from the sampled chart points.
What does behavioral elasticity mean here?
It controls how quickly the modeled taxable base contracts as the tax rate rises. A larger value represents a stronger response and moves the revenue peak to a lower rate.
Can this predict government revenue?
No. It is a simplified scenario model and omits the institutional, distributional, dynamic, and empirical detail required for a real revenue forecast.
Why is revenue zero at a 100 percent rate?
The chosen response function makes the retained tax base equal zero at that endpoint. This is a property of the model, not a claim that every real tax base would literally disappear.
What does it cost?
The capability is free to run in the browser. API execution costs $0.002 per request.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/econ/laffer-curve-revenue \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"tax_base":1000000,"tax_rate_percent":40,"behavioral_elasticity":1.5}'const res = await fetch("https://api.kit.forhosting.com/econ/laffer-curve-revenue", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"tax_base": 1000000,
"tax_rate_percent": 40,
"behavioral_elasticity": 1.5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/econ/laffer-curve-revenue",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"tax_base": 1000000,
"tax_rate_percent": 40,
"behavioral_elasticity": 1.5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/econ/laffer-curve-revenue", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"tax_base":1000000,"tax_rate_percent":40,"behavioral_elasticity":1.5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"tax_base":1000000,"tax_rate_percent":40,"behavioral_elasticity":1.5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/econ/laffer-curve-revenue", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"tax_base": 1000000,
"tax_rate_percent": 40,
"behavioral_elasticity": 1.5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "econ.laffer_curve_revenue",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |