Intel TerrainIntel Terrain

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 plans

Canonical 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_at

Sample Data

idca-cslb
nameCalifornia Contractors State License Board
stateCA
last_scraped_at2026-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_count

Sample Data

license_number1234567
board_idca-cslb
business_nameACME Construction Inc.
license_typeB — General Building Contractor
statusactive
expiration_date2027-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_url

Sample Data

result_typediscipline_only
license_number1094
board_idnyc-dob
license_typeMaster Plumber
action_typerevocation
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_url

Sample Data

action_typecitation
action_date2025-11-12
case_numberC-2025-04829
descriptionFailure to maintain workers' comp on active project

Risk Tier

Insurer

Rolled-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_count

Sample Data

risk_tierelevated
complaint_count7
disciplinary_action_count3

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_confidence

Sample Data

matched2,322
expired41
suspended9
unmatched28

Webhook Alerts

Insurer

Subscribe 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_at

Sample Data

event_typelicense.suspended
license_number482991
previous_statusactive
new_statussuspended

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.

DatasetGCPlatformInsurer
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

CA

Statewide contractor licensing — the canonical CA source

ca-cslb

Florida Department of Business and Professional Regulation

FL

Statewide construction industry licensing

fl-dbpr

NYC Department of Consumer and Worker Protection

NY

NYC Home Improvement Contractors and Home Improvement Salespersons

nyc-dcwp

New York Department of State

NY

Statewide catch-all for occupational licenses (sparse on contractors — see NYC)

ny-dos

NYC Department of Buildings

NY

NYC general construction + specialty trade licenses (electrical, plumbing, asbestos abatement, site safety)

nyc-dob

Texas Department of Licensing and Regulation

TX

Statewide specialty trade + occupational licensing

tx-tdlr

Texas State Board for Plumbing Examiners

TX

Statewide professional plumbing licensing

tx-tsbpe

Crawls run nightly. New boards evaluated quarterly based on market demand and data accessibility.

Access contractor data today

7-day free trial on every plan.