California CSLB Contractor License Scraper avatar

California CSLB Contractor License Scraper

Pricing

from $9.23 / 1,000 results

Go to Apify Store
California CSLB Contractor License Scraper

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

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

12 days ago

Last modified

Share

California CSLB Contractor License Scraper

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

Apify Coverage Output Billing

Table of contents

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

FieldTypeRequiredDefaultDescription
classificationsstring[]yes(none)One or more CSLB license classifications, for example C-10 (Electrical), C-36 (Plumbing), B (General Building). Up to 10 per run.
countiesstring[]yes(none)One or more California county codes, for example 19 (Los Angeles), 30 (Orange), 37 (San Diego). Up to 10 per run.
maxLicensesintegerno10Maximum license records to collect across all classifications and counties (1 to 1000000). Free Apify plans are capped at 10.
withDetailsbooleannotrueWhen on, each record includes the contractor bond and workers' compensation detail. When off, only the core license fields are emitted.
withLeadScorebooleannofalsePaid 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.
withProfileSummarybooleannofalsePaid add-on. Adds a 1-2 sentence AI profile summary. Billed per record only when a summary is produced.
enrichContactsbooleannofalsePaid 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.
enrichContactsMaxintegerno50Cap 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.

FieldTypeDescription
businessNamestringLicensed business name.
licenseNumberstringCSLB license number.
statusstringLicense status, for example CLEAR, EXPIRED, SUSPENDED.
urlstringCSLB license detail page URL.
businessTypestringBusiness type (Corporation, Sole Ownership, ...), or null.
classificationsstring[]Trade classifications held on the license.
issueDatestringLicense issue date (YYYY-MM-DD), or null.
expireDatestringLicense expiry date (YYYY-MM-DD), or null.
addressstringBusiness street address.
citystringCity.
statestringState code (CA).
zipstringPostal code.
countystringCounty name.
phonestringPhone on file, or null.
bondInfoobjectContractor bond { suretyCompany, bondNumber, effectiveDate } (only with withDetails), or null.
workersCompobjectWorkers' comp { coverageType, insuranceCompany, policyNumber, effectiveDate, expirationDate } (only with withDetails), or null.
aiLeadScorenumberAI lead score (0-100) when the add-on is enabled, else null.
aiLeadTemperaturestringAI lead temperature (hot/warm/cold) when enabled, else null.
aiProfileSummarystringAI profile summary when the add-on is enabled, else null.
observedAtstringISO 8601 timestamp of when the record was collected.
errorstringnull 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:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "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 (result event). A details event 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 error field and does not charge. Empty runs cost nothing.
  • Spend cap respected. Set maxTotalChargeUsd on 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.

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.