California Contractor Licenses Scraper avatar

California Contractor Licenses Scraper

Pricing

Pay per event

Go to Apify Store
California Contractor Licenses Scraper

California Contractor Licenses Scraper

Look up California CSLB contractor licenses by number, business, personnel, or URL and export status, classifications, bonds, workers' compensation, personnel, and public contact data.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Look up California contractor licenses in the official Contractors State License Board (CSLB) database and export structured records for verification, due diligence, and lead enrichment.

Search by license number, business name, personnel name, or an official license-detail URL.

Each result can include license standing, issue and expiration dates, classifications, contractor bond details, workers' compensation information, associated personnel, public disclosures, and business contact information.

The Actor uses a stateful browser session and a US datacenter proxy because CSLB can return an empty or maintenance page to ordinary HTTP requests.

What can this CSLB license lookup do?

  • Check one or many CSLB license numbers.
  • Search licenses by full or partial business name.
  • Find licenses associated with a contractor owner or other personnel.
  • Accept official CSLB license-detail URLs from an upstream dataset.
  • Deduplicate licenses found by several searches.
  • Limit output with maxItems to control run cost.
  • Export results as JSON, CSV, Excel, XML, RSS, or HTML.
  • Feed normalized records into Apify integrations and APIs.

The Actor reads public CSLB records only.

It does not bypass an account, collect private account data, or make a legal determination about a contractor.

Who is it for?

Compliance and procurement teams can verify a vendor's CSLB standing before onboarding or renewal.

General contractors and project owners can review classifications, expiration, bond, and workers' compensation information.

Lead-generation teams can enrich contractor business records with official license identifiers and status.

Insurance and risk teams can schedule repeat checks and compare datasets for changed standing.

Developers and data engineers can use the Actor as a structured CSLB lookup API without maintaining browser automation.

Researchers can export a focused set of public licenses for analysis.

Why use this California contractor license scraper?

CSLB's public website uses ASP.NET form state and session-sensitive navigation.

A direct HTTP form submission can return a scheduled-maintenance response even when the browser workflow is available.

This Actor:

  1. Starts a browser behind an Apify datacenter proxy.
  2. Opens the official CSLB search form.
  3. Keeps cookies, form state, and proxy identity together.
  4. Submits the selected lookup mode.
  5. Opens each official license detail.
  6. Loads associated personnel in the same session.
  7. Normalizes the record into a stable dataset item.

Images, fonts, media, and analytics are blocked to reduce transfer and runtime.

What data does it return?

FieldMeaning
licenseNumberCSLB contractor license number
businessNamePublic business name
addressPublic business address
city, state, zipCodeParsed location fields
entityTypeSole ownership, corporation, partnership, or other CSLB entity type
issueDateLicense issue date shown by CSLB
expirationDateLicense expiration date shown by CSLB
licenseStatusCSLB standing and contracting-eligibility text
classificationsClassification codes and names, such as A or C-8
bondSurety, bond number, amount, dates, and source text when present
workersCompensationWorkers' compensation text shown by CSLB
personnelCurrent and former associated personnel returned by CSLB
disclosuresLicense-specific public complaint or disciplinary links when present
dataCurrentAsOfFreshness timestamp displayed by CSLB
sourceUrlOfficial license-detail URL
searchType, searchTermInput route that found the record
scrapedAtExtraction timestamp in ISO 8601 format

CSLB does not populate every section for every license.

Fields can therefore be null, empty arrays, or explanatory source text.

Input parameters

licenseNumbers

An array of 4-to-8-digit California contractor license numbers.

{
"licenseNumbers": ["354811"],
"maxItems": 1
}

businessNames

An array of full or partial business names.

{
"businessNames": ["TOMLINSON CONSTRUCTION"],
"maxItems": 5
}

personnelNames

An array of objects with a required lastName and optional firstName.

Use the full first name shown by CSLB when you need a precise match.

{
"personnelNames": [
{
"lastName": "TOMLINSON",
"firstName": "ADAM WILLIAM"
}
],
"maxItems": 5
}

startUrls

Official CSLB LicenseDetail.aspx URLs.

Other hosts and unrelated CSLB pages are rejected.

{
"startUrls": [
{
"url": "https://www.cslb.ca.gov/OnlineServices/CheckLicenseII/LicenseDetail.aspx?LicNum=354811"
}
],
"maxItems": 1
}

maxItems

The maximum number of unique license records saved across all searches.

Allowed range: 1 to 500.

Default: 25.

How to run your first CSLB license check

  1. Open the Actor in Apify Console.
  2. Keep the prefilled license number 354811, or enter your own license numbers.
  3. Set maxItems to the largest number of records you want to pay for.
  4. Click Start.
  5. Wait for the run to finish.
  6. Open the Dataset tab.
  7. Export the results or connect an integration.

For a business-name search, clear licenseNumbers and fill businessNames.

For several modes in one run, fill more than one input array; duplicate license numbers are emitted once.

Example output

The following abbreviated record comes from the real prefilled lookup.

{
"licenseNumber": "354811",
"businessName": "TOMLINSON CONSTRUCTION",
"address": "13506 WEST KEARNEY BLVD, KERMAN, CA 93630",
"city": "KERMAN",
"state": "CA",
"zipCode": "93630",
"entityType": "Sole Ownership",
"issueDate": "03/30/1978",
"expirationDate": "07/31/1991",
"licenseStatus": "This license is expired and not able to contract at this time.",
"classifications": [
{ "code": "A", "name": "GENERAL ENGINEERING" },
{ "code": "C-8", "name": "CONCRETE" }
],
"bond": {
"surety": "SURETY COMPANY OF THE PACIFIC",
"number": "610633",
"amount": "$5,000",
"effectiveDate": "01/01/1980",
"cancellationDate": "05/08/1992"
},
"workersCompensation": "There was no workers comp information found for this license.",
"personnel": [
{
"name": "JIMMIE LEON TOMLINSON",
"title": "SOLE OWNER",
"associationDate": "03/30/1978",
"classification": "A",
"currentlyAssociated": true
}
],
"sourceUrl": "https://www.cslb.ca.gov/OnlineServices/CheckLicenseII/LicenseDetail.aspx?LicNum=354811",
"searchType": "licenseNumber",
"searchTerm": "354811"
}

Always use dataCurrentAsOf and sourceUrl when freshness or auditability matters.

How much does it cost to check California contractor licenses?

This Actor uses pay-per-event pricing.

A one-time start event costs $0.005 per run.

Each saved contractor license triggers one item event.

The current per-record rate depends on your Apify plan tier:

TierPrice per saved license
Free$0.017480
Bronze$0.015200
Silver$0.011856
Gold$0.009120
Platinum$0.006080
Diamond$0.004256

At Bronze pricing:

  • 1 saved license costs about $0.0202 including the start event.
  • 10 saved licenses cost about $0.1570.
  • 100 saved licenses cost about $1.5250.

Searches with no saved records incur only the start event.

Set the maximum-record limit to cap total spend.

Runtime and proxy usage are covered by the Actor's pricing contract; residential fallback is not enabled automatically.

Schedule recurring license verification

Apify schedules can run the same license-number input daily, weekly, or monthly.

A practical workflow is:

  1. Store the licenses you monitor in the Actor input.
  2. Create a schedule.
  3. Export each run's dataset to your storage or warehouse.
  4. Compare licenseStatus, expirationDate, bond, and workersCompensation with the previous run.
  5. Trigger your own alert when a relevant field changes.

The Actor returns current snapshots.

It does not itself retain history, calculate diffs, or send change alerts.

Integrations and exports

Use built-in Apify integrations to send results to:

  • Google Sheets
  • Zapier
  • Make
  • Slack
  • webhooks
  • Amazon S3
  • Google Drive
  • a custom HTTP endpoint

Download each dataset in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.

For stable automation, key records by licenseNumber rather than business name.

Run through the Apify API

Replace YOUR_APIFY_TOKEN with your token.

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~california-contractor-license-lookup-v2/runs?token=YOUR_APIFY_TOKEN&waitForFinish=300" \
-H "Content-Type: application/json" \
-d '{"licenseNumbers":["354811"],"maxItems":1}'

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/california-contractor-license-lookup-v2').call({
licenseNumbers: ['354811'],
maxItems: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
client = ApifyClient(token="YOUR_APIFY_TOKEN")
run = client.actor("automation-lab/california-contractor-license-lookup-v2").call(
run_input={"licenseNumbers": ["354811"], "maxItems": 1}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

Use with MCP and AI agents

Add the Apify MCP server to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/california-contractor-license-lookup-v2"

Claude Desktop

Add this server in Claude Desktop's MCP settings.

Cursor

Use the same JSON in Cursor's MCP settings.

VS Code

Use the same server URL in your VS Code MCP configuration.

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/california-contractor-license-lookup-v2"
}
}
}

Example prompts:

  • "Check CSLB license 354811 and summarize its status, expiration, and classifications."
  • "Run a California contractor business-name search for TOMLINSON CONSTRUCTION and return the source URLs."
  • "Find licenses associated with TOMLINSON, ADAM WILLIAM and list their bond status."

Limits and expected failure behavior

  • The source is the public CSLB website, not a bulk downloadable license roster.
  • Business and personnel searches can return multiple matches.
  • maxItems stops output after the requested number of unique licenses.
  • Very broad personnel searches may expose only the result page CSLB makes available in the session.
  • Source maintenance, page changes, or proxy blocking can fail a run.
  • A blocked or maintenance response is treated as an error, not as a valid empty result.
  • A valid search with no matches succeeds with an empty dataset.
  • The Actor uses a US datacenter proxy; it does not expose an unmeasured residential fallback.
  • CSLB may omit old, pending, or legally restricted disclosures.
  • Source data can lag real-world events, as CSLB notes on each detail page.

Run focused queries and keep maxItems conservative for predictable results.

Responsible use and legality

CSLB publishes these records for public license checking.

You are responsible for using the data lawfully and in line with applicable terms, privacy rules, anti-discrimination laws, and marketing regulations.

Do not treat an Actor result as legal advice.

Do not use a stale snapshot as the sole basis for a safety, employment, credit, housing, insurance, or contracting decision.

Follow sourceUrl to review the official record when a decision has legal or financial consequences.

Avoid unnecessary collection of personnel data and retain only what your workflow needs.

Troubleshooting

The run reports a maintenance or access-block page

Retry later once.

If the problem persists, check the run log and the CSLB website status.

Do not interpret that failure as "no licenses found."

A business search returns no records

Check spelling and try a shorter but meaningful business-name fragment.

CSLB business names may differ from brands or DBA names.

A personnel search returns no records

Use the surname shown by CSLB.

When adding firstName, use the full first and middle-name string if known.

Why is a field null or empty?

The source does not provide every section for every license.

Older or expired records often contain less current insurance or disclosure information.

Why are there fewer results than expected?

Check maxItems, use a more precise query, and inspect CSLB's displayed search results.

The Actor intentionally deduplicates the same license found through multiple inputs.

FAQ

Is this an official CSLB API?

No.

It is an independent Apify Actor that automates CSLB's public license-check pages and preserves official source URLs.

Does it return active licenses only?

No.

It returns matching public records and includes CSLB's status text so you can filter active, expired, suspended, or other standings downstream.

Can it monitor license changes?

Use an Apify schedule and compare datasets between runs.

The Actor returns snapshots but does not calculate changes or send alerts itself.

Does it charge for duplicates?

No.

A license discovered more than once in the same run is saved and charged once.

Can I use a CSLB URL from another dataset?

Yes, if it is an official cslb.ca.gov LicenseDetail.aspx URL with a valid LicNum parameter.

Does it use residential proxies?

No automatic residential fallback is enabled.

The current route uses an Apify datacenter proxy and a stateful browser session.

Use these Automation Lab Actors for multi-state contractor verification:

Each Actor follows its own state source and input contract.

For California, use this Actor because the output and browser session are designed specifically for CSLB.