# DBPR Florida License Verification (`ws_tony/dbpr-florida-license-verification`) Actor

Verify any Florida professional license (contractors, real estate, cosmetology, CPAs, engineers, and 30+ other boards) directly from the Florida Department of Business and Professional Regulation. Fresher than aggregators, priced per record.

- **URL**: https://apify.com/ws\_tony/dbpr-florida-license-verification.md
- **Developed by:** [Tony](https://apify.com/ws_tony) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event + usage

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## DBPR Florida License Verification & Lookup

**Verify, look up, and search any Florida professional license** directly from the Florida Department of Business & Professional Regulation (DBPR) — myfloridalicense.com. Covers 30+ boards including contractors (CGC, CFC, CBC, CCC, EC), real estate (SL, BK), home inspectors (HI), cosmetology (CL, MM), CPAs, engineers (PE), auctioneers, and more. Fresher than aggregator services, priced per record returned.

### Table of contents

- [What you get per result](#what-you-get-per-result)
- [Who this is for](#who-this-is-for)
- [Pricing](#pricing)
- [How to look up a Florida license by number](#how-to-look-up-a-florida-license-by-number)
- [How to search Florida licensees by name](#how-to-search-florida-licensees-by-name)
- [How to find every active contractor in a Florida city](#how-to-find-every-active-contractor-in-a-florida-city)
- [How to verify a Florida real estate license](#how-to-verify-a-florida-real-estate-license)
- [How to sweep every active CGC in Florida](#how-to-sweep-every-active-cgc-in-florida)
- [Sample output](#sample-output)
- [DBPR direct vs license-aggregator services](#dbpr-direct-vs-license-aggregator-services)
- [DBPR board codes](#dbpr-board-codes)
- [FAQ](#faq)
- [Known limitations](#known-limitations)
- [Legal](#legal)

### What you get per result

A stable record schema so downstream buyers can rely on field names. Three tiers:

**Status-only ($0.002/record)** — license number, status, normalized status, expiration date. No PII. Ideal for renewal-reminder or automated compliance workflows.

**Basic ($0.008/record)** — licensee name, license number, license type, rank, status, expiration date, main address (street and city parsed cleanly), board (inferred), source URL.

**Full ($0.025/record)** — everything in basic plus licensure date, county, DBA / alternate names, and special qualifications from the per-license detail page.

### Who this is for

- **Lead-gen agencies** enriching Florida contractor, realtor, plumber, electrician, or CPA prospect lists with live license status.
- **KYC and compliance teams** verifying active license status on Florida professionals at onboarding and renewal.
- **Insurance and surety underwriters** checking license class, rank, and expiration before binding contractor or professional liability coverage.
- **Marketplaces** (Angi, Thumbtack, HomeAdvisor, Houzz, Porch) that require licensed-professional verification at signup.
- **Renewal-reminder services** that need recurring status checks on a roster of Florida licensees.
- **Background-check operators** validating Florida professional credentials.

### Pricing

Pay-per-event. You pay only for records the actor actually produces. Empty results are not pushed or billed.

| Event | Price | Description |
|---|---:|---|
| `license_status_check` | **$0.002** | License number → status + expiration. No name/address. |
| `license_basic`        | **$0.008** | Name, license #, type, rank, status, expiration, main address. |
| `license_enriched`     | **$0.025** | Basic + licensure date, county, DBA/alt names, special qualifications. |

That's 500 status checks per dollar, 125 basic records per dollar, or 40 enriched records per dollar.

### How to look up a Florida license by number

Direct license-number lookup is the fastest, cheapest path. Works for every prefix (CGC, CFC, CBC, CCC, EC, SL, BK, CL, MM, PE, HI, AC, etc.):

```json
{
  "licenseNumbers": ["CFC056678", "SL705188", "CL1322240"],
  "enrichmentLevel": "full"
}
````

This is the most efficient way to verify a contractor license, look up a Florida real estate agent, check a cosmetology license, or confirm any other DBPR-issued credential — DBPR returns the canonical record without any fuzzy name search.

For a renewal-reminder workflow that only needs the current status:

```json
{
  "licenseNumbers": ["CFC056678", "CGC1512345"],
  "statusCheckOnly": true
}
```

The status-only mode bills at $0.002 per license and returns no PII — ideal for periodic compliance checks. If a license number isn't found in DBPR (typo, voided, or never existed), the actor logs a warning and does not charge for it.

### How to search Florida licensees by name

Useful when you know the person but not their license number. Searches DBPR's name index across all boards:

```json
{
  "licenseeNames": [
    { "lastName": "SMITH", "firstName": "JOHN" },
    { "orgName": "AARDVARK PLUMBING" }
  ],
  "maxResultsPerSearch": 25,
  "enrichmentLevel": "basic"
}
```

Names are case-insensitive on input. DBPR returns partial matches, capped by `maxResultsPerSearch`. Common-surname searches (Smith, Johnson, Williams, Garcia) can return thousands of records — keep the cap modest unless you intend to pay for all of them.

### How to find every active contractor in a Florida city

City-scoped search across a specific board + license type. Both `board` and `licenseType` are required by DBPR for city searches:

```json
{
  "citySearches": [
    { "city": "TAMPA", "board": "06", "licenseType": "0605" }
  ],
  "maxResultsPerSearch": 500,
  "enrichmentLevel": "basic"
}
```

This returns every active Certified General Contractor (CGC) in Tampa. Swap the board+licenseType pair to scope by city for any Florida profession — plumbers (CFC), roofers (CCC), electricians (EC), real estate sales associates (SL), brokers (BK), home inspectors (HI), CPAs, cosmetologists (CL), and so on. See [DBPR board codes](#dbpr-board-codes) below; the full numeric license-type table is in `src/normalize.js`.

To search a county instead of a city, swap `city` for `county` (e.g., `county: "39"` for Hillsborough). To sweep all of Florida, iterate the 67 county codes.

### How to verify a Florida real estate license

Florida real estate uses the SL (Sales Associate) and BK (Broker) prefixes. Direct lookup works the same as any other license:

```json
{
  "licenseNumbers": ["SL705188", "BK3123456"],
  "enrichmentLevel": "full"
}
```

The `full` tier includes licensure date, county, and any DBA / alternate names — useful for compliance teams confirming a real estate broker's qualifications before listing or paying commission, and for marketplaces verifying Florida realtors at signup.

### How to sweep every active CGC in Florida

State-wide license-type sweep. Without a city or county filter, this returns every active Certified General Contractor in the state. Use a high `maxResultsPerSearch` cap — there are tens of thousands of CGC licensees:

```json
{
  "licenseTypeSearches": [
    { "board": "06", "licenseType": "0605" }
  ],
  "maxResultsPerSearch": 5000,
  "enrichmentLevel": "basic"
}
```

The same pattern works for any board+type pair: every active plumber in Florida, every active electrician, every active cosmetologist, every active CPA. Be aware of pricing — 5,000 basic records is $40, and DBPR pagination at 50/page means a 5,000-record sweep takes ~100 seconds before any enrichment.

### Sample output

Each record is a flat JSON object with a stable schema. A `basic`-tier record looks like this:

```json
{
  "id": "FL-DBPR:CFC056678:Primary:E941FBE6942475F84E3177712B2CF505",
  "source_state": "FL",
  "source_agency": "DBPR",
  "source_url": "https://www.myfloridalicense.com/LicenseDetail.asp?SID=&id=E941FBE6942475F84E3177712B2CF505",
  "detail_id": "E941FBE6942475F84E3177712B2CF505",
  "license_number": "CFC056678",
  "license_type": "Certified Plumbing Contractor",
  "license_rank": "Cert Plumbing",
  "license_prefix": "CFC",
  "board": "Construction Industry",
  "board_code": "06",
  "status": "Current, Active",
  "status_normalized": "active",
  "expiration_date": "2026-08-31",
  "name": "SMITH, LAWRENCE C",
  "name_type": "Primary",
  "primary_name": "SMITH, LAWRENCE C",
  "dba_names": ["AARDVARK PLUMBING INC"],
  "alternate_names": [],
  "main_address": {
    "street": "3023 SPRUCE ST",
    "city": "TAMPA",
    "state": "FL",
    "postal_code": "33607",
    "country": "US"
  },
  "scraped_at": "2026-04-25T18:36:04.476Z",
  "enrichment_level": "basic"
}
```

A `status-only` record is much smaller (no PII) and bills at $0.002:

```json
{
  "id": "FL-DBPR:CFC056678:Primary:E941FBE6942475F84E3177712B2CF505",
  "license_number": "CFC056678",
  "status": "Current, Active",
  "status_normalized": "active",
  "expiration_date": "2026-08-31",
  "enrichment_level": "status_only"
}
```

The `status_normalized` field collapses DBPR's irregular status strings into a small enum: `active`, `expired`, `void`, `delinquent`, `suspended`, `revoked`, `pending`, `inactive`, `voluntary_inactive`, `involuntary_inactive`, `closed`, `probation`, `deceased`. Filter on this rather than the raw `status` field — DBPR writes `"Null and Void, Active"` for dead licenses, which is misleading.

### DBPR direct vs license-aggregator services

| | This actor (direct from DBPR) | Typical aggregator (BatchLeads, Searchbug, ListSource) |
|---|---|---|
| **Data freshness** | Live — same data DBPR's portal serves right now | Refreshed weekly or monthly; can lag by 30+ days |
| **Coverage** | All 30+ DBPR boards, ~90 license types | Usually contractor + real estate only |
| **Pricing** | Pay-per-record ($0.002–$0.025) | $0.10–$1.00/record or $99+/month |
| **Status accuracy** | Reflects DBPR's current state — `delinquent`, `null and void`, and `expired` correctly filtered | Often shows expired or revoked licenses as "active" until next refresh |
| **Customizable input** | License #, name, city, county, license type, statewide sweep | Limited query options |
| **Audit trail** | `source_url` per record points to DBPR's public detail page | Aggregator's internal ID only |

If your use case requires regulatory-grade freshness — KYC, surety underwriting, marketplace verification, professional services compliance — the direct-from-DBPR feed is what you want.

### DBPR board codes

Use these in `board` fields on `citySearches` and `licenseTypeSearches`:

| Code | Board |
|---|---|
| `01` | Certified Public Accounting |
| `02` | Architecture & Interior Design |
| `03` | Barbers |
| `04` | Home Inspectors |
| `05` | Cosmetology |
| `06` | Construction Industry |
| `07` | Mold-Related Services |
| `08` | Electrical Contractors |
| `09` | Engineers |
| `13` | Landscape Architecture |
| `25` | Real Estate |
| `26` | Veterinary Medicine |
| `38` | Community Association Managers |
| `48` | Auctioneers |
| `50` | Building Code Administrators and Inspectors |
| `53` | Geologists |
| `59` | Asbestos Contractors and Consultants |
| `64` | Real Estate Appraisers |
| `85` | Yacht and Ships |
| `200` | Hotels and Restaurants |
| `210` | Elevator Safety |
| `400` | Alcoholic Beverages & Tobacco |
| `800` | Condominiums, Cooperatives, Timeshares |
| `840` | Homeowners' Associations |

(See `src/normalize.js` for the full table including numeric `licenseType` codes per board.)

### FAQ

**Where does this Florida license data come from?** Directly from myfloridalicense.com, the public license portal operated by the Florida Department of Business & Professional Regulation. Same data the public website serves; we just expose it as a stable structured feed.

**How fresh is the license data?** As fresh as DBPR's portal — typically updated within 24 hours of any DBPR action (new issuance, renewal, suspension, revocation). We don't cache or pre-fetch — every run hits DBPR live.

**Is scraping the Florida DBPR license portal legal?** Florida DBPR license records are public records under Florida Statute Chapter 119. The actor reads the same lookup pages a browser would. You should review DBPR's terms of use before reselling raw data or combining it with other PII.

**What happens if a license number doesn't exist?** The actor logs a warning (`license_number "X" not found in DBPR`) and skips that lookup — no record is pushed and you are NOT charged for it.

**Why are some addresses returning "Private"?** DBPR allows certain professionals (judges, law-enforcement officers, code inspectors) to suppress their main address from the public portal under Fla. Stat. § 119.071. We pass that through as `street: "Private"` so you can detect and handle it downstream.

**Do I get charged for expired or null-and-void licenses?** No. By default, only `active` and `pending` licenses are returned and billed. Set `includeExpired: true` to include `expired`, `void`, `delinquent`, `suspended`, and `revoked` statuses.

**Can I run this on a schedule for ongoing verification?** Yes — Apify's Schedules feature runs the actor on a cron expression. Common pattern: a weekly sweep of your customer roster as `licenseNumbers` with `statusCheckOnly: true`, billed at $0.002/record. A 1,000-customer roster runs about $2/week.

**What's the difference between Primary and DBA in the data?** A single license can have both a Primary (the responsible person, e.g., the qualifier on a contractor license) and a DBA (the business operating under that license). The actor collapses both into one record per license, with the canonical name in `name` (preferred from Primary) and any business names in `dba_names`.

**Is there a free tier?** No free tier currently — pay-per-event from the first record. Apify gives every account $5/month of free platform credit, which translates to roughly 2,500 status checks or 625 basic records before any billing kicks in.

### Known limitations

- **Status normalization is opinionated.** `includeExpired: false` (default) keeps only `active` and `pending` records. Flip to `true` to see `void`, `expired`, `delinquent`, `suspended`, etc.
- **Basic tier can't tell board from prefix perfectly.** For common prefixes (CFC/CGC/CBC → Construction, SL/BK → Real Estate, CL/MM → Cosmetology, EC/ER → Electrical, HI → Home Inspectors) we infer the board. For uncommon prefixes, `board` is null unless you use `enrichmentLevel: "full"`.
- **City searches are case-sensitive on DBPR's side — we upper-case for you.** Still, some DBPR entries have misspelled cities (`LAFAYETT`, `FT LAUDERDALE` vs `FORT LAUDERDALE`). Use broader queries if counts seem low.
- **DBPR caps each page at 50 records.** We paginate transparently up to `maxResultsPerSearch` (default 50, max 5000). Each page costs roughly 1 second of wall time, so a 1,000-record search takes ~20 seconds before any enrichment.
- **Address parsing is heuristic.** DBPR returns the address as a single concatenated string. We split it into street + city using a USPS-suffix tokenizer and a small dictionary of multi-word Florida cities. Should be accurate on >95% of records; report any miscategorized address as a bug.
- **Empty results are not pushed or billed.**

### Legal

Florida DBPR license records are public records under Florida Statute Chapter 119. This actor reads the same public lookup page a browser would. Review DBPR's terms of use and applicable privacy laws before reselling the raw data or combining it with other PII.

# Actor input Schema

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

List of DBPR license numbers (e.g. `CFC056678`, `CGC1512345`, `SL705188`). Direct lookup — skips the name search and goes straight to the record. Cheapest path per record.

## `licenseeNames` (type: `array`):

List of names to search. Each entry is either a single string (treated as last name) or an object `{"lastName": "SMITH", "firstName": "JOHN"}` or `{"orgName": "AARDVARK PLUMBING"}`. Partial matches are returned.

## `citySearches` (type: `array`):

Find licensees of a specific license type in a specific city / county. **DBPR requires both `board` and `licenseType` on these searches** (e.g. `06` + `0605` = Certified General Contractor). Entry shape: `{"city": "TAMPA", "board": "06", "licenseType": "0605"}` or `{"county": "39", "board": "06", "licenseType": "0605"}` (county = Hillsborough). Optional `state` defaults to `FL`; use `NA` for out-of-state licensees. See README for board + license-type codes.

## `licenseTypeSearches` (type: `array`):

Find all licensees of a given type across a geography. Entry shape: `{"board": "06", "licenseType": "0605"}` (defaults to out-of-state), or add `"city"`/`"county"`/`"state"` to narrow. Both `board` and `licenseType` are required (DBPR constraint). To cover all of Florida, iterate over counties (there are 67). Great for snapshotting every active CGC, plumber, or CPA in a county.

## `enrichmentLevel` (type: `string`):

`basic` returns what the search-results page shows: license #, name, type, status, expiration, main address. `full` additionally fetches the per-license detail page for: licensure date, county, DBA/alternate names, and special qualifications.

## `statusCheckOnly` (type: `boolean`):

If true, only charges `license_status_check` ($0.002) per license number and returns `{license_number, status, status_normalized, expiration_date}` — no name, address, or other PII. Only works with `licenseNumbers` input. Great for renewal-reminder workflows.

## `maxResultsPerSearch` (type: `integer`):

Cap on how many licensees to return per search. DBPR can return thousands (e.g. 25,000+ Smiths) — cap low unless you intend to pay for all of them.

## `includeExpired` (type: `boolean`):

If true, all license statuses are returned. If false (default), only licenses with `Current` or `Active` status are kept — cheaper and usually what verification workflows want.

## `maxConcurrency` (type: `integer`):

Number of searches to run in parallel. DBPR tolerates bursts but is a single IIS host — keep this modest.

## `requestTimeoutSecs` (type: `integer`):

HTTP request timeout for each page fetch.

## `proxyConfiguration` (type: `object`):

DBPR is a public state government site with no Cloudflare and no aggressive rate limiting — going direct is the most reliable. Apify's shared datacenter proxies sometimes return UPSTREAM502 errors mid-run when talking to DBPR, so proxy is OFF by default. Turn it on only if you need to avoid leaking the run's source IP.

## Actor input object example

```json
{
  "licenseNumbers": [
    "CFC056678"
  ],
  "licenseeNames": [
    {
      "lastName": "SMITH",
      "firstName": "JOHN"
    }
  ],
  "citySearches": [],
  "licenseTypeSearches": [],
  "enrichmentLevel": "basic",
  "statusCheckOnly": false,
  "maxResultsPerSearch": 50,
  "includeExpired": false,
  "maxConcurrency": 3,
  "requestTimeoutSecs": 90,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "licenseNumbers": [
        "CFC056678"
    ],
    "licenseeNames": [
        {
            "lastName": "SMITH",
            "firstName": "JOHN"
        }
    ],
    "citySearches": [],
    "licenseTypeSearches": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ws_tony/dbpr-florida-license-verification").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 = {
    "licenseNumbers": ["CFC056678"],
    "licenseeNames": [{
            "lastName": "SMITH",
            "firstName": "JOHN",
        }],
    "citySearches": [],
    "licenseTypeSearches": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ws_tony/dbpr-florida-license-verification").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "licenseNumbers": [
    "CFC056678"
  ],
  "licenseeNames": [
    {
      "lastName": "SMITH",
      "firstName": "JOHN"
    }
  ],
  "citySearches": [],
  "licenseTypeSearches": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call ws_tony/dbpr-florida-license-verification --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ws_tony/dbpr-florida-license-verification",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "DBPR Florida License Verification",
        "description": "Verify any Florida professional license (contractors, real estate, cosmetology, CPAs, engineers, and 30+ other boards) directly from the Florida Department of Business and Professional Regulation. Fresher than aggregators, priced per record.",
        "version": "0.2",
        "x-build-id": "TckjcKkZGcOoBaW6X"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ws_tony~dbpr-florida-license-verification/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ws_tony-dbpr-florida-license-verification",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/ws_tony~dbpr-florida-license-verification/runs": {
            "post": {
                "operationId": "runs-sync-ws_tony-dbpr-florida-license-verification",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/ws_tony~dbpr-florida-license-verification/run-sync": {
            "post": {
                "operationId": "run-sync-ws_tony-dbpr-florida-license-verification",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "licenseNumbers": {
                        "title": "License numbers to look up",
                        "type": "array",
                        "description": "List of DBPR license numbers (e.g. `CFC056678`, `CGC1512345`, `SL705188`). Direct lookup — skips the name search and goes straight to the record. Cheapest path per record.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "licenseeNames": {
                        "title": "Licensee names to search",
                        "type": "array",
                        "description": "List of names to search. Each entry is either a single string (treated as last name) or an object `{\"lastName\": \"SMITH\", \"firstName\": \"JOHN\"}` or `{\"orgName\": \"AARDVARK PLUMBING\"}`. Partial matches are returned.",
                        "default": []
                    },
                    "citySearches": {
                        "title": "City searches",
                        "type": "array",
                        "description": "Find licensees of a specific license type in a specific city / county. **DBPR requires both `board` and `licenseType` on these searches** (e.g. `06` + `0605` = Certified General Contractor). Entry shape: `{\"city\": \"TAMPA\", \"board\": \"06\", \"licenseType\": \"0605\"}` or `{\"county\": \"39\", \"board\": \"06\", \"licenseType\": \"0605\"}` (county = Hillsborough). Optional `state` defaults to `FL`; use `NA` for out-of-state licensees. See README for board + license-type codes.",
                        "default": []
                    },
                    "licenseTypeSearches": {
                        "title": "License-type searches",
                        "type": "array",
                        "description": "Find all licensees of a given type across a geography. Entry shape: `{\"board\": \"06\", \"licenseType\": \"0605\"}` (defaults to out-of-state), or add `\"city\"`/`\"county\"`/`\"state\"` to narrow. Both `board` and `licenseType` are required (DBPR constraint). To cover all of Florida, iterate over counties (there are 67). Great for snapshotting every active CGC, plumber, or CPA in a county.",
                        "default": []
                    },
                    "enrichmentLevel": {
                        "title": "Enrichment level",
                        "enum": [
                            "basic",
                            "full"
                        ],
                        "type": "string",
                        "description": "`basic` returns what the search-results page shows: license #, name, type, status, expiration, main address. `full` additionally fetches the per-license detail page for: licensure date, county, DBA/alternate names, and special qualifications.",
                        "default": "basic"
                    },
                    "statusCheckOnly": {
                        "title": "Status-check mode",
                        "type": "boolean",
                        "description": "If true, only charges `license_status_check` ($0.002) per license number and returns `{license_number, status, status_normalized, expiration_date}` — no name, address, or other PII. Only works with `licenseNumbers` input. Great for renewal-reminder workflows.",
                        "default": false
                    },
                    "maxResultsPerSearch": {
                        "title": "Max results per name/city/type search",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Cap on how many licensees to return per search. DBPR can return thousands (e.g. 25,000+ Smiths) — cap low unless you intend to pay for all of them.",
                        "default": 50
                    },
                    "includeExpired": {
                        "title": "Include expired / null-and-void licenses",
                        "type": "boolean",
                        "description": "If true, all license statuses are returned. If false (default), only licenses with `Current` or `Active` status are kept — cheaper and usually what verification workflows want.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Parallel workers",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of searches to run in parallel. DBPR tolerates bursts but is a single IIS host — keep this modest.",
                        "default": 3
                    },
                    "requestTimeoutSecs": {
                        "title": "Per-request timeout (seconds)",
                        "minimum": 10,
                        "maximum": 300,
                        "type": "integer",
                        "description": "HTTP request timeout for each page fetch.",
                        "default": 90
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "DBPR is a public state government site with no Cloudflare and no aggressive rate limiting — going direct is the most reliable. Apify's shared datacenter proxies sometimes return UPSTREAM502 errors mid-run when talking to DBPR, so proxy is OFF by default. Turn it on only if you need to avoid leaking the run's source IP.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
