CSLB Scraper | Contractor Licenses, Bonds and Leads avatar

CSLB Scraper | Contractor Licenses, Bonds and Leads

Pricing

from $1.62 / 1,000 licenses

Go to Apify Store
CSLB Scraper | Contractor Licenses, Bonds and Leads

CSLB Scraper | Contractor Licenses, Bonds and Leads

CSLB scraper for California contractor licenses: search by trade, county, city, business name, license number or person. Get status, trades, phone, address, bonds, workers' comp, liability insurance and owners. 20 licenses in 14 seconds, 41 fields each. Lead lists and license checks, no login.

Pricing

from $1.62 / 1,000 licenses

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

CSLB Contractor License Scraper | California Licenses, Bonds and Leads (2026)

CSLB licenses, 41 fields each, from any classification.

From SilentFlow. Creators of Facebook Search Scraper and Pinterest Scraper, with 570,000+ combined lifetime runs.

Every California contractor license from the Contractors State License Board (CSLB), one flat row each: status, trades, phone, address, bond, workers' comp, liability insurance and the people on the license. 20 San Diego County electricians with full records in 13 seconds.

Why choose this actor?

Checking contractor licenses one page at a time on cslb.ca.gov? Building a lead list of plumbers or electricians from a spreadsheet that has no owner names, no bond amounts and no insurance dates? Stuck with a tool that only works when you already know the license number?

  • More of each license in every row. On our San Diego test run, 39 fields were filled on at least half of the 20 licenses (36 on a run of 100): status and its explanation, trades with their names, issue and expiration dates, years licensed, phone and full address, county, the contractor's bond with surety, number and amount, workers' comp type, insurer, policy and dates, the qualifier, the owners and officers with their titles, and the complaint disclosure flag. The most used CSLB actor shows 14 fields in its example.
  • Start from a trade and a place, not a license number. Pick a trade and a county, a city or a ZIP code, or the whole state, and get every active license that matches. You can still type business names, license numbers, CSLB links or people. The most used CSLB actor starts from license numbers, business names and people only, so you have to know the contractor first. Here the whole San Diego County list of active C-10 electricians, 2,100 licenses, came back in 8 seconds.
  • The decision maker and the paperwork in the same row. Each full record names the people on the license (owner, CEO, officers, managers, the responsible managing officer or member) with their titles and dates, flags the one who qualifies the license, and lists every bond on file: the contractor's bond, the LLC worker bond and the bond of the qualifying individual. On our 100-license run, every row came back with a contact name and title.

Try CSLB Scraper

Try your first contractor licenses

Paste this input in the actor's Input tab, or keep the prefilled one, and press Start:

{
"classifications": ["C-10"],
"counties": ["San Diego"],
"maxItems": 20,
"includeDetails": true,
"activeOnly": false
}

You get 20 active C-10 electricians from San Diego County in about 13 seconds, each one a row with its license status, phone, address, bond, workers' comp and the people on the license. The Apify Free plan covers runs like this one every month, so you can check the data before you scale to a whole county or the whole state.

How it works

Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:

You have access to the CSLB Scraper on Apify: silentflow/cslb-scraper
It scrapes the California Contractors State License Board (cslb.ca.gov). One dataset row per contractor license.
Input (no field is required; give a trade with a place, or names, numbers or people):
- classifications (array of strings): CSLB trade codes such as "C-10" (Electrical), "C-36" (Plumbing), "B" (General Building), "C-61/D-35" (Pool and Spa Maintenance). Codes like "C10" and words like "plumber", "roofing", "hvac" are read too.
- counties (array of strings): California county names ("San Diego", "Los Angeles", "Orange"); short forms "LA", "SF", "OC" work. Needs a trade.
- cities (array of strings): a city ("Pasadena") or a 5-digit ZIP code ("92101"). Needs a trade.
A trade with no county and no city lists the whole state.
- searchQueries (array of strings): business or DBA names, matched from the start of the name ("pacific construction"). A number typed here is read as a license number.
- licenseNumbers (array of strings): CSLB license numbers ("1079882") or links to any CSLB page of a license (...LicenseDetail.aspx?LicNum=1079882).
- personnelNames (array of strings): people on a license, "Last, First" ("Gainor, Dean") or a last name alone. Returns every license, current or past, they are listed on.
- maxItems (integer, default 100): licenses to save for the whole run.
- includeDetails (boolean, default true): read each license's CSLB page and personnel list (bond amounts, liability insurance, workers' comp class codes, people, qualifier, complaint disclosure). Off: trade lists come straight from the CSLB data portal, thousands of rows in seconds.
- activeOnly (boolean, default false): skip expired, inactive, cancelled, suspended and revoked licenses.
Output per license (57 columns, flat, camelCase, null when CSLB has no value):
- identity: id (license number, string), licenseNumber, url (permanent CSLB page), businessName, dbaName, entityType (Sole Owner, Corporation, LLC, Partnership, Joint Venture)
- license: status (Active, Inactive, Expired, Cancelled, Suspended, Revoked), isActive, statusDetails, additionalStatus[], classifications[] (codes), classificationNames[], certifications[], issueDate, reissueDate, expirationDate, yearsLicensed, lastUpdated
- contact and place: phone, address, city, state, zipCode, county, fullAddress
- bonds: bondCompany, bondNumber, bondAmount (dollars), bondEffectiveDate, bondCancellationDate, bonds[{type, company, number, amount, effectiveDate, cancellationDate}], qualifierName
- workers' comp: workersCompType (Insured, Exempt, Employee Leasing, Self-Insured, No Coverage), isWorkersCompExempt, workersCompCompany, workersCompPolicyNumber, workersCompEffectiveDate, workersCompExpirationDate, workersCompCancellationDate, workersCompSuspendDate, workersCompClassCodes[]
- liability insurance: liabilityInsuranceCompany, liabilityInsurancePolicyNumber, liabilityInsuranceAmount, liabilityInsuranceEffectiveDate, liabilityInsuranceExpirationDate
- people: contactName, contactTitle, personnelCount, personnel[{name, title, associationDate, disassociationDate, classification, isCurrent}], hasPersonnelOnOtherLicenses
- disclosure: hasComplaintDisclosure, complaintDisclosureUrl, miscellaneousInfo[]
- meta: dataCurrentAt (CSLB data stamp, RFC 3339 Pacific time), searchQuery, scrapedAt (RFC 3339 UTC)
Calendar dates are RFC 3339 full-dates (2027-08-31). Use apify-client for Python or JavaScript: client.actor("silentflow/cslb-scraper").call(run_input={...}), then read the default dataset.

How to scrape CSLB contractor licenses

Check a contractor's license by number

The fastest way to verify a contractor you are about to hire, pay or onboard. Paste license numbers or the CSLB links you already have.

{
"licenseNumbers": ["1079882", "https://www.cslb.ca.gov/OnlineServices/CheckLicenseII/LicenseDetail.aspx?LicNum=832000"]
}

Each number becomes one row with the full record, whatever the license status. A number CSLB does not know gives no row, and the run says so in its log.

List every licensed plumber in a city

Pick a trade and type a city or a ZIP code. On our test run, 12 Pasadena plumbers came back with their owners in 10 seconds.

{
"classifications": ["C-36"],
"cities": ["Pasadena"],
"maxItems": 200
}

Build a roofing and solar lead list for three counties

Combine trades and counties. Every active license that holds one of the trades and has its address of record in one of the counties is listed once, even when it holds both trades.

{
"classifications": ["C-39", "C-46"],
"counties": ["Los Angeles", "Orange", "Riverside"],
"maxItems": 1000,
"includeDetails": true
}

Input parameters

FieldTypeDefaultWhat it does
classificationsarray of stringsprefilled C-10CSLB trades to list. Codes (C-10, C10, B, C-61/D-35), names (Electrical) or common words (plumber, roofing, hvac).
countiesarray of stringsprefilled San DiegoCalifornia counties. Names with or without "County", or LA, SF, OC.
citiesarray of stringsnoneCities (Pasadena) or 5-digit ZIP codes (92101), each read with every trade.
searchQueriesarray of stringsnoneBusiness or DBA names, matched from the start of the name.
licenseNumbersarray of stringsnoneLicense numbers or links to a CSLB license page.
personnelNamesarray of stringsnonePeople on a license, Last, First or a last name.
maxItemsinteger100 (prefilled 20)Licenses to save for the whole run.
includeDetailsbooleantrueFull record: license page and personnel list for every license.
activeOnlybooleanfalseKeep active licenses only.

Accepted formats. Trades take the code of the CSLB list in any spacing (C-10, C10, c 10), limited specialty codes with or without their prefix (C-61/D-35, D35), the trade name (Swimming Pool) or an everyday word (electrician, plumber, roofer, landscaper, general contractor). Counties take the 58 county names of California, with or without "County". A city is any name CSLB knows as an address of record; a ZIP code is five digits. License numbers take digits, a leading #, or any link to a CSLB page that carries LicNum= (license detail, bond history, workers' comp history). Names and people are read case-insensitive, punctuation ignored.

What needs what. Counties and cities need at least one trade: the CSLB lists by place are lists of a trade. A trade with no county and no city lists the whole state. Business names, license numbers and people work alone, and every input can be combined in one run: the licenses found by several of them are saved once.

What data can you extract from CSLB?

GroupFields
Identityid, licenseNumber, url, businessName, dbaName, entityType
Licensestatus, isActive, statusDetails, additionalStatus, classifications, classificationNames, certifications, issueDate, reissueDate, expirationDate, yearsLicensed, lastUpdated
Contact and placephone, address, city, state, zipCode, county, fullAddress
BondsbondCompany, bondNumber, bondAmount, bondEffectiveDate, bondCancellationDate, bonds, qualifierName
Workers' compworkersCompType, isWorkersCompExempt, workersCompCompany, workersCompPolicyNumber, workersCompEffectiveDate, workersCompExpirationDate, workersCompCancellationDate, workersCompSuspendDate, workersCompClassCodes
Liability insuranceliabilityInsuranceCompany, liabilityInsurancePolicyNumber, liabilityInsuranceAmount, liabilityInsuranceEffectiveDate, liabilityInsuranceExpirationDate
PeoplecontactName, contactTitle, personnelCount, personnel, hasPersonnelOnOtherLicenses
DisclosurehasComplaintDisclosure, complaintDisclosureUrl, miscellaneousInfo
MetadataCurrentAt, searchQuery, scrapedAt

That is 57 columns per license. bonds holds one object per bond on file (6 fields each) and personnel one object per person, current or past (6 fields each). On our 100-license San Diego run, every row had its phone, address, bond surety, number and amount, workers' comp type, contact name and title; workers' comp insurer and policy number were on 46 of them (the other licensees certified they have no employees), liability insurance on the 4 LLCs.

Usable as is. id and url are stable: the license number never changes and the CSLB page link is permanent. Calendar dates are RFC 3339 full-dates (2027-08-31), ready for a spreadsheet filter. dataCurrentAt is the stamp CSLB prints on the license page, in Pacific time, so you know how fresh each record is. A value CSLB does not publish is null, never an empty text or a 0, and a list the run did not read (personnel with full records turned off) is null, while a list read and empty is [].

Output example

{
"id": "1079882",
"licenseNumber": "1079882",
"url": "https://www.cslb.ca.gov/OnlineServices/CheckLicenseII/LicenseDetail.aspx?LicNum=1079882",
"businessName": "THE REMS GROUP LLC",
"dbaName": null,
"entityType": "LLC",
"status": "Active",
"isActive": true,
"statusDetails": "This license is current and active.",
"additionalStatus": [],
"classifications": ["C-10"],
"classificationNames": ["Electrical"],
"certifications": [],
"issueDate": "2021-08-17",
"reissueDate": null,
"expirationDate": "2027-08-31",
"yearsLicensed": 5,
"lastUpdated": null,
"phone": "(702) 683-3335",
"address": "2449 CADES WAY STE B",
"city": "VISTA",
"state": "CA",
"zipCode": "92081",
"county": "San Diego",
"fullAddress": "2449 CADES WAY STE B, VISTA, CA 92081",
"bondCompany": "AMERICAN CONTRACTORS INDEMNITY COMPANY",
"bondNumber": "100595203",
"bondAmount": 25000,
"bondEffectiveDate": "2023-01-01",
"bondCancellationDate": null,
"bonds": [
{"type": "Contractor's Bond", "company": "AMERICAN CONTRACTORS INDEMNITY COMPANY", "number": "100595203", "amount": 25000, "effectiveDate": "2023-01-01", "cancellationDate": null},
{"type": "LLC Employee/Worker Bond", "company": "GREAT AMERICAN INSURANCE COMPANY", "number": "3963831", "amount": 100000, "effectiveDate": "2021-08-06", "cancellationDate": "2026-11-05"},
{"type": "Bond of Qualifying Individual", "company": null, "number": null, "amount": null, "effectiveDate": "2022-09-12", "cancellationDate": null}
],
"qualifierName": "DEAN CRAIG GAINOR",
"workersCompType": "Employee Leasing",
"isWorkersCompExempt": false,
"workersCompCompany": "ACE AMERICAN INSURANCE COMPANY",
"workersCompPolicyNumber": "C73875821",
"workersCompEffectiveDate": "2026-01-01",
"workersCompExpirationDate": "2027-01-01",
"workersCompCancellationDate": null,
"workersCompSuspendDate": null,
"workersCompClassCodes": [],
"liabilityInsuranceCompany": "RICHMOND NATIONAL INSURANCE COMPANY",
"liabilityInsurancePolicyNumber": "RN7050348702",
"liabilityInsuranceAmount": 1000000,
"liabilityInsuranceEffectiveDate": "2026-01-14",
"liabilityInsuranceExpirationDate": "2027-01-14",
"contactName": "CHRISTINA PEARL GAINOR",
"contactTitle": "MANAGER",
"personnelCount": 2,
"personnel": [
{"name": "CHRISTINA PEARL GAINOR", "title": "MANAGER", "associationDate": "2021-08-17", "disassociationDate": null, "classification": null, "isCurrent": true},
{"name": "DEAN CRAIG GAINOR", "title": "RMM", "associationDate": "2021-08-17", "disassociationDate": null, "classification": "C-10", "isCurrent": true},
{"name": "JAMES MICHAEL DILLAHUNTY", "title": "MANAGER", "associationDate": "2021-08-17", "disassociationDate": "2022-09-12", "classification": null, "isCurrent": false},
{"name": "CARMINE BATTAFARANO", "title": "MANAGER", "associationDate": "2021-08-17", "disassociationDate": "2022-09-12", "classification": null, "isCurrent": false}
],
"hasPersonnelOnOtherLicenses": true,
"hasComplaintDisclosure": false,
"complaintDisclosureUrl": null,
"miscellaneousInfo": [],
"dataCurrentAt": "2026-10-21T05:50:05-07:00",
"searchQuery": "C-10 in San Diego County",
"scrapedAt": "2026-10-21T12:50:06Z"
}

Advanced usage

Pull a whole county list in seconds

Turn full records off and the list comes straight from the CSLB data portal: on our test run, all 2,100 active C-10 electricians of San Diego County in 8 seconds, with phone, address, county, issue and expiration dates, bond surety and number, and workers' comp coverage on each row.

{
"classifications": ["C-10"],
"counties": ["San Diego"],
"maxItems": 5000,
"includeDetails": false
}

Use this for market sizing or a first pass on a territory, then run the licenses you keep with full records to add owners, bond amounts and liability insurance.

Vet a list of subcontractors before you pay them

Paste the license numbers from your vendor list and keep every status, so the expired and suspended ones stand out instead of disappearing.

{
"licenseNumbers": ["1079882", "832000", "1000001", "708387"],
"includeDetails": true,
"activeOnly": false
}

Filter the dataset on isActive, expirationDate, workersCompType and hasComplaintDisclosure, or open the License check view of the dataset, which lays these columns side by side. On our test, license 708387 came back as revoked with its complaint disclosure link, 1000001 as inactive with the workers' comp note that blocks its renewal.

Find every license a person is on

Owners and qualifiers often hold several licenses over time. Type the person as Last, First to get each license they are or were listed on, with its status.

{
"personnelNames": ["Gainor, Dean"],
"includeDetails": true
}

On our test run, this returned the two licenses of that person: a cancelled corporation and an active LLC.

List a niche trade across California

A trade with no county and no city covers the whole state. Pool and spa maintenance (C-61/D-35) gave 1,632 active licenses statewide in 4 seconds without full records, each with its county and the date CSLB last updated the record.

{
"classifications": ["pool and spa maintenance"],
"maxItems": 2000,
"includeDetails": false
}

Track insurance renewals every month

Schedule the actor in the Apify Console (Schedules, then pick this task or input) to read a trade and a county every month. Sort the Insurance view by workersCompExpirationDate or liabilityInsuranceExpirationDate to see whose policies end next, with the insurer and policy number.

{
"classifications": ["B", "C-10", "C-36"],
"counties": ["Sacramento", "Placer"],
"maxItems": 3000,
"includeDetails": true,
"activeOnly": true
}

Every run reads CSLB live, so the dataset of each run is a dated snapshot. Export it as CSV, Excel or JSON from the dataset page, or send it to Google Sheets, HubSpot or your warehouse with an Apify integration.

FAQ

What is the CSLB? The Contractors State License Board licenses and regulates contractors in California. Construction and home improvement work in the state needs a CSLB license beyond small jobs, so its records list the electricians, plumbers, roofers, general contractors and the other trades working in California, with their bonds and insurance.

What does one row contain? One contractor license: identity, status and dates, trades, phone and address, bonds, workers' comp, liability insurance, the people on the license and the complaint disclosure flag, 57 columns in all. The table above lists each group.

Do I need a CSLB account or an API key? No. Everything returned is the public license record CSLB shows to anyone who checks a license. There is no login and nothing to set up: pick a trade and a county and press Start.

How fresh is the data? Live. Every run reads CSLB at the time it runs, and each full record carries the dataCurrentAt stamp CSLB prints on the license page. Schedule the actor to keep a dated history of a list.

Can I get every licensed contractor in a county? Yes, for one or several trades at a time. A county list holds every active license of the trades you pick whose address of record is in the county: 2,100 C-10 electricians in San Diego County on our test run. Set maxItems above the count you expect, and turn full records off when you need the whole list fast.

Does it return email addresses? No. CSLB publishes a business phone number and the address of record, not emails. Each row gives the phone, the full address, the people on the license and the permanent CSLB page.

Why are some fields empty? CSLB fills them only when they apply. Liability insurance is only required from LLCs, a DBA only exists when the contractor uses one, workers' comp insurer and policy are empty when the licensee certified it has no employees (workersCompType is then Exempt). An empty field comes back as null, so a missing value is never mistaken for a real one.

How does the business name search match? From the start of the name, case and punctuation ignored: pacific construction returns PACIFIC CONSTRUCTION, PACIFIC CONSTRUCTION MANAGERS LLC, PACIFIC CONSTRUCTION SERVICES INC and the other names that begin with these words, including DBA and former names. A name in the middle (rems group for THE REMS GROUP LLC) is not matched: type the name as it starts, or use the license number. Expired and cancelled licenses are included unless you tick Active licenses only.

Which trades can I pick? All 78 classifications of the CSLB lists: A General Engineering, B General Building, B-2 Residential Remodeling, the C trades from C-2 Insulation to C-61 Limited Specialty and its D subcategories, and the ASB and HAZ certifications. The form lists them by code and name; you can also type a code or an everyday word.

Can I combine trades, places and filters? Yes. classifications: ["C-39", "C-46"] with counties: ["Los Angeles", "Orange"] and cities: ["Pasadena"] reads the roofers and solar contractors of both counties and of Pasadena, and saves each license once. Add business names, license numbers or people in the same run, and tick Active licenses only to drop the rest.

Are the links permanent? Yes. url is the CSLB license page of the license number, which does not change. complaintDisclosureUrl is the CSLB disclosure page of the license. The rows carry no image or temporary link.

What do RMO, RME and RMM mean in the titles? They are the person whose experience qualifies the license: the responsible managing officer of a corporation, the responsible managing employee, or the responsible managing member of an LLC. The classification of a person in personnel is the trade they qualify, and qualifierName names the first of them.

More SilentFlow scrapers

🛒 E-commerce

💼 Jobs

🏠 Real estate

📣 Social media

🏢 Business data

✈️ Travel

🎯 Lead generation

🔎 SEO

📈 Marketing

🧰 More tools

Support

Need something this scraper doesn't do yet? We ship features fast.

  • Feature requests go straight to our backlog
  • Enterprise needs? We do custom integrations and high-volume plans
  • Pricing questions? Check the Monetization tab on the actor page

Response time: usually under 24 hours.

This Actor extracts publicly available contractor license records from the California Contractors State License Board (cslb.ca.gov). It does not bypass any login, paywall or CAPTCHA, and never uses a CSLB account. Users are responsible for complying with CSLB's conditions of use and applicable data protection laws (GDPR, CCPA, and PIPL where relevant). Rows carry the names of owners, officers and qualifiers, and the address and phone number of sole owners, which can be personal data: handle them accordingly, keep only what you need, and honor removal and opt-out requests, especially before any outreach. CSLB advises checking a license on its own site before hiring a contractor; the data returned is informational, so verify it for regulated or legal decisions. This Actor is not affiliated with or endorsed by the State of California or the CSLB.

CSLB Scraper by SilentFlow: every California contractor license of a trade and a place, with its bond, insurance and people, ready for your spreadsheet.