State tax docs / Calculation order
How the state tax engine computes a year of tax
Every step the engine takes, in the order it takes them, from the API request to the final tax. Each step names the code that performs it, the configuration and inputs it reads, the jurisdictions it applies to, and where its sources are. The state pages walk the same steps for one jurisdiction with its own figures (States). Engine version 1.5.0, tax year 2026.
This page is generated from the engine's calculation registry (research/data/state-tax-calc-registry.json). A build gate reads the engine
source and fails when a function, a marked step, a configuration field or an input the engine reads is not in the registry, when a step has
no source or is missing from this page or a state page, or when a line reference here is out of date.
The pipeline in brief
- Parse and check the request; map it onto the engine input (request handling).
- Pick the jurisdiction, the filing status's rate schedule and deduction (configuration).
- Form the income total the income tests use, nest the income subsets, attribute income to each spouse (income).
- Take out what the state excludes: military pay, public and employer pensions, Social Security, retirement income, conversions, gains (exclusions).
- Subtract the standard deduction, exemptions and age subtractions, and any federal-tax deduction (deductions, taxable income).
- Apply the rate schedule and the state's recapture, gains rates and minimum tax (tax).
- Subtract nonrefundable credits, floored at zero (credits).
- Add the county tax, capital-gains surcharge and surtax (after credits).
Request handling (API and library entry point)
Three stages: parse, evaluate, respond
The JSON body is parsed (type checks only), then evaluated (value checks, mapping onto the engine input, the engine call), then turned into the response. A typed caller can enter at the second stage with the same checks. A body that is not JSON returns 400 before any of this.
State code
state (or state_code) must be a non-empty string. A code longer than seven characters is read as unknown. The lookup is case-insensitive.
Filing status
filingStatus (or filing_status): absent or null means single; otherwise one of seven case-insensitive strings. A non-string or any other value is refused with 400. The response echoes the status as single, mfj, mfs or hoh.
The four original fields
ordinaryIncome, socialSecurity and capitalGains are optional numbers and age an optional whole number: absent or null means 0 (not given). Since engine 1.5.0 a value of the wrong type, or an age that is not a whole number, is refused with 400 naming the field, like the newer fields (the first release read a wrong type as 0 and truncated the age); an age outside 0 to 120 keeps its original message.
Optional amounts added in 1.1.0
wages, iraDistributions, pensionPrivate, pensionPublic, pensionMilitary, rothConversion, shortTermGains, socialSecurityGross, federalTax and federalNiit: absent or null means not supplied; anything but a number is refused with 400 naming the field. Snake-case spellings are accepted.
Social Security coverage of a public pension
pensionPublicSsCovered must be true or false; absent or null means unknown. Only false reaches the engine (as pension_public_not_ss_covered = 1).
Blindness and disability
blind and disabled (and spouse.blind, spouse.disabled) must be true or false; absent or null means false. They reach the engine per person: the top-level pair is the primary filer, the spouse pair the spouse on a joint return.
Spouse object
spouse must be an object whose keys are only age, wages, iraDistributions, pensionPrivate, pensionPublic, pensionMilitary, rothConversion, blind and disabled (or their snake-case forms). spouse.age must be a whole number from 1 to 120.
Value checks
In this order: state present, state known, the three original amounts not negative, age 0 to 120, every other amount finite, not negative and at most $100,000,000,000, socialSecurityGross at least socialSecurity when both are given, spouse only with mfj, spouse.age 1 to 120, then the spouse's amounts. The first failure is returned.
Amount limits
Each amount added in 1.1.0 must be finite, not negative, and at most $100,000,000,000.
Mapping the request onto the engine input
Other ordinary income = ordinaryIncome + wages + shortTermGains. Retirement distributions = IRA + private pension + public pension + military pay. Pension income = private + public pension. With a spouse object the person amounts are summed for the household and the spouse's own share is passed as the split. federalTax and federalNiit are unknown (no deduction) when absent. The federal-taxable-income inputs are always unknown on the API. An absent spouse.age means the primary filer's age.
Effective rate
effectiveRate = tax divided by the sum of every income amount supplied (both spouses' amounts included); 0 when that sum is 0.
Response document
The response carries the state, the tax, the effective rate, the input as read, the rules block, the breakdown, a note, the state's documentation link, the tax year and the engine version.
The rules block
rules reports the state's parameters for the request: Social Security rule, bracket count, standard deduction, personal exemption, senior subtraction, capital-gains treatment, the retirement exclusion, the military and wage rules and the local tax. Since engine 1.5.0 the scalar amounts are the ones the engine uses for the request's filing status (a head-of-household or separate schedule, deduction, exemption or exclusion cap where the state has one; an income-tiered exemption at the request's income total), before age additions, phase-outs and credits.
Amounts for the filing status
The schedule the filing status uses (its bracket count), its own standard deduction (head of household, separate), its personal exemption (head-of-household amount, or the income tier for the request), the senior subtraction and the retirement exclusion cap (the separate cap where the state sets one), as the calculation selects them.
The breakdown and perPerson blocks
breakdown is the engine's detail record summed over the household; perPerson (with a spouse object) is one entry per person, from the same record.
Error body
Every 400 has the body {"error": "<message>"}; the messages are listed verbatim on the API reference.
Configuration, filing status and entry points
Each jurisdiction's configuration
On first use the engine fills one configuration record per jurisdiction (rate schedules, deductions, exclusions, flags), each value cited beside it in the source. The record is read-only afterwards; every calculation reads from it.
Military and wage rules
Military retirement and earned-income rules are set per jurisdiction in a second pass over the same records.
Blindness, disability and the 1.5.0 additions
A third pass over the same records sets the engine 1.5.0 rules: blind amounts, disability routes, head-of-household amounts and the personal and senior credits the blind-and-disability survey found, each cited beside it.
Looking up a jurisdiction
A two-letter code (case-insensitive) or NONE selects a configuration. Initialisation runs once, thread-safely. NONE has no brackets, so its tax is always 0.
Entry points
compute_state_tax_detail() is the calculation; compute_state_tax_v4() calls it without a detail record. The older v3, v2 and compute_state_tax() pass the documented unknowns: no public-pension or pension split, no federal tax (so no Alabama or Oregon deduction) and no federal taxable income (so the component model).
Per-person mode joint returns with the spouse's age given
On a joint return with the spouse's age given, every age test the state applies per taxpayer is evaluated for each spouse at their own age. Without it one household age applies to both.
Blindness and disability, per person only when the caller says a person is blind or disabled
The filer is person one; the spouse counts only on a joint return and only when the caller says so (there is no household convention as for age). Where a state lets a disabled person (and, where it says so, a blind one, or one whose spouse is disabled) qualify for its general retirement exclusion before the age, that person is treated as having reached the age for that exclusion only. Of the 42 taxing jurisdictions, these have a blind amount: Arizona, Arkansas, California, Colorado, Delaware, the District of Columbia, Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana, Nebraska, New Jersey, New Mexico, North Dakota, Oklahoma, Oregon, Utah, Vermont and Virginia; these have none: Alabama, Connecticut, Georgia, Louisiana, New York, North Carolina, Ohio, Pennsylvania, Rhode Island, South Carolina, West Virginia and Wisconsin. A disability route is calculated in Arkansas, the District of Columbia, Georgia, Hawaii, Idaho, Iowa, Maryland, Michigan, New Jersey, Oregon and West Virginia.
Rate schedule and standard deduction by filing status
Single uses the single schedule and deduction; married filing jointly the joint ones. Head of household and married filing separately follow the two steps below.
Married filing separately
Where the state publishes its own separate schedule, that one (with half the joint deduction unless a separate deduction is set). Where one schedule applies to every status, that schedule unscaled with the single deduction. Otherwise the joint schedule with every threshold and the deduction halved (computed as the joint tax on twice the income, halved).
Head of household
The state's head-of-household schedule where it has one, else the single schedule; the head-of-household deduction where set, else the single deduction.
A separate deduction for married filing separately married filing separately
Where set, this amount replaces the deduction the schedule rule above gives married filing separately.
No broad income tax
A jurisdiction with no brackets returns 0 at once, except Washington's capital-gains excise below. Military pay is still attributed per person in the detail record.
Washington capital-gains excise
The excise rate on long-term gain above the excise deduction, plus the additional rate on gain above the high threshold. Nothing else is taxed.
Income normalisation and attribution
The income total every income test uses
Other ordinary income + retirement distributions (before any exclusion) + conversion + federally taxable Social Security + long-term gains. It stands in for federal adjusted gross income in every threshold, cliff and phase-out below; state subtractions do not reduce it.
Short-term gains exempt
Short-term gain (a part of other ordinary income) leaves the base; it stays in the income total above.
Nesting the income subsets
Public pension ⊆ pension income ⊆ retirement distributions; military pay ⊆ distributions and apart from pension income; wages ⊆ other ordinary income. Each subset is clamped into its parent, so an inconsistent input cannot exclude dollars that are not there.
Attributing income to each spouse joint returns with each spouse's own amounts given
With a caller's split (the API's spouse object), each spouse's own distributions, pension, public pension, conversion, wages and military pay; spouse 2's shares are clamped into the household totals and spouse 1 gets the rest. Without a split, in per-person mode, every item is divided 50/50. Social Security, other ordinary income and gains are always divided 50/50 where a rule needs a per-person amount. The split is used only where a state's rule is per taxpayer; household totals stay authoritative for the base and the income tests.
Keeping the per-spouse shares inside the household joint returns with each spouse's own amounts given
After the public-pension and employer-pension carve-outs, if the two spouses' remaining shares add up to more than the household's exclusion-eligible distributions (an inconsistent split), spouse 1's share is reduced so they do not.
Exclusions: military pay, pensions, Social Security, retirement income, conversions and gains
Military retirement pay
The state's military rule runs first, on military pay alone, per taxpayer: each spouse's own pay at their own age when attributed, otherwise half each at the household age on a joint return. Exempt dollars leave the base; the rest become pension dollars for the general retirement rules. Where the state lets a disabled retiree qualify at any age, a disabled person is treated as having reached the rule's age.
One taxpayer's military exemption
Exempt: all of it (below the age split, up to the younger cap). Capped: up to the cap for the age tier, plus the earned-income bonus below the age split when the taxpayer's own wages exceed the threshold, less the taxpayer's own Social Security where the rule says so. Percentage: the percentage (below the age split, up to the younger cap). Then the income limit: above it the exemption is lost, or phased out over the range where one is set.
One military cap per joint return joint returns
On a joint return the cap is one amount for the couple, over the pay of the spouses who pass the age test, reduced by the household's Social Security where the rule says so, then the income test.
Military exclusion reduces other caps
Where the statute says so, the military amount a taxpayer excluded reduces that taxpayer's general retirement-exclusion cap, their age-65 subtraction, or both.
Military pay barred from the general exclusion
Where a state's military rule leaves dollars taxable and bars them from the general retirement exclusion, they are added back to the base after the exclusions. No jurisdiction currently does this.
Non-covered public pension excluded in full only when the caller says the pension was not covered by Social Security
Only when the caller says the public pension was not covered by Social Security: the pension takes the uncapped public-pension exemption below (per taxpayer, without using the general retirement exclusion).
Public pension exemption
Public-pension dollars leave the base, uncapped or up to the per-taxpayer cap (each spouse's own public pension against their own cap when attributed), without using up the general exclusion the remaining distributions may claim. Capped-out public dollars stay taxable and cannot draw the private exclusion.
Public pension exemption reduced by the Social Security exemption
From age 62 the capped public-pension exemption is reduced by the federally taxable Social Security (per spouse, half each, in per-person mode).
Employer pension exemption
Employer (defined-benefit) pension dollars, public or private, leave the base; IRA dollars keep the capped exclusion.
Colorado: per spouse, own ages joint returns with the spouse's age given
Per spouse at their own ages (both ages known): each spouse's own distributions and half the Social Security through the subtraction below, at that spouse's age; the income test for ages 55 to 64 uses the joint income total. A conversion is taxed in full.
Colorado: per spouse, household age joint returns
Joint return without the spouse's age: still per spouse, each at the household age, with the distributions split by the caller's split or 50/50 and Social Security 50/50. A conversion is taxed in full.
Colorado: one filer
Otherwise (single, separate and head-of-household returns): one subtraction on the whole amount. A conversion is taxed in full.
Colorado Social Security and pension subtraction
65 or older: Social Security fully subtracted; pension and annuity income up to $24,000 less the Social Security subtracted. 55 to 64 with income at or below the threshold: the same with a $20,000 cap. 55 to 64 above it: one shared $20,000, Social Security first. Under 55: no subtraction.
Which Social Security threshold applies
Joint returns use the joint threshold; head of household uses it too where the state says so, otherwise the single one; married filing separately uses its own threshold where set, else the single one. Benefits are tested against the income total above.
Social Security exempt
None of the federally taxable benefit enters the base.
Social Security: exempt up to a threshold, then all
At or below the threshold nothing enters; above it the whole federally taxable amount does (a cliff).
Social Security: the federal amount
The federally taxable amount enters the base as it is.
Social Security: a share of gross benefits above a threshold
At or below the threshold nothing enters. Above it, 25% of gross benefits, capped at the federally taxable amount; without gross benefits the engine estimates them as the taxable amount divided by 0.85.
Social Security: stepped subtraction
At or below the threshold nothing enters. Above it, 10% of the benefit enters for each $4,000 of income over ($2,000 married filing separately), or part of one, up to all of it.
Social Security: ratable phase-out
At or below the threshold nothing enters. Above it the share entering rises in proportion over the next $10,000 of income, up to all of it.
Social Security: credit phase-out
The credit removes the tax on benefits at or below the threshold. Above it the credit falls by 2.5% per dollar over; the engine carries this as the taxed share of benefits rising by that rate divided by the tax rate per dollar over, up to all of it.
Social Security: age and income test
Exempt only at full retirement age (67) or older with income at or below the threshold; otherwise the whole federally taxable amount enters.
Social Security: Colorado age bands (Social Security alone)
The same age bands as the Colorado subtraction, on Social Security alone. In a calculation Colorado always takes the joint subtraction above; this branch serves callers of the Social Security rule by itself.
Rhode Island: per-spouse age test joint returns with the spouse's age given
With both ages known, each spouse's half of the benefits is exempt only if that spouse is at full retirement age, against the joint income test.
Does a conversion draw the retirement cap?
Where the state lets a conversion draw the capped exclusion, and the filer is at or above the conversion age, the conversion is pooled with distributions against the cap.
Retirement exclusion per spouse (both ages known) joint returns with the spouse's age given
Full-exclusion states exclude each qualifying spouse's own dollars. Capped states give each spouse the single cap for their own age against their own eligible dollars (pension dollars only where the exclusion is pension-only; employer dollars only below the IRA age), less their military exclusion and half of any Social Security offset. Per-return states (and the pooled-if-both-qualify rule when both qualify) apply the joint cap to the couple's pooled eligible dollars when either spouse qualifies. The income tests then apply once to the summed deduction.
Income-tested percentage of distributions
Distributions are deductible at the percentage for the income band (joint column for joint returns, and for head of household unless it uses the single column). Where the state says so a conversion draws the same percentage; otherwise it is taxed in full. In per-person mode the excluded amount is shown for each spouse in proportion to their own distributions (reporting only).
The percentage table
The deductible share by income. Single, head-of-household and separate filers: 100% from $0; 85% from $75,000; 70% from $77,500; 55% from $80,000; 40% from $82,500; 25% from $85,000; 10% from $87,500; 5% from $90,000; 2.5% from $95,000; 0% from $100,000. Joint filers: 100% from $0; 85% from $100,000; 70% from $105,000; 55% from $110,000; 40% from $115,000; 25% from $120,000; 10% from $125,000; 5% from $130,000; 2.5% from $140,000; 0% from $150,000. The table lives in code; these values are read back from it.
Conversion pooled with distributions
The conversion joins the distributions against the one cap (with a spouse split in a per-taxpayer state, each spouse's own distributions and conversion against that spouse's cap). Nothing of the conversion is added separately.
Pension-only exclusion
Only pension and annuity dollars draw the capped exclusion; IRA dollars and conversions are taxed in full.
No retirement exclusion (age deduction instead)
Distributions and conversions stay in the base; the age deduction below applies against any income.
Retirement exclusion (household)
The distributions eligible for the exclusion go through the exclusion below. Taxable public-pension dollars left by a cap are not eligible; below the IRA age only employer-plan dollars are.
Retirement exclusion per spouse (declared split) joint returns with each spouse's own amounts given
With a spouse split in a per-taxpayer state, each spouse's own eligible dollars draw that spouse's single cap (less their military exclusion); an income limit then applies once to the sum.
Conversion taxed or exempt
In full-exclusion states a conversion is exempt at the qualifying age (at any age where the state says so). Elsewhere, unless pooled above, it is ordinary income taxed in full.
Full exclusion
All distributions are excluded at or above the exclusion age; below it they are taxed.
Graduated exclusion by income band
Below the exclusion age nothing is excluded. Otherwise the share of the exclusion granted falls with income (Social Security left out); in the middle bands it is a percentage by filing status of the whole pension, limited to the pension, where the state's worksheet says so, otherwise of the capped amount. The separate-return cap applies where set. Engine values, single and head of household: 100% from $0; 37.5% over $100,000; 18.75% over $125,000; 0% over $150,000; joint: 100% from $0; 50% over $100,000; 25% over $125,000; 0% over $150,000; separate: 100% from $0; 25% over $100,000; 12.5% over $125,000; 0% over $150,000.
Income limit on the exclusion
When the income total (Social Security left out where the state says so) exceeds the limit, the exclusion is lost (a cliff), reduced dollar for dollar after the cap (subtractive), or phased out in proportion over the range.
Cap by age tier
The full cap at or above the exclusion age, the lower cap at or above the partial age, otherwise none. Joint returns use the joint cap; every other status the single cap.
Cap reduced by Social Security
The cap is reduced dollar for dollar by Social Security received: gross benefits when supplied, otherwise the federally taxable amount.
The capped deduction
Deduction = the smaller of the eligible distributions and the cap, then reduced by the income limit above; the rest of the distributions stays in the base.
One taxpayer's cap joint returns with the spouse's age given
For per-spouse calculations, each spouse's cap is the single-column cap for their age tier.
Long-term gains in the base
Where gains are taxed as ordinary income: net long-term gain less the flat exclusion (never below zero), times the inclusion share. Elsewhere none enters.
Retirement and investment pool per spouse joint returns with the spouse's age given
Each spouse's pool = own distributions + own conversion + half the long-term gain in the base + (where the state counts earned income) up to the earned-income amount of their own wages, against the cap for their own age. The pool above the caps is taxed.
Retirement and investment pool
Distributions + conversion + long-term gain in the base (+ wages up to the earned-income amount per qualifying person) form one pool against the cap for the household age (each spouse's own pool and cap with a split in a per-taxpayer state). The pool above the cap is taxed as ordinary income; conversions and gains are not added separately.
Public pension not covered by Social Security only when the caller says the pension was not covered by Social Security
Only when the caller says the public pension was not covered: the smaller of the public pension still in the base and the cap, reduced above the income start (by a percentage per step, or linearly over a range). Where it is an election instead of the Social Security exclusion, the engine keeps whichever excludes more.
Non-covered pension: age test and shared cap only when the caller says the pension was not covered by Social Security
Where the state sets them: only a recipient at or above the age qualifies (each spouse's own public pension in per-person mode); the cap is reduced by the Social Security received (gross when supplied) and by the military pay the same deduction already excluded. A disabled recipient qualifies from the lower disability age where the state sets one.
Deductions, exemptions and age subtractions
Additional standard deduction at 65
The unmarried amount for a single or head-of-household filer 65 or older, the married amount for each spouse 65 or older, added to the standard deduction before any phase-out.
Additional standard deduction for blindness only when the caller says a person is blind or disabled
The unmarried amount for a blind single or head-of-household filer, the married amount for each blind spouse, added to the standard deduction before any phase-out. Age and blindness are separate boxes, so a person 65 or older and blind gets both.
Standard deduction phase-out
Above the start the deduction is scaled by 1 − (income − start) / width, down to zero, with head-of-household and separate starts where the state has them; where the state says so a head of household never gets less than the single deduction at the same income. Where the state rounds the reduction, it is rounded down to that multiple before it is taken.
Standard deduction limited at high income
Above the income threshold the deduction (with its age and blindness amounts) is limited to the status amount: the state adds the rest back. On the component path only; where the caller supplies federal taxable income that figure is used as given.
Exemption phase-out on state income
The exemption the engine carries as the deduction is lost in whole steps for each step (or part) of income over the start, or linearly over the range; the income here is what enters the state base (exempt Social Security left out).
Taxpayer credit instead of a deduction
No deduction is subtracted: the deduction amount (plus the federal additional amount per taxpayer 65 or older) becomes the base of the credit applied after the schedule. The federal blind amount joins the base the same way, per blind person.
Personal exemption
The joint amount on a joint return, the head-of-household amount where set, otherwise the single amount.
Exemption set by income
The amount per exemption is the first tier whose income limit the income total does not exceed (joint limits for joint returns, and for head of household where set), else the amount above the tiers; two exemptions on a joint return, one otherwise. It replaces the flat exemption.
Exemption phase-out
Above the filing status's start the exemption is scaled by 1 − (income − start) / range, down to zero.
Low- and middle-income exemption
At any age, per exemption (the filer, and the spouse on a joint return; the engine has no dependents): the amount less the filing status's rate times the income total above its base, not below zero, and none once the income total is over the status's limit.
Exemption for blindness only when the caller says a person is blind or disabled
An extra exemption for each blind person (the filer, and the spouse on a joint return). Where the state's exemption is for a person who is blind or disabled, a disabled person below the state's age limit (if any) qualifies too, one exemption per person either way.
Income exclusion for disability only when the caller says a person is blind or disabled
Up to the amount of income for each disabled person, while the income total is under the limit, taken against the base (the engine does not know each person's own income; taxable income cannot go below zero).
Age subtraction
At or above the age: the single amount, or the joint amount on a joint return (both spouses at the household age). In per-person mode, half the joint amount (or the single amount) per qualifying spouse. Plus the low-income amount below the income test; less the military exclusion where the statute says so; limited to the spouse's own income where the statute says so.
Age subtraction for a disabled person only when the caller says a person is blind or disabled
Where the state gives its age subtraction to a permanently and totally disabled person at any age: per disabled spouse in per-person mode; on the household path below the age, one amount per disabled person, reduced as at the age.
Age subtraction reduced by Social Security and public pension
Each qualifying taxpayer's amount is reduced by their own taxable Social Security (half each on a joint return) and their own public-pension exemption.
Extra exemption at 65 for low income
One more exemption per taxpayer at or above the age when the income total (conversions left out where the state says so) is at most the filing status's limit.
Age exemption stepped down by income
For each taxpayer at or above the age (each spouse on a joint return): the full amount while the income total is at most the status's start, then less the decrement for each width of income (or part of one) above it; head of household reads the joint column where the state says so. Where the state says so, a blind person qualifies too, with one exemption per person.
Federal senior deduction taken against the state base
For each taxpayer 65 or older: the amount, reduced by the rate times the income total above the status's start (joint start on a joint return); none for married filing separately. In the states whose base is federal taxable income it is taken only when the caller does not supply that figure (it is already in it).
Disability exemption instead of the regular ones only when the caller says a person is blind or disabled
A person who is blind (or disabled) takes the state's disability exemption instead of their own regular and age exemptions; the other spouse keeps theirs.
Age deduction against any income
The amount per taxpayer at or above the age, reduced dollar for dollar by income (taxable Social Security left out) over the limit; on a joint return the combined amount is reduced once by the joint excess.
Taxable income
State taxable income
Other ordinary income + Social Security, retirement income, conversion and gains left in the base − standard deduction − personal exemption − age subtractions.
Starting from federal taxable income only when the caller supplies federal taxable income (the planner; not the API)
When the caller supplies federal taxable income (the planner does; the API does not), the base starts from it, adds the gains in it (less the state's gain subtraction), and subtracts the state's own exclusions and subtractions; the state's deduction is not subtracted again.
Federal income tax deduction only when the caller supplies federal tax
Only when the caller supplies federal tax. Full: the federal tax plus the net investment income tax. Capped: the federal tax (without the net investment income tax where the state says so) up to the cap, which loses 20% of itself for each band of income from the start (joint and head-of-household returns on the joint bands, separate returns half the cap).
Detail record
The bases, exclusions and subtractions are recorded per person (or for the household) for the breakdown.
Rule names in the detail record
Each person's record names the military, retirement and age rule the state applies.
No tax at or below zero
State taxable income at or below zero returns a tax of 0 (credits are not refundable and nothing below applies).
Tax: the schedule, recapture, gains rates and minimum tax
Each spouse's own zero-rate band joint returns
On a joint return the first (zero-rate) bracket is widened to the sum over the spouses of the smaller of the band and that spouse's income (own wages, retirement and conversion income by the caller's split, everything else half each), and the brackets above shift with it.
Separate-return scaling married filing separately
For the halved-joint rule, taxable income is doubled before the schedule and the result halved.
The rate schedule
Each bracket's rate on the part of taxable income inside it, summed. No rounding: the result is carried in full precision.
Fixed amount above the zero bracket
Once taxable income passes the threshold a fixed amount is added (halved with the schedule for a separate return).
Tax-benefit recapture
On state AGI (the income in the base before deductions) above the start, the recapture below is added.
The recapture worksheets
For each bracket below the filer's top one, its benefit (flat rate times the bracket bottom, less the schedule tax on it, less the lower brackets' benefit) is phased in over $50,000 of income above the larger of $107,650 and the bracket bottom. Fully phased in, all taxable income is taxed at the top rate. Where the first worksheet applies to taxable income below its bracket, the flat rate of that bracket applies to all of it, phased in the same way.
Add-back and recapture
On state AGI (the income in the base), the add-back and the recapture below are added to the schedule tax.
Rate phase-out add-back (Table C)
A fixed amount per step (or part) of income over the start, up to a maximum, by filing status. The table lives in code; the state page prints engine values.
Benefit recapture (Table D)
Three tiers per filing status (separate returns use the single tiers); each adds a fixed amount per step (or part) of income over its start, up to its own maximum.
Own schedule for long-term gains
The gain in the base (at most the taxable income) is taken out of the schedule and taxed at the lower gains rate up to the first ordinary bracket's top, stacked on the ordinary income, and at the upper rate above; this replaces the schedule part of the tax, and amounts added on top of the schedule before it (a fixed amount, recapture) are kept.
Alternative capital-gains tax
The schedule part of the tax is the smaller of the regular schedule tax and the schedule tax on income without the gain plus the alternative rate times the gain; amounts added on top of the schedule before it are kept.
Minimum tax
Above the income threshold the tax before credits is at least the rate times the income total.
Credits
Per-exemption credit
The credit per exemption: two on a joint return, one otherwise, or the state's own count for a head of household. Where the state sets an income limit there is no credit above it (the joint limit for joint returns and heads of household).
Senior credit
The credit per taxpayer at or above the age: two on a joint return at the household age, one per qualifying spouse in per-person mode. A head of household's extra personal credit is not a second senior credit.
Credit for blindness only when the caller says a person is blind or disabled
The credit for each blind person.
Personal, senior and blind credits phased out
Above the status threshold each personal, senior and blind credit loses the amount for each step of income (or part of one), not below zero; the separate step applies to married filing separately.
Credit for severe disability only when the caller says a person is blind or disabled
One more credit for each disabled person while the income total is at most the limit.
Taxpayer tax credit
The credit rate times the credit base, less the phase-out rate times taxable income above the filing status's base, not below zero.
Married couple credit joint returns with each spouse's own amounts given
Joint returns with the spouse's age and a spouse split only, and only when no retirement exclusion was taken: the rate times the lower-earning spouse's wages, up to the maximum.
Joint filing credit joint returns with each spouse's own amounts given
Joint returns with the spouse's age and a spouse split only, income total under $750,000, and each spouse with at least $500 of wages, retirement or conversion income: a share of the tax by taxable income, 15% from the first dollar of tax; 10% over $50,000; 5% over $75,000, at most $650.
Military retirement credit
The credit rate times the military pay.
Credits cannot make the tax negative
The credits are subtracted and the result floored at zero.
After credits: county tax, surcharges and surtaxes
County income tax
The county rate times state taxable income, after credits and not reduced by them.
Capital-gains surcharge
When the income total exceeds the threshold, the rate times net long-term gain.
Surtax on high income
The rate times state taxable income over the filing status's threshold.
Conventions: rounding and later years
Rounding
The engine does not round, except where a form rounds a computed amount: South Carolina rounds the reduction of its income-adjusted deduction down to a whole ten dollars, and the engine does the same. Otherwise brackets, phase-outs and credits are computed in double precision, and the API returns the tax unrounded. Step functions that the forms define in whole steps use ceilings (Minnesota's Social Security and public-pension steps, Connecticut's exemption, add-back and recapture steps, California's credit phase-out) or floors (Oregon's federal-tax bands). Where a state's instructions look tax up in a table of income bands, the engine applies the rate schedule to the exact amount, so results can differ from the table by a few dollars. The pages on this site show amounts rounded to the cent.
Later years: indexing dollar amounts
The engine's tables are for the tax year shown. For later years the planner scales every dollar amount the statutes index by one inflation factor; rates, percentages, ages and the amounts the statutes fix stay as they are. The calculation-order page lists which fields scale and which do not.
The lines the worked examples show
The engine records these as it computes (its detail record); the state pages print them for each worked example. The documentation build checks that they add up: taxable income = the income in the base − the deductions, exemptions and age subtractions − the federal-tax deduction (floored at zero), and tax = schedule tax + the additions and adjustments − the credits used + the county tax, surcharge and surtax.
| Record field | Line | Step |
|---|---|---|
agi_proxy | Income total used by the income tests | The income total every income test uses |
short_term_gains_exempt | Short-term gain exempted (not in the base) | Short-term gains exempt |
military_excluded | Military pay excluded (not in the base) | Military retirement pay |
retirement_excluded | Retirement income and conversions excluded (not in the base) | The capped deduction |
earned_income_excluded | Wages inside the retirement exclusion (not in the base) | Retirement and investment pool |
noncovered_pension_excluded | Non-covered public pension subtracted (already out of the retirement line below) | Public pension not covered by Social Security |
ordinary_in_base | + Other ordinary income in the base | State taxable income |
ss_in_base | + Social Security in the base | Which Social Security threshold applies |
retirement_in_base | + Retirement income in the base | The capped deduction |
conversion_in_base | + Roth conversion in the base | Conversion taxed or exempt |
ltcg_in_base | + Long-term gain in the base | Long-term gains in the base |
standard_deduction | − Standard deduction | Standard deduction phase-out |
personal_exemption | − Personal exemption | Personal exemption |
senior_total | − Age subtractions and deductions | Age subtraction |
federal_tax_deduction | − Federal income tax deduction | Federal income tax deduction |
taxable_income | = State taxable income | State taxable income |
zero_band_width | Joint zero-rate band after per-spouse widening | Each spouse's own zero-rate band |
bracket_tax | Tax from the rate schedule | The rate schedule |
bracket_cliff | + Fixed amount above the zero bracket | Fixed amount above the zero bracket |
recapture | + Tax-benefit recapture | The recapture worksheets |
ct_addback | + Rate phase-out add-back (Table C) | Rate phase-out add-back (Table C) |
ct_recapture | + Benefit recapture (Table D) | Benefit recapture (Table D) |
cg_schedule_adjustment | ± Own gains schedule (replaces the schedule tax on the gain) | Own schedule for long-term gains |
cg_alt_adjustment | − Alternative capital-gains tax saving | Alternative capital-gains tax |
min_tax_topup | + Minimum tax top-up | Minimum tax |
tax_before_credits | = Tax before credits | Minimum tax |
credit_exemption | Per-exemption credit | Per-exemption credit |
credit_senior | Senior credit | Senior credit |
credit_blind | Blind credit | Credit for blindness |
credit_disabled | Disability credit | Credit for severe disability |
credit_taxpayer | Taxpayer tax credit | Taxpayer tax credit |
credit_married_couple | Married couple credit | Married couple credit |
credit_joint_filing | Joint filing credit | Joint filing credit |
military_credit | Military retirement credit | Military retirement credit |
credits_applied | − Credits used (never more than the tax) | Credits cannot make the tax negative |
local_tax | + County income tax | County income tax |
cg_surcharge | + Capital-gains surcharge | Capital-gains surcharge |
surtax | + Surtax | Surtax on high income |
cg_excise | Capital-gains excise | Washington capital-gains excise |
tax | = Tax | Credits cannot make the tax negative |
Later years: which amounts are indexed
The engine's tables are for tax year 2026. The planner projects later years by multiplying dollar amounts by one inflation factor in
scale_state_tax_config_for_year() (backend/src/monte_carlo.c:2368). Rate tables scale their thresholds; the rates do not change.
Tables that live in code rather than in the configuration (the Connecticut percentage, add-back and recapture tables, the New York recapture start and width, the Colorado caps, the Minnesota Social Security step, the Ohio joint filing credit bands) are not scaled. The API computes tax year 2026 only.
Scaled every later year
| Field | Meaning | When |
|---|---|---|
brackets_* | Every bracket threshold of every schedule | always |
std_deduction_single | Standard deduction (or folded personal exemption), single/MFS | always |
std_deduction_mfj | Standard deduction (or folded personal exemption), MFJ | always |
std_deduction_hoh | Head-of-household standard deduction (0 = the single amount) | always |
std_deduction_phaseout_start_single | Income above which the standard deduction phases out, single | always |
std_deduction_phaseout_start_mfj | Income above which the standard deduction phases out, MFJ | always |
std_deduction_phaseout_denom_single | Width of the standard-deduction phase-out, single | always |
std_deduction_phaseout_denom_mfj | Width of the standard-deduction phase-out, MFJ | always |
personal_exemption_single | Personal exemption subtracted in addition to the standard deduction, single | always |
personal_exemption_mfj | Personal exemption subtracted in addition to the standard deduction, MFJ | always |
exemption_phaseout_start_single | Income above which the exemption phases out, single (CT) | always |
exemption_phaseout_start_mfj | Income above which the exemption phases out, MFJ (CT) | always |
exemption_phaseout_range_single | Width of the exemption phase-out, single (CT) | always |
exemption_phaseout_range_mfj | Width of the exemption phase-out, MFJ (CT) | always |
exemption_credit_per | Nonrefundable credit per exemption (1 single, 2 MFJ) | always |
senior_credit_per | Additional nonrefundable credit per taxpayer at or above the senior age | always |
taxpayer_credit_phaseout_base_single | Taxpayer credit phase-out base, single/MFS | always |
taxpayer_credit_phaseout_base_mfj | Taxpayer credit phase-out base, MFJ | always |
taxpayer_credit_phaseout_base_hoh | Taxpayer credit phase-out base, HOH | always |
senior_subtraction_single | Subtraction from the base at or above the senior age, single | always |
senior_subtraction_mfj | Subtraction from the base at or above the senior age, MFJ | always |
senior_subtraction_lowincome_bonus_single | Extra senior subtraction below the low-income test, single | always |
senior_subtraction_lowincome_bonus_mfj | Extra senior subtraction below the low-income test, MFJ | always |
senior_subtraction_lowincome_agi | Income below which the extra senior subtraction applies | always |
ss_exempt_agi_single | Income threshold for the Social Security exemption, single | always |
ss_exempt_agi_mfj | Income threshold for the Social Security exemption, MFJ | always |
ss_exempt_agi_mfs | Dedicated MFS threshold (0 = the single threshold) | always |
retirement_income_exclusion_single | Capped retirement-income exclusion, single (per taxpayer) | always |
retirement_income_exclusion_mfj | Capped retirement-income exclusion, MFJ (both spouses) | always |
retirement_exclusion_partial_single | Lower-tier cap for a younger age band, single | always |
retirement_exclusion_partial_mfj | Lower-tier cap for a younger age band, MFJ | always |
retirement_exclusion_income_limit | Income limit for the exclusion, single | always |
retirement_exclusion_income_limit_mfj | Income limit for the exclusion, MFJ | always |
retirement_exclusion_income_range_single | Phase-out width over the income limit, single | always |
retirement_exclusion_income_range_mfj | Phase-out width over the income limit, MFJ | always |
public_pension_exclusion_cap_single | Cap on the public-pension exemption, per taxpayer (0 = uncapped) | only where public_pension_cap_indexed is set (the cap follows an indexed figure); held where the statute fixes it |
public_pension_exclusion_cap_mfj | Cap on the public-pension exemption, MFJ | only where public_pension_cap_indexed is set (the cap follows an indexed figure); held where the statute fixes it |
cg_flat_exclusion | First dollars of gain excluded | always |
cg_surcharge_agi_threshold | Income threshold for the capital-gains surcharge | always |
cg_excise_deduction | Capital-gains excise standard deduction | always |
cg_excise_high_threshold | Taxable gain above which the additional excise applies | always |
top_surtax_threshold | Surtax threshold | only where top_surtax_threshold_indexed is set |
fit_deduction_cap_single | Cap on the federal-tax subtraction, single/HOH | always |
fit_deduction_cap_mfj | Cap on the federal-tax subtraction, MFJ | always |
military_cap | Military pay exempt per taxpayer at or above the age split (optional cap for the percent rule) | always |
military_cap_mfj | Military cap per joint return (0 = per taxpayer) | except where military_amounts_fixed is set (the statute fixes the amounts); held there with the per-taxpayer cap and the income limits |
military_cap_young | Military pay exempt per taxpayer below the age split | always |
military_income_limit_single | Income limit for the military exemption, single | always |
military_income_limit_mfj | Income limit for the military exemption, MFJ | always |
military_income_range_single | Phase-out width above the military income limit, single (0 = cliff) | always |
military_income_range_mfj | Phase-out width above the military income limit, MFJ | always |
military_earned_bonus | Extra military exemption below the age split when own earned income exceeds the threshold | always |
military_earned_threshold | Earned income needed for the extra military exemption | always |
earned_income_in_retirement_exclusion | Earned income per taxpayer that counts toward the retirement exclusion | always |
std_deduction_mfs | MFS standard deduction where it is neither half the MFJ one nor the single one (0 = the default rule) | always |
std_deduction_phaseout_start_hoh | Income above which the standard deduction phases out, HOH (0 = single values) | always |
std_deduction_phaseout_denom_hoh | Width of the standard-deduction phase-out, HOH | always |
std_deduction_phaseout_start_mfs | Income above which the standard deduction phases out, MFS (0 = single values) | always |
std_deduction_phaseout_denom_mfs | Width of the standard-deduction phase-out, MFS | always |
personal_exemption_hoh | Personal exemption, HOH, where it differs from single (0 = single) | always |
exemption_tier_amount | Per-exemption amount for each income tier | always |
exemption_tier_agi_single | Upper income of each exemption tier, single/MFS | always |
exemption_tier_agi_joint | Upper income of each exemption tier, MFJ | always |
exemption_tier_amount_above | Per-exemption amount above the last tier | always |
exemption_phaseout_step | Exemption lost in whole steps of this size (0 = linear) | always |
exemption_phaseout_start_hoh | Income above which the exemption phases out, HOH (0 = single) | always |
exemption_phaseout_start_mfs | Income above which the exemption phases out, MFS (0 = single) | always |
taxpayer_credit_aged_add_single | Federal additional standard deduction per 65+ taxpayer added to the taxpayer-credit base, single/HOH | always |
taxpayer_credit_aged_add_married | Same, married | always |
bracket_cliff_amount | Fixed amount owed once bracket income exceeds the threshold | always |
bracket_cliff_threshold | Income above which the fixed amount is owed | always |
top_surtax_threshold_mfj | Surtax threshold, MFJ (0 = the single threshold) | only where top_surtax_threshold_indexed is set |
top_surtax_threshold_hoh | Surtax threshold, HOH (0 = the single threshold) | only where top_surtax_threshold_indexed is set |
top_surtax_threshold_mfs | Surtax threshold, MFS (0 = the single threshold) | only where top_surtax_threshold_indexed is set |
retirement_income_exclusion_mfs | Retirement exclusion cap, MFS (0 = the single cap) | always |
std_deduction_aged_add_unmarried | Additional standard deduction per taxpayer 65 or older, single/HOH (part of the phased-out deduction) | always |
std_deduction_aged_add_married | Additional standard deduction per spouse 65 or older, MFJ/MFS | always |
exemption_ratable_phaseout_start_single | Income above which the personal exemption phases out ratably, single (0 = no phase-out) | always |
exemption_ratable_phaseout_start_mfj | Same, MFJ | always |
exemption_ratable_phaseout_start_hoh | Same, HOH | always |
exemption_ratable_phaseout_start_mfs | Same, MFS | always |
exemption_ratable_phaseout_range | Width of the ratable exemption phase-out | always |
exemption_ratable_phaseout_range_mfs | Width of the ratable exemption phase-out, MFS (0 = the general width) | always |
senior_lowinc_exemption | Extra exemption per taxpayer at the age below when federal AGI is at most the filing-status limit | always |
senior_lowinc_agi_single | Federal AGI limit for the low-income extra exemption, single | always |
senior_lowinc_agi_mfj | Same, MFJ | always |
senior_lowinc_agi_mfs | Same, MFS | always |
senior_lowinc_agi_hoh | Same, HOH | always |
noncov_pension_cap_single | Subtraction for a public pension earned without Social Security coverage, per return, single/HOH/MFS (needs the caller's say-so) | always |
noncov_pension_cap_mfj | Same, MFJ | always |
noncov_pension_phaseout_start_single | Income above which that subtraction phases out, single/HOH | always |
noncov_pension_phaseout_start_mfj | Same, MFJ | always |
noncov_pension_phaseout_start_mfs | Same, MFS (0 = the single start) | always |
blind_std_add_unmarried | Additional standard deduction per blind person, single/HOH (part of the phased-out deduction) | always |
blind_std_add_married | Same, per blind spouse, MFJ/MFS | always |
blind_credit_base_add_unmarried | Federal blind amount added to the taxpayer-credit base per blind person, single/HOH | always |
blind_credit_base_add_married | Same, per blind spouse, MFJ/MFS | always |
senior_subtraction_lowincome_agi_mfs | Income below which the extra senior subtraction applies, married filing separately (0 = the general test) | always |
Not scaled
| Field | Meaning | Why |
|---|---|---|
taxpayer_credit_rate | Taxpayer tax credit rate on the deduction base (UT); nonzero means no deduction is subtracted | A rate. |
taxpayer_credit_phaseout_rate | Taxpayer credit reduction per dollar of taxable income over the base | A rate. |
ltcg_inclusion_ratio | Share of net long-term gain entering the base (0 = all of it) | A share. |
cg_alt_rate | Alternative maximum rate on net long-term gain | A rate. |
cg_own_rate_low | Own lower capital-gains rate (two-rate schedule) | A rate. |
cg_own_rate_high | Own upper capital-gains rate (two-rate schedule) | A rate. |
cg_surcharge_rate | Surcharge on net capital gain above an income threshold | A rate. |
cg_excise_rate | Capital-gains excise rate (no-income-tax state) | A rate. |
cg_excise_high_rate | Additional excise rate above the high threshold | A rate. |
top_surtax_rate | Flat surtax on taxable income over the threshold | A rate. |
fit_phaseout_start_single | Income at which the federal-tax cap starts to step down, single | Held at the tax-year amount: the engine treats the band edges as fixed in statute. |
fit_phaseout_start_mfj | Income at which the federal-tax cap starts to step down, MFJ/HOH | Held at the tax-year amount: the engine treats the band edges as fixed in statute. |
fit_phaseout_step_single | Width of each 20% step, single | Held at the tax-year amount: the engine treats the band widths as fixed in statute. |
fit_phaseout_step_mfj | Width of each 20% step, MFJ/HOH | Held at the tax-year amount: the engine treats the band widths as fixed in statute. |
local_tax_rate | Default local rate (overridable per request) | A rate. |
military_pct | Share of military pay exempt (percent rule) | A share. |
military_credit_rate | Credit rate on military pay in the base (credit rule) | A rate. |
married_couple_credit_rate | Married couple credit rate on the lower-earning spouse's earned income | A rate. |
married_couple_credit_max | Married couple credit maximum | Held at the tax-year amount. |
min_tax_agi_rate | Minimum tax as a share of federal AGI above the threshold | A rate. |
min_tax_agi_threshold | Federal AGI above which the minimum tax applies | Held at the tax-year amount: the engine treats it as fixed in statute. |
noncov_pension_phaseout_step | The subtraction falls by the step percentage for each step of income (or part) over the start | Held at the tax-year amount: a step width the engine treats as fixed in statute. |
noncov_pension_phaseout_step_pct | Share of the subtraction lost per step | A share. |
noncov_pension_phaseout_range | Width over which the subtraction phases out linearly (when there is no step) | Held at the tax-year amount: a phase-out width the engine treats as fixed in statute. |
senior_step_exemption | Exemption per taxpayer at the age below, stepped down by federal AGI (full up to the start, less the decrement per width or part above it) | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
senior_step_agi_single | Federal AGI up to which the stepped exemption is in full, single | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
senior_step_agi_mfj | Same, MFJ (and HOH where HOH reads the joint column) | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
senior_step_agi_mfs | Same, MFS | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
senior_step_width_single | Width of each AGI step, single | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
senior_step_width_mfj | Same, MFJ | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
senior_step_width_mfs | Same, MFS | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
senior_step_decrement | Amount the stepped exemption falls per step | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
lmi_exemption | Low- and middle-income exemption per exemption (filer; both spouses on MFJ), any age | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
lmi_agi_limit_single | Federal AGI limit for the low- and middle-income exemption, single | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
lmi_agi_limit_mfj | Same, MFJ | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
lmi_agi_limit_hoh | Same, HOH | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
lmi_agi_limit_mfs | Same, MFS | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
lmi_base_single | Federal AGI above which that exemption is reduced, single | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
lmi_base_mfj | Same, MFJ | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
lmi_base_hoh | Same, HOH | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
lmi_base_mfs | Same, MFS | Held at the tax-year amount: fixed in the New Mexico statute, not indexed. |
lmi_rate_single | Reduction per dollar of AGI above the base, single | A rate. |
lmi_rate_mfj | Same, MFJ | A rate. |
lmi_rate_hoh | Same, HOH | A rate. |
lmi_rate_mfs | Same, MFS | A rate. |
fed_senior_deduction | The federal senior deduction the state allows, per taxpayer 65 or older (none on MFS) | Held at the tax-year amount: the federal statute fixes it (and ends it after the 2028 tax year, which the scaler cannot see). |
fed_senior_phaseout_single | AGI above which each senior deduction is reduced, single/HOH | Held at the tax-year amount: the federal statute fixes it (and ends it after the 2028 tax year, which the scaler cannot see). |
fed_senior_phaseout_mfj | Same, MFJ | Held at the tax-year amount: the federal statute fixes it (and ends it after the 2028 tax year, which the scaler cannot see). |
fed_senior_phaseout_rate | Reduction of each senior deduction per dollar of AGI above the start | A rate. |
std_phaseout_round_down | The standard-deduction phase-out's reduction is rounded down to a multiple of this (0 = unrounded) | A rounding unit, not an amount that indexes. |
blind_exemption | Extra exemption subtracted per blind person | Held at the tax-year amount: fixed in most of the statutes that set it; where a state indexes it, later-year results are conservative. |
blind_credit | Nonrefundable credit per blind person | Held at the tax-year amount: fixed in most of the statutes that set it; where a state indexes it, later-year results are conservative. |
blind_in_lieu_exemption | Exemption for a blind or disabled person instead of their own regular and age exemptions | Held at the tax-year amount: fixed in most of the statutes that set it; where a state indexes it, later-year results are conservative. |
disabled_income_exclusion | Income excluded per disabled person while the income total is under the limit | Held at the tax-year amount: fixed in statute. |
disabled_income_exclusion_agi_limit | Income total under which that exclusion applies | Held at the tax-year amount: fixed in statute. |
credit_phaseout_start_single | Federal AGI above which the personal, senior and blind credits phase out, single/MFS (0 = none) | Held at the tax-year amount, like the credits it reduces. |
credit_phaseout_start_mfj | Same, MFJ | Held at the tax-year amount, like the credits it reduces. |
credit_phaseout_start_hoh | Same, HOH | Held at the tax-year amount, like the credits it reduces. |
credit_phaseout_step | AGI step (or part) per which each credit is reduced | Held at the tax-year amount, like the credits it reduces. |
credit_phaseout_step_mfs | Same, MFS (0 = the general step) | Held at the tax-year amount, like the credits it reduces. |
credit_phaseout_amount | Reduction of each credit per step | Held at the tax-year amount, like the credits it reduces. |
exemption_credit_agi_limit_single | No personal exemption credit above this federal AGI, single/MFS (0 = no limit) | Held at the tax-year amount: fixed in statute. |
exemption_credit_agi_limit_joint | Same, MFJ and HOH | Held at the tax-year amount: fixed in statute. |
disabled_credit | Extra credit per disabled person while federal AGI is at most the limit | Held at the tax-year amount; the credit it equals is indexed, so later-year results are conservative. |
disabled_credit_agi_limit | Federal AGI limit for that credit | Held at the tax-year amount: fixed in statute. |
std_addback_agi_threshold | Above this income total the standard deduction is limited to the status amount below (0 = none) | Held at the tax-year amount: fixed in statute. |
std_addback_keep_single | Deduction kept above that income total, single/HOH/MFS | Held at the tax-year amount: fixed in statute. |
std_addback_keep_mfj | Same, MFJ | Held at the tax-year amount: fixed in statute. |
What the engine does not calculate
- Itemized deductions, and credits other than those each state page lists (dependent, earned-income, property-tax, renter, child and similar credits).
- Dependents: there is no dependent input, so no dependent exemption, deduction or credit is given (child tax credits, dependent exemptions and credits, and dependent-based deductions such as New Mexico's deduction for certain dependents); head of household uses the state's head-of-household schedule and deduction only. Each state page lists its dependent items under what the engine does not calculate.
- Blindness and disability: the blind and disabled inputs (per person) apply every blind amount and every disability route to a state's age-based relief that each state page lists. Not calculated: disability rules that depend on an amount of disability pay or on facts the inputs do not carry (the disability-income exclusions of several states, low-income or wage-tested disability credits); each state page names its own.
- Part-year and non-resident apportionment, and credits for tax paid to other states. Every calculation is for a full-year resident.
- State alternative minimum taxes.
- City, school-district and other municipal income taxes (Indiana and Maryland county taxes are included).
- Business income rules: pass-through entity taxes, net operating losses, depreciation differences and other state additions and subtractions outside the income types listed on the API reference.
- Tax-table lookups: where a state's instructions have filers look tax up in a table of income bands, the engine applies the rate schedule to the exact amount.
- Withholding, estimated payments, penalties and interest: the engine computes the year's liability only.
- Out-year rules that are not yet law: later years reuse this year's rules with indexed dollar amounts (see Later years).
What it does not calculate for one jurisdiction is listed on that jurisdiction's page, under "What the engine does not calculate".