# Sunbiz Florida Business Registry Scraper (`memo23/sunbiz-florida-scraper`) Actor

Sunbiz Florida Business Registry Scraper: one row per Florida corporation or LLC on sunbiz.org, found from a company name, a person on its filings, an FEI/EIN, a document number, a ZIP or a street address. Rows hold status, last event, filing dates, agent, officers, annual reports and PDF links.

- **URL**: https://apify.com/memo23/sunbiz-florida-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.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?

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

## Sunbiz Florida Business Registry Scraper

Scrape the **Florida Division of Corporations (Sunbiz)** business registry — search by entity name, officer, registered agent, FEI/EIN, document number, ZIP, or address, and export full company records: status, officers, registered agent, addresses, annual reports and filing images.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/sunbiz/how-it-works-sunbiz.png)

### Why use this scraper

- **No API key, no login.** Sunbiz is a public government registry; this actor reads it directly.
- **Seven search modes.** Entity name, officer/registered agent, registered agent only, FEI/EIN, document number, ZIP code, or street address.
- **Full detail per company.** Officers with titles and addresses, registered agent name + address, principal and mailing addresses, annual reports, document images (PDF links), name history and event history links.
- **Cloudflare-bypassed without a proxy.** Firefox TLS fingerprinting passes the Cloudflare challenge that blocks plain HTTP clients — a proxy is optional, not required.
- **Cheaper than the alternative.** $0.004 per result vs. the incumbent's $0.0078–$0.006.

### Overview

The actor POSTs the chosen Sunbiz search form, parses the results table, paginates with the "Next On List" link, then optionally fetches each company's detail page in parallel. Output is one row per company with all filing, address, officer, agent and report fields.

### Supported inputs

| Search type | Field | Example |
|---|---|---|
| Entity Name | `searchQuery` | `disney` |
| Officer / Registered Agent | `searchQuery` | `smith john` |
| Registered Agent | `searchQuery` | `corporation service company` |
| FEI / EIN | `searchQuery` | `59-2063888` |
| Document Number | `searchQuery` | `G12345` |
| ZIP Code | `searchQuery` | `33101` |
| Street Address | `searchQuery` | `100 Biscayne Blvd` |

You can also paste direct Sunbiz detail URLs or search-results URLs into `startUrls` to scrape those records directly, bypassing the search step.

### Use cases

- **Lead generation** — pull officers and registered agents for Florida-registered businesses, with addresses and titles.
- **Due diligence** — check a company's status, filing history, annual reports and document images before a deal.
- **Compliance monitoring** — track status changes, last events, and annual report filings for a portfolio of Florida entities.
- **Market research** — count and profile businesses by ZIP, address, or agent.
- **Registered agent discovery** — find every entity a given registered agent represents.

### How it works

1. You pick a `searchType` and enter a `searchQuery` (or paste direct `startUrls`).
2. The actor POSTs the search form to `search.sunbiz.org/Inquiry/CorporationSearch/By<X>` using Firefox impit, which passes Cloudflare's challenge without a proxy.
3. Cheerio parses the results table — entity name, document number, status, and each detail-page link.
4. It follows the "Next On List" pagination link up to `maxPages`, collecting detail URLs.
5. If `withDetails` is on, each detail page is fetched in parallel and parsed for officers, registered agent, addresses, annual reports, document images, and name/event history links.
6. One row per company is pushed to the dataset — JSON or CSV export.

### Input configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `searchType` | select | `entityName` | How to search: entity name, officer/agent, registered agent, FEI/EIN, document number, ZIP, or address |
| `searchQuery` | string | `""` | The term to search for |
| `startUrls` | string\[] | `[]` | Direct Sunbiz detail or search-results URLs to scrape instead of searching |
| `maxItems` | integer | `100` | Max company records to return (0 = unlimited, capped by Sunbiz at ~500 per search) |
| `maxPages` | integer | `25` | Max search-result pages to paginate (Sunbiz returns ~20 per page) |
| `withDetails` | boolean | `true` | Fetch each detail page for officers, agent, addresses, reports, and filing images |
| `proxy` | proxy | off | Optional — usually not needed since Firefox impit passes Cloudflare directly |

#### Minimal input

```json
{
  "searchType": "entityName",
  "searchQuery": "disney",
  "maxItems": 10,
  "withDetails": true
}
```

### Output overview

Each dataset row is one Florida company. With `withDetails: true` you get the full record; with `withDetails: false` you get the search-result overview (name, document number, status, detail URL).

### Output sample

```json
{
  "entityName": "THE DOLPHIN HOTEL, INC.",
  "status": "INACTIVE",
  "entityType": "Florida Profit Corporation",
  "documentNumber": "315937",
  "dateFiled": "04/18/1967",
  "feiEin": "95-2489141",
  "state": "FL",
  "registeredAgentName": "FRANK S. IOPPOLO",
  "registeredAgentAddress": "1375 BUENA VISTA DRIVE\n4TH FLOOR NORTH\nLAKE BUENA VISTA, FL 32830",
  "officers": [
    { "title": "P", "name": "WELLS, FRANK G.", "address": "500 SOUTH BUENA VISTA ST\nBURBANK, CA" },
    { "title": "S", "name": "IOPPOLO, FRANK S", "address": "1375 BUENA VISTA DR.\nLAKE BUENA VISTA, FL" }
  ],
  "principalAddress": "1375 BUENA VISTA DR\n4 FLR N\nLAKE BUENA VISTA, FL 32830",
  "mailingAddress": "500 S BUENA VISTA STREET\nBURBANK, CA 91521-0340",
  "annualReports": [
    { "year": "1993", "filedDate": "05/01/1993" },
    { "year": "1994", "filedDate": "05/01/1994" }
  ],
  "lastEvent": "VOLUNTARY DISSOLUTION",
  "eventDateFiled": "04/15/1996",
  "eventEffectiveDate": "NONE",
  "documentImages": [
    "https://search.sunbiz.org/Inquiry/CorporationSearch/ConvertTiffToPDF?storagePath=COR%5C1807%5C0118%5CAR004682.tif&documentNumber=315937"
  ],
  "registeredAgentNameChanged": "07/09/1991",
  "registeredAgentAddressChanged": "07/01/1992",
  "principalAddressChanged": "05/01/1993",
  "mailingAddressChanged": "04/27/1995",
  "detailUrl": "https://search.sunbiz.org/Inquiry/CorporationSearch/SearchResultDetail?aggregateId=...",
  "nameHistoryUrl": "https://search.sunbiz.org/Inquiry/CorporationSearch/NameHistory?aggregateId=...",
  "eventHistoryUrl": "https://search.sunbiz.org/Inquiry/CorporationSearch/EventHistory?aggregateId=...",
  "officerCount": 6
}
```

### Key output fields

| Field | Description |
|---|---|
| `documentNumber` | Florida Division of Corporations document number |
| `entityName` | Registered entity name |
| `entityType` | e.g. Florida Profit Corporation, Florida Limited Liability Company, Trademark |
| `status` | ACTIVE, INACTIVE, PENDING REINSTATEMENT, etc. |
| `feiEin` | Federal Employer Identification Number |
| `dateFiled` | Date the entity was filed (MM/DD/YYYY) |
| `state` | State code, usually FL |
| `lastEvent` | Most recent filing event (e.g. VOLUNTARY DISSOLUTION, ANNUAL REPORT) |
| `eventDateFiled` | Date of the last event |
| `eventEffectiveDate` | Effective date of the last event |
| `principalAddress` | Principal place of business |
| `mailingAddress` | Mailing address |
| `registeredAgentName` | Registered agent name |
| `registeredAgentAddress` | Registered agent address |
| `officers` | Array of officers/directors with title, name, and address |
| `annualReports` | Array of annual report years and filed dates |
| `documentImages` | PDF links to filed document images |
| `nameHistoryUrl` | Link to the entity's name history page |
| `eventHistoryUrl` | Link to the entity's event history page |
| `officerCount` | Number of officers/directors |
| `detailUrl` | Direct URL to the Sunbiz detail page |

### FAQ

**Do I need a proxy?** Usually no. Firefox TLS fingerprinting passes Sunbiz's Cloudflare challenge directly. If you hit blocks from your region, enable Apify residential proxy.

**What's the difference between `withDetails: true` and `false`?** With details on, each company's detail page is fetched for officers, agent, addresses, reports, and filing images. With details off, you get only the search-result overview (name, document number, status) — faster and cheaper for bulk counts.

**How many results can I get?** Sunbiz returns ~20 results per page and caps each search at roughly 500 results. Use a more specific search query to narrow results, or use `maxPages` to limit pagination.

**Why are officers empty for some LLCs?** Florida LLCs file managers/authorized members rather than officers; some LLCs don't list any on Sunbiz. The actor captures whatever the detail page exposes.

**Are document images downloadable?** The `documentImages` field contains PDF links to the filed document scans. You can fetch those URLs separately (they're public Sunbiz pages).

### Support

For issues, feature requests, or questions, use the **Issues** tab on the actor's Apify Console page.

### Additional services

Need a custom data feed, a scheduled run, or help wiring this into your pipeline? Reach out through the Apify actor's support channel.

### Explore more scrapers

Looking for other business-registry or lead-generation scrapers? Check the full portfolio at [apify.com/memo23](https://apify.com/memo23).

### For AI Agents & LLM Apps

This actor is designed to be called by AI agents and LLM applications. Use the Apify MCP server or the standard actor run API with a JSON input containing `searchType`, `searchQuery`, and `maxItems`. The output is a clean JSON array of company records, ready for downstream processing, lead enrichment, or compliance checks.

```json
{
  "searchType": "entityName",
  "searchQuery": "consulting",
  "maxItems": 50,
  "withDetails": true
}
```

### Disclaimer

This scraper reads publicly available data from the Florida Division of Corporations (Sunbiz) public search portal. It is not affiliated with, endorsed by, or sponsored by the State of Florida or the Florida Department of State. Users are responsible for complying with Sunbiz's terms of use and all applicable laws. The data is provided as-is for research, lead generation, and compliance purposes.

### SEO Keywords

sunbiz scraper, florida business registry, florida division of corporations, sunbiz.org search, florida entity search, florida company lookup, registered agent search florida, florida officer search, FEI EIN lookup florida, florida document number search, florida business entity scraper, sunbiz API, florida corporation search, florida LLC search, florida annual reports, florida filing records, business registry scraper, lead generation florida, compliance monitoring florida

# Actor input Schema

## `searchType` (type: `string`):

Choose how to search the Florida business registry.

## `searchQuery` (type: `string`):

The term to search for. For entity name use the company name (e.g. 'disney'); for officer/agent use a person name (e.g. 'smith john'); for FEI/EIN use the number (e.g. '59-2063888'); for document number use the FL document number (e.g. 'G12345'); for ZIP use a Florida ZIP (e.g. '33101'); for address use a street (e.g. '100 Biscayne Blvd').

## `startUrls` (type: `array`):

Paste direct Sunbiz detail URLs (search.sunbiz.org/Inquiry/CorporationSearch/SearchResultDetail?...) or search-result URLs to scrape those records directly, bypassing the search step.

## `maxItems` (type: `integer`):

Maximum number of company records to return. Set to 0 for unlimited (capped by Sunbiz at 500 per search).

## `maxPages` (type: `integer`):

Maximum number of search-result pages to paginate through. Sunbiz returns ~20 results per page. Set to 0 for unlimited (will stop at the last page).

## `withDetails` (type: `boolean`):

When enabled, each company's detail page is fetched to add officers, registered agent address, annual reports, document images, name history and event history. When disabled, only the search-result overview (name, document number, status) is returned.

## `proxy` (type: `object`):

Optional proxy. Sunbiz is reachable directly with Firefox TLS fingerprinting, so a proxy is usually not needed. Use Apify residential or your own if you hit Cloudflare blocks.

## Actor input object example

```json
{
  "searchType": "entityName",
  "searchQuery": "",
  "startUrls": [],
  "maxItems": 100,
  "maxPages": 25,
  "withDetails": true,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

The scraped Sunbiz company records in the default dataset.

# 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 = {
    "startUrls": [],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/sunbiz-florida-scraper").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 = {
    "startUrls": [],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/sunbiz-florida-scraper").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 '{
  "startUrls": [],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call memo23/sunbiz-florida-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/sunbiz-florida-scraper"
        }
    }
}
```

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/hjXjCRtH0EaD95Ju8/builds/yA89f8fXcyjZ1XJNx/openapi.json
