Financial Services
Form 1040 is the U.S. individual income tax return. Two dense pages carry filing status, taxpayer and spouse identity, dependents, and a long column of numbered income, deduction, and tax lines that have to reconcile with each other. Returns arrive as software-generated PDFs, scanned paper, and handwritten copies. Sensible converts 1040 data into structured JSON for income verification, underwriting, and tax-prep workflows.
Validated JSON
Schema-enforced output; every field matches your contract
Source coordinates
Every value links back to page + bounding box for audit
Per-document pricing
Predictable cost. No token-volatility surprises
Trusted by teams turning documents into production data






The 1040 has a fixed federal layout, which makes it a strong candidate for positional extraction. The difficulty is the variation around the layout: a parallel 1040-SR for older filers, attached schedules that move numbers onto the main form, and a dense numbered line column where a single misread digit breaks the return. Layout-based rules pin the consistent lines; LLM parsing handles scanned and handwritten copies; cross-line checks confirm the math reconciles.
01
Line numbering shifts between tax years, and the large-print 1040-SR reorders the same fields for older filers. Schedules 1 through 3 feed totals back onto specific main-form lines. Fingerprints identify the year and variant so the right config runs, and the schedules map to the lines they roll up into rather than getting flattened into loose text.
02
Page two stacks income, adjustment, deduction, and tax lines inches apart, each labeled by number in the margin. Some returns are typed by software; others are filled by hand or scanned until the digits blur. Anchored region rules read each line by its number, so line 11 stays AGI and line 24 stays total tax across every return, and low-confidence fields get flagged for review.
03
Total income on line 9 minus adjustments on line 10 should equal AGI on line 11. AGI minus the deduction on line 12 should land on taxable income on line 15. Sensible checks these relationships after extraction and flags returns where the arithmetic does not reconcile, so reviewers see the exceptions instead of every page.
Managed services
Solutions engineers handle plan, build, deploy, and adjust on your behalf. You see clean JSON in your API response. Same engine as self-serve, just with the configuration work outsourced.
What's included
01Plan.Engineers review your samples and pick the right method
02Build.SenseML configs written from your samples
03Deploy.Same engine as self-serve, ready for production
04Adjust.We update configs when formats shift or new edge cases appear
05Integrate.Help with custom integration into your downstream systems
Every income or lending pipeline maps the 1040 to its own schema, so we build the config around your fields rather than a fixed list. These are the lines verification and underwriting teams pull most often; we map whatever else your workflow needs.
01
Taxpayer & filing status
Filing status, taxpayer and spouse name and SSN, home address, digital-asset question, dependents (name, SSN, relationship, credit eligibility)
02
Income & adjustments
Wages (1a), taxable interest (2b), ordinary dividends (3b), IRA and pension distributions (4b, 5b), Social Security benefits (6b), capital gain (7), total income (9), adjustments (10), adjusted gross income (11)
03
Tax, payments & refund
Standard or itemized deduction (12), taxable income (15), tax (16), total tax (24), federal withholding (25), total payments (33), overpayment and refund (34), amount you owe (37)
config.json
SenseML
{ /* SenseML: Form 1040 extraction */
"fields": [
{
"method": {
"id": "queryGroup",
"queries": [
{ "id": "taxpayer_name", "description": "taxpayer first name and last name, top of form 1040" },
{ "id": "filing_status", "description": "filing status checkbox, single, married filing jointly, head of household" },
{ "id": "adjusted_gross_income", "description": "adjusted gross income, line 11, AGI" },
{ "id": "total_tax", "description": "total tax, line 24" }
// + income, deduction, and payment lines, mapped to your schema
]
}
}
]
}Sensible processes the 1040 family across tax years and filing variants. Fingerprints identify the form and year so the right config runs, and attached schedules map to the main-form lines they feed. New variants can be configured in hours, and the extraction logic is explicit in SenseML, not buried in prompt tuning.
Form 1040, 1040-SR (large print for older filers), 1040-NR, and prior-year layouts back through the post-2018 redesign
Schedule 1 (additional income and adjustments), Schedule 2 (additional tax), Schedule 3 (credits and payments), plus software-printed, scanned, and handwritten returns
Answers about form years and variants, line-item extraction across attached schedules, and handling scanned or handwritten returns.
Sensible runs cross-line checks after extraction: total income minus adjustments should equal AGI, AGI minus the deduction should land on taxable income. Returns where the arithmetic does not reconcile get flagged so reviewers see the exceptions instead of every page.
Yes. Layout-based rules pin the consistent numbered lines, and LLM parsing handles software-printed, scanned, and handwritten copies where the digits blur. Low-confidence fields are flagged for review rather than guessed.
Filing status, taxpayer and spouse identity, dependents, income and adjustment lines, AGI (line 11), taxable income (15), total tax (24), withholding, payments, and refund or amount owed are all extracted. Custom fields can be added in SenseML to match your income or underwriting schema exactly.
Sensible processes the 1040 family across tax years and filing variants: Form 1040, the large-print 1040-SR for older filers, 1040-NR, and prior-year layouts back through the post-2018 redesign. Fingerprints identify the year and variant so the right config runs, and attached Schedules 1 through 3 map to the main-form lines they feed.
Start free
Free 14-day trial. No credit card required. Start extracting in minutes.