Contractor License Data Catalog
Nightly license verification across 7 state and municipal boards in CA, FL, NY, and TX, normalized into a single schema. Sourced directly from board portals and rolled up with a disciplinary feed and a 4-level risk tier.
Geographic Coverage
4 states (CA, FL, NY, TX) and growing. NY contractor licensing is municipal in NYC (DOB + DCWP); upstate NY uses DOS for some licenses.
Board Coverage
7 boards: CA CSLB, FL DBPR, NYC DCWP, NY DOB, NYC DOS, TX TDLR, and TX TSBPE. Additional states added quarterly based on subscriber demand.
Refresh Cadence
Board crawls run nightly. Risk tier recomputes on the same cycle. Insurer-tier subscribers receive webhooks the moment a status diff is observed.
License Boards Registry
All plansCanonical list of every licensing board we crawl. State, board name, source URL, and a `last_scraped_at` timestamp showing when each board was most recently refreshed. The anchor table for every other contractor dataset.
Source
Curated registry — state and municipal contractor licensing portals
Update Frequency
Stable (updated when new boards are added; `last_scraped_at` updates per scraper pass)
Coverage
7 boards at launch (CA CSLB, FL DBPR, NYC DCWP, NY DOB, NYC DOS, TX TDLR, TX TSBPE), expanding quarterly
Key Fields
idnamestateurllast_scraped_atcreated_atSample Data
| id | ca-cslb |
| name | California Contractors State License Board |
| state | CA |
| last_scraped_at | 2026-04-25T08:14:00Z |
Contractors
All plans (risk_tier: Insurer only)Per-contractor license records, normalized across boards. License number, board, business name, DBA, owner name, license type, specialty codes, status, issue/expiration dates, address, phone. Updated nightly on UPSERT against `(license_number, board_id)`.
Source
Nightly board crawls
Update Frequency
Nightly (UPSERT — current state, not append-only)
Coverage
Every contractor licensed by one of the 7 boards. Initial backfill seeds the table; nightly passes keep status, expiration, and address current.
Key Fields
license_numberboard_idbusiness_namedba_nameowner_namelicense_typespecialty_codesstatusissue_dateexpiration_dateaddresscitystatezipphonerisk_tiercomplaint_countdisciplinary_action_countSample Data
| license_number | 1234567 |
| board_id | ca-cslb |
| business_name | ACME Construction Inc. |
| license_type | B — General Building Contractor |
| status | active |
| expiration_date | 2027-08-15 |
Discipline-Only Licensees
Platform+ (per-trade disambiguation available on all plans)Licensees with public regulatory action records but no current active license on file — denied applications, revocations, and voluntary surrenders. Most lookup tools return 'not found' for these and discard the regulatory record. We surface them through the same lookup endpoint with `result_type='discipline_only'` and `license_type` populated for collision disambiguation. Multi-row response when a license number is shared across trades on the same board.
Source
Board enforcement portals (nightly) — surfaced when license_number does not resolve to an active contractors-table row
Update Frequency
Nightly (append-only)
Coverage
Live today: TX TDLR + NYC DOB. Roadmap: CA CSLB revoked-licensee expansion, FL DBPR surrender feed, NY DOS, NYC DCWP. NOT 100% coverage — bound to the boards that publish disciplinary feeds we can scrape.
Key Fields
result_typelicense_numberboard_idlicense_typeentity_nameaction_dateaction_typecase_numberviolation_descriptionsource_urlSample Data
| result_type | discipline_only |
| license_number | 1094 |
| board_id | nyc-dob |
| license_type | Master Plumber |
| action_type | revocation |
| entity_name | [respondent name on file] |
Disciplinary Actions
Platform+Every disciplinary action filed against a licensed contractor — citation, suspension, revocation, voluntary surrender — with action date, source case number, and short description. Append-only (we never overwrite history); same case appears once per board per filing event. Action rows are linked to the contractor when the license resolves; otherwise they live on the discipline-only surface above.
Source
Board enforcement portals (nightly)
Update Frequency
Nightly (append-only)
Coverage
All boards in the registry. Depth grows daily from launch; we capture historical filings where the board exposes them.
Key Fields
contractor_idboard_idaction_dateaction_typecase_numberdescriptionsource_urlSample Data
| action_type | citation |
| action_date | 2025-11-12 |
| case_number | C-2025-04829 |
| description | Failure to maintain workers' comp on active project |
Risk Tier
InsurerRolled-up 4-level risk score per contractor (`low / moderate / elevated / high`), recomputed nightly from disciplinary frequency, complaint count, license currency, and specialty volatility. Surfaced as a column on the contractors table for Insurer-tier subscribers.
Source
Computed in-platform from contractors + disciplinary_actions
Update Frequency
Nightly
Coverage
Every contractor in the registry with a baseline of disciplinary + license history (a contractor is 'low' by default until enough history accumulates to escalate).
Key Fields
risk_tiercomplaint_countdisciplinary_action_countSample Data
| risk_tier | elevated |
| complaint_count | 7 |
| disciplinary_action_count | 3 |
Bulk Lookup
Platform+POST a list of license numbers or business names to a single endpoint; get back a normalized status report across every board in one response. Designed for marketplace re-verification and book-of-business sweeps.
Source
Live query against the contractors registry
Update Frequency
On demand (per Platform/Insurer-tier rate limit)
Coverage
All 7 boards in a single call. Throughput governed by the API rate-limit on your plan.
Key Fields
request_payloadresponse_envelopematch_confidenceSample Data
| matched | 2,322 |
| expired | 41 |
| suspended | 9 |
| unmatched | 28 |
Webhook Alerts
InsurerSubscribe a contractor or a license number; get a webhook the moment status changes — license suspended/revoked, new disciplinary action filed, or risk tier escalates. Built for bond-monitoring and trust-and-safety systems.
Source
Triggered on diff between consecutive nightly snapshots (real-time delivery on the next pass)
Update Frequency
Real time (next nightly pass after the change is observed)
Coverage
All contractors + boards in the registry
Key Fields
event_typecontractor_idboard_idlicense_numberprevious_statusnew_statusoccurred_atSample Data
| event_type | license.suspended |
| license_number | 482991 |
| previous_status | active |
| new_status | suspended |
Sample API Response
Every endpoint returns the same envelope shape: data for the result and meta for plan + rate-limit context.
GET /api/v1/contractors/lookup?license_number=1234567&board_id=ca-cslb
200 OK{
"data": {
"license_number": "1234567",
"board_id": "ca-cslb",
"business_name": "ACME Construction Inc.",
"dba_name": null,
"owner_name": "Jane Doe",
"license_type": "B - General Building Contractor",
"specialty_codes": ["B"],
"status": "active",
"issue_date": "2014-03-22",
"expiration_date": "2027-08-15",
"address": "1234 Market St, San Francisco, CA 94103",
"phone": "415-555-0142",
"risk_tier": "low",
"complaint_count": 0,
"disciplinary_action_count": 0,
"disciplinary_actions": []
},
"meta": {
"plan": "con-platform",
"rate_limit_remaining": 1923,
"rate_limit_reset": "2026-05-01T00:00:00Z"
}
}Methodology
We pull contractor license records directly from the authoritative state and municipal portals nightly. Records are UPSERTed against the natural key (license_number, board_id), so the contractors table reflects current state — status, expiration, address — at the most recent nightly pass. Disciplinary actions are append-only (we never overwrite history) and are deduplicated against a heuristic key of (contractor_id, board_id, action_date, action_type, case_number). Risk tier is recomputed on every nightly pass from disciplinary frequency, complaint count, license currency, and specialty volatility — it is a screening signal, not a substitute for full underwriting. New York contractor licensing is largely municipal in NYC (DOB and DCWP), so we treat those as separate boards rather than rolling them under NY DOS; the NY DOS row remains seeded as a state-level catch-all for non-construction NY occupational licenses.
Discipline-only surface: licensees with public regulatory action records but no active license on file (denied applications, revocations, voluntary surrenders) are NOT discarded. They're surfaced through the same lookup endpoint with result_type='discipline_only' and a populated license_type field. Coverage today: TX TDLR + NYC DOB; CA CSLB / FL DBPR / NY DOS / NYC DCWP follow on the roadmap. We're honest about the limits — discipline-only is bound to boards that publish disciplinary feeds we can scrape, so coverage is not 100% across the corpus.
Identity tuple is per-trade: some boards (most prominently NYC DOB) issue colliding license numbers across license_types — the same numeric license_no can belong to two different humans in two different trades. The correct identity tuple is (license_number, board_id, license_type), not the (number, board) pair tools usually assume. Our lookup returns multi-row responses when license_number is shared across trades, with each row labeled by license_type so customers can disambiguate. This per-trade labeling ships on every plan, including General Contractor, because without it a customer can't tell which record is “their” licensee.
Dataset Access by Plan
Higher-tier plans unlock additional datasets, programmatic access, and webhook delivery.
| Dataset | GC | Platform | Insurer |
|---|---|---|---|
| License Boards Registry | |||
| Contractors (license verification) | |||
| Per-trade disambiguation (tell colliding license numbers apart) | |||
| Discipline-Only Surface (denied / revoked / surrendered records) | |||
| Disciplinary Actions (full reason text + history) | |||
| Bulk Lookup endpoint | |||
| API access | |||
| Risk Tier classification | |||
| Bond Status tracking (CA) | |||
| Webhook Alerts |
State + Board Coverage
7 boards across 4 states at launch. Additional states prioritized by subscriber demand.
California
CA CSLB statewide contractor licensing
Florida
FL DBPR Business & Professional Regulation
New York
NY DOS statewide + NYC DOB + NYC DCWP municipal
Texas
TX TDLR + TX TSBPE statewide licensing & regulation
Boards Covered
California Contractors State License Board
CAStatewide contractor licensing — the canonical CA source
ca-cslb
Florida Department of Business and Professional Regulation
FLStatewide construction industry licensing
fl-dbpr
NYC Department of Consumer and Worker Protection
NYNYC Home Improvement Contractors and Home Improvement Salespersons
nyc-dcwp
New York Department of State
NYStatewide catch-all for occupational licenses (sparse on contractors — see NYC)
ny-dos
NYC Department of Buildings
NYNYC general construction + specialty trade licenses (electrical, plumbing, asbestos abatement, site safety)
nyc-dob
Texas Department of Licensing and Regulation
TXStatewide specialty trade + occupational licensing
tx-tdlr
Texas State Board for Plumbing Examiners
TXStatewide professional plumbing licensing
tx-tsbpe
Crawls run nightly. New boards evaluated quarterly based on market demand and data accessibility.