← Health board

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.

—insufficient data
Run it on Apify → verified nightly

Verification

n/agolden-diff success
0canary runs
2days since last update

Output fields

Authoritative field set from the dataset schema.

FieldType
verdictstring|null
verdict_reasonstring|null
verdict_basisstring|null
requested_companystring|null
requested_license_numberstring|null
requested_statestring|null
entity_namestring|null
license_numberstring|null
license_typestring|null
status_rawstring|null
expiry_datestring|null
days_to_expiryinteger|null
citystring|null
source_portalstring|null
source_statestring|null
noticestring|null
notice_typestring|null
coverage_notestring|null
source_urlstring|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

FieldTypeReqDefaultDescription
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