# California Contractor License Lookup (CSLB): Owners & Bonds (`spriggs-data/california-contractor-license-lookup`) Actor

Look up and export California CSLB contractor licenses from CSLB's official data files: ~245,000 licenses with owner/officer/RMO names, classifications, bond, workers' comp, phone & address. Search by name, owner or license #; filter by trade, county, city, ZIP, expiring or new.

- **URL**: https://apify.com/spriggs-data/california-contractor-license-lookup.md
- **Developed by:** [Thomas Spriggs](https://apify.com/spriggs-data) (community)
- **Categories:** Lead generation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 license records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## California Contractor License Lookup (CSLB): Owners, Bonds & Workers' Comp

Look up, verify and export **California contractor licenses** from the **Contractors State License Board (CSLB)'s own data files**: about **245,000 licenses**, every classification (A, B, B-2, C-10 electrical, C-20 HVAC, C-36 plumbing, C-39 roofing, C-46 solar, C-53 pool…), with **current owners, officers and RMO/RME qualifiers**, **contractor bond** (surety, number, amount), **workers' compensation** (insurer and expiry, or exemption), phone, address and county.

- **Verify** contractors by license number or by business, owner or officer name, in bulk.
- **Export lead lists**: every active C-39 roofer in Los Angeles County, every solar contractor in San Diego, every HVAC contractor in Fresno, with the owner's name.
- **Renewal, bonding and insurance leads**: licenses expiring in the next N days, with their current surety and workers' comp carrier.
- **New-business leads**: contractors licensed since a date.

No login, no browser, no CAPTCHA, no scraping of the CSLB lookup site: the actor reads CSLB's free **License Master** and **Personnel** files from the CSLB Public Data Portal, so a run over the whole state takes seconds and costs a fraction of a cent in compute.

### Input

| Field | What it does |
|---|---|
| `names` | Business, DBA, **owner, officer or qualifier** names. Every word must appear in the same name (case-insensitive; LLC/Inc/Co ignored). `christopher moran` finds every license where a Christopher Moran is the owner, an officer or the RMO/RME. |
| `licenseNumbers` | CSLB license numbers to verify. Numbers that match nothing are listed in the run summary (`licenseNumbersNotFound`). |
| `trades` | `roofing` (C-39), `solar` (C-46), `electrical` (C-10), `plumbing` (C-36), `hvac` (C-20), `general` (A/B), `home_improvement` (B-2), `pool_spa` (C-53), `landscaping` (C-27), `concrete_masonry`, `fire_protection` and more. |
| `licenseTypeContains` | Classification codes or names, e.g. `C-10`, `C39`, `B-2`, `Solar`. |
| `counties`, `cities`, `zipCodes` | Business-address county (`Los Angeles`, `Orange County`), city (exact) and ZIP (5 digits or a prefix like `921`). |
| `status` | `active` (default: CSLB status CLEAR, not expired, not inactive) or `any`. |
| `expiringWithinDays` | Only licenses expiring in the next N days. |
| `issuedAfter` | Only licenses first issued on or after a date (YYYY-MM-DD). |
| `maxItems` | Cap on records saved and charged (default 100). |
| `includePersonnel` | Owners/officers/qualifiers on each record (default on). |

#### Examples

Every active roofing contractor in Los Angeles County, with owner names:

```json
{ "trades": ["roofing"], "counties": ["Los Angeles"], "maxItems": 5000 }
```

Verify a list of license numbers (any status):

```json
{ "licenseNumbers": ["1000002", "1001040", "1084212"], "status": "any" }
```

Every license a person is an owner, officer or qualifier on:

```json
{ "names": ["christopher moran"], "status": "any" }
```

HVAC contractors in Fresno whose license expires within 90 days:

```json
{ "trades": ["hvac"], "cities": ["Fresno"], "expiringWithinDays": 90 }
```

Contractors licensed since October 1:

```json
{ "issuedAfter": "2026-10-01", "maxItems": 1000 }
```

### Output

One record per license. Real record (October 2026):

```json
{
  "licenseNumber": "1002782",
  "licenseCode": "C-46",
  "licenseType": "Solar Contractor (C-46)",
  "businessName": "LETS GET SOLAR NUWORLD ENERGY SOLUTIONS INC",
  "status": "Active",
  "issueDate": "2015-04-09",
  "expirationDate": "2027-04-30",
  "daysUntilExpiration": 188,
  "address": "6413 EL PATO CT", "city": "Carlsbad", "state": "CA", "zip": "92009", "county": "San Diego",
  "phone": "8587332255",
  "bondAmount": 25000.0,
  "trades": ["solar"],
  "primaryContactName": "Eric Thrall Murphy",
  "primaryContactTitle": "Responsible Managing Officer/Chief Executive Officer/President",
  "personnel": [
    { "name": "Eric Thrall Murphy", "firstName": "Eric", "lastName": "Murphy",
      "titles": ["Responsible Managing Officer/Chief Executive Officer/President"],
      "qualifyingClassifications": ["C-46"], "since": "2015-04-09" }
  ],
  "extra": {
    "businessType": "Corporation", "primaryStatus": "CLEAR", "workersCompCoverage": "Exempt",
    "bondSurety": "WESTERN SURETY COMPANY", "bondNumber": "67030142", "bondEffectiveDate": "2024-04-22",
    "recordLastUpdated": "2025-04-08"
  },
  "dataAsOf": "2026-10-23",
  "verifyUrl": "https://www.cslb.ca.gov/OnlineServices/CheckLicenseII/CheckLicense.aspx"
}
```

`personnel` lists only people with a **current** association, best contact first (sole owner, CEO/president, then RMO/RME qualifiers and other officers). `extra` adds the workers' comp coverage type, insurer and expiry date (or `Exempt`) and the bond details. A `RUN_SUMMARY` record in the key-value store shows how many records were scanned and saved, the data date, and any license numbers that weren't found.

Export as JSON, CSV or Excel, or use it from the Apify API, Zapier, Make, n8n or the Apify MCP server for AI agents. Save an input as a Task and schedule it to monitor a list of contractors or catch new licenses every week.

### Pricing

Pay per result: **$2 per 1,000 license records** on the Free plan, cheaper on paid plans, plus a tiny start fee. Filters run before anything is saved, so you only pay for the records you asked for. `maxItems` caps every run.

### Data and limits

- **Source:** CSLB Public Data Portal, *License Master* and *Personnel* files (California public records, free of charge). The actor reads a copy of the same official files that we refresh from CSLB about daily (CSLB's download server sometimes cuts long downloads), and falls back to CSLB directly when that copy is more than 7 days old. Every record shows its file date in `dataAsOf`.
- CSLB's files hold current and expired-but-renewable licenses. Cancelled and revoked licenses, complaint and disciplinary history aren't in the files, so check `verifyUrl` (CSLB's own lookup) for those.
- Names and addresses are exactly as CSLB publishes them. This is public licensing data; use it in line with California and US law (including telemarketing and anti-spam rules).
- Not affiliated with or endorsed by CSLB.

### Need other states?

**[US Contractor License Lookup](https://apify.com/spriggs-data/us-contractor-license-lookup)** searches 14 official databases in one run: California plus Florida DBPR, Texas TDLR, Ohio OCILB, Washington L\&I, Oregon CCB/BCD, New York, NYC, Connecticut, Colorado and Maryland.

### Related Spriggs Data actors

- **[US Building Permits API: Construction, Roofing & Solar Leads](https://apify.com/spriggs-data/us-building-permits)**: new building permits from 42 official city and county portals, including Los Angeles, San Francisco and unincorporated San Diego County, with contractor names to check here.
- **[Bluesky Scraper](https://apify.com/spriggs-data/bluesky-scraper)** and **[Mastodon & Lemmy Scraper](https://apify.com/spriggs-data/fediverse-scraper)**: public social posts and profiles, no login.

*Built and maintained by Spriggs Data.*

# Actor input Schema

## `names` (type: `array`):

Business, DBA, owner, officer or qualifier (RMO/RME) names. Every word must appear in the same name (case-insensitive; LLC/Inc/Co ignored): 'smith roofing' finds 'SMITH & SONS ROOFING INC', 'christopher moran' finds every license where he is an owner, officer or qualifier. Leave empty to list contractors by the filters below.

## `licenseNumbers` (type: `array`):

CSLB license numbers to verify, e.g. '1000002'.

## `trades` (type: `array`):

Only contractors holding a CSLB classification in these trades (e.g. roofing = C-39, solar = C-46, electrical = C-10, plumbing = C-36, HVAC = C-20, general = A/B).

## `licenseTypeContains` (type: `array`):

CSLB classification codes or names, e.g. 'C-10', 'C39', 'B-2', 'Solar'. Matches any license holding one of them.

## `cities` (type: `array`):

Business city (exact name, case-insensitive), e.g. 'Sacramento', 'Fresno'.

## `counties` (type: `array`):

California county of the business address, e.g. 'Los Angeles', 'San Diego', 'Orange'.

## `zipCodes` (type: `array`):

Business ZIP (5 digits, or a prefix like '921').

## `status` (type: `string`):

Active only, or every status (useful for due-diligence checks).

## `expiringWithinDays` (type: `integer`):

Only licenses whose expiration date is in the next N days: renewal / insurance / bonding leads.

## `issuedAfter` (type: `string`):

YYYY-MM-DD. Only licenses first issued on or after this date: new-business leads.

## `maxItems` (type: `integer`):

Hard cap on records saved (and charged) per run.

## `includePersonnel` (type: `boolean`):

Adds <code>personnel</code> (current sole owner, CEO/president, officers, RMO/RME qualifiers with their classifications and start dates) and <code>primaryContactName</code> / <code>primaryContactTitle</code> from CSLB's free Personnel file.

## `includeRaw` (type: `boolean`):

Adds the untouched original row under 'raw'.

## Actor input object example

```json
{
  "names": [],
  "trades": [
    "solar"
  ],
  "counties": [
    "San Diego"
  ],
  "status": "active",
  "maxItems": 30,
  "includePersonnel": true,
  "includeRaw": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "names": [],
    "trades": [
        "solar"
    ],
    "counties": [
        "San Diego"
    ],
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("spriggs-data/california-contractor-license-lookup").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "names": [],
    "trades": ["solar"],
    "counties": ["San Diego"],
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("spriggs-data/california-contractor-license-lookup").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "names": [],
  "trades": [
    "solar"
  ],
  "counties": [
    "San Diego"
  ],
  "maxItems": 30
}' |
apify call spriggs-data/california-contractor-license-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,spriggs-data/california-contractor-license-lookup"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/NTbg0x2VldQzSCPa6/builds/98akvLTL36eWkpKHz/openapi.json
