State Boards
US Contractor License Lookup & List Scraper (State Boards)
Verify contractor licenses or export whole-state contractor lists across 39 US jurisdictions in one run - enumerated verdicts, the board cited on every row.
Verification
Output fields
Authoritative field set from the dataset schema.
| Field | Type |
|---|---|
verdict | string|null |
verdict_reason | string|null |
verdict_basis | string|null |
requested_company | string|null |
requested_license_number | string|null |
requested_state | string|null |
entity_name | string|null |
license_number | string|null |
license_type | string|null |
status_raw | string|null |
expiry_date | string|null |
days_to_expiry | integer|null |
city | string|null |
source_portal | string|null |
source_state | string|null |
notice | string|null |
notice_type | string|null |
coverage_note | string|null |
source_url | string|null |
Sample row
{
"verdict": "active",
"verdict_reason": "status 'This license is current and active.', expires 2027-10-31",
"verdict_basis": "status+expiry_date",
"requested_company": null,
"requested_license_number": "22726",
"requested_state": "CA",
"entity_name": "RANSOME COMPANY",
"license_number": "22726",
"license_type": null,
"status_raw": "This license is current and active.",
"expiry_date": "10/31/2027",
"days_to_expiry": 451,
"source_portal": "CSLB",
"source_url": "https://www.cslb.ca.gov/OnlineServices/CheckLicenseII/LicenseDetail.aspx?LicNum=22726"
} Inputs
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
mode | string | no | "verify" | lookup / verify: mode 'verify' - give company names or licence numbers and get one verdict per contractor per state (active, expired, revoked, suspended, inactive, not_found...). export: mode 'export' - download every licensed contractor in each state you pick, or a slice of it via 'stateFilters'. Each state is answered by that state's own scrapebench actor, run under your account. |
states | array | no | ["CA","TX"] | 2-letter codes. Verify covers AL, AR, AZ, CA, CO, CT, DC, DE, FL, IA, ID, LA, MA, MD, ME, MI, MN, MO, MS, NC, ND, NE, NJ, NM, NV, NY, OH, OK, OR, PA, RI, SC, TN, TX, VA, VT, WA, WV, WY. Export covers AL, AR, AZ, CA, CO, CT, DC, DE, FL, IA, ID, IL, LA, MD, ME, MN, MO, MS, ND, NE, NJ, NM, NV, NY, OH, OK, OR, PA, RI, SC, TN, TX, UT, VA, VT, WA, WV, WY. In verify mode every name and number is checked in every state listed. A state outside the list returns 'unverifiable_state_not_covered' - the check was NOT performed, which is not a finding that anybody is unlicensed. |
state | string | no | — | Single-state form of 'states', e.g. 'TX'. Kept for saved tasks and agents; both may be set. |
companies | array | no | ["Ransome Company"] | Business or licensee names to verify. Matching is EXACT on the full name once case, punctuation and company suffixes (LLC, Inc, Corp) are ignored - 'ABC Roofing' will NOT match 'ABC Roofing & Siding', by design. A name matching more than one licence returns 'check_failed' rather than a guess. Use licence numbers whenever you have them. |
licenseNumbers | array | no | ["22726"] | Licence numbers to verify - the most reliable input. Punctuation and leading zeros are ignored. DE, IA, MS, OH and VA cannot be searched by number (their boards only take names) and return 'check_failed' asking for the name. |
company | string | no | — | Single-value form of 'companies'. |
licenseNumber | string | no | — | Single-value form of 'licenseNumbers'. |
stateFilters | object | no | {"TX":{"licenseType":"Electrical Contractor","county":"Travis"}} | Export mode only. Keyed by state code; each value is passed verbatim as that state's actor input, so use that actor's own field names (linked in the README), e.g. {"TX": {"county": "Travis"}, "CA": {"licenseClass": "C-10", "county": "Sacramento"}}. A state with no entry exports with no filter. |
maxResults | integer | no | 500 | Export mode only: the most rows delivered per state. Billing is per row delivered, so this is also your spend limit per state. |
Pricing
Pay per result (license-verified) — no charge for empty runs.
Example: 1000 rows delivered at $0.001/result ≈ $1.00.
FAQ
Which states are covered?
Verify: AL, AR, AZ, CA, CO, CT, DC, DE, FL, IA, ID, LA, MA, MD, ME, MI, MN, MO, MS, NC, ND, NE, NJ, NM, NV, NY, OH, OK, OR, PA, RI, SC, TN, TX, VA, VT, WA, WV and WY. Export: AL, AR, AZ, CA, CO, CT, DC, DE, FL, IA, ID, IL, LA, MD, ME, MN, MO, MS, ND, NE, NJ, NM, NV, NY, OH, OK, OR, PA, RI, SC, TN, TX, UT, VA, VT, WA, WV and WY. Any other state returns a free row saying it is not covered - never a finding about the contractor.
Does 'not_found' mean the contractor is unlicensed?
No. It means the state registry returned no match for what was searched. A typo, a DBA that differs from the licensed entity, or a licence held under a parent company all produce 'not_found'. Treat it as 'go and check', never as a finding.
What does it cost?
$0.001 per row on top of the state actor's own per-row fee (from 2026-11-14). Each state runs as its own actor run under your account and bills there, so a verified California licence costs about $0.005 and an exported Texas row about $0.005. Free rows (not_found, check_failed, notices) cost nothing here.
How do I filter an export?
Put that state's own input fields under its code in 'stateFilters', e.g. {"TX": {"county": "Travis"}}. Each state actor's page lists its filters; this tool passes them through unchanged. A state with no entry exports with no filter, up to 'maxResults' rows.
Can I search every state by licence number?
No. Delaware, Iowa, Mississippi, Ohio and Virginia boards only search by name, so a number-only request there returns 'check_failed' asking for the company name. Reporting 'not_found' would imply the licence does not exist, which we cannot know from a search that was never possible.
Is this personal data?
It is public professional-licence data as the state boards publish it. Some boards license individuals, so a person's name can appear where the board publishes it that way. No enrichment is added.
Guides & use cases
Related actors