California CSLB Contractor License Scraper
Pricing
from $9.23 / 1,000 results
California CSLB Contractor License Scraper
Scrape licensed California contractor records from the CSLB public portal by classification and county. Extract license number, business name, status, trade classifications, issue and expiry dates, bond, workers comp, address, county and phone. Export to JSON, CSV or Excel.
Pricing
from $9.23 / 1,000 results
Rating
5.0
(2)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
12 days ago
Last modified
Categories
Share
California CSLB Contractor License Scraper
Here is one real result, with every field the actor returns:
{"businessName": "EL DESIGN INC","licenseNumber": "1090237","status": "CLEAR","url": "https://www.cslb.ca.gov/onlineservices/checklicenseII/LicenseDetail.aspx?LicNum=1090237","businessType": "Corporation","classifications": ["B", "C36"],"issueDate": "2022-04-19","expireDate": "2028-04-30","address": "185 GLENDALE BLVD","city": "LOS ANGELES","state": "CA","zip": "90026","county": "Los Angeles","phone": "(213) 247 5025","aiLeadScore": null,"aiLeadTemperature": null,"aiProfileSummary": null,"bondInfo": {"suretyCompany": "AMERICAN CONTRACTORS INDEMNITY COMPANY","bondNumber": "100883043","effectiveDate": "2024-08-19"},"workersComp": {"coverageType": "Exempt","insuranceCompany": null,"policyNumber": null,"effectiveDate": null,"expirationDate": null},"observedAt": "2026-08-14T07:12:10.709Z","error": null}
The most complete California CSLB contractor license scraper available. It returns every field the CSLB public data export exposes for a licensed contractor (license number, business name and type, status, trade classifications, issue and expiry dates, full address, county and phone), plus the contractor bond and workers' compensation detail, and gives you classification and county filters to pull exactly the contractors you need.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor requests the CSLB public data export for the classifications and counties you select, parses the returned spreadsheet, and writes one normalized record per licensed contractor to the run's dataset. Each record carries the license number, business name and type, license status, trade classifications, issue and expiry dates, full address with county, and the phone on file. When withDetails is on (the default), each record also includes the contractor bond block (surety company, bond number, effective date) and the workers' compensation block (coverage type, insurer, policy number, effective and expiration dates).
Dates are normalized to YYYY-MM-DD and missing values are returned as null. Optional paid AI add-ons (lead score, profile summary) and a contact enrichment add-on are off by default and billed per record only when they return usable output.
Quickstart
Open the actor, paste this into the input, and press Run. It returns up to 10 plumbing (C-36) contractors in Los Angeles County with bond and workers' comp detail.
{"classifications": ["C-36"],"counties": ["19"],"maxLicenses": 10,"withDetails": true}
classifications and counties are both required and use the CSLB codes (county 19 is Los Angeles). Up to 10 classifications and 10 counties per run.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
classifications | string[] | yes | (none) | One or more CSLB license classifications, for example C-10 (Electrical), C-36 (Plumbing), B (General Building). Up to 10 per run. |
counties | string[] | yes | (none) | One or more California county codes, for example 19 (Los Angeles), 30 (Orange), 37 (San Diego). Up to 10 per run. |
maxLicenses | integer | no | 10 | Maximum license records to collect across all classifications and counties (1 to 1000000). Free Apify plans are capped at 10. |
withDetails | boolean | no | true | When on, each record includes the contractor bond and workers' compensation detail. When off, only the core license fields are emitted. |
withLeadScore | boolean | no | false | Paid add-on. AI-qualifies each contractor as a sales lead (0-100 plus hot/warm/cold). Billed per record only when a score is produced. |
withProfileSummary | boolean | no | false | Paid add-on. Adds a 1-2 sentence AI profile summary. Billed per record only when a summary is produced. |
enrichContacts | boolean | no | false | Paid add-on. For records without an email, attempt to find a public business contact email and name. Billed per attempt, plus an extra charge only when an email is found. |
enrichContactsMax | integer | no | 50 | Cap how many results the contact add-on tries to enrich. Free Apify accounts are capped at 3. |
If no classification or county is provided, the run stops without charging. AI and contact add-ons require a paid Apify plan and are disabled for free accounts.
Output reference
One dataset item per contractor license. Types: string, integer, number, string[], object, or null when the value is absent.
| Field | Type | Description |
|---|---|---|
businessName | string | Licensed business name. |
licenseNumber | string | CSLB license number. |
status | string | License status, for example CLEAR, EXPIRED, SUSPENDED. |
url | string | CSLB license detail page URL. |
businessType | string | Business type (Corporation, Sole Ownership, ...), or null. |
classifications | string[] | Trade classifications held on the license. |
issueDate | string | License issue date (YYYY-MM-DD), or null. |
expireDate | string | License expiry date (YYYY-MM-DD), or null. |
address | string | Business street address. |
city | string | City. |
state | string | State code (CA). |
zip | string | Postal code. |
county | string | County name. |
phone | string | Phone on file, or null. |
bondInfo | object | Contractor bond { suretyCompany, bondNumber, effectiveDate } (only with withDetails), or null. |
workersComp | object | Workers' comp { coverageType, insuranceCompany, policyNumber, effectiveDate, expirationDate } (only with withDetails), or null. |
aiLeadScore | number | AI lead score (0-100) when the add-on is enabled, else null. |
aiLeadTemperature | string | AI lead temperature (hot/warm/cold) when enabled, else null. |
aiProfileSummary | string | AI profile summary when the add-on is enabled, else null. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
When the contact add-on finds an email, extra fields are added: enrichedEmail, enrichedContactName, enrichedJobTitle, enrichedEmailStatus, enrichedSource, enrichedConfidence.
Example output record
Real record from a live run (input {"classifications": ["B","C-36"], "counties": ["19"], "withDetails": true, "withLeadScore": true, "withProfileSummary": true}):
{"businessName": "EL DESIGN INC","licenseNumber": "1090237","status": "CLEAR","businessType": "Corporation","classifications": ["B", "C36"],"issueDate": "2022-04-19","expireDate": "2028-04-30","address": "185 GLENDALE BLVD","city": "LOS ANGELES","state": "CA","zip": "90026","county": "Los Angeles","phone": "(213) 247 5025","bondInfo": {"suretyCompany": "AMERICAN CONTRACTORS INDEMNITY COMPANY","bondNumber": "100883043","effectiveDate": "2024-08-19"},"workersComp": { "coverageType": "Exempt", "insuranceCompany": null, "policyNumber": null, "effectiveDate": null, "expirationDate": null },"aiLeadScore": 75,"aiLeadTemperature": "warm","aiProfileSummary": "EL DESIGN INC is a licensed contractor based in Los Angeles, CA, with CSLB license 1090237, classified under B and C36. The corporation has been licensed since April 19, 2022, and has a clear status with a contractor bond from American Contractors Indemnity Company.","observedAt": "2026-08-14T07:12:10.709Z","error": null}
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~california-cslb-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"classifications":["C-36"],"counties":["19"],"maxLicenses":25,"withDetails":true}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~california-cslb-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"classifications":["C-10","C-46"],"counties":["30","37"],"maxLicenses":500}'
Apify CLI:
apify call scrapers_lat/california-cslb-scraper \--input '{"classifications":["B"],"counties":["19"]}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per license record returned (
resultevent). Adetailsevent is charged when real bond or workers' comp detail is merged. See the pricing tab for current prices. - No charge on failure. If the download fails or matches nothing, the actor writes a single item with a populated
errorfield and does not charge. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results, including add-on charges. - Free Apify plans are capped at 10 records per run. Upgrade for higher
maxLicenses. - AI and contact add-ons require a paid Apify plan and are billed per record only when they return usable output.
FAQ and troubleshooting
How do I select classifications and counties?
Pick from the dropdowns in the input, or pass the CSLB codes directly. Classifications use the CSLB labels (C-36, B, C-10); counties use their numeric codes (19 = Los Angeles). Up to 10 of each per run.
A run returned 0 records. Why? No contractor in the selected counties held the selected classifications, or the portal returned no spreadsheet. Broaden the classifications or add counties. Empty runs cost nothing.
Do I get bond and workers' comp?
Yes, when withDetails is on (the default). Each record includes the bondInfo and workersComp blocks parsed from the CSLB export, with null where the source omits a value.
Why is workersComp.insuranceCompany null?
The contractor is Exempt, self-insured, or has no current W/C policy. Only rows with an active W/C policy carry an insurer and policy number.
Is this an official CSLB tool? No. This actor is independent and has no affiliation with the California Contractors State License Board. It reads only publicly available CSLB data.
Related scrapers
- California DRE Scraper: California real estate licensee records.
- Florida DBPR Scraper: Florida professional and contractor licenses.
- USA Contractor Licenses Scraper: Contractor licenses across US states.
- Texas TDLR Scraper: Texas licensed professionals and businesses.
- Oregon CCB Contractors Scraper: Oregon licensed construction contractors.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with the California Contractors State License Board (CSLB). Accesses only publicly available license data.
