Contractor License Data Catalog
Nightly license verification across 6 state and municipal boards in CA, TX, FL, and NYC, 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, TX, FL, NY) and growing. NY contractor licensing is municipal in NYC (DOB + DCWP); upstate NY uses DOS for some licenses.
Board Coverage
6 boards: CA CSLB, TX TDLR, FL DBPR, NY DOS, NYC DOB, NYC DCWP. 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
6 boards at launch (CA CSLB, TX TDLR, FL DBPR, NY DOS, NYC DOB, NYC DCWP), 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 6 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
All plans (visibility + license_type) · Platform+ (full reason text + history)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 6 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. The discriminator field ships on every plan, including General Contractor, because without it a customer can't tell which row 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) | |||
| Discipline-Only Surface (visibility + license_type) | |||
| Disciplinary Actions (full reason text + history) | |||
| Bulk Lookup endpoint | |||
| API access | |||
| Risk Tier classification | |||
| Bond Status tracking | |||
| Webhook Alerts |
State + Board Coverage
6 boards across 4 states at launch. Additional states prioritized by subscriber demand.
California
CA CSLB statewide contractor licensing
Texas
TX TDLR statewide licensing & regulation
Florida
FL DBPR Business & Professional Regulation
New York
NY DOS statewide + NYC DOB + NYC DCWP municipal
Boards Covered
California Contractors State License Board
CAStatewide contractor licensing — the canonical CA source
ca-cslb
Texas Department of Licensing and Regulation
TXStatewide specialty trade + occupational licensing
tx-tdlr
Florida Department of Business and Professional Regulation
FLStatewide construction industry licensing
fl-dbpr
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
NYC Department of Consumer and Worker Protection
NYNYC Home Improvement Contractors and Home Improvement Salespersons
nyc-dcwp
Crawls run nightly. New boards evaluated quarterly based on market demand and data accessibility.