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

Extracting data from MCS-90 endorsements

An insurer attaches an MCS-90 to a motor carrier's auto liability policy, guaranteeing payment of public liability judgments. FMCSA prescribes the wording, and each insurer types its entries onto the blanks. Freight brokers and shippers collect one from every carrier they vet, as a PDF inside a carrier packet or attached to an email.

A reviewer needs the carrier's exact name, the amended policy number, the insurer, the coverage basis and the limit per accident. A carrier onboarding system checks them against the insurer's FMCSA filing, then clears the carrier for loads or holds it for review.

Page 1 of a sample MCS-90 Endorsement, with extracted values outlined
10,240Markdown characters
54parse blocks
35fields extracted
The problem

What makes MCS-90 endorsements hard

Values typed into running sentences

Each entry sits on an underline inside a printed sentence. One line carries two label and value pairs, the policy number beside its effective date.

Coverage chosen by checkbox

Primary and excess cover are two printed sentences with a box each. The excess sentence adds a second blank for the underlying limit.

Printed limits for information only

Every MCS-90 prints a Schedule of Limits with federal minimums by type of carriage. The insured limit is the amount typed beside the checked box.

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 MCS-90 endorsement, end to end

About this document: A completed Form MCS-90 that Northland Insurance Company issued to BCT, Inc., the for-hire trucking subsidiary of Boise Paper. Boise Paper posts it in a carrier packet for shippers and brokers, and it appears here as published. It runs to three pages, and page 1 holds the typed entries and the primary or excess checkbox. Page 2 carries the operative wording, and page 3 the Schedule of Limits.

Processing objective: The objective is to establish which carrier is covered and by which insurer, under which policy and up to what amount per accident. Those are the facts a shipper or broker opens an MCS-90 to check. Every value comes from page 1, where labels and typed entries share running lines of text.

Demonstration fields: Motor carrier, Motor carrier state, Amending policy number, Insurance company, Primary limit per accident

The document

3 of 3 pages
  • Page 1 of the sample MCS-90 EndorsementPage 1shown below
  • Page 2 of the sample MCS-90 EndorsementPage 2
  • Page 3 of the sample MCS-90 EndorsementPage 3

Where each value came from

Page 1 of the sample MCS-90 Endorsement, with every featured field outlined
Motor carriermotor_carrier.name
BCT, INC.
The region of the sample MCS-90 Endorsement containing Motor carrier, with the extracted value outlined
extraction_metadata["motor_carrier.name"]
{
  "value": "BCT, INC.",
  "page": 1,
  "range": {
    "end": 2219,
    "start": 2176
  },
  "box": {
    "xmin": 0.14263,
    "ymin": 0.33537,
    "xmax": 0.92249,
    "ymax": 0.36016
  }
}
Motor carrier statemotor_carrier.state_or_province
Idaho
The region of the sample MCS-90 Endorsement containing Motor carrier state, with the extracted value outlined
extraction_metadata["motor_carrier.state_or_province"]
{
  "value": "Idaho",
  "page": 1,
  "range": {
    "end": 2265,
    "start": 2220
  },
  "box": {
    "xmin": 0.14378,
    "ymin": 0.36281,
    "xmax": 0.42024,
    "ymax": 0.38703
  }
}
Amending policy numberamending_policy_number
WF011842
The region of the sample MCS-90 Endorsement containing Amending policy number, with the extracted value outlined
extraction_metadata["amending_policy_number"]
{
  "value": "WF011842",
  "page": 1,
  "range": {
    "end": 2395,
    "start": 2334
  },
  "box": {
    "xmin": 0.1436,
    "ymin": 0.41365,
    "xmax": 0.91997,
    "ymax": 0.42941
  }
}
Insurance companyinsurance_company
Northland Insurance Company
The region of the sample MCS-90 Endorsement containing Insurance company, with the extracted value outlined
extraction_metadata["insurance_company"]
{
  "value": "Northland Insurance Company",
  "page": 1,
  "range": {
    "end": 2451,
    "start": 2396
  },
  "box": {
    "xmin": 0.14361,
    "ymin": 0.43656,
    "xmax": 0.92079,
    "ymax": 0.45137
  }
}
Primary limit per accidentcoverage.primary_limit_per_accident
750,000
The region of the sample MCS-90 Endorsement containing Primary limit per accident, with the extracted value outlined
extraction_metadata["coverage.primary_limit_per_accident"]
{
  "value": "750,000",
  "page": 1,
  "range": {
    "end": 2783,
    "start": 2663
  },
  "box": {
    "xmin": 0.14364,
    "ymin": 0.56469,
    "xmax": 0.89584,
    "ymax": 0.57793
  }
}

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

MCS-90 Endorsement processing highlights

Primary or excess checkbox
Limit per accident
Underlying limit for excess cover
Values typed on underlines
Shared-line label pairs
Exact motor carrier name
Insurer and policy number
Countersignature detection
Schedule of Limits table
FMCSA verification phone number
Cancellation notice periods
Bounding box for every value
FAQs

Questions, answered

Yes. Parsing renders each checkbox as checked or unchecked beside its sentence. A schema field for the coverage basis comes back primary or excess. The limit is read from the checked line, and the underlying limit for excess cover is a field of its own.

Yes. A signature parses as an attestation block, labeled SIGNED, with a short description of the mark. A boolean field in the schema can record whether the insurer's representative countersigned, while the signature's location on the page stays available for review.

Yes. The schedule parses as a table, and each row returns the type of carriage, the commodity transported and the minimum limit. Every cell is grounded to its own location, so a reviewer can check any minimum against the page.

Yes. A carrier packet bundles the MCS-90 with the carrier's operating authority and a W-9. Classify labels each page with document classes you define, and Parse can then process only the MCS-90 pages.

Extract returns a character range in the parsed Markdown for every value. The Ground API turns those ranges into a page number and bounding box, so a review screen can highlight the limit on the endorsement itself.

Start extracting MCS-90 endorsement data

Reliable, structured outputs with full traceability in minutes