How-to
How to run Florida Roofing Contractor Directory & Leads (DBPR)
Step-by-step: the exact input, what each field does, and the rows that come back from the source portal.
You sell to roofers in Florida, whether that is shingles, insurance, software or financing, and you want the state’s own list of who is licensed to roof right now. DBPR has that list, in its licence search. The search works one county at a time, 50 results a page, and mixes current licences with exam applicants, null & void and revoked records. It also lists a firm and its licensed qualifier as two separate rows, often pages apart. This actor runs the search for both roofing licences in every county you ask for, reads every page, and hands back one row per current licence.
What you’ll need
Nothing but an Apify account. The actor talks to the source portal directly.
No API key, no CAPTCHA and no proxy. DBPR’s licence search answers Apify’s own IP, so the Proxy configuration field is off by default; set it only if a run comes back blocked.
Step 1 — Open the actor
Open Florida Roofing Contractor Directory & Leads (DBPR) on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.
Step 2 — Fill in the input
| Field | Type | Required | What it does |
|---|---|---|---|
counties | array | no | Florida counties to export, e.g. ‘Miami-Dade’, ‘Hillsborough’, ‘St. Johns’. Case, punctuation and a trailing ‘County’ do not matter; ‘Dade’ and DBPR’s two-digit county codes… (default []) |
cities | array | no | Optional: keep only licensees whose address city is one of these (exact city name, case-insensitive, e.g. ‘Jacksonville’, ‘Cape Coral’). Leave empty for every city. (default []) |
licenseTypes | array | no | CCC = Certified Roofing Contractor (may work anywhere in Florida), RC = Registered Roofing Contractor (limited to the local jurisdictions where they hold a competency card).… (default ['CCC', 'RC']) |
statuses | array | no | active (current or on probation, and active — allowed to contract), inactive, suspended, or all. Default: active. ‘all’ means those three together; null & void, delinquent, revoked and… (default ['active']) |
maxResults | integer | no | Cap on the rows returned for the whole run (this is one statewide export, not a per-county search). Florida had 9,736 active roofing licences on 2026-10-22, so 10000 returns all of… (default 500) |
The field first-timers get wrong is maxResults. It defaults to 500 and it caps the whole run, not
each county. Florida had 9,736 active roofing licences on 2026-10-22, so a statewide run on the
default stops at 500 rows (Alachua, Baker, Bay and onward, in county order). Set it to 10000 to take
the whole state, or leave it low while you test.
counties is the other one that decides your list. Leave it empty and you get all of Florida, plus
licensees DBPR files as out of state or foreign. Spelling is forgiving: Miami-Dade, Dade and
DBPR’s two-digit code all resolve to the same county. A name that is not a Florida county is dropped
and logged, and if none of your names resolve the run returns one free notice row rather than
quietly widening to the whole state. statuses defaults to active, which means DBPR’s Current or
Current with Probation, and Active.
A working input:
{
"counties": [
"Miami-Dade"
],
"licenseTypes": [
"CCC",
"RC"
],
"statuses": [
"active"
],
"maxResults": 2000
}
Step 3 — Run it
Press Start. The run log prints one line per county search with how many licences it read and how many matched, so you can watch it work.
A run is one DBPR search per county and licence type, each read to its last page. The example input above is two searches and returned 1,193 rows in 47 seconds on 2026-10-22. The whole state is about 140 searches: 9,736 active rows took 745 seconds that day, so give a statewide run its default one-hour timeout. If a run does reach its timeout, it returns the rows it has plus one free notice saying how many searches it finished.
An empty result usually means a cities value that does not match DBPR’s spelling exactly (it is an
exact, case-insensitive match, so Port St Joe and Port Saint Joe are different cities). Drop the
city filter, run the county alone, and read the city column to see how DBPR writes it.
Step 4 — Read the output
Each run returns a labelled table, not raw JSON:
Every row looks like this — a real row from a real run:
{
"state": "FL",
"license_number": "CCC1328938",
"license_code": "CCC",
"license_type": "Certified Roofing Contractor",
"business_name": "MODERN ROOFING SOLUTIONS",
"person_name": "AARONS, PIERRE GILBERT",
"status": "Current, Active",
"expiration_date": "2028-08-31",
"address": "4902 SW 67TH TER",
"po_box": false,
"city": "GAINESVILLE",
"address_state": "FL",
"zip_code": "32608",
"county": "Alachua",
"phone": null,
"matched_by": "dbpr_search",
"source_url": "https://www.myfloridalicense.com/LicenseDetail.asp?SID=&id=3EFD7CF8E8DE7D0716AAB468558E9A60"
}
| Field | Example value | Meaning |
|---|---|---|
business_name | MODERN ROOFING SOLUTIONS | Firm on the licence (DBPR’s DBA name); the qualifier’s own name when no firm is listed |
person_name | AARONS, PIERRE GILBERT | Licensed qualifier (DBPR’s Primary name), as DBPR writes it (LAST, FIRST MIDDLE) |
license_number | CCC1328938 | DBPR licence number (one row per licence) |
license_code | CCC | CCC or RC |
license_type | Certified Roofing Contractor | Certified Roofing Contractor or Registered Roofing Contractor |
status | Current, Active | DBPR status, e.g. ‘Current, Active’, ‘Current with Probation, Active’, ‘Current, Inactive’, ‘Suspended, Active’ |
expiration_date | 2028-08-31 | Expiration date (ISO) |
source_url | https://www.myfloridalicense.com/LicenseDetail.asp?… | The licence’s own DBPR detail page |
Most people came for business_name with the address, and license_code tells you which of the two
roofing licences you are looking at. A CCC holder may roof anywhere in Florida; an RC holder is
limited to the local jurisdictions where they hold a competency card. In Miami-Dade on 2026-10-22 the
active split was 1,165 CCC to 28 RC.
DBPR’s search shows the firm and the qualifier as two rows; the actor merges them by licence number,
so business_name is the firm and person_name the person (99% of active rows carry both). One
qualifier can hold several licences, each its own row, so key on license_number rather than on the
name.
There is no phone and no email. DBPR’s search shows neither, so phone is null on every row, and you
will need another source for contact details. The address is DBPR’s main address on file; 98% of
active rows carry a city and ZIP, and po_box flags the ones that are PO boxes.
Step 5 — Export it
Open the Dataset tab and export to CSV, JSON, or Excel — or pull the same rows from the API, which is what you want if this is going to run on a schedule.
What it costs
$0.002 per roofing licence returned. The Miami-Dade example, 1,193 rows, costs about $2.39. Every active roofer in Florida, 9,736 rows on 2026-10-22, costs about $19.47. A run that matches nothing, an unrecognised county, a DBPR outage, a reached timeout or a reached spending cap each return one free notice row that is never charged. Apify platform usage is billed separately on your plan.
Where the data comes from
This reads the source portal directly. Every night a canary runs this actor against that live source and diffs the result against a frozen fixture — what “verified” means.
The source is DBPR’s public licence search at myfloridalicense.com, board 06 (Construction
Industry), licence types Certified and Registered Roofing Contractor. Until 2026-10-22 this actor read
DBPR’s daily construction-licence file instead; that download moved behind Cloudflare around
2026-10-19 and now refuses cloud IPs, while the search is served by DBPR’s own server. The search
lists every status, so the actor keeps only Current, Current with Probation and Suspended licences:
all here means those, 10,687 on the measurement date. Exam applicants, null & void, delinquent and
revoked records are never returned.
See it used
Export Every Active Florida Roofing Contractor (DBPR) takes the whole state in one run, 9,736 rows, and turns it into a territory list.
Selling to roofers in another state too? Illinois Roofing Contractor Directory & Leads Scraper (IDFPR) does the same job for Illinois, county by county, with city and ZIP but no street address.
Last updated 2026-10-22