Input schema (JSON)
{
"type": "object",
"required": [
"age",
"salary",
"retire_age",
"spending_in_retirement"
],
"properties": {
"age": {
"type": "integer",
"maximum": 80,
"minimum": 18,
"description": "Your age this year. The plan starts now."
},
"filing": {
"enum": [
"single",
"married"
],
"type": "string",
"description": "Tax filing status. Default 'single'. 'married' = one joint return; fill in the spouse_* fields."
},
"salary": {
"type": "number",
"maximum": 5000000,
"minimum": 0,
"description": "Your gross pay this year, in dollars."
},
"end_age": {
"type": "integer",
"maximum": 110,
"description": "Plan until this age (default 92; horizon at most 90 years)."
},
"accounts": {
"type": "object",
"properties": {
"hsa": {
"enum": [
"none",
"self",
"family"
],
"type": "string",
"description": "HSA-eligible health plan coverage. Default none."
},
"ira": {
"type": "boolean",
"description": "May contribute to an IRA / Roth IRA. Default true."
},
"match": {
"type": "array",
"items": {
"type": "object",
"required": [
"match_pct",
"of_first_pct_of_pay"
],
"properties": {
"match_pct": {
"type": "number",
"maximum": 300,
"minimum": 0,
"description": "Employer match rate in whole percent (100 = dollar for dollar, 50 = 50 cents per dollar)."
},
"of_first_pct_of_pay": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "WIDTH of this tier in whole percent of pay (not cumulative). '100% of the first 3% then 50% of the next 2%' = [{100,3},{50,2}]."
}
},
"description": "One employer-match tier: 'employer adds match_pct cents per dollar you put in, on the next of_first_pct_of_pay percent of pay'.",
"additionalProperties": false
},
"maxItems": 4,
"description": "Your employer match tiers, richest first."
},
"has_401k": {
"type": "boolean",
"description": "Employer 401(k) available. Default true."
},
"spouse_match": {
"type": "array",
"items": {
"type": "object",
"required": [
"match_pct",
"of_first_pct_of_pay"
],
"properties": {
"match_pct": {
"type": "number",
"maximum": 300,
"minimum": 0,
"description": "Employer match rate in whole percent (100 = dollar for dollar, 50 = 50 cents per dollar)."
},
"of_first_pct_of_pay": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "WIDTH of this tier in whole percent of pay (not cumulative). '100% of the first 3% then 50% of the next 2%' = [{100,3},{50,2}]."
}
},
"description": "One employer-match tier: 'employer adds match_pct cents per dollar you put in, on the next of_first_pct_of_pay percent of pay'.",
"additionalProperties": false
},
"maxItems": 4,
"description": "Spouse's employer match tiers."
},
"has_roth_401k": {
"type": "boolean",
"description": "Plan offers a Roth 401(k) option. Default true."
},
"spouse_has_401k": {
"type": "boolean",
"description": "Default true."
},
"spouse_has_roth_401k": {
"type": "boolean",
"description": "Default true."
}
},
"description": "Which accounts the user can use. Defaults: 401(k) and Roth 401(k) available, IRA allowed, no HSA, no match.",
"additionalProperties": false
},
"balances": {
"type": "object",
"properties": {
"roth": {
"type": "number",
"minimum": 0,
"description": "Roth 401(k)/IRA balance."
},
"brokerage": {
"type": "number",
"minimum": 0,
"description": "Taxable brokerage and cash."
},
"traditional": {
"type": "number",
"minimum": 0,
"description": "Traditional 401(k)/IRA balance."
},
"brokerage_gain": {
"type": "number",
"minimum": 0,
"description": "Unrealized long-term gain inside the brokerage balance (cannot exceed it)."
}
},
"description": "Current household balances, dollars. Omitted = 0.",
"additionalProperties": false
},
"retire_age": {
"type": "integer",
"description": "Age you stop working. Must be above 'age'."
},
"assumptions": {
"type": "object",
"properties": {
"backdoor_roth": {
"type": "boolean",
"description": "Roth IRA open at any income via backdoor. Default true."
},
"state_tax_pct": {
"type": "number",
"maximum": 20,
"minimum": 0,
"description": "Flat state income tax rate, whole percent. Default 0."
},
"real_return_pct": {
"type": "number",
"maximum": 15,
"minimum": -5,
"description": "Investment return above inflation, whole percent. Default 5."
},
"exact_income_limits": {
"type": "boolean",
"description": "Model exact Roth IRA / deduction income phase-outs (slower MILP, a few seconds). Default false."
},
"retirement_tax_rate_pct": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "Income tax rate applied to leftover traditional money at the end of the plan. Default 22."
}
},
"description": "Modeling assumptions; the defaults are reported back.",
"additionalProperties": false
},
"spouse_salary": {
"type": "number",
"maximum": 5000000,
"minimum": 0,
"description": "Married only: spouse's gross pay this year (0 or omitted = spouse does not work)."
},
"real_raise_pct": {
"type": "number",
"maximum": 10,
"minimum": -5,
"description": "Yearly raise above inflation, whole percent (1 = 1%). Default 1."
},
"social_security": {
"type": "object",
"properties": {
"annual": {
"type": "number",
"minimum": 0,
"description": "Yearly benefit in today's dollars."
},
"start_age": {
"type": "integer",
"maximum": 70,
"minimum": 62,
"description": "Age benefits start. Default 67."
}
},
"description": "Expected Social Security (household). Omitted = none modeled.",
"additionalProperties": false
},
"spouse_retire_age": {
"type": "integer",
"description": "Married only: the age YOU will be when your spouse stops working (all ages on this server are the primary earner's). Default = retire_age."
},
"children_birth_years": {
"type": "array",
"items": {
"type": "integer"
},
"maxItems": 10,
"description": "Birth years of dependent children (child tax credit, head of household)."
},
"spending_in_retirement": {
"type": "number",
"maximum": 5000000,
"minimum": 0,
"description": "Yearly spending after retiring, today's dollars (before income tax)."
},
"spending_while_working": {
"type": "number",
"maximum": 5000000,
"minimum": 0,
"description": "Yearly living costs while still working, today's dollars. Default = spending_in_retirement."
}
},
"additionalProperties": false
}