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

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.

Page 1 of a sample Bid Tabulation, with extracted values outlined
24,212Markdown characters
1,218parse blocks
1,297fields extracted
The problem

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.

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 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 1 of the sample Bid TabulationPage 1shown below
  • Page 2 of the sample Bid TabulationPage 2
  • Page 3 of the sample Bid TabulationPage 3
  • Page 4 of the sample Bid TabulationPage 4

Where each value came from

Page 1 of the sample Bid Tabulation, with every featured field outlined
Engineer's Estimate total base bidengineers_estimate.total_base_bid
1,186,195
The region of the sample Bid Tabulation containing Engineer's Estimate total base bid, with the extracted value outlined
extraction_metadata["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
  }
}
Low bidderbidders[0].name
Yarberry Companies, Inc.
The region of the sample Bid Tabulation containing Low bidder, with the extracted value outlined
extraction_metadata["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
  }
}
Low bidder total base bidbidders[0].total_base_bid
1,117,809
The region of the sample Bid Tabulation containing Low bidder total base bid, with the extracted value outlined
extraction_metadata["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
  }
}
Low bidder bid bond receivedbidders[0].bid_bond
Yes
The region of the sample Bid Tabulation containing Low bidder bid bond received, with the extracted value outlined
extraction_metadata["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
  }
}
Engineer's unit price for item 3 (railroad casing pipe)bid_schedules[0].line_items[2].engineers_estimate_unit_price
623
The region of the sample Bid Tabulation containing Engineer's unit price for item 3 (railroad casing pipe), with the extracted value outlined
extraction_metadata["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
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

Bid Tabulation processing highlights

Every bidder's unit prices
Engineer's estimate column
Base bid and alternates
Merged bidder header cells
Unit price and total pairs
Submittal checklist grids
Deduct items as negatives
Schedule and grand totals
Low bidder identification
Excel and PDF tabulations
No per-agency templates
Bounding box for every value
FAQs

Questions, answered

Yes. Define the line items as an array in your schema, with a unit price and total for the engineer's estimate and for each bidder. Each line comes back as its own entry, with every price paired to the bidder whose column printed it.

Yes. Describe the bid schedules as an array, each with its own totals and line items. The base bid and every alternate come back separately, so each bidder's grand total can be checked against its schedules.

Yes. Describe each checklist entry, such as the bid bond, as a field on the bidder. Extraction pairs each mark with the bidder column and the document row it sits in, and grounds it to its own cell.

Yes. Parse accepts XLSX and CSV files as well as PDFs and scans. Spreadsheet content is grounded by cell, so each price comes back with a sheet name and cell address in Excel notation.

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 price in the cell that printed it.

Start extracting bid tabulation data

Reliable, structured outputs with full traceability in minutes