Progressive income tax calculator
Enter taxable income and your own bracket table to see the tax band by band: 50,000 under brackets of 10%, 12% and 22% owes 6,800, an effective rate of 13.6% with a 22% marginal rate. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Taxable income
- 50,000
- Tax owed
- 6,800
- After tax income
- 43,200
- Effective rate percent
- 13.6
- Marginal rate percent
- 22
Progressive income tax means each slice of taxable income is charged at its own marginal rate, so the bill is not simply top-rate times total income. This progressive income tax calculator accepts any non-negative taxable income and an ordered list of brackets you supply—upper thresholds and rate percentages—then walks the schedule band by band to return tax owed, after-tax income, effective rate, and the marginal rate that applies to the last dollar. Model a simple three-band schedule for teaching, paste a national or state table for planning sketches, or run the same contract in product code without hard-coding one jurisdiction.
How progressive brackets turn income into tax owed
Under a progressive schedule the first dollars of taxable income are taxed at the lowest published rate, the next slice at the next rate, and so on until income is fully allocated. This calculator starts with lower equal to zero and walks your ordered brackets.
For each band it takes the ceiling (the band upper, or infinity when the last band is open-ended or when income exceeds a final finite upper and the last rate is extended), multiplies the slice max of zero and min of income and ceiling minus lower by the band rate over one hundred, and accumulates that slice tax.
Worked example: taxable income fifty thousand with brackets upper ten thousand at ten percent, upper forty thousand at twelve percent, and upper one hundred thousand at twenty-two percent yields one thousand on the first ten thousand, three thousand six hundred on the next thirty thousand, and two thousand two hundred on the remaining ten thousand, for tax owed of six thousand eight hundred, an effective rate of thirteen point six percent, and a marginal rate of twenty-two percent.
Nothing here files a return, applies credits, or chooses a filing status; you supply already-taxable income and the rate schedule so planners and product teams share one transparent progressive walk.
Where a progressive income tax calculator earns its keep
Educators and exam writers need a deterministic progressive income tax calculator so students can check multi-bracket homework without spreadsheet drift on slice boundaries. Personal finance coaches and planning sites use the same walk to illustrate why a raise can move only the top dollars into a higher band while lower slices stay at prior rates. Product and fintech teams embed the contract in offer letters, compensation modelers, and scenario tools when the jurisdiction table is a parameter rather than a hard-coded constant.
What you can do with it
Sketch a raise or side income under progressive rates
Re-run the same brackets at two income levels to see how much of the increment is taxed at the new marginal rate versus prior bands.
FAQ
Do I enter gross pay or taxable income?
Enter taxable income after any deductions or exemptions you want applied. This tool does not compute standard deductions, credits, or filing-status adjustments.
What if my top bracket has no upper limit?
Omit upper (or set it null) only on the final bracket to declare an open-ended top rate. Income above all finite ceilings is taxed at that last rate.
What if income exceeds the last finite upper?
The last rate is extended above that ceiling so residual income is taxed rather than left at zero. Prefer an explicit open top when your schedule documents one.
Will a raise push all my income into a higher tax rate?
No. Only the part of income above a bracket's ceiling is taxed at the higher rate; the lower slices keep their rates. Run the same brackets at both income levels to see how the extra income is taxed.
What is the difference between the effective and the marginal rate?
The marginal rate applies to your last unit of income; the effective rate is total tax divided by taxable income. In the example the marginal rate is 22% but the effective rate is 13.6%, because the lower slices pay 10% and 12%.
Related tools
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/finance/income-tax-brackets \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"taxable_income":50000,"brackets":[{"upper":10000,"rate_percent":10},{"upper":40000,"rate_percent":12},{"upper":100000,"rate_percent":22}]}'const res = await fetch("https://api.kit.forhosting.com/finance/income-tax-brackets", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"taxable_income": 50000,
"brackets": [
{
"upper": 10000,
"rate_percent": 10
},
{
"upper": 40000,
"rate_percent": 12
},
{
"upper": 100000,
"rate_percent": 22
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/income-tax-brackets",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"taxable_income": 50000,
"brackets": [
{
"upper": 10000,
"rate_percent": 10
},
{
"upper": 40000,
"rate_percent": 12
},
{
"upper": 100000,
"rate_percent": 22
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/income-tax-brackets", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"taxable_income":50000,"brackets":[{"upper":10000,"rate_percent":10},{"upper":40000,"rate_percent":12},{"upper":100000,"rate_percent":22}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"taxable_income":50000,"brackets":[{"upper":10000,"rate_percent":10},{"upper":40000,"rate_percent":12},{"upper":100000,"rate_percent":22}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/income-tax-brackets", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"taxable_income": 50000,
"brackets": [
{
"upper": 10000,
"rate_percent": 10
},
{
"upper": 40000,
"rate_percent": 12
},
{
"upper": 100000,
"rate_percent": 22
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.income_tax_brackets",
"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. |
Technical notes
Use it free in the browser or call the API at $0.002 per successful request when automation needs the identical result shape.
How progressive brackets turn income into tax owed
The response also returns after-tax income, the normalized brackets, a bracket_breakdown array with lower, upper, rate, taxable_in_bracket, and tax_in_bracket per applied band, method progressive_income_tax_brackets, and a short formula string.
Input contract, open top rates, rounding, and errors
Finite uppers must be strictly positive and strictly increasing from left to right. Only the final bracket may omit upper or set it null to declare an open-ended top rate; non-final open uppers are rejected. If every bracket has a finite upper and income still exceeds the last ceiling, the last rate is extended above that ceiling so residual income is not silently untaxed. Optional precision defaults to two decimal places for currency-style display and may be set from zero to fifteen via precision, decimals, or dp. POST a JSON body with two required inputs. Taxable_income is non-negative finite currency units after deductions you already applied; aliases include income, amount, taxable, and earnings. Brackets is a non-empty ordered array of at most forty objects, each with rate_percent from zero through one hundred and an optional upper; aliases for the array include tax_brackets, rates, and schedule. Missing taxable_income or brackets, empty arrays, negative income, rates outside zero through one hundred, non-increasing uppers, and open uppers on non-final bands fail with invalid_input and are not billed. Successful responses echo rounded taxable_income, tax_owed, after_tax_income, effective_rate_percent, marginal_rate_percent, brackets, bracket_breakdown, bracket_count, method, formula, and precision.
Where a progressive income tax calculator earns its keep
Pair the free interactive page for exploration with the priced endpoint for pipelines, keep brackets ordered from lowest upper to highest, supply already-taxable income rather than gross pay if deductions matter, and treat the output as a transparent arithmetic estimate—not legal tax advice and not a substitute for official tables or a return preparer.
Integration use cases
Check multi-bracket homework and exams
Enter taxable income and the textbook bracket table to verify tax owed, effective rate, and which bands received income in bracket_breakdown.
Parameterize jurisdiction schedules in product code
Pass user- or config-supplied brackets into the API so one progressive engine serves many regions without shipping a new hard-coded table per market.
Technical questions
How does the progressive income tax calculator work?
Provide taxable_income and ordered brackets with rate_percent and upper thresholds. The engine taxes each slice between lower and ceiling at that band’s rate, then returns tax_owed, after_tax_income, effective and marginal rates, and a per-band breakdown.
What does the progressive income tax calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.