WSDOT Construction Bid Item Price Index avatar

WSDOT Construction Bid Item Price Index

Pricing

$10.00 / 1,000 price row delivereds

Go to Apify Store
WSDOT Construction Bid Item Price Index

WSDOT Construction Bid Item Price Index

Awarded low-bid unit prices for every line item on Washington State DOT highway/bridge construction contracts, parsed live from WSDOT's own bid-tabulation PDFs across three incompatible report layouts. Charged only per delivered price row.

Pricing

$10.00 / 1,000 price row delivereds

Rating

0.0

(0)

Developer

Kevin

Kevin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

An independent tool. It is not affiliated with, endorsed by, or operated by the Washington State Department of Transportation. WSDOT publishes its bid-tabulation records as a matter of public record under Washington's Public Records Act, RCW 42.56 (https://apps.leg.wa.gov/rcw/default.aspx?cite=42.56). This Actor reads WSDOT's own public bid-tabulation index and PDF reports and reports what it finds, parsed and reshaped into one schema.

Live per run. Every run fetches the requested month(s)' index page and every contract PDF listed on it fresh, straight from wsdot.wa.gov.


Why this exists

Washington highway/bridge construction bid prices are public, but reading them means opening one PDF per contract by hand, from an index that lists six years of history on twelve calendar-month pages rather than one year-month page per month. The PDFs themselves come from at least three different report-generator variants: which visual column is labelled "LOW BIDDER" shifts per contract (sometimes the middle column, not the first), and a contract with more than 3 bidders prints its entire item table again for the next group of bidders -- a naive parser double-counts every item. Roughly 1 in 5 real WSDOT bid-tab PDFs cannot be read as text at all (a "Microsoft: Print To PDF" export with no recoverable font, or a font with no usable character mapping) and this Actor detects and reports that honestly instead of guessing or crashing. DOTestimate, the closest self-service comparable, indexes 22 states but not Washington as of 2026-08-31 (see DOSSIER.md).

What you get per row

FieldMeaning
stateAlways WA
contract_number, ps_e_job_number, wsdot_project_numberWSDOT's own contract identifiers
county, region, highwayWhere the work is
project_titleThe project's own description, from WSDOT's index page
bids_opened_on, awarded_onContract dates, where the source provides them
item_number, item_category, item_labelThe bid item: its number, its section (e.g. "PREPARATION", "GRADING"), and WSDOT's own standard pay-item name
quantity, unit_of_measureHow much, in what unit
engineer_estimate_unit_price, engineer_estimate_amountWSDOT's own pre-bid estimate, per unit and extended, where the item type carries a per-unit price
low_bid_unit_price, low_bid_amountThe AWARDED low bidder's price -- per unit and extended -- the number that determined who won
low_bid_contractorThe company awarded the contract
number_of_biddersHow many companies bid on this contract
source_urlDirect link to WSDOT's own PDF, to verify
source_monthWhich requested YYYY-MM this row came from
chargedWhether this row cost you anything
not_charged_reasonWhy it did not, in plain English

The billing rule, stated plainly

One event: price row delivered, charged once per unique (contract_number, item_number) in the result. A contract that shows up again on a later run within the same month is charged again -- the same way puc-rate-case-tracker charges again for a docket that develops further, not a duplicate of the first charge.

Coverage -- read this before you rely on it

v1 covers Washington State (WSDOT) only. Oregon (ODOT) has a real, machine-parseable bid-item archive too, but DOTestimate's own FAQ already names Oregon as next on its roadmap -- treated as a future candidate, not built into v1. Not every WSDOT contract PDF can be read: SUMMARY.json in the run's key-value store reports exactly how many contracts were seen, how many parsed, and how many were unparseable and why.


Input

{
"months": ["2026-08"]
}

Leave months empty to check only the current calendar month -- WSDOT's own index groups every contract by calendar month across all years on one page, so requesting a broad range can mean a large, slow, expensive run. Invalid entries are ignored; if nothing valid remains, the current month is used.

Output

{
"state": "WA",
"contract_number": "XE3760",
"ps_e_job_number": "26Y012",
"wsdot_project_number": "XE3760",
"county": "KING",
"region": "SCR",
"highway": "SR 090",
"project_title": "I-90, EB 3 Miles E of North Bend - Emergency Seeding and Erosion Control Small Works Roster",
"bids_opened_on": "AUG 12 2026",
"awarded_on": "AUG 13 2026",
"item_number": "2",
"item_category": "EROSION CONTROL AND ROADSIDE PLANTING",
"item_label": "COIR LOG",
"quantity": 265.0,
"unit_of_measure": "L.F.",
"engineer_estimate_unit_price": 25.0,
"engineer_estimate_amount": 6625.0,
"low_bid_unit_price": 20.5,
"low_bid_amount": 5432.5,
"low_bid_contractor": "SCARSELLA BROS., INC.",
"number_of_bidders": 5,
"source_url": "https://wsdot.wa.gov/sites/default/files/2026-08/Contracts-bidtabulation-26Y012.pdf",
"source_month": "2026-08",
"charged": true,
"not_charged_reason": ""
}

A SUMMARY.json lands in the key-value store with which months were requested, how many contracts were seen/parsed/unparseable, and a charged/free breakdown.