California CSLB Scraper — Contractor Licenses
Pricing
from $20.00 / 1,000 license records
California CSLB Scraper — Contractor Licenses
Scrape California CSLB contractor licenses, classifications, status, business details, personnel, bonds, and public compliance data.
Pricing
from $20.00 / 1,000 license records
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Features
Share
California CSLB Contractor License Scraper
Scrape the California Contractors State License Board (CSLB) public database for full contractor license records. Search by license number, business name, or personnel name — get status, all classifications, bonds, workers' comp, disciplinary actions, personnel, and full contact details in structured JSON. The default input looks up license 1000001 and returns one record.
Current status (2026-10-27): license-number, business-name and personnel-name searches work. CSLB's ZIP-code search page currently redirects to its license check page, so
zipCodessearches return no records; a ZIP-only run ends with a failed status and no charges. Runs during CSLB's weekly database maintenance (Sunday 8 p.m. to Monday 6 a.m. Pacific) also end with a failed status and no charges.
Use cases
- Contractor verification — confirm a contractor is licensed and in good standing before hiring
- Compliance monitoring — detect newly expired, suspended, or revoked licenses for vendor lists on recurring schedules
- Lead generation — build targeted lists of licensed contractors from business-name or personnel searches, filtered by city, classification, or active status
- Subcontractor sourcing — find qualified subcontractors by specialty classification and region
- Insurance underwriting — score contractors using disciplinary actions, bond cancellation history, and workers' comp status
- Due diligence — check complaint and legal action history before signing contracts
- Market research — analyze contractor density by county/classification, track new-license issuance trends
Input
The actor supports three working search modes (ZIP search is currently unavailable). Use any one or combine multiple:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
licenseNumbers | array | no | [] | Direct license-number lookup (fastest). Example: ["1000001", "812345"] |
businessName | string | no | "" | Full or partial business name. Example: "Smith Construction" |
personnelLastName | string | no | "" | Last name of license-holding individual |
personnelFirstName | string | no | "" | Optional first name to narrow personnel search |
zipCodes | array | no | [] | California ZIP codes. Currently unavailable: CSLB's ZIP search page redirects, so no records are returned. |
city | string | no | "" | Client-side filter on business address city |
classification | string | no | "" | Filter by CSLB classification code (e.g. "C-10", "B") |
status | select | no | "any" | Filter by license status: any, active, expired, suspended, revoked, canceled, inactive |
maxResults | integer | no | 100 | Hard cap on records returned (about 250 records fit in the default 1-hour timeout; the run stops cleanly before it) |
At least one search mode is required.
Example inputs
License number lookup:
{"licenseNumbers": ["842951", "1000001"],"maxResults": 2}
Business name search:
{"businessName": "Pacific Construction","status": "active","maxResults": 50}
Active HVAC contractors from a business-name search:
{"businessName": "Air","classification": "C-20","status": "active","maxResults": 20}
Personnel name search:
{"personnelLastName": "Smith","personnelFirstName": "John","maxResults": 25}
Output
Each record contains the full public record for one contractor license:
| Field | Type | Description |
|---|---|---|
license_number | string | CSLB license number |
business_name | string | Legal business name |
license_status | string | Active, Expired, Suspended, Revoked, Canceled, or Inactive |
entity_type | string|null | CORPORATION, LLC, SOLE OWNER, etc. |
issue_date | string|null | Original license issue date (ISO 8601) |
expiration_date | string|null | License expiration date (ISO 8601) |
business_address | string|null | Full street address |
city | string|null | Business address city |
county | string|null | California county (derived from ZIP) |
zip_code | string|null | Business address ZIP |
business_phone | string|null | Business phone number |
classifications | array | All license classifications [{code, description}] |
bonds | array | All bonds: contractor's bond, qualifier bond [{type, company, amount_usd, bond_number, effective_date, cancellation_date}] |
workers_comp | object|null | Workers' comp carrier, policy, dates, or exempt status |
qualifiers | array | Qualifying individuals [{name, association}] |
personnel | array | All listed personnel [{name, classification, license_number, status}] |
disciplinary_actions | array | Disciplinary actions [{date, type, summary}] |
administrative_actions | array | Administrative actions [{date, type, summary}] |
detail_url | string | Direct CSLB detail page link |
scraped_at | string | ISO 8601 timestamp |
source_url | string | Source page URL |
Pricing
This Actor uses pay-per-event pricing. Apify platform usage is included; no separate platform-usage fee is passed to users. Only license records saved to the dataset are charged. Licenses that do not exist, records removed by your filters, and failed or unavailable lookups are not charged.
| Apify tier | Per license record (USD) | Per 100 records (USD) | Start fee per started GB of memory (USD) |
|---|---|---|---|
| FREE | $0.025001 | $2.5001 | $0.006251 |
| BRONZE | $0.024375 | $2.4375 | $0.006094 |
| SILVER | $0.02375 | $2.375 | $0.005938 |
| GOLD / PLATINUM / DIAMOND | $0.02 | $2.00 | $0.005 |
The default run uses 1 GB of memory, so it pays the start fee once. At FREE-tier prices, the default one-license lookup costs about $0.031, and 20 records cost about $0.506. The authoritative prices are shown in the Actor's Apify pricing settings.
Technical notes
- Access route: requests go to CSLB directly from the Apify cloud with no proxy (measured working 2026-10-27). Proxy settings are managed by the Actor owner and are not part of the input.
- Scheduled downtime: The CSLB database is unavailable Sundays 8 PM through Monday 6 AM Pacific Time. Runs in this window end with a failed status and no record charges; avoid scheduling runs then.
- Run status: every run ends with a status message giving delivered records, charged events, and the stop reason. The
OUTPUTrecord repeats these counts. - Search limits: Business name searches return up to 50 names per page (pagination handled automatically). Personnel name searches return up to 100 names per page.
- Classification codes: See the CSLB classification list for all 40+ specialty codes.
Integration
Export scraped data, run the scraper via API, schedule and monitor runs, or integrate with other tools. The output dataset is compatible with:
- CSV/JSON/Excel export from Apify Console
- Zapier and Make webhooks
- Direct API access via Apify REST API
- CRM import (HubSpot, Salesforce) with field mapping
- AI agent tool calls via Apify MCP server
FAQ
Is the data official?
Yes. Every record is read from the CSLB public license lookup at cslb.ca.gov at run time.
How long does a lookup take?
About 10-15 seconds per license, because each license is opened through CSLB's own lookup form.
What happens if a license number does not exist?
It is skipped and counted in OUTPUT.licensesNotFound. You are not charged for it.
Can I search by ZIP code?
Not at the moment. CSLB's ZIP-code search page redirects to the license check page, so use business-name or personnel-name searches with the city filter instead.
Why did my run fail on a Sunday night?
CSLB takes its database offline from Sunday 8 p.m. to Monday 6 a.m. Pacific time. Runs in that window end with a failed status and no record charges.
Last verified: 2026-10-27