# Florida Contractor License Lookup (DBPR): Roofing, HVAC, Pool (`spriggs-data/florida-contractor-license-lookup`) Actor

Look up and export ~129,000 Florida DBPR contractor licenses from the state's official public-record files: general, roofing, A/C, plumbing, pool, solar, electrical & alarm, with licensee, company, address, county, issue & expiry dates. Filter by trade, county, city, ZIP or newly licensed.

- **URL**: https://apify.com/spriggs-data/florida-contractor-license-lookup.md
- **Developed by:** [Thomas Spriggs](https://apify.com/spriggs-data) (community)
- **Categories:** Lead generation, Real estate
- **Security:** Limited permissions
- **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

## Florida Contractor License Lookup (DBPR): Roofing, HVAC, Pool & Electrical

Look up, verify and export **Florida contractor licenses** from the **Florida Department of Business & Professional Regulation (DBPR)'s own public-record files**: about **129,000 licenses** (about 115,000 currently active) from the **Construction Industry Licensing Board** (certified and registered general, building, residential, roofing, air-conditioning, mechanical, plumbing, pool/spa, solar, sheet metal, underground utility and specialty contractors) and the **Electrical Contractors' Licensing Board** (electrical, electrical specialty and alarm system contractors), with licensee name, company (DBA), address, county, status, original issue date and expiry date.

- **Verify** contractors by DBPR license number (`CGC1512345`, `CCC029606`, `EC13001234`…) or by company / licensee name, in bulk.
- **Export lead lists**: every active roofer in Hillsborough County, every pool contractor in the state, every solar contractor in Miami-Dade, every electrician in Orange County.
- **New-business leads**: contractors first licensed since a date (about 970 new construction and electrical licenses were issued between Oct 1 and Oct 31, 2026).
- **Renewal leads**: licenses expiring in the next N days (Florida contractor licenses renew on a two-year cycle, so this is most useful in the months before August 31).

No login, no browser, no CAPTCHA, no scraping of the DBPR license search: the actor reads DBPR's free statewide licensee extract files, so a run over the whole state takes seconds and costs a fraction of a cent in compute.

### Input

| Field | What it does |
|---|---|
| `names` | Company (DBA) or licensee names. Every word must appear in the same name (case-insensitive; LLC/Inc/Co ignored). `westfall roofing` finds `WESTFALL ROOFING`. |
| `licenseNumbers` | DBPR license numbers to verify. Numbers that match nothing are listed in the run summary (`licenseNumbersNotFound`). |
| `trades` | `roofing` (CCC/RC), `hvac` (CAC/RA/CMC/RM/CSC/RS), `plumbing` (CFC/RF), `pool_spa` (CPC/RP), `solar` (CVC), `general` (CGC/CBC/CRC and registered), `electrical` (EC/ER/ES/ET), `alarm_security` (EF/EG/EY/EZ…), `excavation_demolition` (CUC/RU) and specialty trades. |
| `licenseTypeContains` | License type codes or names, e.g. `CGC`, `CCC`, `CPC`, `EC`, `Specialty`, `Swimming Pool`. |
| `counties`, `cities`, `zipCodes` | Address county (`Miami-Dade`, `Palm Beach County`), city (exact) and ZIP (5 digits or a prefix like `336`). |
| `status` | `active` (default: DBPR status current and active, not expired) or `any` (adds inactive, probation, suspended and delinquent licenses). |
| `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). |

#### Examples

Every active roofing contractor in Hillsborough County (Tampa):

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

Every licensed pool & spa contractor in Florida:

```json
{ "trades": ["pool_spa"], "maxItems": 10000 }
```

Verify a list of license numbers (any status):

```json
{ "licenseNumbers": ["CCC029606", "CVC56769"], "status": "any" }
```

Solar contractors in Miami-Dade County:

```json
{ "trades": ["solar"], "counties": ["Miami-Dade"] }
```

Contractors licensed since October 1 (new-business leads):

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

### Output

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

```json
{
  "licenseNumber": "CVC56769",
  "licenseCode": "CVC",
  "licenseType": "Certified Solar Contractor",
  "businessName": "PRESTIGE WINDOWS & DOORS",
  "personName": "SCAVUZZO, CRISTINA ELIZABETH",
  "status": "Active",
  "issueDate": "2009-05-21",
  "effectiveDate": "2022-09-01",
  "expirationDate": "2028-08-31",
  "daysUntilExpiration": 670,
  "isActive": true,
  "address": "8232 COMMERCE WAY", "city": "MIAMI LAKES", "state": "FL", "zip": "33016", "county": "Miami-Dade",
  "trades": ["solar"],
  "extra": { "primaryStatus": "Current", "secondaryStatus": "Active", "countyCode": "23" },
  "dataAsOf": "2026-10-31",
  "verifyUrl": "https://www.myfloridalicense.com/wl11.asp"
}
```

`personName` is the licensed individual (the qualifier); `businessName` is the company they qualify, when DBPR lists one. Specialty licenses (SCC, RX, ES, ET) carry their specialty in `licenseType` and `specialties` (e.g. "Gas Line Specialty", "Swimming Pool Layout", "Sign Specialty"). 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 weekly to catch newly licensed contractors.

### 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:** DBPR's public-record licensee extract files for the Construction Industry and Electrical Contractors' licensing boards (Florida public records, Chapter 119 F.S., free download). DBPR's download server blocks most cloud IPs, so the actor reads a copy of the same official files that we refresh from DBPR daily, and tries DBPR directly when that copy is stale. Every record shows its file date in `dataAsOf`.
- DBPR's files don't include phone numbers or e-mail addresses, complaints or disciplinary history; check `verifyUrl` (DBPR's own license search) for those. Addresses are exactly as DBPR publishes them (some repeat a PO box).
- Covers state-certified and state-registered contractors. Purely local (county or city) certificates of competency aren't in DBPR's files.
- This is public licensing data; use it in line with Florida and US law (including telemarketing and anti-spam rules).
- Not affiliated with or endorsed by DBPR or the State of Florida.

### Need other states?

**[US Contractor License Lookup](https://apify.com/spriggs-data/us-contractor-license-lookup)** searches 14 official databases in one run: Florida plus California CSLB, Texas TDLR, Ohio OCILB, Washington L\&I, Oregon CCB/BCD, New York, NYC, Connecticut, Colorado and Maryland. Single-state editions: **[California Contractor License Lookup (CSLB)](https://apify.com/spriggs-data/california-contractor-license-lookup)** (owners, bonds and workers' comp) and **[Ohio Contractor License Lookup](https://apify.com/spriggs-data/ohio-contractor-license-lookup)** (HVAC, electrical, plumbing).

### 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 Orlando, 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`):

Company (DBA) or licensee names. Every word must appear in the same name (case-insensitive; LLC/Inc/Co ignored): 'westfall roofing' finds 'WESTFALL ROOFING'. Leave empty to list contractors by the filters below.

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

DBPR license numbers to verify, e.g. 'CCC029606', 'EC13001234', 'CGC1512345' (the prefix is the license type: CGC general, CCC roofing, CAC A/C, CFC plumbing, CPC pool, CVC solar, EC electrical...).

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

Only contractors licensed in these trades (roofing = CCC/RC, HVAC = CAC/RA/CMC/CSC, plumbing = CFC/RF, pool = CPC/RP, solar = CVC, general = CGC/CBC/CRC, electrical = EC/ER/ES/ET, alarm = EF/EG/EY/EZ...).

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

DBPR license type codes or names, e.g. 'CCC', 'CGC', 'CPC', 'EC', 'Specialty', 'Swimming Pool'. Matches any one of them.

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

Licensee address city (exact name, case-insensitive), e.g. 'Tampa', 'Orlando', 'Miami'.

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

Florida county of the licensee address, e.g. 'Miami-Dade', 'Hillsborough', 'Orange', 'Palm Beach'.

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

Address ZIP (5 digits, or a prefix like '336').

## `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.

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

Adds the untouched original DBPR row under 'raw'.

## Actor input object example

```json
{
  "names": [],
  "trades": [
    "roofing"
  ],
  "counties": [
    "Hillsborough"
  ],
  "status": "active",
  "maxItems": 30,
  "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": [
        "roofing"
    ],
    "counties": [
        "Hillsborough"
    ],
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("spriggs-data/florida-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": ["roofing"],
    "counties": ["Hillsborough"],
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("spriggs-data/florida-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": [
    "roofing"
  ],
  "counties": [
    "Hillsborough"
  ],
  "maxItems": 30
}' |
apify call spriggs-data/florida-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/florida-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/KxnmJacZv8Hko2GOf/builds/3HWgxjMASc6P0XZNr/openapi.json
