17 States
Contractor License Verify - AI Agent Tool (17 States)
Ask one question, get one structured verdict: is this contractor licensed in this state? Enumerated verdicts built for an AI agent to branch on - not prose.
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 |
checked_at | string|null |
coverage_note | string|null |
source_url | string|null |
scraped_at | 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",
"checked_at": "2026-08-06T19:20:11+00:00",
"source_url": "https://www.cslb.ca.gov/OnlineServices/CheckLicenseII/LicenseDetail.aspx?LicNum=22726"
} Inputs
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
state | string | no | "CA" | REQUIRED. The 2-letter US state code of the licensing board to check, e.g. 'TX'. Supported: AL, AR, CA, CT, FL, MA, MI, MN, NC, NM, NV, OR, SC, TN, TX, VA, WA. Pass any other state and every result comes back with verdict 'unverifiable_state_not_covered', which means the check was NOT performed - do not report that as the contractor being unlicensed. Contractor licensing is per-state, so you must know the state before you can verify anything; if the user has not told you which state, ask them rather than guessing. |
company | string | no | — | The business or licensee name to look up, e.g. 'Ransome Company'. Use this when you do not have a licence number. Matching is EXACT on the full name once case, punctuation and company suffixes (LLC, Inc, Corp) are ignored - so 'ABC Roofing' will NOT match 'ABC Roofing & Siding', by design. If a name matches more than one licence you get verdict 'check_failed' rather than a guess, because returning the wrong contractor's licence is worse than returning nothing. Supply 'licenseNumber' instead whenever you have it: it is exact and cannot mis-match. |
licenseNumber | string | no | — | The contractor's licence number, e.g. '22726'. This is the most reliable input - prefer it over the company name whenever the user has given you one. Punctuation and leading zeros are ignored, so 'CCB-123456' and '123456' both work. If the number is not in the state's registry you get verdict 'not_found', which means the registry had no such record - it is NOT evidence that the contractor is unlicensed. |
companies | array | no | [] | Batch form of 'company' - check many names in ONE run instead of starting a run per name. All entries must be in the same state. You are billed per verdict returned, not per run, so batching costs the same and is much faster. |
licenseNumbers | array | no | [] | Batch form of 'licenseNumber' - check many licence numbers in ONE run. All entries must be in the same state. Billing is per verdict returned, so batching costs the same as separate runs and is much faster. |
Pricing
Pay per result (license-verified) — no charge for empty runs.
Example: 100 verdicts resolved on a state board at $0.004/result ≈ $0.40.
FAQ
Which states are covered?
Seventeen: AL, AR, CA, CT, FL, MA, MI, MN, NC, NM, NV, OR, SC, TN, TX, VA and WA. Any other state returns verdict 'unverifiable_state_not_covered', which means no check was performed - it is not a finding about the contractor.
Does 'not_found' mean the contractor is unlicensed?
No, and this is the most important line in the whole listing. 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'. If your agent reports that as 'unlicensed' to an end user, it has made a false and damaging claim about a real business. Treat it as 'go and check', never as a finding.
Why is there an 'inactive' verdict as well as 'revoked'?
Because the boards publish both, and conflating them would be defamatory. 'Revoked' and 'suspended' are disciplinary actions. 'Lapsed', 'Voluntary Surrender', 'Archived' and 'Voluntary Termination' are administrative or the licensee's own choice - all real strings from real boards. Those map to 'inactive', and the reason field says so explicitly.
How fast is it?
Measured on 2026-08-06: median 13.3 seconds, fastest around 10.6s (Florida, California, Washington), slowest 30.8s for South Carolina, whose board puts a reCAPTCHA on the search itself and so costs a solve per check. New Mexico is 19.6s for the same reason. Set an agent timeout above 35 seconds.
What is 'verdict_basis' for?
It tells you what the verdict is standing on, because the boards do not all publish the same fields. Alabama, Texas and Virginia publish no status field, so a verdict there rests on the expiration date alone. North Carolina and South Carolina publish no expiration date, so those rest on status alone. Everywhere else you get both.
Can I check several contractors at once?
Yes - use 'companies' or 'licenseNumbers' with a list, all in the same state. Billing is per verdict returned, so a batch costs the same as separate runs and is much faster. The single-value fields exist for the agent case, where one question is the whole point.
Can I search Virginia by license number?
No. Virginia's DPOR data is a name-filtered roster with no license-number search axis, so a number-only request there returns 'check_failed' telling you to supply 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 rather than companies, so a licensed person's name can appear where the board publishes it that way. No personal or PII enrichment is added.
Guides & use cases
Related actors