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-mcpserver (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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da35ef44651326bd762e37441c9e427ec8762753228dafcb40fc0ed5deddebdc
|
|
| MD5 |
e78568a05cf6d2e157714dffc3f854db
|
|
| BLAKE2b-256 |
daf81aa5a67e8ca1a9304f2d58633961e06a476956a490352586c89bfc01a4a5
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
85b8a6a0b1a3f542299bfc8535460b76fc48d1133bd82a15c044204e6b17d447
|
|
| MD5 |
e8d0d9e53321d14149edbe1641da25ab
|
|
| BLAKE2b-256 |
7ec4d42e3f4853d48aa205921ec257badd352051581537438c49a70aa71ab439
|