California Contractor Licenses Scraper
Pricing
Pay per event
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
Maintained by CommunityActor 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
maxItemsto 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:
- Starts a browser behind an Apify datacenter proxy.
- Opens the official CSLB search form.
- Keeps cookies, form state, and proxy identity together.
- Submits the selected lookup mode.
- Opens each official license detail.
- Loads associated personnel in the same session.
- 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?
| Field | Meaning |
|---|---|
licenseNumber | CSLB contractor license number |
businessName | Public business name |
address | Public business address |
city, state, zipCode | Parsed location fields |
entityType | Sole ownership, corporation, partnership, or other CSLB entity type |
issueDate | License issue date shown by CSLB |
expirationDate | License expiration date shown by CSLB |
licenseStatus | CSLB standing and contracting-eligibility text |
classifications | Classification codes and names, such as A or C-8 |
bond | Surety, bond number, amount, dates, and source text when present |
workersCompensation | Workers' compensation text shown by CSLB |
personnel | Current and former associated personnel returned by CSLB |
disclosures | License-specific public complaint or disciplinary links when present |
dataCurrentAsOf | Freshness timestamp displayed by CSLB |
sourceUrl | Official license-detail URL |
searchType, searchTerm | Input route that found the record |
scrapedAt | Extraction 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
- Open the Actor in Apify Console.
- Keep the prefilled license number
354811, or enter your own license numbers. - Set
maxItemsto the largest number of records you want to pay for. - Click Start.
- Wait for the run to finish.
- Open the Dataset tab.
- 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:
| Tier | Price 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:
- Store the licenses you monitor in the Actor input.
- Create a schedule.
- Export each run's dataset to your storage or warehouse.
- Compare
licenseStatus,expirationDate,bond, andworkersCompensationwith the previous run. - 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 ApifyClientclient = 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().itemsprint(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.
maxItemsstops 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.
Related contractor license Actors
Use these Automation Lab Actors for multi-state contractor verification:
- Arizona ROC Contractor License Scraper
- Oregon Contractor License Lookup Scraper
- Washington Contractor License Lookup Scraper
- North Carolina Contractor License Lookup Scraper
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.