Take a live AI-guided product tour with Lando.Launch AI demo
Document type

Extracting data from auto loss runs

A fleet's insurer prints each auto loss run in its own layout, listing every collision, theft and liability claim on the vehicles. Commercial auto underwriters often request several years of history with each submission, often from several prior carriers. Brokers forward the runs as PDF email attachments.

Underwriting needs each claim's loss date, cause of loss, amount paid, recoveries and total incurred, along with each year's totals. A rating workbook loads them to measure claim frequency and severity across the fleet, which sets the renewal price and the deductible on offer.

Page 1 of a sample Auto Loss Run, with extracted values outlined
24,571Markdown characters
1,316parse blocks
1,170fields extracted
The problem

What makes auto loss runs hard

One fleet, several coverage sections

A run often reports auto liability and physical damage as separate sections for one fleet, each with its own policy ID and year totals.

Recoveries can exceed the payment

Subrogation against another driver and salvage on a written-off vehicle can return more than the carrier paid, so total incurred sits far below paid.

Cause of loss in carrier wording

One carrier prints STRUCK AN ANIMAL where another prints a coverage code, and both claims have to land in the same category for rating.

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 auto loss run, end to end

About this document: The Automobile Physical Damage section of a claim report from the Texas Association of Counties Risk Management Pool, posted by Cameron County with an insurance request for proposal. Its 4 landscape pages list claims on the county's vehicles under five policy years. Each year opens with a policy header and closes with a Totals row. Page 1 is featured. The liability pages, which name private claimants, were removed before publication.

Processing objective: The objective is to follow one physical damage claim from its policy header down to the Totals row for its year. The claim is an animal strike, and its $13,043 total incurred is the largest of that year. It rolls into the $17,240 printed for the year as a whole.

Demonstration fields: Policy ID, Claim number, Cause of loss, Claim total incurred, Policy-year total incurred

The document

4 of 4 pages
  • Page 1 of the sample Auto Loss RunPage 1shown below
  • Page 2 of the sample Auto Loss RunPage 2
  • Page 3 of the sample Auto Loss RunPage 3
  • Page 4 of the sample Auto Loss RunPage 4

Where each value came from

Page 1 of the sample Auto Loss Run, with every featured field outlined
Policy IDpolicies[1].policy_id
RMP-00370-201107
The region of the sample Auto Loss Run containing Policy ID, with the extracted value outlined
extraction_metadata["policies[1].policy_id"]
{
  "value": "RMP-00370-201107",
  "page": 1,
  "range": {
    "end": 1011,
    "start": 984
  },
  "box": {
    "xmin": 0.21536,
    "ymin": 0.2955,
    "xmax": 0.35817,
    "ymax": 0.31367
  }
}
Claim numberpolicies[1].claims[1].claim_number
APD201102084-1
The region of the sample Auto Loss Run containing Claim number, with the extracted value outlined
extraction_metadata["policies[1].claims[1].claim_number"]
{
  "value": "APD201102084-1",
  "page": 1,
  "range": {
    "end": 1266,
    "start": 1252
  },
  "box": {
    "xmin": 0.02248,
    "ymin": 0.33035,
    "xmax": 0.18898,
    "ymax": 0.34667
  }
}
Cause of losspolicies[1].claims[1].cause_of_loss
STRUCK AN ANIMAL
The region of the sample Auto Loss Run containing Cause of loss, with the extracted value outlined
extraction_metadata["policies[1].claims[1].cause_of_loss"]
{
  "value": "STRUCK AN ANIMAL",
  "page": 1,
  "range": {
    "end": 1421,
    "start": 1405
  },
  "box": {
    "xmin": 0.74533,
    "ymin": 0.33053,
    "xmax": 0.96859,
    "ymax": 0.34685
  }
}
Claim total incurredpolicies[1].claims[1].total_incurred
13,043
The region of the sample Auto Loss Run containing Claim total incurred, with the extracted value outlined
extraction_metadata["policies[1].claims[1].total_incurred"]
{
  "value": 13043,
  "page": 1,
  "range": {
    "end": 1341,
    "start": 1334
  },
  "box": {
    "xmin": 0.42521,
    "ymin": 0.33045,
    "xmax": 0.48495,
    "ymax": 0.34674
  }
}
Policy-year total incurredpolicies[1].totals.total_incurred
17,240
The region of the sample Auto Loss Run containing Policy-year total incurred, with the extracted value outlined
extraction_metadata["policies[1].totals.total_incurred"]
{
  "value": 17240,
  "page": 1,
  "range": {
    "end": 5882,
    "start": 5875
  },
  "box": {
    "xmin": 0.37613,
    "ymin": 0.76985,
    "xmax": 0.48543,
    "ymax": 0.78819
  }
}

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. VPC and on-prem deployment require an Enterprise plan.

Compare plans
Capabilities

Auto Loss Run processing highlights

Claims grouped by policy year
Collision and comprehensive claims
Liability and physical damage lines
Cause of loss as printed
Paid, recovered and deductible amounts
Open reserves per claim
Recoveries larger than paid
Open, closed and reopened status
Year totals for reconciliation
Wide landscape claim tables
Runs from any carrier
Cell-level bounding boxes
FAQs

Questions, answered

Yes. Each field carries a description, and the x-alternativeNames keyword lists the other labels carriers print for it, such as Pool Paid for the paid amount. Extraction matches fields by meaning, so each carrier's column lands in the same field.

Model the policy years as an array, with each year holding its policy ID, its claims array and its Totals row. Every claim then comes back nested under the policy header it was printed beneath.

Yes. Give each dollar column its own number field, and name the columns in printed order in the claims array's description. Paid, recoveries, outstanding reserve, deductible and total incurred each come back as their own value.

Yes. Extract the Totals row as its own object beside the claims array, then sum each dollar field across the year's claims in your own code. A match with the printed total confirms the year before its figures reach a rating model.

Send the extraction and its parse to the Ground API. A value printed in a claim table comes back matched to the table cell that holds it. That cell carries a page number and a bounding box, so a reviewer sees the amount in its row.

Start extracting auto loss run data

Reliable, structured outputs with full traceability in minutes