ForHosting KIT · Finance & money

Tax bracket calculator

With 50,000 of taxable income and a table that taxes 10%, 12% and then 22%, you are in the 22% bracket yet owe 6,800, an effective rate of 13.6%. Paste the table for your filing status and read your band. Free in your browser.

  • Free
  • Runs in your browser
  • No sign-up
  • Your data stays on your device
Use it from WebAPIEmailTelegramApp soon
If you enter
Income
50,000
Filing status
Single
You get
Tax
6,800
Marginal rate percent
22
Effective rate percent
13.6
Bracket number
3

A tax bracket is the slice of a progressive rate schedule that contains the last dollar of taxable income, not a flat percent charged on every dollar you earn. People who search for a tax bracket calculator, or who ask which tax bracket they are in, need three inputs together: taxable income, a filing status, and the table that belongs to that status. This calculator walks the table from the bottom, stacks the tax on each slice, names the band that actually holds the last dollar, and returns the marginal rate plus the tax owed. Zero income is valid and lands in the first band with zero tax.

How tax brackets stack, and why filing status matters

A progressive income-tax schedule is a staircase, not a single percent. Each step has an upper bound and a statutory rate that applies only to dollars that sit inside that step. A filer with fifty thousand dollars of taxable income against a table that taxes the first ten thousand at ten percent, the next thirty thousand at twelve percent, and the remainder at twenty-two percent is in the twenty-two percent bracket, but they still pay ten percent on the first slice and twelve percent on the second.

Filing status matters because the same jurisdiction almost always publishes a different staircase for single, married filing jointly, married filing separately, head of household, and qualifying surviving spouse. This calculator does not freeze one year's IRS table. You send the table that matches the status you also send, together with taxable income, and the engine names the band, stacks the tax, and reports the marginal rate.

Zero taxable income is valid and lands in the first listed band with tax zero.

Where a tax bracket calculator earns its keep

Households that just want to know which tax bracket they are in can paste this year's published slices for their filing status and read the band, the last-dollar rate, and the tax owed without opening a full return. Compensation and payroll teams that already know taxable wages can see whether a bonus would push the last dollar into the next band, then layer withholding, FICA, and credits in their own engine.

Exam-prep generators and consumer-math classrooms use the same contract so a student who multiplies the whole income by the top percent is marked wrong, because progressive tax is stacked, not flat, and the current bracket is the last slice touched, not the whole staircase.

This landing targets people searching for a tax bracket calculator, which tax bracket they are in, or the marginal rate from a table and a filing status; it is not a sales-tax tool, not a named-state statute, not a full 1040 estimator, and not a credit optimizer. Prefer this capability when you already have taxable income, a filing status, and a schedule of rates and want the band identified.

Which tax bracket from this year's table

Households paste taxable income, filing status, and the published slices to see the current band, last-dollar rate, and stacked tax owed before credits.

Bonus and filing-status what-ifs

Send the same table twice with a higher income, or two tables for two filing statuses, and compare whether the last dollar crossed into the next bracket.

How do I know which tax bracket I am in?

The calculator walks your filing-status table from the bottom and names the slice that contains the last dollar of taxable income. That slice is the current bracket: its rate is the marginal rate, and the stacked tax on every slice is the tax owed.

What is the difference between the marginal rate and the effective rate?

The marginal rate is the statutory percent on the last dollar, which is the current tax bracket. The effective rate is tax owed divided by taxable income, so it is always lower than the top slice on a progressive table when income is positive.

Why is filing status required if I already send a table?

Jurisdictions publish a different staircase for each filing status. The field records which staircase you applied, is validated against a closed list, and is echoed so a client can label the band as single, joint, separate, head of household, or qualifying surviving spouse.

What happens if income is negative?

A tax bracket is computed from taxable income, so a negative amount is never turned into a refund. Failed validation is not billed.

What does the tax bracket calculator cost?

The browser tool is free and runs locally.

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.

POSThttps://api.kit.forhosting.com/fin/tax-bracket

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.

curl -X POST https://api.kit.forhosting.com/fin/tax-bracket \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"income":50000,"filing_status":"single","brackets":[{"up_to":10000,"rate":10},{"up_to":40000,"rate":12},{"up_to":85000,"rate":22},{"rate":24}]}'
{
  "income": 50000,
  "filing_status": "single",
  "brackets": [
    {
      "up_to": 10000,
      "rate": 10
    },
    {
      "up_to": 40000,
      "rate": 12
    },
    {
      "up_to": 85000,
      "rate": 22
    },
    {
      "rate": 24
    }
  ]
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "fin.tax_bracket",
  "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.

Per request$0.002

Published price — no tokens, no invented credits. A failed task is never charged.

max_abs1000000000000
max_items50
HTTPCodeMeaning
401unauthorizedMissing or invalid API key.
402insufficient_balanceYour balance doesn't cover the task price.
404unknown_typeThat task type doesn't exist.
429rate_limitedToo many requests. Use the webhook instead of polling.

Negative taxable income is rejected with invalid_input instead of a fake refund.

What a tax bracket is, how stacking works, and why filing status belongs in the request

The tax bracket that people search for is the step that contains the last dollar of taxable income: that is the marginal band, the rate that applies to the next dollar earned, and the number that headlines quote when they say someone is in the twenty-two percent bracket. It is not the average rate on the whole return. Negative taxable income is not a bracket: it is rejected with invalid_input rather than a negative tax that would look like a refund.

Input contract, response shape, and error behaviour

Failed validation is never charged. Send a JSON body with three required fields: income, filing_status, and brackets. income (aliases taxable_income, taxable, amount) is taxable annual income in currency units after deductions and before credits, not gross wages. It may arrive as a JSON number or as a numeric string that matches a strict finite pattern without dollar signs or thousands separators. Absolute value must stay within one trillion so the product remains finite in IEEE double precision on the Worker and in the browser. A negative income is the hard error this landing exists to enforce: invalid_input naming income, never a refund. Zero is allowed and yields tax zero, an effective rate of zero, and the first listed band. filing_status (aliases status, filing) must be one of single, married_filing_jointly, married_filing_separately, head_of_household, or qualifying_surviving_spouse; an unrecognized value is rejected. The status is echoed so a client can show which staircase was applied. brackets (aliases table, rates, schedule) is a non-empty list of at most fifty rows for that status. Each row needs rate (aliases percent, tax_rate) as a percent such as 22 for twenty-two percent, and may include up_to (aliases to, max, ceiling) as the slice ceiling. Omit up_to on the top open-ended bracket. Only the last row may omit up_to; duplicate ceilings are rejected. A negative row rate is also invalid_input. On success the response echoes income rounded to cents and filing_status, returns tax as two-decimal money, reports marginal_rate_percent on the last dollar, reports effective_rate_percent as tax divided by income or zero when income is zero, names the current band with bracket_number (one-based), bracket_from, optional bracket_up_to, bracket_rate_percent, bracket_count, and top_bracket, and restates the formula. Pricing is a flat $0.002 per successful request with unit item.

Where a tax bracket calculator earns its keep

Personal-finance apps and notebook scripts that need a deterministic tax-bracket oracle can pin fifty thousand dollars as a single filer against a known four-row table to a published band and tax, a one-hundred-thousand-dollar married-filing-jointly case to the open top band, and a deliberately negative income to the hard invalid_input path. If you need a frozen Franchise Tax Board table or a single state flat percent, use a named-state endpoint instead. Failed tasks that return invalid_input do not consume prepaid balance, which keeps exploratory scripts cheap when developers deliberately send a negative income. Round-trip checks are easy: recompute each slice by hand, confirm the published tax within two-decimal rounding, confirm that the last slice matches bracket_number, then confirm that tax divided by income matches effective_rate_percent at the published $0.002 automation rate.

Payroll estimates and golden tests

Compensation tools and QA suites pin known taxable incomes and statuses to a deterministic band and tax, and reject a negative income with invalid_input.

Read the full KIT documentation →