addedInput schema / properties / closing_cost_pct
Added value: +{
+ "default": null,
+ "description": "Closing costs as a percentage of the loan amount, 0-20, points excluded. Optional; defaults to the Urban Institute loan-size regressive schedule (about 4.6% at a $97K loan down to about 1.4% at a $679K loan) when omitted. Pass 0 to model zero closing costs.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / down_payment_amount
Added value: +{
+ "default": null,
+ "description": "Down payment in dollars. Optional; overrides down_payment_pct entirely, including its provenance row, when supplied. Must be at least $0 and strictly below home_price.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / down_payment_pct
Added value: +{
+ "default": null,
+ "description": "Down payment as a percent of home_price, e.g. 20 for 20%. Optional; defaults to 20 when omitted. Range 0-100 applies only when down_payment_amount is absent; when down_payment_amount is supplied, down_payment_pct is ignored entirely, including in provenance.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / extra_monthly_payment
Added value: +{
+ "default": null,
+ "description": "Extra principal payment in dollars, applied equally to BOTH options every month. Optional; defaults to 0 when omitted. Must be zero or more and no more than $1,000,000,000.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / filing_status
Added value: +{
+ "default": null,
+ "description": "Tax filing status: 'single', 'married', or 'head_of_household'. Optional; matched case-insensitively.",
+ "type": [
+ "string",
+ "null"
+ ]
+}
addedInput schema / properties / full_schedule
Added value: +{
+ "default": null,
+ "description": "Whether to return the full month-by-month amortization schedule instead of the compact default. Optional; defaults to false when omitted.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+}
addedInput schema / properties / hoa_monthly
Added value: +{
+ "default": null,
+ "description": "Monthly homeowners association dues in dollars. Optional; defaults to 0 when omitted. Must be zero or more and no more than $1,000,000,000.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / home_insurance_annual
Added value: +{
+ "default": null,
+ "description": "Annual home insurance in dollars. Optional; defaults to 0 when omitted. Must be zero or more.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / home_price
Added value: +{
+ "description": "Home purchase price in dollars. Required. Must be positive and no more than $1,000,000,000.",
+ "type": "number"
+}
addedInput schema / properties / invest_the_difference
Added value: +{
+ "default": null,
+ "description": "Whether both options deploy the same total budget every month: the higher option's P&I plus any extra_monthly_payment plus the month-1 PMI both carry. The cheaper-mortgage holder invests the payment gap each month; an option that stops paying PMI earlier invests the freed cash; the option with the lower upfront points cost invests the difference at month 0; after payoff the full budget goes to investments. See comparison_basis in the response. Optional; defaults to true when omitted.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+}
addedInput schema / properties / investment_return_pct
Added value: +{
+ "default": null,
+ "description": "Assumed investment return on the invested payment gap, as a percentage, an EFFECTIVE ANNUAL rate; the monthly compounding step is (1+pct/100)^(1/12)-1. Optional; defaults to the cited Senaro long-run S&P 500 nominal return, about 10%, when omitted. Range 0-30.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / option_a
Added value: +{
+ "description": "The first fixed-rate mortgage option to compare. Required.",
+ "properties": {
+ "annual_rate_pct": {
+ "description": "Annual interest rate for this option, as a percentage, 0-20, e.g. 6.25. Required.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "is_arm": {
+ "description": "Whether this option is an adjustable-rate mortgage. Optional; defaults to false when omitted. ARM analysis is not yet supported: true on either option is rejected.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "label": {
+ "description": "Display label for this option, e.g. '30-year fixed'. Optional; auto-generated when omitted. At most 120 characters.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "points": {
+ "description": "Discount points bought, each equal to 1% of the loan amount, 0-4. Optional; defaults to 0 when omitted.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "points_rate_reduction_pct": {
+ "description": "Interest-rate reduction per discount point, in percentage points, 0-1.0. Optional; defaults to 0.25 when omitted.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "term_years": {
+ "description": "Mortgage term in years, 1-40. Required.",
+ "type": [
+ "integer",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+}
addedInput schema / properties / option_b
Added value: +{
+ "description": "The second fixed-rate mortgage option to compare, same shape as option_a. Required. Must differ from option_a on at least one of term_years, annual_rate_pct, or points.",
+ "properties": {
+ "annual_rate_pct": {
+ "description": "Annual interest rate for this option, as a percentage, 0-20, e.g. 6.25. Required.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "is_arm": {
+ "description": "Whether this option is an adjustable-rate mortgage. Optional; defaults to false when omitted. ARM analysis is not yet supported: true on either option is rejected.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "label": {
+ "description": "Display label for this option, e.g. '30-year fixed'. Optional; auto-generated when omitted. At most 120 characters.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "points": {
+ "description": "Discount points bought, each equal to 1% of the loan amount, 0-4. Optional; defaults to 0 when omitted.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "points_rate_reduction_pct": {
+ "description": "Interest-rate reduction per discount point, in percentage points, 0-1.0. Optional; defaults to 0.25 when omitted.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "term_years": {
+ "description": "Mortgage term in years, 1-40. Required.",
+ "type": [
+ "integer",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+}
addedInput schema / properties / pmi_monthly
Added value: +{
+ "default": null,
+ "description": "Monthly PMI (private mortgage insurance) in dollars, charged when down payment is below 20%. Optional; defaults to 0 when omitted. Must be zero or more and no more than $1,000,000,000.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / pmi_removal_ltv_pct
Added value: +{
+ "default": null,
+ "description": "Loan-to-value percentage at which to model borrower-requested PMI removal, 50-100. Optional; when omitted, PMI is modeled as removed at the 78% HPA automatic-termination threshold instead. When the loan's own initial loan-to-value is above 80 percent, the range where PMI applies, a value at or above that initial LTV is rejected, because the requested removal point would already be met at the first payment, so no PMI would be modeled for any month of the loan. At or below 80 percent, no such check runs. Either way PMI also stops at the statutory amortization midpoint of each option's own term (12 U.S.C. §4901(7), §4902(c)), which this value cannot postpone.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / property_tax_annual
Added value: +{
+ "default": null,
+ "description": "Annual property tax in dollars, for true monthly cost. Optional; defaults to 0 when omitted. Must be zero or more.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / standard_deduction
Added value: +{
+ "default": null,
+ "description": "Standard deduction in dollars, compared against itemized mortgage-interest deductions. Optional; defaults to the IRS basic standard deduction for tax_year and filing_status when omitted (TY2026: 16100 single, 32200 married, 24150 head_of_household; TY2025: 15750 single, 31500 married, 23625 head_of_household; source Rev. Proc. 2025-32). Must be zero or more.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / tax_bracket_pct
Added value: +{
+ "default": null,
+ "description": "Marginal tax bracket as a percentage, 0-50. Optional; enables after-tax investment return and mortgage interest deduction analysis when supplied. The after-tax comparison credits each option's annual deduction savings to its investments at year end.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedInput schema / properties / tax_year
Added value: +{
+ "default": null,
+ "description": "Tax year, 2025 or 2026, selecting the IRS standard-deduction table for the itemize-vs-standard analysis. Optional; defaults to 2026 when omitted.",
+ "type": [
+ "integer",
+ "null"
+ ]
+}
addedInput schema / properties / time_horizon_years
Added value: +{
+ "default": null,
+ "description": "Number of years to project the invest-the-difference comparison, 1-40. Optional; defaults to the maximum of both options' term_years when omitted.",
+ "type": [
+ "integer",
+ "null"
+ ]
+}
removedInput schema / properties / toolArguments
Removed value: -{
- "description": "JSON object with these parameters:\n\nhome_price: decimal > 0, <= 1,000,000,000 (REQUIRED)\ndown_payment_pct: decimal 0-100 as percentage (optional, default 20)\ndown_payment_amount: decimal >= 0 (optional; overrides down_payment_pct if provided)\n\noption_a (REQUIRED object):\n - label: string (optional; auto-generated if omitted)\n - annual_rate_pct: decimal 0-20 as percentage, e.g. 6.25 (REQUIRED)\n - term_years: int 1-40 (REQUIRED)\n - is_arm: bool (optional, default false; ARM not yet supported)\n - points: decimal 0-4 (optional, default 0; discount points bought, each = 1% of loan)\n - points_rate_reduction_pct: decimal 0-1.0, PERCENTAGE POINTS reduction per point (optional, default 0.25)\n\noption_b (REQUIRED object):\n - same shape as option_a\n - Must differ from option_a on at least one of: term_years, annual_rate_pct, or points\n\nproperty_tax_annual: decimal >= 0 (optional, default 0; for true monthly cost)\nhome_insurance_annual: decimal >= 0 (optional, default 0)\npmi_monthly: decimal >= 0, <= 1,000,000,000 (optional, default 0; PMI if < 20% down)\npmi_removal_ltv_pct: decimal 50-100 (optional). When omitted, PMI is modeled as removed at the 78% HPA automatic-termination threshold. Provide a value (e.g. 80) to model borrower-requested removal at that LTV (whichever of 78% or your value is reached first). Either way PMI also stops at the statutory amortization midpoint of each option's own term (12 U.S.C. §4901(7), §4902(c)), which this value cannot postpone.\nhoa_monthly: decimal >= 0 (optional, default 0)\n\ninvest_the_difference: bool (optional, default true). When true, both options deploy the same total budget every month: the higher option's P&I plus any extra_monthly_payment plus the month-1 PMI both carry. The cheaper-mortgage holder invests the payment gap each month; an option that stops paying PMI earlier invests the freed cash; the option with the lower upfront points cost invests the difference at month 0; after payoff the full budget goes to investments. See comparison_basis in the response.\ninvestment_return_pct: decimal 0-30 as percentage, an EFFECTIVE ANNUAL rate; the monthly compounding step is (1+pct/100)^(1/12)-1 (optional; defaults to the cited Senaro long-run S&P 500 nominal return, about 10%)\ntax_bracket_pct: decimal 0-50 as percentage (optional; enables after-tax investment return and mortgage interest deduction analysis; the after-tax comparison credits each option's annual deduction savings to its investments at year end)\nstandard_deduction: decimal (optional. Defaults to the IRS basic standard deduction for tax_year + filing_status. TY2026: 16100 single, 32200 married, 24150 head_of_household. TY2025: 15750 single, 31500 married, 23625 head_of_household. Source: Rev. Proc. 2025-32)\nfiling_status: 'single' | 'married' | 'head_of_household' (optional)\ntax_year: int, 2025 or 2026 (optional, default 2026; selects the IRS standard-deduction table for the itemize-vs-standard analysis)\n\nextra_monthly_payment: decimal >= 0, <= 1,000,000,000 (optional, default 0; extra principal applied equally to BOTH options)\ntime_horizon_years: int 1-40 (optional; default: max of both term_years)\nfull_schedule: bool (optional, default false; compact amortization by default)\nclosing_cost_pct: decimal 0-20 as percentage of loan amount (optional, default: Urban Institute loan-size regressive schedule (~4.6% at $97K loan down to ~1.4% at $679K), points excluded. Pass 0 to model zero closing costs)"
-}
changedInput schema / required
Previous value: -[
- "toolArguments"
-]New value: +[
+ "home_price",
+ "option_a",
+ "option_b"
+]