🏗️ California CSLB Contractor Scraper — Licenses & Leads avatar

🏗️ California CSLB Contractor Scraper — Licenses & Leads

Pricing

from $2.00 / 1,000 contractor results

Go to Apify Store
🏗️ California CSLB Contractor Scraper — Licenses & Leads

🏗️ California CSLB Contractor Scraper — Licenses & Leads

Find and verify California CSLB contractors by license, classification, county, city, or ZIP. Export license status, phone, bonds, workers’ compensation, and personnel.

Pricing

from $2.00 / 1,000 contractor results

Rating

0.0

(0)

Developer

Zapticx

Zapticx

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

3

Monthly active users

6 days ago

Last modified

Share

Find licensed contractors in California and export clean CSLB license records by classification, county, city, ZIP code, exact business name, or license number. This California contractor scraper combines official bulk CSLB data with optional live California contractor license lookup, giving you a low-cost contractor database for leads, compliance research, bond checks, and workers’ compensation review.

Basic results cost $0.002 per unique contractor record ($2.00 per 1,000) under the configured pay-per-event model. Enabling personnel enrichment adds $0.015 once per run, never per person. One dataset row represents one CSLB license; classifications, bonds, workers’ compensation, and personnel stay nested instead of creating duplicate billable rows.

Data comes from the official CSLB Public Data Portal and, when requested, the official live license-detail page.

CSLB does not provide contractor email addresses, so this Actor does not return fabricated emails.

What can you do with this Actor?

  • Build California contractor leads by trade and geography.
  • Verify a list of CSLB license numbers and refresh current status/date fields.
  • Find electrical, plumbing, roofing, HVAC, landscaping, solar, and general contractors.
  • Screen subcontractors using license standing, expiration, bond, and workers’ compensation data.
  • Research contractor classifications, counties, cities, and ZIP codes.
  • Export structured records through the Apify API for analytics or automation.

How to use

  1. Create a free Apify account. The current Free plan includes $5 of monthly usage credit.
  2. Open the Actor, choose classifications or another meaningful filter, and set maxResults.
  3. Enable bonds, workers’ compensation, personnel, or live verification as needed.
  4. Run the Actor and export the default dataset as JSON, CSV, Excel, or another supported format.

The form opens prefilled with a C-36 + Los Angeles example that returns 10 real results and is designed to finish within the Store’s five-minute expectation under observed source conditions.

Features

  • Official statewide CSLB bulk source; no page-per-contractor discovery crawl.
  • Direct license-number lookup and case-insensitive exact business-name matching.
  • Classification, county, city, ZIP, and license-status filtering.
  • AND between filter categories and OR within each array.
  • One normalized record per license number, with classification aggregation and deduplication.
  • Structured contractor, workers/employee, and disciplinary bond arrays.
  • Current/most-recent workers’ compensation fields as supplied by CSLB.
  • Optional current personnel associations without one paid result per person.
  • Optional direct-HTTP live verification; bulk data is retained if verification fails.
  • Source dates, record dates, provenance URLs, concise run statistics, and schema-change detection.
  • A verified shared copy of CSLB's License Master, published by Zapticx with checksums and the true CSLB source date. Runs use it first, fall back to the validated copy cached in your account, and only then download directly from CSLB. The cache refreshes itself when CSLB publishes a newer file (CSLB publishes daily). Whenever the data is older than CSLB's latest file, or the date could not be checked, every record says so in sourceCacheState and sourcePublishedAt; live verification remains available when current status matters.
  • No residential proxy, browser automation, login, or email inference.

Data fields

FieldDescription
licenseNumberCSLB contractor license number as a string
businessName, fullBusinessName, dbaLegal/full business and doing-business-as names where supplied
businessTypeCSLB entity/business type
licenseStatusDerived ACTIVE, INACTIVE, EXPIRED, SUSPENDED, or UNKNOWN
statusCode, secondaryStatusSource standing/status values retained for fidelity
issueDate, reissueDate, expirationDateISO dates when confidently parseable
addressStreet, city, state, ZIP, county, and country
phoneDigits-only phone string
classifications[]Display code, raw source code, and official name where mapped
bonds[]Bond type, surety, number, amount, dates, and disciplinary metadata where present
workersComp[]Coverage type, insurer, policy, and relevant dates
personnel[]Current public associations, titles, classifications, dates, and qualifier bond where present
personnelSourceUpdatedAt, personnelSourceStateOptional personnel-snapshot date and cache state when enrichment is requested
sourceUpdatedAt, recordUpdatedAtBulk-source and record freshness
sourceCacheState, sourcePublishedAtWhether the bulk snapshot was freshly downloaded, current, or stale (CSLB publishes newer data than sourceUpdatedAt, or could not be checked), and the date CSLB currently publishes
sourceOriginWhere the bulk data came from: shared-snapshot, local-cache or direct-download
verifiedLive, verifiedAtLive verification outcome and time
sourceUrlOfficial CSLB license-detail URL

null means CSLB did not supply a usable value. Empty arrays mean the related collection was not present or not requested.

Input

  • searchMode: auto (default), master, or identifier-oriented lookup.
  • licenseNumbers: 1–8 digit license numbers. Identifier searches take precedence over discovery filters.
  • businessNames: case-insensitive exact matches; fuzzy matching is not claimed.
  • classifications: codes such as A, B, B-2, C-10, C-36, or C-61/D-49.
  • counties, cities, zipCodes: geography filters.
  • licenseStatuses: friendly status values.
  • includeBond, includeWorkersComp: related-data controls included in the contractor-result price.
  • includePersonnel: attach personnel and charge one $0.015 personnel-enrichment event for the run.
  • verifyLive: verify selected licenses against current CSLB pages.
  • maxResults: 1–10,000 unique license records (10 when omitted).

The C-36 and Los Angeles values in the form are only an example. API calls, schedules and saved Tasks search exactly the filters they send: leaving out cities or classifications means no city or classification filter. A call with no filter at all ends with no results, no charge, and a status message explaining what to send.

{
"classifications": ["C-36"],
"counties": ["Los Angeles"],
"licenseStatuses": ["ACTIVE"],
"includeBond": true,
"includeWorkersComp": true,
"includePersonnel": false,
"verifyLive": false,
"maxResults": 1000
}

If identifiers and discovery filters are both supplied, identifiers win and the Actor logs that discovery filters were ignored.

Output

Illustrative structure (values are sanitized, not represented as a real contractor):

{
"licenseNumber": "1234567",
"businessName": "EXAMPLE CONSTRUCTION INC",
"dba": null,
"businessType": "Corporation",
"licenseStatus": "ACTIVE",
"statusCode": "CLEAR",
"issueDate": "2018-01-10",
"expirationDate": "2027-01-31",
"address": {
"street": "123 MAIN ST",
"city": "LOS ANGELES",
"state": "CA",
"zip": "90001",
"county": "Los Angeles",
"country": "US"
},
"phone": "5551234567",
"classifications": [{ "code": "B", "rawCode": "B", "name": "General Building Contractor" }],
"bonds": [{ "type": "contractor", "suretyCompany": "EXAMPLE SURETY", "bondNumber": "EXAMPLE-1", "amount": 25000, "effectiveDate": "2026-01-01", "cancellationDate": null }],
"workersComp": [],
"personnel": [],
"dataSource": "CSLB",
"sourceMode": "master",
"sourceUpdatedAt": "2026-10-05",
"verifiedLive": false,
"verifiedAt": null,
"sourceUrl": "https://www.cslb.ca.gov/1234567"
}

Pricing

The PPE configuration has two events:

  • contractor-result — $0.002, fired exactly once for each unique contractor record successfully written.
  • personnel-enrichment — $0.015, fired at most once per run, only after CSLB personnel data has been joined to at least one returned contractor record. It is not charged when includePersonnel is false, when no contractors match, or when the personnel file cannot be loaded (records then carry personnelSourceState: "unavailable"), and it never varies with the number of personnel attached.
RecordsBasic runWith personnel
100$0.200$0.215
1,000$2.000$2.015
5,000$10.000$10.015
10,000$20.000$20.015

Bonds and workers’ compensation add no surcharge. Personnel remains nested rather than creating paid rows. Once the personnel file has been joined, the single $0.015 run charge applies even if none of your matched licenses has associated personnel. The spending limit is checked before that work, without charging, so a limit too low for enrichment stops the run early. Live verification remains included in the contractor-result price for V1. See the measured and estimated docs/ECONOMICS.md.

Examples / Tasks

  • Los Angeles Plumbing Contractors — C-36 + Los Angeles County + active status.
  • California Electrical Contractor Leads — C-10 statewide, up to 5,000 records.
  • Roofing Contractors with Insurance Data — C-39 across Los Angeles, Orange, and San Diego counties.
  • Verify a License List — license numbers + searchMode: "lookup" + verifyLive: true.

Ready-to-copy inputs are in the examples/ directory.

API & integrations

Run the Actor through the Apify API or ApifyClient for JavaScript/Python, then read the default dataset. You can also trigger runs with schedules or webhooks and connect the output through Apify’s Make and Zapier integrations. n8n, Google Sheets workflows, MCP clients, and AI agents can call the API or consume exported dataset data; availability depends on how you configure those external tools.

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('ZAPTICX_ACTOR_ID').call({
classifications: ['C-10'],
counties: ['San Diego'],
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Limitations

  • CSLB bulk data is periodic; license status can change after a file is published. Use live verification for consequential checks.
  • If CSLB is slow or down while a newer file is published, discovery uses the last validated snapshot instead of failing. Records are then marked sourceCacheState: "stale-cache", sourceUpdatedAt keeps the snapshot date, and the run's status message says so. A first run that cannot download a complete, validated CSLB file fails with a clear message and returns no partial results.
  • First runs normally read the verified shared snapshot, so they do not depend on CSLB's download service. If the shared snapshot is unavailable or fails its integrity checks, the Actor falls back to your account's cache and then to CSLB directly, which downloads the full License Master (about 78 MB). On days when CSLB's download service is degraded, that direct download can fail with a clear message and no charge. Runs that already have a cached copy keep working from it, labelled stale, and retry a direct refresh at most every 4 hours.
  • CSLB does not provide contractor email addresses. This Actor does not guess or synthesize them.
  • Some source fields are legitimately absent, and personnel reflects public associations supplied by CSLB.
  • Exact business-name matching is supported; fuzzy business search is not.
  • Personnel adds a large source download and may materially extend runtime.
  • Source availability and CSLB’s documented weekly maintenance window can affect runs.

About Zapticx

Zapticx builds structured, automation-ready public-data products on Apify.

This Actor is unofficial and is not affiliated with or endorsed by the California Contractors State License Board (CSLB). It processes publicly available licensing information. Users are responsible for complying with applicable laws and source terms.