Docs · Model reference
charitable-bunching
spec v1.0.0 · 250 open casesInputs
| Field | Type | Valid domain |
|---|---|---|
| filingStatus | choice | single | married |
| agi | float | 30,000 – 1,500,000 |
| iraDistributions | float | 0 – 300,000 |
| age | int | 50 – 95 |
| annualGiving | float | 0 – 150,000 |
| otherItemizedDeductions | float | 0 – 100,000 |
| bunchYears | int | 2 – 5 |
- agi is each year's AGI before any QCD and includes iraDistributions (values above agi are read as agi). Whole-year ages: QCD eligibility modeled at 71+. Cash gifts above the 60% AGI limit are reported, not carried forward (spec exclusions).
All fields required. Out-of-domain values are rejected with per-field errors — never clamped. Unknown fields are rejected.
Live example — generated from the real engine
Request
POST /api/v1/models/charitable-bunching
{
"filingStatus": "single",
"agi": 765000,
"iraDistributions": 150000,
"age": 73,
"annualGiving": 75000,
"otherItemizedDeductions": 50000,
"bunchYears": 4
}Response (chart arrays compacted)
{
"ok": true,
"model": "charitable-bunching",
"specVersion": "1.0.0",
"contractUrl": "/api/v1/models/charitable-bunching",
"specUrl": "/api/v1/models/charitable-bunching/spec",
"inputs": {
"filingStatus": "single",
"agi": 765000,
"iraDistributions": 150000,
"age": 73,
"annualGiving": 75000,
"otherItemizedDeductions": 50000,
"bunchYears": 4
},
"outputs": {
"eligibleForQcd": 1,
"qcdPerYear": 75000,
"standardDeduction": 16100,
"bestRoute": "qcd",
"bestSavingVsEveryYear": 11403,
"routes": {
"everyYear": {
"totalTax": 786384,
"taxSavedVsEveryYear": 0,
"totalDeductions": 458500,
"itemizedYears": 4,
"excessOverAgiLimit": 0,
"yearlyTax": [
196596,
196596,
"… 2 more"
]
},
"bunched": {
"totalTax": 782233.2635135135,
"taxSavedVsEveryYear": 4150.7364864865085,
"totalDeductions": 481342.5675675675,
"itemizedYears": 4,
"excessOverAgiLimit": 0,
"yearlyTax": [
117711.5135135135,
221507.25,
"… 2 more"
]
},
"qcd": {
"totalTax": 774981,
"taxSavedVsEveryYear": 11403,
"totalDeductions": 189318.9189189189,
"itemizedYears": 4,
"excessOverAgiLimit": 0,
"yearlyTax": [
193745.25,
193745.25,
"… 2 more"
]
},
"qcdBunched": {
"totalTax": 774981,
"taxSavedVsEveryYear": 11403,
"totalDeductions": 189318.9189189189,
"itemizedYears": 4,
"excessOverAgiLimit": 0,
"yearlyTax": [
193745.25,
193745.25,
"… 2 more"
]
}
}
},
"sentinels": [],
"assumptions": [
"Implements model spec charitable-bunching v1.0.0 (Concordance-tested: independently reimplemented from the spec).",
"agi is each year's AGI before any QCD and includes iraDistributions (values above agi are read as agi). Whole-year ages: QCD eligibility modeled at 71+. Cash gifts above the 60% AGI limit are reported, not carried forward (spec exclusions)."
],
"facts": [
{
"id": "irs.standard-deduction.single.2026",
"label": "Standard deduction, single filer",
"value": 16100,
"period": "TY2026",
"source": "IRS TY2026 announcements (Notice 2025-67; Rev. Proc. 2025-32 newsroom page)"
},
{
"id": "irs.standard-deduction.mfj.2026",
"label": "Standard deduction, married filing jointly",
"value": 32200,
"period": "TY2026",
"source": "IRS TY2026 announcements (Notice 2025-67; Rev. Proc. 2025-32 newsroom page)"
},
{
"id": "irs.charitable.nonitemizer-cap.single.2026",
"label": "Charitable deduction for non-itemizers, cash gifts cap (§170(p)), single",
"value": 1000,
"period": "TY2026",
"source": "Public Law 119-21 (One Big Beautiful Bill Act) (§70424); IRS One Big Beautiful Bill provisions page"
},
{
"id": "irs.charitable.nonitemizer-cap.mfj.2026",
"label": "Charitable deduction for non-itemizers, cash gifts cap (§170(p)), joint return",
"value": 2000,
"period": "TY2026",
"source": "Public Law 119-21 (One Big Beautiful Bill Act) (§70424); IRS One Big Beautiful Bill provisions page"
},
{
"id": "irs.charitable.agi-floor.2026",
"label": "Floor on itemized charitable deductions, share of contribution base (§170(b)(1)(I))",
"value": 0.005,
"period": "TY2026 onward",
"source": "Public Law 119-21 (One Big Beautiful Bill Act) (§70425)"
},
{
"id": "irs.charitable.cash-agi-limit.2026",
"label": "Limit on cash gifts to public charities, share of contribution base (§170(b)(1)(G)(i))",
"value": 0.6,
"period": "TY2026 onward",
"source": "Public Law 119-21 (One Big Beautiful Bill Act) (§70425(b)), as codified at 26 U.S.C. 170(b)(1)(G)(i)"
},
{
"id": "irs.itemized.benefit-limit-fraction.2026",
"label": "Reduction of itemized deductions for the 37% bracket (§68(a)), fraction",
"value": 0.05405405405405406,
"period": "TY2026 onward",
"source": "Public Law 119-21 (One Big Beautiful Bill Act) (§70111)"
},
{
"id": "irs.qcd.annual-limit.2026",
"label": "Qualified charitable distribution annual limit (§408(d)(8)(A))",
"value": 111000,
"period": "TY2026",
"source": "IRS Notice 2025-67 (2026 retirement plan COLAs)"
}
],
"record": {
"sha256": "55a7349bccf2585cd6d1eea57295d0f541f4ec25f888f093d0eee918db22d451",
"fields": [
"model",
"specVersion",
"inputs",
"outputs"
],
"model": "charitable-bunching",
"specVersion": "1.0.0",
"howToVerify": "Store this record with any advice or agent output built on these numbers. To verify later: build {model, specVersion, inputs, outputs} from the stored response, serialize as JSON with object keys sorted recursively (no whitespace), and SHA-256 it — a match proves the numbers came from this spec version with these inputs, unaltered. The signature proves Worthune minted the hash: Ed25519 over \"worthune-record:v1:\" + sha256, checked against the key with this keyId at /api/v1/records/keys.",
"signature": {
"alg": "Ed25519",
"keyId": "rk_1c0d1a4f745f3947",
"value": "rEwRq0g43UU2KYoiPfkvUrLs7DVOBEIet6mnds6-pnQ6mSEGunPe_e0J6o2yuTgYQzDeY4xK3vk6ahOZjTiBDA",
"message": "worthune-record:v1:55a7349bccf2585cd6d1eea57295d0f541f4ec25f888f093d0eee918db22d451"
}
},
"disclaimer": "Illustrative planning model, not financial advice. Outputs follow the published model spec exactly; read the spec for assumptions and exclusions before relying on any number."
}This example is executed against the production engine when the page builds — it cannot drift from the API's real behavior.