Skip to main content

Read messy construction sub-quotes, bid packages & spec PDFs into clean structured data — and catch the scope gaps/exclusions vendors bury. Every value cited to its page.

Project description

BidReader

Read messy construction sub-quotes, bid packages & spec PDFs into clean structured data — and catch the scope gaps and exclusions vendors bury in the fine print. Every value is cited to its page and exact source text.

MIT · pip install bidreader · works on the PDFs estimators actually get.

"Manually typing numbers from a PDF into Excel because the formatting is a crime scene… hunting for the one line where a sub quietly excluded 'trash removal' in size-8 font." — r/Construction (498 upvotes)

BidReader is that junior who never sleeps: it doesn't write anything new — it finds what's already there and points to it.


What it does

pip install bidreader
export REQUESTY_API_KEY=...        # or OPENROUTER_API_KEY / GEMINI_API_KEY (free tier works)
bidreader sub_quote.pdf
from bidreader import read
doc = read("sub_quote.pdf")
doc.line_items     # [{section, description, qty, unit, amount, page}, ...]
doc.exclusions     # [{item, quote, page, risk}, ...]   <- the stuff they buried
doc.scope_gaps     # trade-standard scope NOT mentioned (confirm before you bid)
doc.to_json()

Real output (drywall sub-quote, exclusion buried in size-7 font)

LINE ITEMS (5):
  09 22 16  Metal stud framing, 3-5/8" 25ga walls   12400 SF   $35,340.00  p1
  09 29 00  5/8" Type X gypsum board, both faces     24800 SF   $40,920.00  p1
  09 29 00  Tape & finish, Level 4                   24800 SF   $23,560.00  p1
  ...                                                 BID TOTAL  $121,628.00

!!  EXCLUSIONS CAUGHT (4):
  - Fire-stopping/firecaulking  (page 1)
      "this proposal EXCLUDES fire-stopping/firecaulking at rated assemblies"
      risk: life-safety scope; another trade or a change order eats this cost.
  - Debris removal/haul-off  (page 1)
      "removal/haul-off of construction debris (by others)"
  ...

SCOPE GAPS TO CONFIRM (5):
  - Acoustic ceiling tiles -- grid framing is included but the tiles within it are not.
  - Rough carpentry blocking/backing for fixtures -- not mentioned.

Why

The construction-AI gold rush is all building the same crowded, resisted thing — autonomous takeoff. The loudest, most-repeated, unmet estimator pain is upstream and downstream of it: turning crime-scene PDFs into clean data and catching what subs quietly excluded. No permissive library does this. BidReader is that primitive.

  • MIT — depend on it inside your commercial estimating/BIM product (no AGPL/NC contamination).
  • Provider-agnostic — Requesty, OpenRouter, or Google AI Studio (free tier).
  • Cited — every number traces to a page + the exact source text. Trust is the real adoption blocker; this is built for it.

Use it from an AI agent (MCP)

Any MCP client — Claude Desktop, Cursor, etc. — can call BidReader:

pip install "bidreader[mcp]"
{
  "mcpServers": {
    "bidreader": {
      "command": "bidreader-mcp",
      "env": { "REQUESTY_API_KEY": "rqsty-..." }
    }
  }
}

Tools exposed: read_document(path), catch_exclusions(path), extract_line_items(path). Now your agent can answer "which subs excluded fire-stopping?" across a bid folder.

Roadmap

  • Scanned-PDF vision OCR path · revision/addendum diff ("what changed between Addendum 3 and 4") · bidreader-mcp server (any agent can call it) · Excel/CSV export · multi-quote leveling (compare subs side-by-side).

License

MIT.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bidreader-0.2.0.tar.gz (7.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bidreader-0.2.0-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file bidreader-0.2.0.tar.gz.

File metadata

  • Download URL: bidreader-0.2.0.tar.gz
  • Upload date:
  • Size: 7.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for bidreader-0.2.0.tar.gz
Algorithm Hash digest
SHA256 da35ef44651326bd762e37441c9e427ec8762753228dafcb40fc0ed5deddebdc
MD5 e78568a05cf6d2e157714dffc3f854db
BLAKE2b-256 daf81aa5a67e8ca1a9304f2d58633961e06a476956a490352586c89bfc01a4a5

See more details on using hashes here.

File details

Details for the file bidreader-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: bidreader-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 9.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for bidreader-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 85b8a6a0b1a3f542299bfc8535460b76fc48d1133bd82a15c044204e6b17d447
MD5 e8d0d9e53321d14149edbe1641da25ab
BLAKE2b-256 7ec4d42e3f4853d48aa205921ec257badd352051581537438c49a70aa71ab439

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page