← Guides

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.

The Florida Roofing Contractor Directory & Leads (DBPR) listing on the Apify Store
The listing on the Apify Store. Pricing and the nightly health record are both public.

Step 2 — Fill in the input

The input form for Florida Roofing Contractor Directory & Leads (DBPR) in the Apify Console
The input form, as it appears in the Apify Console.
FieldTypeRequiredWhat it does
countiesarraynoFlorida 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 [])
citiesarraynoOptional: 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 [])
licenseTypesarraynoCCC = 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'])
statusesarraynoactive (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'])
maxResultsintegernoCap 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:

The output fields returned by Florida Roofing Contractor Directory & Leads (DBPR)
The output view — every field the actor returns, named and typed.

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"
}
FieldExample valueMeaning
business_nameMODERN ROOFING SOLUTIONSFirm on the licence (DBPR’s DBA name); the qualifier’s own name when no firm is listed
person_nameAARONS, PIERRE GILBERTLicensed qualifier (DBPR’s Primary name), as DBPR writes it (LAST, FIRST MIDDLE)
license_numberCCC1328938DBPR licence number (one row per licence)
license_codeCCCCCC or RC
license_typeCertified Roofing ContractorCertified Roofing Contractor or Registered Roofing Contractor
statusCurrent, ActiveDBPR status, e.g. ‘Current, Active’, ‘Current with Probation, Active’, ‘Current, Inactive’, ‘Suspended, Active’
expiration_date2028-08-31Expiration date (ISO)
source_urlhttps://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