California CSLB Contractor License Scraper
Pricing
from $25.00 / 1,000 license records
California CSLB Contractor License Scraper
Scrape California Contractors State License Board (CSLB) public records. Search by license number, business name, personnel name, or ZIP/city. Returns full license details: status, classifications, bonds, workers comp, disciplinary actions, personnel, address, phone.
Pricing
from $25.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
3 days ago
Last modified
Categories
Share
Scrape the California Contractors State License Board (CSLB) public database for full contractor license records. Search by license number, business name, personnel name, or ZIP code — get status, all classifications, bonds, workers' comp, disciplinary actions, personnel, and full contact details in structured JSON.
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 by ZIP code, 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 four search modes. 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 for region-based search. Example: ["92101", "90012"] |
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 |
customProxyUrl | string | no | "" | Premium residential proxy URL for maximum reliability |
proxyConfiguration | object | no | residential | Apify proxy settings |
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}
ZIP code lead generation:
{"zipCodes": ["92101", "92102"],"classification": "C-20","status": "active","maxResults": 200}
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
| Event | Price |
|---|---|
| Actor Start | $0.00005 |
| License Record | $0.025 per record |
You only pay for records successfully scraped. Start with a small maxResults to test before scaling.
Technical notes
- Residential proxy required: CSLB's F5 BIG-IP WAF blocklists datacenter IPs. The actor uses Apify residential proxy by default. For production bulk runs, provide a premium residential proxy via
customProxyUrl(Decodo/Bright Data/IPRoyal) for maximum reliability. - Scheduled downtime: The CSLB database is unavailable Sundays 8 PM through Monday 6 AM Pacific Time. Avoid scheduling runs during this window.
- 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