*** September 2026 Major Release ***Read and watch
Document type

Extracting data from pension statements

Public retirement systems and corporate plan administrators send retirees a pension statement with every payment, each in the system's own layout. Mortgage lenders may request the latest statement when applicants use pension income to qualify, as a portal download or a scan of the mailed advice.

Underwriting needs the gross monthly annuity, the tax withholding, the other deductions and the net payment. The loan origination system counts the gross annuity as qualifying income, once documents show it continuing for three more years.

Page 1 of a sample Pension Statement, with extracted values outlined
2,325Markdown characters
80parse blocks
36fields extracted
The problem

What makes pension statements hard

Current beside year to date

Each amount prints for the current period and again as a year-to-date total, so every figure has a twin in the next column.

Deductions in several tables

Taxes, before-tax deductions and after-tax deductions each sit in their own small table, and a summary band totals them again.

Each system's own layout

State systems, municipal plans and corporate administrators each design their own payment advice, with different labels for the same amounts.

How it works

Parse, extract, verify

1

Parse

Parse turns the document into reading-order Markdown and a hierarchy of blocks (text, tables, figures), and grounds each block to its exact location on the page.

2

Extract

You define the fields in a JSON schema, and Extract returns their values in a consistent, structured format, each linked back to where it appears in the Markdown.

3

Verify

Each value links back to where it appears, down to the character range in the Markdown, and the page and bounding box in the source document, so every result can be verified.

Worked example

One pension statement, end to end

About this document: The specimen pension pay stub that the New York State and Local Retirement System shows its retirees in a tutorial on reading their payment advice. One landscape page with no text layer: a header, earnings and tax tables, deduction tables, a summary band and the net pay distribution. Page 1 is featured. Every personal value is a placeholder.

Processing objective: The objective is to follow one monthly payment from gross to net. The service annuity is the gross amount, withholding and other deductions come off it, and what remains is the net pay deposited. Each figure grounds to its own cell.

Demonstration fields: Monthly service annuity, Federal withholding, Total deductions, Net pay

The document

1 page
  • Page 1 of the sample Pension StatementPage 1shown below

Where each value came from

Page 1 of the sample Pension Statement, with every featured field outlined
Monthly service annuityearnings[0].current
2,148.58
The region of the sample Pension Statement containing Monthly service annuity, with the extracted value outlined
extraction_metadata["earnings[0].current"]
{
  "value": 2148.58,
  "page": 1,
  "range": {
    "end": 808,
    "start": 800
  },
  "box": {
    "xmin": 0.19324,
    "ymin": 0.37344,
    "xmax": 0.38231,
    "ymax": 0.48169
  }
}
Federal withholdingtaxes[0].current
257.82
The region of the sample Pension Statement containing Federal withholding, with the extracted value outlined
extraction_metadata["taxes[0].current"]
{
  "value": 257.82,
  "page": 1,
  "range": {
    "end": 877,
    "start": 871
  },
  "box": {
    "xmin": 0.69224,
    "ymin": 0.37342,
    "xmax": 0.82902,
    "ymax": 0.48161
  }
}
Total deductionssummary.total_deductions_current
802.5
The region of the sample Pension Statement containing Total deductions, with the extracted value outlined
extraction_metadata["summary.total_deductions_current"]
{
  "value": 802.5,
  "page": 1,
  "range": {
    "end": 1807,
    "start": 1801
  },
  "box": {
    "xmin": 0.69487,
    "ymin": 0.71663,
    "xmax": 0.82938,
    "ymax": 0.74401
  }
}
Net paysummary.net_pay_current
1,088.26
The region of the sample Pension Statement containing Net pay, with the extracted value outlined
extraction_metadata["summary.net_pay_current"]
{
  "value": 1088.26,
  "page": 1,
  "range": {
    "end": 1824,
    "start": 1816
  },
  "box": {
    "xmin": 0.82934,
    "ymin": 0.71663,
    "xmax": 0.96184,
    "ymax": 0.74399
  }
}

How to try it yourself

Everything on this page is reproducible. The sample, its schema, and the Parse and Extract API outputs are published. You can repeat the same two calls from whichever surface you already build on.

  • Claude Skilldescribe the job; the agent writes it
  • CLIno code at all
  • MCPexpose ADE docs as an agent tool
  • REST APIany language
  • Pythonlandingai-ade
  • TypeScriptlandingai-ade
Why LandingAI?

Documents into data

Accurate

The best accuracy on the difficult documents other tools get wrong, such as messy scans, complicated tables, checkboxes and handwriting.

Auditable

Every answer cites its sources. Values come back with an audit trail (page, bounding box, character range) so a human can review them.

Agentic

Applies multi-step reasoning, and plans before it acts. Handles documents it has never seen before and adapts to variations.

API-first

Composable APIs that drop into any tech stack and can be called from anywhere. Easy to build on and embed in your pipelines and products.

Affordable

Cost-competitive rates with complete price transparency. Spend controls before you run, and every job reports its exact cost.

Enterprise-grade

Built for production and scale from day one. Fully observable and monitored, running securely in our cloud or yours.

Built for high-volume, high-throughput production

  • Zero data retention
  • Priority rate limits
  • Enhanced support
  • VPC and on-prem deployment

Available on Team and Enterprise plans.

Compare plans
Capabilities

Pension Statement processing highlights

Gross annuity amount
Federal and state withholding
Before-tax and after-tax deductions
Net pay
Current and year-to-date totals
Pay period and advice date
Recipient and account details
Net pay distribution
Image-only statements
Dates normalized to ISO
No per-system templates
Bounding box for every value
FAQs

Questions, answered

Yes. Give the current period and the year to date their own fields in your schema. Each amount comes back under its period, grounded to the cell in its own column.

Yes. Parsing works from the rendered page, so a statement saved as an image or as outlined vector text parses the same way as a native PDF. Every value is grounded to its position on the page.

No. A schema names the fields you want and describes them in plain language. Extraction reads the parsed statement for meaning, so one schema covers each system's own labels and tables.

Every extracted value carries the character range it was quoted from in the parsed Markdown. The Ground API maps that range to a page and a bounding box, so a reviewer sees each amount in the cell that printed it.

Start extracting pension statement data

Reliable, structured outputs with full traceability in minutes