Contractor License Verify - AI Agent Tool (17 States) avatar

Contractor License Verify - AI Agent Tool (17 States)

Pricing

$0.004 / license verified

Go to Apify Store
Contractor License Verify - AI Agent Tool (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.

Pricing

$0.004 / license verified

Rating

0.0

(0)

Developer

ScrapeBench

ScrapeBench

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

6 days ago

Last modified

Categories

Share

Pain points

  • An AI agent building a vendor-onboarding or CRM-intake flow cannot answer 'is this contractor licensed?' today - there is no public API for it.
  • State licensing portals are ASP.NET WebForms, bulk rosters and CAPTCHA-gated search pages; none of them are callable by a model.
  • Batch scrapers return a dataset. An agent needs one answer, in a shape it can branch on, with a citation.

What we solve

  • One contractor, one state, one flat verdict object - built for a single agent call rather than a bulk export.
  • Enumerated verdicts (active, expired, revoked, suspended, inactive, not_found, unverifiable_state_not_covered, check_failed) so an agent branches on a value instead of parsing prose.
  • Every answer cites the state board it came from and when it was checked.

Summary

A single-query license verification tool shaped for an AI agent. Give it a state and either a company name or a license number, and it routes to that state's official licensing board and returns one flat object: a verdict, the reason in plain language, the board's own raw status string, the expiry date, and which board answered. It covers 17 states - AL, AR, CA, CT, FL, MA, MI, MN, NC, NM, NV, OR, SC, TN, TX, VA, WA - including boards no agent can otherwise reach: CSLB is an ASP.NET WebForms portal, SC LLR sits behind a reCAPTCHA, New Mexico behind an image CAPTCHA. The design rule that matters most here is what the tool refuses to say. 'not_found' means the registry returned no match for that search and is explicitly NOT a finding that anybody is unlicensed. An uncovered state returns 'unverifiable_state_not_covered', never silence. Any error, timeout or ambiguous name match returns 'check_failed', never a pass. A licence that ended voluntarily is 'inactive', never 'revoked' - because an agent repeats whichever word you hand it, and one of those is a defamation-shaped claim about a real business.

Who it's for

  • Developers building AI agents for vendor onboarding, CRM intake or procurement
  • Teams wiring contractor verification into an LLM tool-calling flow
  • Marketplaces and platforms that must verify a trade licence at signup
  • Anyone who needs one licence answer on demand rather than a bulk export

How to use

Set the input, run the actor, and collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API). Example input:

{
"state": "CA",
"licenseNumber": "22726"
}

See Inputs below for every available field.

What you get

One row per record:

FieldDescription
verdictactive
verdict_reasonPlain-language explanation, safe to quote to an end user
verdict_basisWhich evidence the verdict rests on: status, expiry_date, status+expiry_date, or none
requested_companyThe company name that was searched, echoed back
requested_license_numberThe license number that was searched, echoed back
requested_stateThe state that was searched
entity_nameThe licensed business or person as the board publishes it
license_numberLicense number as published by the board
license_typeLicense type or classification, where published
status_rawThe board's own status string, unmodified (e.g. 'Voluntary Surrender')
expiry_dateExpiration date as published by the board
days_to_expiryDays until expiry; negative when already expired
source_portalWhich board answered (CSLB, TX TDLR, SC LLR...) - cite this
checked_atUTC timestamp of the check
coverage_noteWhich states are covered and what an uncovered state means
source_urlWhere the answer came from

Sample:

{
"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

FieldRequiredTypeDefaultDescription
statenostring"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.
companynostringThe 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.
licenseNumbernostringThe 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.
companiesnoarray[]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.
licenseNumbersnoarray[]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 Event)

You pay per result (license-verified) — no charge for empty runs. Example: 100 verdicts resolved on a state board at $0.004/result$0.40.

Charged only for a verdict actually resolved on a board. not_found, unverifiable_state_not_covered and check_failed are free.

The per-state lookup Actors this tool calls on your behalf bill their own per-match fees to your account, so budget both lines: about $0.008 per verdict in the 15 open-data states, and about $0.034 in New Mexico and South Carolina, where the board CAPTCHAs the search itself and every check costs a solve.

Measured per-state latency (2026-08-06, one licence-number lookup each)

Seconds
Median across all 17 states13.3s
Fastest (FL, CA, WA, MI, NC)10.6 - 11.3s
Slowest: South Carolina (reCAPTCHA per check)30.8s
New Mexico (image CAPTCHA per check)19.6s
Massachusetts / Alabama / Connecticut16 - 17s

If you are calling this from an agent loop, set your timeout above 35 seconds and expect ~13s typical. The cost is the state portal, not this tool.

Use cases

  • Agent tool call - give an LLM the ability to answer 'is this contractor licensed in Texas?' with a citable source.
  • Vendor onboarding - verify a trade licence at signup before a contractor is approved.
  • CRM intake - enrich a new contractor record with licence status, type and expiry at the moment it is created.
  • Spot check - one contractor, one state, one answer, without configuring a batch scraper.

Why this actor

  • Verdicts are enumerated, never prose - an agent branches on a value instead of interpreting a sentence.
  • not_found is its own verdict and the schema says in so many words that it does NOT mean unlicensed. That is the single most important line here: an agent that gets this wrong makes a defamation-shaped claim about a real business.
  • Fails closed. An error, a timeout or a name matching two licences returns check_failed, never a pass.
  • A voluntarily ended licence is 'inactive', never 'revoked' - the boards publish both, and only one of them is a disciplinary finding.
  • Reaches boards an agent cannot: CSLB's WebForms portal, SC LLR's reCAPTCHA, New Mexico's image CAPTCHA.

Limitations & updates

Covers 17 states; anything else returns 'unverifiable_state_not_covered'. Louisiana is deliberately excluded - its board publishes a bulk roster with no per-contractor search, so a single lookup would mean downloading the whole thing. Some boards are partial by source: AL, TX and VA publish no license status (verdict rests on the expiry date), and NC and SC publish no expiration date (verdict rests on status); 'verdict_basis' reports which on every answer. Virginia cannot be searched by license number at all. Name matching is deliberately strict - an exact match on the full normalized business name or nothing - so a license number is always the more reliable input, and a name matching two licences returns 'check_failed' rather than a guess. Data reflects what each board publishes at check time; 'checked_at' is on every answer for that reason.

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.

Which actor to choose

Part of the contractor-license suite - pick the shape that fits how you are calling it:

  • Contractor License Expiration Monitor & Alerts (Notion) — You want a watchlist re-checked on a schedule with alerts, rather than one answer on demand.
  • California Contractor License Lookup & Verify (CSLB) — You need California specifically, including owner/personnel name search.
  • Multi-State Contractor & Trade License Lookup — You want the same contractor checked across WA, OR, TX & CT in one run.
  • South Carolina Contractor License Lookup & Verify (SC LLR) — You need South Carolina search by name, city or classification rather than a single verdict.
  • New Mexico Contractor License Lookup & Verify (NM CID) — You need New Mexico search by business name, city or ZIP.

Guides & use cases

Written up on scrapebench.dev — the bench that runs and verifies this actor against the live source every night:

More actors, coverage and nightly verification results: scrapebench.dev