Extracting data from certificates of insurance
An insurance broker issues a certificate of insurance on request, most often on the ACORD 25 form, filled in by the broker's agency system. General contractors and property managers collect one from every vendor and subcontractor, often hundreds, each renewed yearly. They arrive as emailed PDFs, portal uploads and the occasional fax.
Compliance needs the insured, each insurer, the policy numbers, the effective and expiration dates, and the limits. A COI tracking system compares those limits with the contract's insurance requirements and requests a new certificate before a policy expires.

What makes certificates of insurance hard
A ruled grid of merged cells
Each coverage row spans several lines, with the policy number and dates in tall merged cells beside a ladder of limit labels and amounts.
Checkboxes carry the terms
Checked boxes show whether general liability is written on an occurrence or claims-made basis, and whether its aggregate applies per policy, project or location.
Key terms in free text
Additional insured status and waivers of subrogation are often written into the description box, which can continue onto an attached ACORD 101 schedule.
Parse, extract, verify
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.
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.
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.
One certificate of insurance, end to end
About this document: An ACORD 25 certificate of liability insurance that the American Baseball Coaches Association publishes as a sample of the proof of coverage its members can request. Its broker issued it, naming the association as the insured. The single page fills two coverage rows, general liability and professional liability, and a full description of operations. The certificate holder box is blank, and a SAMPLE watermark crosses the grid.
Processing objective: The objective is to answer a certificate holder's question: who covers the insured, under which policy, for what period and up to what amount. Every value comes from the general liability row. Its policy number and dates sit in tall merged cells spanning the row.
Demonstration fields: Insurer A, General liability policy number, Policy effective date, Policy expiration date, Each occurrence limit
The document
1 page
Page 1shown below
Where each value came from

insurers[0].name
{
"value": "Sirius American Insurance Company",
"page": 1,
"range": {
"end": 1426,
"start": 1381
},
"box": {
"xmin": 0.50152,
"ymin": 0.21227,
"xmax": 0.88297,
"ymax": 0.22755
}
}coverages[0].policy_number
{
"value": "PLH03GL00001432",
"page": 1,
"range": {
"end": 2866,
"start": 2851
},
"box": {
"xmin": 0.34759,
"ymin": 0.39438,
"xmax": 0.54166,
"ymax": 0.50048
}
}coverages[0].effective_date
{
"value": "09/01/2026",
"page": 1,
"range": {
"end": 2897,
"start": 2887
},
"box": {
"xmin": 0.5416,
"ymin": 0.39438,
"xmax": 0.61829,
"ymax": 0.50049
}
}coverages[0].expiration_date
{
"value": "09/01/2027",
"page": 1,
"range": {
"end": 2928,
"start": 2918
},
"box": {
"xmin": 0.61829,
"ymin": 0.39437,
"xmax": 0.69444,
"ymax": 0.5005
}
}coverages[0].limits[0].amount
{
"value": "$ 1,000,000",
"page": 1,
"range": {
"end": 2972,
"start": 2961
},
"box": {
"xmin": 0.84162,
"ymin": 0.39435,
"xmax": 0.97094,
"ymax": 0.40954
}
}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
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.
