Extracting data from bid tabulations
Public owners and their consulting engineers publish a bid tabulation after each bid opening, laid out in their own spreadsheets. Estimators and construction cost data services collect them from every agency in their market, letting after letting. They arrive as posted PDFs, Excel downloads and scans of handwritten opening sheets.
Estimating needs each bidder's name, total bid and unit price for every line item, beside the engineer's estimate. A cost database or estimating system stores those unit prices by item and region, and prices the next bid from that history.

What makes bid tabulations hard
Prices come in column pairs
Each bidder's unit price and total sit side by side under one merged header cell that names the bidder.
Alternates repeat the whole grid
Each alternate restates the bidder header and its own line items, so one bidder's prices span several schedules and pages.
A layout for every agency
Each engineer and agency builds its own tabulation spreadsheet, varying the bidder count, the column order and where the submittal checklist sits.
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 bid tabulation, end to end
About this document: A bid tabulation for a sewer collection system project in Jackson Township, Indiana, posted by Commonwealth Engineers, the engineer of record. Four landscape pages: the base bid on page 1, mandatory alternates on pages 2 and 3, and grand totals with the engineer's certification on page 4. Page 1 is featured. Every bidder is a company.
Processing objective: The objective is to read the result of the opening: what the engineer expected the base bid to cost, who bid lowest and at what price. The low bid of $1,117,809.00 came in under the $1,186,195.00 estimate, with its bid bond received. Item 3's unit price tests the column pairing.
Demonstration fields: Engineer's Estimate total base bid, Low bidder, Low bidder total base bid, Low bidder bid bond received, Engineer's unit price for item 3 (railroad casing pipe)
The document
4 of 4 pages
Page 1shown below
Page 2
Page 3
Page 4
Where each value came from

engineers_estimate.total_base_bid
{
"value": 1186195,
"page": 1,
"range": {
"end": 5699,
"start": 5686
},
"box": {
"xmin": 0.44813,
"ymin": 0.78117,
"xmax": 0.51669,
"ymax": 0.80178
}
}bidders[0].name
{
"value": "Yarberry Companies, Inc.",
"page": 1,
"range": {
"end": 524,
"start": 461
},
"box": {
"xmin": 0.51655,
"ymin": 0.20908,
"xmax": 0.65387,
"ymax": 0.26901
}
}bidders[0].total_base_bid
{
"value": 1117809,
"page": 1,
"range": {
"end": 5730,
"start": 5717
},
"box": {
"xmin": 0.58533,
"ymin": 0.78119,
"xmax": 0.65391,
"ymax": 0.80185
}
}bidders[0].bid_bond
{
"value": "Yes",
"page": 1,
"range": {
"end": 833,
"start": 830
},
"box": {
"xmin": 0.51654,
"ymin": 0.28754,
"xmax": 0.65385,
"ymax": 0.30758
}
}bid_schedules[0].line_items[2].engineers_estimate_unit_price
{
"value": 623,
"page": 1,
"range": {
"end": 2175,
"start": 2168
},
"box": {
"xmin": 0.37729,
"ymin": 0.49161,
"xmax": 0.44842,
"ymax": 0.5096
}
}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.
