Data & caveats
Everything on this site is built from public data — no records requests, no private sources. This page lists the sources, the known limitations, and how to reproduce the pipeline.
Sources
- Certified payrolls: data.ny.gov Socrata resource
w2zp-sf2x— 588,505 wage lines for work weeks 2026-01-01 through 2026-07-20, filed by the contractors themselves. - Prevailing-wage schedules: New York State Department of Labor Article 8 schedules — the archived 2025–2026 statewide edition and the current 2026–2027 per-county editions from the Wage Protection Portal, all 62 counties, including the Registered Apprentices sections.
- Debarment list: NYSDOL Bureau of Public Work debarment list (July 20, 2026 edition), used only for validation.
- County attribution: U.S. Census ZCTA-to-county file and the Census 2023 gazetteer.
Known limitations
- Supplements are not screened. The comparison is cash wage against the scheduled base rate. Prevailing-wage law also requires supplemental benefits; whether a contractor paid them, in cash or in kind, is not visible in this dataset. A contractor paying a below-floor cash wage may lawfully be paying the balance as supplements in cash — one of the reasons findings are candidates, not determinations.
- Apprenticeship registration is not verifiable from public data. The Tier-2 screen removes findings whose paid rate matches a scheduled apprentice rate, but a registered apprentice paid an off-schedule rate would survive the screen. Registration records are not public.
- Classification mapping is conservative but not perfect. The filed work-category text is mapped to schedule trade families; where no defensible mapping exists, the line is logged as unmatched (766 lines) rather than force-matched. The minimum-family floor means a misclassification within a family can only make the screen more lenient, not less.
- The weekly gross-wages field spans all of a worker’s work, while the hours fields are project-specific. Agreement between the two is used as one-sided corroboration; disagreement carries no signal and is never used against a contractor.
- Exposure figures are indicative, computed as shortfall per hour × reported project hours on flagged lines. They are screening magnitudes for prioritization — not damages, which would require supplement accounting, full work-period records, and adjudicated classifications.
Accounting for every line
The pipeline drops nothing silently. Of 588,505 harvested lines, 554,606 are journeyworker lines with plausible hourly rates and were screened; the remainder are non-journeyworker labels or out-of-range rates, all counted. 1,709 screened lines could not be matched (766 with no defensible category mapping, 943 with genuinely unresolvable multi-county locations) and are logged as unmatched.
Reproducibility
The pipeline is plain Python (standard library only) plus pdftotext, writing to a single SQLite database: harvest, county attribution, rate-library parsing for both schedule periods, the Tier-1 flag engine, the apprentice-rate library, the Tier-2 screen, and the exports that feed this site. The whitepaper documents each stage; the run order is a fixed sequence of eight scripts.
Corrections
If you believe any entry on this site is in error — a misattributed county, a wrong floor, a name collision, or any other issue — contact thomas@concoursetech.com. Corrections are reviewed promptly and errata are noted.