DEV Community

DDMarketer
DDMarketer

Posted on

I open-sourced 2026 US tax bracket data (all 50 states, corrected MO/MS/OH schedules) and built a free API + MCP server on top

Every payroll side project, moving-cost calculator, and "what does $100k actually buy" app needs the same input: 2026 tax brackets for federal plus all 50 states. And most of them either hardcode numbers from a blog post or scrape a table that someone else scraped in 2024. I got tired of that, so I cleaned up the dataset behind my own site (kultranz.com, full disclosure, I build it), fixed three state schedules that were quietly wrong, and released the whole thing as CC BY 4.0 data plus a no-signup API and a Streamable HTTP MCP server.

Why 2026 made this messy

The federal layer finally settled. OBBBA made the TCJA rate structure permanent instead of expiring, and IRS Rev. Proc. 2025-32 published the 2026 inflation adjustments, so federal is just seven brackets, a $16,100 single standard deduction ($32,200 married filing jointly), and FICA with a $184,500 Social Security wage base. Boring and stable, which is good.

The states are where it falls apart. A lot of "2026" tables floating around are 2025 schedules with the year bumped, because state legislatures keep changing things late in the year. My own first cut had three states wrong, and I shipped the correction yesterday:

  • Missouri is not a flat 2% state. The real 2026 schedule is graduated: 0% on the first $1,348 of taxable income, then 2.0, 2.5, 3.0, 3.5, 4.0 and 4.5% steps, topping out at 4.7% above $9,436.
  • Mississippi's H.B. 1 exempts the first $10,000. It is 4% above that, not 4% from dollar zero.
  • Ohio's H.B. 96 applies 2.75% only to nonbusiness income over $26,050. Below that, zero.

If you consumed any US tax table published before October 2026, those three states are the ones to re-check. The fix moved the flat-state count from 16 down to 13 and grew the long-format CSV from 311 to 329 rows, which tells you these were not cosmetic edits.

At $75k single the differences are real money, not rounding. Missouri computes to $2,588 of state tax on that salary, Mississippi $2,508, Ohio $1,346. A flat-from-zero model gets all three wrong in different directions.

What is in the dataset

  • 51 jurisdictions: all 50 states plus DC
  • single and married filing jointly everywhere
  • every state typed as none (9 states), flat (13), or progressive (28 states plus DC)
  • 329 state bracket rows in long-format CSV, plus 14 federal rows with the standard deduction and FICA parameters on every row
  • a canonical JSON file (data/tax_2026.json) that the CSVs are derived from, value for value
  • CC BY 4.0, commercial use included, attribution is the only requirement

Grab it wherever is convenient:

There is a sibling dataset for the other half of take-home comparisons, the US metro cost-of-living index (BEA RPP plus median rent, home value, income for 50 metros), same license.

The API, no key required

If you would rather not ship a tax engine, the same data backs a hosted API. The free tier needs no signup and no key, 25 requests a day:

curl "https://api.kultranz.com/paycheck?salary=75000&state=MO&filingStatus=single"
Enter fullscreen mode Exit fullscreen mode
{
  "data": {
    "gross": 75000,
    "taxable_income": 58900,
    "federal_tax": 7670,
    "social_security": 4650,
    "medicare": 1087.5,
    "state_tax": 2587.67,
    "total_tax": 15995.17,
    "net": 59004.83,
    "effective_rate": 21.33
  }
}
Enter fullscreen mode Exit fullscreen mode

That output is a live response, not an illustration. In Python it is one call to compare states:

import requests

STATES = ["TX", "FL", "OH", "MS", "MO", "NY", "CA"]

for state in STATES:
    r = requests.get(
        "https://api.kultranz.com/paycheck",
        params={"salary": 75000, "state": state, "filingStatus": "single"},
        timeout=10,
    )
    d = r.json()["data"]
    print(f"{state}: net ${d['net']:,.0f}  (state tax ${d['state_tax']:,.0f})")
Enter fullscreen mode Exit fullscreen mode

Run it and you see the point of clean schedules: the nine no-wage-tax states all net $61,592 at $75k, while Missouri nets $59,005 and New York and California land in the mid $56ks. Same salary, $5k of spread, all of it schedule math.

Other endpoints cover cost-of-living equivalence between two metros, the 50-metro RPP table, salary percentiles by job and city, and small finance utilities. Full list on the API docs page.

MCP server

The same engine is exposed as an MCP server over Streamable HTTP, no auth:

claude mcp add --transport http kultranz https://api.kultranz.com/mcp
Enter fullscreen mode Exit fullscreen mode

Or in any generic client config:

{
  "mcpServers": {
    "kultranz": { "url": "https://api.kultranz.com/mcp" }
  }
}
Enter fullscreen mode Exit fullscreen mode

It is stateless, plain JSON-RPC 2.0 over POST works from curl. The MCP tier is metered separately from REST at 200 tool calls a day per IP. If you want the code instead of the endpoint, kultranz-mcp is MIT.

Pricing, stated plainly

  • Free: 25 REST requests a day, no key, no card. The samples above run on it.
  • $5 lifetime Data Pass: no daily cap. It is a one-time payment honestly positioned for the first 500 buyers, after which it becomes $5 a month, so the early adopters get the permanent deal.
  • RapidAPI tiers: $10 a month for 100k requests, then $49 and $199 tiers, if you prefer marketplace billing.
  • The dataset itself stays CC BY 4.0 forever. The paid product is the compute and the maintenance, not the data.

And for the money people rather than the builder people: the same engine generates a one-page Salary Negotiation Brief (your percentile, the local pay ladder, a counter-offer script, after-tax math) for $19 at kultranz.com/negotiation-brief, if you are negotiating a raise this cycle instead of reading tax CSVs.

Caveats, so nobody gets burned

The dataset is an estimate, not tax advice. It excludes local income taxes (NYC, Philadelphia), credits, and itemized deductions. Washington and New Hampshire are modeled as no tax on wage income, which is what they are. Ten states where the MFJ standard deduction was not explicitly published carry a 2x single approximation, and that is flagged in the README. Everything is sourced from IRS Rev. Proc. 2025-32, the SSA 2026 wage base announcement, and state revenue department tables via the Tax Foundation, with the full method on the methodology page.

If your state's DOR disagrees with a number in the JSON, that is exactly the issue I want. Corrections land in the canonical file, the CSVs regenerate from it, and the API picks them up on the next deploy. The MO/MS/OH fix is how that loop is supposed to work: someone checked, the fix shipped, every consumer of the data got it in one place.

Top comments (2)

Collapse
 
ddmarketer profile image
DDMarketer •

Pinning the direct API links for anyone who wants the numbers without wrangling CSVs (free tier: no key, no signup, 25 requests/day):

The canonical JSON and derived CSVs are in the repos linked in the post if you would rather self-host the math. If a state's DOR disagrees with a number, that correction loop is exactly what the comments are for.

Collapse
 
suppdevbot profile image
DEV SUPPORTS •

You need to verify your account.

Enter fullscreen mode Exit fullscreen mode

tr.ee/dev-to