CSLB California Contractor License Scraper avatar

CSLB California Contractor License Scraper

Pricing

from $19.00 / 1,000 results

Go to Apify Store
CSLB California Contractor License Scraper

CSLB California Contractor License Scraper

Bulk-scrape California CSLB contractor licenses to JSON. Full public record per license: status, all classifications, bonds, workers'-comp, disciplinary history, personnel, phone, address. Search by license number or business/owner name; filter by city, county, ZIP, classification, status.

Pricing

from $19.00 / 1,000 results

Rating

0.0

(0)

Developer

StackRelay

StackRelay

Maintained by Community

Actor stats

0

Bookmarked

18

Total users

8

Monthly active users

8 days ago

Last modified

Share

Bulk-scrape California contractor licenses from the CSLB (Contractors State License Board) public database. One result = one California contractor's public-record data — license status, classifications, bond info, workers-comp coverage, disciplinary/administrative history, personnel, and addresses.

Disclaimer — please read before running. This actor is an independent data tool built by StackRelay. It is not affiliated with, endorsed by, or operated by the California Contractors State License Board (CSLB) or the State of California. Results are a best-effort, point-in-time snapshot of the public CSLB license-check pages, provided AS-IS with no warranty of accuracy, completeness, or timeliness — license status, bonds, workers-comp, and disciplinary/administrative entries can change at any time after a record is fetched, and some upstream filings lag by days to weeks. Every record carries a source_url linking to the official CSLB detail page and a scraped_at timestamp: verify independently at the source before acting on any record. Disciplinary and administrative action entries are verbatim, point-in-time reproductions of what CSLB published — not adjudications or determinations by StackRelay; confirm each at its source_url before relying on or repeating it. Output contains personal data (owner/qualifying-party names and addresses); if you process data about EU/UK residents you may be an independent data controller under GDPR/UK GDPR. This actor's output is not a consumer report and must not be used for FCRA-regulated purposes — employment, tenant, or credit screening decisions about an individual. By running this actor you agree to the ./DEVELOPER_TERMS.md.

Built for compliance teams verifying subcontractors, insurance underwriters pricing contractor policies, construction PMs vetting subs, and B2B sales teams prospecting California contractors (roofing, HVAC, electrical, plumbing, general building — every CSLB classification is searchable).

What makes this actor different

CSLB publishes an unusually rich public contractor dataset — bond info, workers-comp, and disciplinary/administrative history are all on file. Many competing CSLB scrapers return only license number, name, and status. This actor returns the fields CSLB publishes on its public detail pages, with a stable JSON schema. Field completeness varies by license and by what CSLB has on file.

FeatureThis actorTypical CSLB actor
Search by license number
Search by business namePartial
Narrow by city / county / ZIP / classification / status
All license classifications per rowPrimary only
Bond info (company, amount, effective / cancellation dates)
Workers-comp (carrier, policy number, effective / expiration dates)
Disciplinary actions
ZIP → county auto-fill (CA ZIP crosswalk, ~2,600 ZIPs)
Transparent pay-per-result pricingOften pay-per-event, opaque

How search works

Pick ONE primary search field:

  • licenseNumber — direct lookup (fastest, cheapest)
  • businessName — partial or full, matched case-insensitively against both the legal business name and associated personnel/owner names. "Acme" matches "Acme Construction Co", "Acme Plumbing Inc", etc.; "Smith" also matches "Johnie Cement Work" (owned by John Smith). If you need strict business-name-only matching, filter downstream on the business_name output field.

Optionally narrow the results with any combination of city, county, zipCode, classification, and status. These filters apply client-side after the primary search (CSLB doesn't publish a way to enumerate contractors by city/county alone — so a primary search is required).

Example inputs

Single-license lookup — cheapest, one record:

{
"licenseNumber": "123456"
}

Find SMITH-named contractors in the City of Los Angeles, cap at 25:

{
"businessName": "SMITH",
"city": "Los Angeles",
"maxResults": 25
}

Find every "Green Building" in the ZIP 94703, active status:

{
"businessName": "Green Building",
"zipCode": "94703",
"status": "active"
}

Bulk scrape "Acme" businesses, cap at 1,000:

{
"businessName": "Acme",
"maxResults": 1000
}

Example output (one record)

{
"license_number": "123456",
"business_name": "ACME CONSTRUCTION CO",
"business_address": "123 MAIN ST, LOS ANGELES, CA 90012",
"business_phone": "(213) 555-1234",
"mailing_address": null,
"city": "Los Angeles",
"county": "Los Angeles",
"zip_code": "90012",
"issue_date": "2015-06-14",
"expiration_date": "2026-06-30",
"status": "active",
"entity_type": "corporation",
"classifications": [
{ "code": "B", "description": "GENERAL BUILDING CONTRACTOR" },
{ "code": "C-10", "description": "ELECTRICAL" }
],
"qualifiers": [
{ "name": "JANE SMITH", "association": "RESPONSIBLE MANAGING OFFICER" }
],
"bonds": [
{
"type": "contractor_bond",
"company": "OLD REPUBLIC SURETY",
"amount_usd": 25000,
"effective_date": "2023-07-01",
"cancellation_date": null
}
],
"workers_comp": {
"carrier": "STATE COMPENSATION INSURANCE FUND",
"policy_number": "9999999",
"effective_date": "2024-01-01",
"expiration_date": "2025-01-01"
},
"disciplinary_actions": [],
"administrative_actions": [
{
"type": "LICENSE REISSUED TO ANOTHER ENTITY",
"date": "2018-09-28",
"summary": "09/28/2018 - LICENSE REISSUED TO ANOTHER ENTITY"
}
],
"source_name": "California CSLB (Contractors State License Board) public license lookup",
"source_url": "https://www.cslb.ca.gov/OnlineServices/CheckLicenseII/LicenseDetail.aspx?LicNum=123456",
"scraped_at": "2026-04-22T10:00:00.000Z"
}

Field notes

  • license_number is the stable primary key — use it to deduplicate across runs.
  • classifications, qualifiers, bonds, disciplinary_actions, and administrative_actions are always arrays (may be empty [], never null).
  • disciplinary_actions vs administrative_actions. CSLB lists both genuine enforcement actions (citations, accusations, revocations, probation, judgments) and routine administrative/lifecycle codes (license reissued to another entity, Secretary of State dissolution, bond posted/cancelled, workers-comp exemption changes, partner disassociation, continuances) in one place. We split them: disciplinary_actions holds probable real discipline, and administrative_actions holds the lifecycle/clerical codes. Classification is conservative and heuristic — any code we don't recognize as administrative stays in disciplinary_actions, so a genuine action is unlikely to be hidden, but a non-empty disciplinary_actions array is a flag to review, not a confirmed finding. Both fields are verbatim, point-in-time reproductions of CSLB's published codes; verify each entry at the record's source_url before relying on or repeating it (see the disclaimer at the top of this README).
  • workers_comp is an object or null (null when the contractor has a valid exemption).
  • county is derived from zip_code via a bundled 2,623-ZIP California crosswalk; out-of-state mailing addresses return null.
  • mailing_address is always null from this source — CSLB's detail page does not expose it separately from the business address. (Kept in schema for downstream compatibility.)
  • Dates are ISO-8601 (YYYY-MM-DD); scraped_at is ISO-8601 UTC.

Common use cases

  • Lead generation for companies selling TO California contractors — insurance, fleet, SaaS, equipment, supplies, workwear. Filter by classification (C-10 electrical, C-36 plumbing, C-20 HVAC, C-33 painting, C-39 roofing, C-27 landscaping, B general building, A general engineering) and status: active for a clean ICP list.
  • Subcontractor due diligence — verify license status, bond coverage, workers-comp, and disciplinary history before hiring. Pull by licenseNumber or business name.
  • Insurance underwriting — score contractors by active disciplinary actions, bond cancellation history, and workers-comp status.
  • Compliance monitoring — schedule weekly runs to flag newly expired, suspended, or revoked licenses in your vendor list.
  • Market research — count active C-10 electrical contractors per county, map bond-amount distributions, track new-license issuance trends.

Verify a license by trade

Find contractors by city

Compliance & due diligence

License status monitoring

Lead generation

Find contractors by trade + city

Pricing

Pay-per-result. See the Store listing for the current per-1,000-records rate.

Only fully-formed records are pushed to the Dataset. If a scrape fails mid-record we discard the row — you don't pay for broken data. The maxResults input caps spend per run.

Limitations

  • California only. For Texas licenses, see the companion TDLR Texas Contractor License Scraper. For other states, see the portfolio.
  • No email addresses. CSLB's public record set does not include contractor emails — only business phone and address. For email enrichment, feed the business name + address to LinkedIn, Apollo, ZoomInfo, or Clearbit downstream.
  • Mailing address is always null. CSLB's public detail page does not separate mailing from business address.
  • Disciplinary action summaries are short codes only (e.g. "10/16/2023 - WC EXEMPT CANCELLED-LIC INACTIVATED"). Full complaint narratives live on a separate CSLB page and are not scraped here.
  • Workers-comp data lags real-world changes by up to ~30 days (CSLB filing delay, not this actor).
  • Residential proxy is required, not optional. CSLB's edge (F5 BIG-IP) blocklists Apify's datacenter IP pool, which causes searches to silently return the empty form instead of results. The default proxy configuration uses Apify Residential and adds only a fraction of a cent per record in proxy traffic — we recommend leaving it on. Default maxConcurrency: 8 and 3 retries handle CSLB's actual rate-limit behavior; lower concurrency further if you see retries climb.
  • Not affiliated with CSLB or the State of California. Only publicly available data is scraped.

FAQ

Is scraping CSLB legal? Yes. California license data is public record by statute (Business and Professions Code §7000 et seq.) and explicitly published by CSLB for public use. This actor does not use login, does not bypass any paywall, and collects only data CSLB publishes on its public license-check pages.

Does this include contractor email addresses? No — CSLB's public record set does not include email. You get business_phone and business_address on every record (plus a full personnel list with names and titles). If you need emails, pipe business_name + business_address into LinkedIn Sales Navigator, Apollo, ZoomInfo, or Clearbit — the combo resolves most CA contractors cleanly.

Why does businessName: "Smith" return a contractor whose business name doesn't contain "Smith"? CSLB's name search matches against both the legal business name and associated personnel/owner names. So "Smith" returns Smith Construction Co (business-name match) and Johnie Cement Work owned by John Smith (personnel match). This is useful for due-diligence and background-check workflows — you can find every CA license associated with a person, not just the ones with their name on the door. If you need strict business-name-only matching, filter the output downstream on the business_name field.

How fresh is the data? Each record is scraped live at run time and is a point-in-time snapshot — accurate only as of its scraped_at timestamp. It is as current as CSLB's published detail page at that moment (often same-day for status changes; workers-comp and bond filings can lag CSLB by roughly 1–30 days upstream, sometimes longer for amendments). Always re-verify at the record's source_url before relying on it.

Can I run this on a schedule? Yes. Apify Schedules handles cron. Weekly is a common cadence for keeping a contractor database fresh; daily is fine for narrow active-status monitoring.

How do I export to Google Sheets / CSV / Airbyte / my database? Every field is available via the Apify Dataset API in JSON, CSV, Excel, and HTML formats. Native integrations cover Zapier, Make, n8n, Airbyte, and direct Google Sheets push.

Can I call this from Claude / Cursor / Cline or another MCP client? Yes — any Apify actor is callable via Apify's official MCP server. Point your MCP client at apify-mcp-server and invoke this actor with the same input shape documented above.

Why isn't there a "search everything" option (no primary filter)? CSLB's public search doesn't expose a way to enumerate every California contractor — you must search by license number or business name (which as noted above also matches personnel/owner names). City, county, ZIP, and classification are narrowing filters only. This is a CSLB constraint, not a product choice.

Why does this actor require Apify Residential proxy instead of datacenter? CSLB's web edge (F5 BIG-IP) blocklists commercial datacenter IP ranges. A search routed through datacenter proxies silently returns the empty search form — the actor cannot tell the difference between "your search has no matches" and "you've been blocked," so runs error out with no records. Residential routes traffic through real consumer ISP connections, which CSLB serves normally. The cost difference is small (well under 1% of revenue at our pricing); the success-rate difference is not.

How do I deduplicate across runs? Use license_number — it's CSLB's stable primary key. Re-running the same search returns the same license numbers.

Can you add TDLR Texas / Florida DBPR / other state contractor boards? Yes — that's the roadmap. Each state ships as a separate actor so you only pay for the states you need.

  • What this data is. A best-effort, point-in-time snapshot of the public CSLB license-check pages. The actor is a pipe, not an oracle: fields are passed through from CSLB with formatting normalization only (title-casing, date formats, ZIP→county lookup). Coverage and field completeness vary by license and by what CSLB has on file.
  • It can be wrong or stale. License status, bonds, workers-comp, and disciplinary/administrative entries change over time; some upstream filings lag CSLB by days to weeks. A record is accurate only as of its scraped_at timestamp. Every record carries a source_url to the official CSLB detail page — independently verify any record there before relying on it.
  • Disciplinary/administrative entries are verbatim source data. They are point-in-time reproductions of what CSLB published, not adjudications or determinations by StackRelay. The disciplinary_actions vs administrative_actions split is a conservative heuristic — treat a non-empty disciplinary_actions array as a flag to review at source_url, not a confirmed finding. Do not republish these entries as fact without verifying them at the source.
  • Personal data. Output includes personal data about individuals (owner/qualifying-party names, business addresses, phone). If you process data about EU/UK residents you may be an independent data controller under GDPR/UK GDPR and are responsible for a lawful basis and honoring data-subject rights.
  • Prohibited uses. The output is not a "consumer report" and StackRelay is not a consumer reporting agency. Do not use this data for FCRA-regulated purposes — determining an individual's eligibility for employment, housing/tenancy, credit, or insurance. Verifying a contractor's license/bond/workers-comp status for compliance and due-diligence is the intended use. Do not use the data to harass, stalk, or profile individuals.
  • Not affiliated. This actor is independently developed by StackRelay and is not affiliated with, endorsed by, or operated by CSLB or the State of California. Only publicly available data is scraped.
  • A disclaimer travels with every run in the key-value store record META, and every dataset row carries source_name, source_url, and scraped_at provenance fields.

Full terms: see ./DEVELOPER_TERMS.md. These notes are for the developer's protection and are not legal advice.

Changelog

  • 0.1 (April 2026) — Initial release. Direct license lookup, business-or-owner-name search with pagination (matches CSLB's native business + personnel name index), post-filters for city/county/ZIP/classification/status, ZIP→county auto-fill for all 58 California counties, normalized status and classification codes, full schema per record.
  • 0.1.1 (July 2026) — Documented the source_name provenance field in the Store's dataset schema (was already shipping on every row, just wasn't declared). Added a third dataset view, Compliance, exposing bonds, workers_comp, disciplinary_actions, and administrative_actions for underwriting, due-diligence, and status-monitoring use cases. No output field or input schema changes.
  • 0.1.2 (July 2026) — Published 40 SEO-optimized example Task pages on the Store listing (license verification by trade, city and county lookups, compliance/due-diligence, status monitoring, lead generation, and combined trade+city searches). Added a "Popular use cases" section below linking to all 40 for internal crawl/authority flow. No output field or input schema changes.
  • 0.1.3 (July 2026) — Fixed a pagination/timeout bug affecting low-candidate-density searches (narrow businessName + city/classification combos): the SEARCH handler's multi-page pagination loop could exceed Crawlee's 60s per-request timeout, triggering a retry that started a second pagination loop without cancelling the first — runs still reported SUCCEEDED but with 0 results after ~4 minutes. Added an internal 45s time budget to the SEARCH loop so it always exits cleanly, plus disabled retries on SEARCH requests. Confirmed fix on the 3 affected example Task pages: runtime dropped from ~240–260s to ~51–58s with zero errors or retries. No output field or input schema changes.