QuantCalc QuantCalc State tax engine docs

State tax docs / Couples and income types

Couples and income types

How the engine treats a married couple, and which kinds of income it tells apart. Request fields are on the API reference; this page explains the model behind them.

Income types

The request's income fields are separate amounts that do not overlap: each dollar goes in exactly one field. Three further fields describe part of another rather than adding income: earlyDistributions (part of iraDistributions and employerPlanDistributions), socialSecurityGross (which includes socialSecurity) and railroadRetirementTier1 (part of socialSecurityGross). iraBasis is not income at all: it is the after-tax contributions not yet recovered, which a state that taxes an early distribution only above them reads.

API fieldWhat goes in itWhy it is separate
wagesW-2 wages and net self-employment incomeSome states treat earned income differently from other income.
iraDistributionsTraditional IRA distributions, excluding conversionsSeveral states exclude pensions but not IRAs, or gate IRA dollars by age.
employerPlanDistributions401(k), 403(b) and 457(b) distributions, excluding conversionsTaxed like IRA money except where a pension rule covers employer plans (Maryland, Rhode Island, Arkansas).
pensionPrivatePrivate-employer pension or annuityPension-only exclusions (for example Maryland and Rhode Island) apply to it.
pensionPublicGovernment pension: civil service, state, municipal, teacherSeveral states exempt it fully or up to a cap.
pensionMilitaryMilitary retirement payMany states exempt it on terms of their own.
rothConversionTraditional-to-Roth conversion amountStates differ on whether a conversion draws the retirement exclusion.
shortTermGainsNet short-term capital gainOrdinary income almost everywhere; exempt where a state exempts all gains.
capitalGainsNet long-term capital gainInclusion ratios, flat exclusions and own rates vary by state.
socialSecurityFederally taxable Social SecurityThe base the state rules start from.
socialSecurityGrossGross benefits (Social Security and Railroad Retirement Tier 1)Connecticut's 25% cap and Maine's and Maryland's pension offsets use gross benefits.
railroadRetirementTier2Railroad Retirement Tier 2 and supplemental annuitiesNo state taxes them (45 U.S.C. 231m); some count them against a retirement cap.
qualifiedDividendsQualified dividendsNorth Dakota excludes part of them; Georgia and Delaware pool them with retirement income.
ordinaryIncomeEverything else ordinary: interest, non-qualified dividends and so on

Couples filing jointly

Without a spouse object, the person-level fields are household totals and one household age applies to every age test: the behaviour of every existing integration. With a spouse object, the top-level person-level fields (wages, iraDistributions, the three pension fields and rothConversion) are the primary filer's own amounts and spouse.* are the spouse's own amounts and age. ordinaryIncome, the gains and Social Security stay household totals, which the engine splits equally between the spouses, except that Social Security is divided by spouse.socialSecurityGross (the spouse's own gross benefits) when it is given. If spouse.age is left out, the spouse is taken to be the primary filer's age: each spouse's own income is still tested against their own cap, at that shared age.

With both ages known the engine evaluates every age-conditioned rule per person where the state applies it per person: retirement exclusions and their age tiers, senior subtractions and credits, age-gated Social Security treatment, conversion age gates and military retirement rules. Where a retirement exclusion is per taxpayer, each spouse's own dollars draw only that spouse's cap, so one spouse's large IRA withdrawal does not absorb both caps (per-taxpayer caps with a declared split since the first release: AL, AR, DE, LA, MO, OK, SC). Where the state applies one cap per joint return (MI, NJ, WI), the age test is met by either spouse (or, in the pooled-if-both case, per taxpayer until both qualify). Each state page says which applies.

The response's perPerson array reports, for each spouse, the age the rules used and every amount excluded with the rule that excluded it, so a result can be checked person by person. Every response carries it: a single filer, or a couple sent without spouse, gets one entry (primary, or household on a joint return).

Engine inputs

For library users, the engine's own input structure, as its dump tool reports it:

Engine inputMeaning
other_ordinaryOrdinary income that is not a retirement distribution, conversion or Social Security
retirement_distributionsPension, annuity and IRA/401(k) distributions, including the pension subsets below
pension_incomePension/annuity-sourced part of retirement_distributions (public and private)
pension_publicPublic or employer-funded pension part of pension_income
roth_conversionTraditional-to-Roth conversion amount
ss_incomeFederally taxable Social Security
ss_grossGross Social Security received (0 or less = unknown)
capital_gainsNet long-term capital gain
short_term_gainsNet short-term capital gain included in other_ordinary
ageFiler's age (the household age for MFJ)
federal_taxFederal income tax excluding NIIT (below 0 = unknown)
federal_niitFederal net investment income tax (below 0 = unknown)
fed_taxable_ordinaryFederal ordinary taxable income after deductions (below 0 = unknown)
fed_taxable_ltcgPreferential-rate gain inside federal taxable income (below 0 = unknown)
has_spouse_split1 = the sp2_* fields carry spouse 2's shares (MFJ only)
sp2_retirement_distributionsSpouse 2's share of retirement_distributions
sp2_pension_incomeSpouse 2's share of pension_income
sp2_pension_publicSpouse 2's share of pension_public
sp2_roth_conversionSpouse 2's share of roth_conversion
sp2_ageSpouse's own age on a joint return (0 or less = unknown: one household age)
wagesEarned income (wages, net self-employment income), part of other_ordinary
pension_militaryMilitary retirement pay, part of retirement_distributions and separate from pension_income
sp2_wagesSpouse 2's share of wages
sp2_pension_militarySpouse 2's share of pension_military
pension_public_not_ss_covered1 = the pension_public dollars were earned without Social Security coverage (unlocks MN's and VT's non-covered pension rules, and since engine 1.4.0 OK's CSRS exclusion and ID's civil-service deduction; 0 = unknown or covered)
blind1 = the filer is blind (engine 1.5.0; each state's blind amount applies)
sp2_blind1 = the spouse is blind (MFJ only)
disabled1 = the filer is totally and permanently disabled (engine 1.5.0; read only by the disability rules each state page lists)
sp2_disabled1 = the spouse is totally and permanently disabled (MFJ only)
dependents_given1 = the caller gave the dependents list (engine 1.7.0; 0 = not said: none)
num_dependentsNumber of dependents in the list (0-20)
dependentsEach dependent: age at the end of the year, student, disabled
pension_federal_civil_serviceFederal civil service annuity (CSRS / FERS), part of pension_public
sp2_pension_federal_civil_serviceSpouse 2's share of the civil service annuity
mfs_spouse_ageMarried filing separately: the other spouse's age (0 = not said)
mfs_spouse_blindMarried filing separately: 1 = the other spouse is blind
disability_incomeDisability pay of a person retired on disability, part of pension_income
sp2_disability_incomeSpouse 2's share of disability_income
early_distributions_given1 = the filer's early IRA amount was said (0 = every IRA dollar of a person under 59)
early_distributionsIRA dollars taken before 59½ (household total)
sp2_early_distributions_given1 = the spouse's early IRA amount was said
sp2_early_distributionsSpouse 2's early IRA dollars
early_exceptionThe filer's §72(t) exception: 1 none, 2 series, 3 death, 4 disability, 5 other (0 = not said)
sp2_early_exceptionThe spouse's §72(t) exception
ira_basisUnrecovered after-tax IRA contributions (household total)
sp2_ira_basisSpouse 2's IRA basis
survivor_benefits1 = the filer's pension and IRA income is received as a beneficiary
sp2_survivor_benefits1 = the spouse's is
ss_disabilityThe filer's Social Security is disability benefits: 1 yes, -1 no, 0 not said
sp2_ss_disabilityThe spouse's: 1 yes, -1 no, 0 not said
sp2_ss_gross_given1 = the spouse's own gross Social Security was said (else half)
sp2_ss_grossThe spouse's own gross Social Security, part of ss_gross
sp2_ss_share_year_given1 = a part-year period's benefits take the year's spouse share (RI, r5)
sp2_ss_share_yearThe spouse's share of the year's gross Social Security (RI part-year Column B, r5)
prior_hoh_qualifying_person_died1 = a head-of-household qualifying person of the two previous years died in those years
ordinary_is_investment1 = the other ordinary income beyond wages and short-term gains is interest, dividends and other investment income (engine 1.8.0; set for the API's ordinaryIncome; 0 = untyped)
qualifying_surviving_spouse1 = the return is a qualifying surviving spouse's (status single; the state's qss_rules apply)
rr_tier2Railroad Retirement Tier 2 (and supplemental annuity), household total — never taxed by a state
sp2_rr_tier2Spouse 2's share of rr_tier2
rr_tier1_grossRailroad Retirement Tier 1 received, a part of ss_gross
sp2_rr_tier1_grossSpouse 2's share of rr_tier1_gross
qualified_dividendsQualified dividends, part of other_ordinary
employer_plan401(k)/403(b)/457(b) distributions, part of retirement_distributions
sp2_employer_planSpouse 2's share of employer_plan
dis_plan_min_ageThe minimum retirement age of the plan paying the filer's disability pay (0 = not said)
sp2_dis_plan_min_ageThe same for the spouse's disability pay
survivor_decedent_ageThe age the filer's deceased spouse would have reached by the end of the year (0 = not said)
sp2_survivor_decedent_ageThe same for the spouse's deceased spouse
ss_survivor1 = the filer's Social Security is survivor benefits
sp2_ss_survivor1 = the spouse's Social Security is survivor benefits
federal_tax_before_credits_given1 = federal_tax_before_credits was said
federal_tax_before_creditsThe federal tax before credits (Form 1040 line 16 + Schedule 2 lines 2 and 8)
federal_tax_after_credits1 = federal_tax is the tax after the nonrefundable credits (Form 1040 line 22); 0 = the planner's own figure, no credits taken
federal_refundable_creditsThe federal refundable credits (Form 1040 lines 27a-30, Schedule 3 line 13a)
capital_lossThe year's net capital loss, positive (federal Schedule D line 16, a carryover brought in included; engine 1.9.0)
capital_loss_carryoverThe part of capital_loss carried in from earlier years (only AL reads it)
rental_netRental real estate, signed: the federal Schedule E line 26 amount after the passive-activity limit (a profit is other ordinary income; engine 1.13.1)
se_net_profitNet profit from self-employment before half the self-employment tax (API selfEmploymentIncome; read by a state business income rule, OH; library audit 2026-10-12)
muni_interest_in_stateFederally tax-exempt interest on the return's own state's obligations (API inStateMunicipalInterest; state engine 1.16)
muni_interest_out_of_stateFederally tax-exempt interest on other states' obligations (API outOfStateMunicipalInterest; state engine 1.16)
mil_service_yearsYears of service in the uniformed services (API militaryServiceYears; 0 = not said; state engine 1.16)
mil_medicalMedically retired from the uniformed services (API militaryMedicalRetirement)
veteranHonorably discharged veteran: 1 yes, -1 no, 0 not said (API veteran)
ret_before_59halfRetirement income received before 59 1/2 in the year the person reaches it (API retirementIncomeBefore59Half)
sp2_mil_service_yearsThe spouse's militaryServiceYears
sp2_mil_medicalThe spouse's militaryMedicalRetirement
sp2_veteranThe spouse's veteran fact
sp2_ret_before_59halfThe spouse's retirementIncomeBefore59Half
federal_earned_income_creditsForm 1040 lines 27a and 29 (API federalEarnedIncomeCredits)
us_obligation_interestInterest on U.S. obligations, a part of the non-wage other ordinary income (API usObligationInterest; state engine 1.16)
qualified_tipsQualified tips received as an employee (IRC 224(c)), part of the wages: [0] the filer, [1] the spouse on a joint return (API qualifiedTips; st116)
qualified_overtimeQualified overtime compensation, the premium above the regular rate (IRC 225(c)), part of the wages, per person (API qualifiedOvertime)
car_loan_interestQualified passenger vehicle loan interest paid (IRC 163(h)(4); API qualifiedCarLoanInterest)
charity_cashCash gifts to public charities other than a donor-advised fund (the IRC 170(p) amount; API charityCash)
fed_bl_given1 = the federal return's own below-the-line amounts are given (computeFederal)
fed_tips_deductionThe federal Schedule 1-A tips deduction (with fed_bl_given)
fed_overtime_deductionThe federal Schedule 1-A overtime deduction (with fed_bl_given)
fed_charity_deductionThe federal 170(p) deduction (with fed_bl_given)
domicile_years_given1 = the person's domicileYears was given
domicile_yearsThe person's whole years of domicile in the state at the end of the year (API domicileYears)
se_half_taxThe deduction for half the self-employment tax federal AGI took from that profit (API selfEmploymentIncome with computeFederal; read by PA net profits, state engine 1.16)
sp2_se_half_taxSpouse 2's share of se_half_tax (golden round 11: the local net-profits taxes add each person's half back)
sp2_se_net_profitSpouse 2's share of se_net_profit (golden round 11: each person's Schedule SE line 4a for an Ohio school district)
fed_deduction_given1 = the federal deduction below was said (the planner and computeFederal say it)
fed_deductionThe federal Form 1040 line 12e as filed (the standard or itemized deduction)
fed_itemizes1 = line 12e is the itemized deduction (Schedule A line 17)
fed_standard_deductionThe federal standard deduction the filer could have claimed (with the age and blindness amounts)
fed_itemized_sitThe state income tax inside Schedule A line 5e: line 5e less lines 5b, 5c and the local income tax, not below 0
sa_given1 = the federal Schedule A lines below were said (a full-year resident return)
sa_fed_agiFederal AGI (Form 1040 line 11)
sa_medicalSchedule A line 1: medical and dental expenses
sa_medical_deductedSchedule A line 4: the medical expenses over 7.5% of federal AGI
sa_salt_incomeSchedule A line 5a: state and local income taxes
sa_salt_real_estateSchedule A line 5b: real estate taxes
sa_salt_personalSchedule A line 5c: personal property taxes
sa_salt_deductedSchedule A line 5e: the taxes under the federal cap
sa_interestSchedule A line 10: home mortgage interest
sa_charity_cashSchedule A line 11: gifts by cash or check
sa_charitySchedule A line 14: the gifts deducted
sa_itemized_before_68Schedule A line 17 before the 2026 section 68 limitation
sa_itemizedSchedule A line 17
sa_payroll_taxMO-A Part 2 lines 2-7: the Social Security, Medicare and self-employment taxes the federal return figures
working_mil_retiree1 = the person meets Montana's working military retiree eligibility for the year (API workingMilitaryRetiree; state engine 1.26)
sp2_working_mil_retireeThe spouse's workingMilitaryRetiree
sa_py_factorA part-year / nonresident return's proration of the state itemized deduction (GA Form 500 Schedule 3 line 13; set only by the residency computation, 0 = not prorated)
property_tax_paidThe year's property tax on the principal residence
rent_paidThe year's rent for the principal residence
rent_includes_heat1 = the rent includes heat or utilities
home_valueThe home's assessed (MA) or full (NY) value; 0 = not said
tax_exempt_interestFederally tax-exempt interest
medical_expensesUnreimbursed medical and dental expenses (NM 65+ credit)
income_test_agi_givenEngine 1.12.0 (W4): 1 = the income tests read income_test_agi (a part-year / nonresident return's state-source computation)
income_test_agiThe whole year's federal AGI the income tests read on a part-year / nonresident return's state-source computation
income_test_ssGolden round 3: the whole year's taxable Social Security an income test that leaves the benefits out takes off income_test_agi (NJ, MO, VA; read only with income_test_agi_given)
income_test_state_agiGolden round 3: the whole year's state AGI from all sources a part-year return's low-income test reads (MA Schedule NTS-L-NR/PY line 8; read only with income_test_agi_given)
income_test_wagesGolden round 3: the whole year's wages a part-year return's earnings test reads (NJ Worksheet E line 8; read only with income_test_agi_given)
tax_table1 = the bracket tax is the state's tax table row where its form makes one mandatory (the API's default for a full-year resident return without a projection); 0 = the rate schedule on the exact amount (every C caller's default: the planner, the optimizers)

Worked examples

Engine results for four fixed households, in a few states that treat them differently (all states are on their own pages):

HouseholdALGANYOKMOCO
Single, 67: $30,000 private pension, $20,000 IRA, $10,000 interest, $24,000 Social Security ($17,000 federally taxable), $5,000 long-term gain$1,193.75$0$1,833.40$1,929.50$1,786.46$1,507.88
Married filing jointly, 70: $40,000 public pension, $40,000 IRA, $20,000 interest, $40,000 Social Security ($34,000 federally taxable), $10,000 long-term gain$2,420$0$544.05$2,959$2,569.01$2,134
Single, 60: $60,000 other ordinary income and a $50,000 Roth conversion$5,260$4,740.50$4,270.65$3,954.50$4,232.81$3,251.60
Married filing jointly, 66: $30,000 IRA, a $40,000 Roth conversion, $30,000 Social Security ($25,500 federally taxable)$2,420$0$544.05$1,159$1,441.01$0
Single, 58: $36,000 military retirement pay and $30,000 wages$1,246.25$798.40$1,023.40$804.50$472.81$1,315.60
Married filing jointly, ages 67 and 61: $50,000 IRA, $10,000 interest, $30,000 Social Security ($25,500 federally taxable), each spouse's age given$2,220$249.50$154.05$709$1,048.56$72.60

Inputs as the engine received them are in the engine config under examples. Federal tax is not supplied, so Alabama's federal-tax deduction is not taken in these figures.