# Florida Insurance Producer Leads — New & Unappointed Agents (`foxlabs/us-insurance-producer-leads`) Actor

Carriers just served involuntary suspension notices (insurance dropped) with ~100% phone and email, plus fresh policy filings and cancellations with insurer names. Daily.

- **URL**: https://apify.com/foxlabs/us-insurance-producer-leads.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Florida Insurance Producer Leads — Newly Licensed & Unappointed Agents

Recruiting-ready contact data for Florida insurance producers, built from the Florida Department of
Financial Services **Licensee Search bulk downloads** — the state's own public-record files.

Two things this Actor does that a licence-lookup tool cannot: it finds the producers who **just got
licensed**, and the ones who are **licensed but no carrier has appointed yet**. Those are the two
lists agent-recruiting teams actually buy.

### What does this Actor do?

- Downloads the official `All Valid Licenses – Individual` file (**321 MB, 1,230,054 licence rows,
  968,206 distinct producers** — measured on the 2026‑07‑27 file) and filters it for you.
- **`Newly licensed`** — producers whose **first-ever** Florida licence falls in your date window.
  Not "someone who added a licence class last month": the Actor reads every licence each person
  holds before deciding. Measured on the live file: **8,930 new entrants in the last 30 days**,
  **112,901 in the last 12 months**.
- **`Licensed but not appointed`** — joins the state's three active-appointment files
  (**3,127,292 active appointments**) by licence number and keeps only producers with none.
  Measured: of 30,954 producers licensed in the last 90 days, **12,070 (39%) have no active
  carrier appointment**.
- **`Search all licences`** — full control: licence class, county, city, state, residency, contact
  requirements.

### Why use it?

| | This Actor | Typical FL licence lookup Actor |
|---|---|---|
| Filter by licence issue date | ✅ | ❌ |
| Find producers with **no** appointment | ✅ | ❌ (they verify appointments instead) |
| One row per **person**, licence classes nested | ✅ | ❌ raw rows — the same person 1.27× |
| `Miami-Dade` spelling accepted | ✅ (register spells it `Dade`) | ❌ returns 0 rows |
| Masked empties (`N/A`, `0000000000`) → `null` | ✅ | ❌ counted as filled |

### How to use it

1. Pick a **Lead preset** — `Newly licensed producers` is the default.
2. Set the **date window** (defaults to the last 90 days for that preset).
3. Optionally narrow by licence category, county/city, residency, or require an e-mail/phone.
4. Run. A run reads the whole state file, so expect **~3 minutes** regardless of how many rows you
   ask for (**~12 minutes** when the appointment join is on).

### Input example

```json
{
  "preset": "newly_licensed",
  "datePreset": "last_60_days",
  "residentOnly": true,
  "licenseCategories": ["life_and_health", "health"],
  "requireEmail": true,
  "maxResults": 2000
}
```

Unappointed-producer recruiting list:

```json
{
  "preset": "no_active_appointment",
  "datePreset": "last_90_days",
  "requireEmail": true,
  "maxResults": 5000
}
```

### Output example

```json
{
  "licenseNumber": "A276085",
  "npn": "636278",
  "fullName": "Keith J Walker",
  "firstName": "Keith",
  "middleName": "J",
  "lastName": "Walker",
  "email": "inssol1@earthlink.net",
  "businessPhone": "2394037420",
  "residencyType": "Resident",
  "isFloridaResident": true,
  "businessAddress1": "INSURANCE SOLUTIONS",
  "businessAddress2": "2171 PINE RIDGE RD SUITE D",
  "businessCity": "NAPLES",
  "businessState": "FL",
  "businessZip": "34109",
  "businessCounty": "Collier",
  "mailingAddress1": "INSURANCE SOLUTIONS",
  "mailingCity": "NAPLES",
  "mailingState": "FL",
  "mailingZip": "34109",
  "firstLicenseDate": "1993-06-12",
  "latestLicenseDate": "1995-05-20",
  "licenseClassCount": 2,
  "dataAsOf": "2026-07-27",
  "licenseTypes": ["GENERAL LINES (PROP & CAS)", "LIFE INCL VAR ANNUITY & HEALTH"],
  "licenseCategories": ["property_casualty", "life_and_health"],
  "licenses": [
    { "licenseTypeCode": "0215", "licenseType": "LIFE INCL VAR ANNUITY & HEALTH", "licenseCategory": "life_and_health", "licenseStatus": "VALID", "licenseIssueDate": "1993-06-12" },
    { "licenseTypeCode": "0220", "licenseType": "GENERAL LINES (PROP & CAS)", "licenseCategory": "property_casualty", "licenseStatus": "VALID", "licenseIssueDate": "1995-05-20" }
  ]
}
```

With `appointmentFilter` on, every row also carries `hasActiveAppointment`, `activeAppointmentCount`
and `appointingEntities` (up to 10 carrier names).

### Data fields & measured coverage

Coverage measured two ways: a **complete parse of a full 1,189,056-row file** (population), and a
**live 5,000-producer platform run** (sample). Both are shown — no estimates.

| Field | Full-file | Live sample | Note |
|---|---|---|---|
| `email` | **99.99%** | 100.00% | lower-cased, regex-validated; invalid → `null` |
| `businessPhone` | **99.93%** | 99.60% | 10 digits; `0000000000` placeholders → `null` |
| `npn` | **99.86%** | 99.98% | National Producer Number — your CRM/AMS join key |
| `fullName` / `firstName` / `lastName` | 100% | 100% | rebuilt in natural order for mail-merge |
| `middleName` | 61.4% | 84.8% | |
| `licenseTypes` / `licenses[]` | 100% | 100% | 78 Florida licence classes, code + description |
| `firstLicenseDate` / `latestLicenseDate` | 99.99% | 100% | ISO dates across **all** classes the person holds |
| `licenseClassCount` | 100% | 100% | 22% of producers hold more than one class |
| `businessCity` / `State` / `Zip` | ~99.9% | ~99.9% | |
| **`businessCounty`** | **96.2%** of Florida-address rows (39.6% of all rows) | 55.0% | the state records a county only for Florida business addresses |
| `businessAddress2` | 22.8% | 40.1% | suite/unit line; duplicates of line 1 are dropped |
| mailing address block | ~100% | ~100% | |

Honest notes, because they change what you can ask for:

- **`businessCounty` is empty for non-residents.** Within Florida business addresses it is 96.2% filled
  (450,910 of 468,831 rows measured), but 59% of Florida licences are held by out-of-state producers
  and the state leaves their county blank — so county filters only make sense for Florida addresses.
- **Licence status is effectively constant.** The source file is "all *valid* licences": 99.98% are
  `VALID`, 0.02% `VALID - PROBATION`. It is exposed as a filter and inside `licenses[]`, not as a
  headline column, because it tells you almost nothing.
- **No profile URL is returned.** The state's licensee search is a form-driven page with no stable
  per-producer URL that could be verified row by row, so raw identifiers (`licenseNumber`, `npn`)
  are shipped instead of a link that might not resolve.
- **"Newly licensed" is measured, not inferred**, but a small number of re-issued licences move
  their issue date forward: comparing two real snapshots nine months apart, 99.94% of issue dates
  were unchanged and 0.06% had been re-issued.

### Freshness

The state rebuilds these files daily. Measured: the live file carried
`Last-Modified: Mon, 27 Jul 2026 06:21:02 GMT` on a 2026‑07‑28 run, and two independent historical
snapshots each contained licences issued **1–2 days** before the file was published. Every row
carries `dataAsOf` so you can prove the vintage of a list you exported.

### Pricing & cost

A run reads the entire state file, so cost is dominated by that fixed scan, not by row count.
Measured on the platform at 4 GB:

| Run | Rows | Time | Compute units |
|---|---|---|---|
| Smoke | 25 | 183 s | 0.203 |
| Filtered (Dade, life & health) | 2,000 | 187 s | 0.208 |
| Adjusters, e-mail + phone required | 6,000 | 192 s | 0.213 |
| Newly licensed, 12 months | 10,000 | 198 s | 0.220 |
| **With appointment join** (~1.3 GB) | 2,000 | 748 s | 0.831 |

Peak memory stayed at **250–430 MB**; 4 GB is the default only so that very large unfiltered pulls
do not run out of room. Pull bigger batches per run — 10,000 rows cost barely more than 25.

### Tips

- Recruiting cadence: run `newly_licensed` + `last_30_days` weekly; you will see roughly
  **8,000–9,000 new producers a month** statewide.
- The sharpest recruiting list is `no_active_appointment` + `last_90_days` + `residentOnly` — newly
  licensed, in-state, and nobody has signed them yet.
- Use `Miami-Dade` freely; it is translated to the register's `Dade`.
- Set `maxResults: 0` for the whole register, and raise the run's memory to 8 GB for that.
- Turning `One row per producer` off gives you the raw licence-level rows if your CRM prefers them.

### FAQ & legal

**Where does the data come from?** The Florida Department of Financial Services publishes these
files at `licenseesearch.fldfs.com/BulkDownload` (the CSVs themselves are served from
`www.myfloridacfo.com`). Florida licensee contact information is **public record** under Florida law.

**Does it need an API key or proxy?** No. No credentials, no proxy, no browser.

**Is this personal data?** Yes — these are real people's business contact details, published by the
state. **You are responsible for how you use them.** Outreach to these contacts is subject to
CAN-SPAM, TCPA and Florida law; that obligation sits with you as the sender, not with this Actor.
Do not use the data for anything the source's public-record purpose does not support.

**What if the state changes the files?** The Actor validates the header of every file it downloads
and aborts with a clear message if a column disappears, if it receives HTML instead of CSV, or if a
download is truncated. It never emits rows that look complete when a layer failed.

**Why does a 25-row run take three minutes?** Because the answer to "who is newly licensed" requires
reading every licence in the state. There is no server-side query to push the filter into.

### Changelog

#### 0.1 (2026-07-28)

First release — see `CHANGELOG.md`.

# Actor input Schema

## `preset` (type: `string`):

Start here — each preset is a ready-made filter combination. 'Newly licensed' finds producers whose FIRST-EVER Florida licence was issued inside the date window (true new entrants, not veterans adding a class). 'Licensed but not appointed' additionally joins the state appointment files and keeps only producers with no active carrier appointment — the classic recruiting list. 'Search all licences' turns every filter over to you.

## `datePreset` (type: `string`):

Which licence-issue dates count. With the 'Newly licensed' preset this is tested against the producer's first-ever licence. Defaults to the last 90 days for 'Newly licensed' and to all time for the other presets.

## `issueDateFrom` (type: `string`):

YYYY-MM-DD, e.g. 2026-01-01. Only used when Date range = Custom.

## `issueDateTo` (type: `string`):

YYYY-MM-DD. Only used when Date range = Custom. Leave empty for 'up to today'.

## `firstTimeOnly` (type: `boolean`):

ON (default for 'Newly licensed'): the date window must contain the producer's very first Florida licence, so you get genuine new entrants. OFF: any licence class issued in the window counts, which also surfaces experienced agents who just added a line.

## `licenseCategories` (type: `array`):

Plain-English groupings of Florida's 78 licence class codes. Leave empty for every class.

## `licenseTypeCodes` (type: `array`):

Raw Florida TYCL codes, e.g. 0215, 0620, 0814. Combined with the categories above (a licence matching either is kept). Leave empty unless you need a class the categories do not isolate.

## `licenseStatus` (type: `string`):

The source file only contains valid licences: 99.98% are VALID and 0.02% are VALID - PROBATION (measured on 1.19 M rows). Use 'Probation only' to isolate that small compliance-risk group.

## `residentOnly` (type: `boolean`):

ON keeps resident licensees only. Roughly 59% of Florida licences are held by non-residents living in other states — useful reach, but resident producers are the ones most agencies recruit.

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

e.g. Dade, Broward, Hillsborough, Orange. 'Miami-Dade' is accepted and mapped to the register's spelling ('Dade'). Note: the county column is only populated for licensees with a Florida business address — 96% filled there, but blank for the 59% of licensees who live out of state, so combining this with non-residents returns little.

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

Exact business-address city names, e.g. MIAMI, ORLANDO, TAMPA. Case-insensitive. Leave empty for all.

## `businessStates` (type: `array`):

Two-letter codes filtering the business address, e.g. FL, TX, NY. Useful to target non-resident Florida licensees living in a particular state. Leave empty for all.

## `appointmentFilter` (type: `string`):

Joins the state's active-appointment files (~1 GB, adds time to the run) and can filter on the result. 'No active appointment' is the recruiting list: licensed producers not currently appointed by any carrier. Leave on 'Do not join' for the fastest runs.

## `requireEmail` (type: `boolean`):

Drop producers without a valid email. Coverage is 99.99% on the raw file, so this rarely removes anything.

## `requirePhone` (type: `boolean`):

Drop producers without a usable 10-digit business phone (placeholder numbers such as 0000000000 never count as filled).

## `groupByLicensee` (type: `boolean`):

ON (default): one row per person, with all their licence classes in a nested list — you are not billed for the same producer 1.27 times. OFF: one row per licence class, closer to the raw state file.

## `maxResults` (type: `integer`):

Hard cap on output rows. Set to 0 for unlimited — the full file holds ~937,000 producers across ~1.19 M licence rows.

## Actor input object example

```json
{
  "preset": "newly_licensed",
  "datePreset": "last_90_days",
  "licenseCategories": [],
  "licenseTypeCodes": [],
  "licenseStatus": "any",
  "residentOnly": false,
  "counties": [],
  "cities": [],
  "businessStates": [],
  "requireEmail": false,
  "requirePhone": false,
  "groupByLicensee": true,
  "maxResults": 1000
}
```

# Actor output Schema

## `dataset` (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 = {
    "preset": "newly_licensed",
    "datePreset": "last_90_days",
    "licenseCategories": [],
    "licenseTypeCodes": [],
    "counties": [],
    "cities": [],
    "businessStates": [],
    "maxResults": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/us-insurance-producer-leads").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 = {
    "preset": "newly_licensed",
    "datePreset": "last_90_days",
    "licenseCategories": [],
    "licenseTypeCodes": [],
    "counties": [],
    "cities": [],
    "businessStates": [],
    "maxResults": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/us-insurance-producer-leads").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 '{
  "preset": "newly_licensed",
  "datePreset": "last_90_days",
  "licenseCategories": [],
  "licenseTypeCodes": [],
  "counties": [],
  "cities": [],
  "businessStates": [],
  "maxResults": 1000
}' |
apify call foxlabs/us-insurance-producer-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,foxlabs/us-insurance-producer-leads"
        }
    }
}

```

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/NKn3McYfaLkbLlMdx/builds/jaH5jRGuL2ikd9F3L/openapi.json
