# Florida Sunbiz Business Extractor (`kawsar/florida-sunbiz-business-extractor`) Actor

Florida Sunbiz business scraper that pulls company records from the state registry by business name, officer, FEI/EIN or document number, so you get filing details, addresses, registered agents, officers and annual reports as JSON, CSV or Excel.

- **URL**: https://apify.com/kawsar/florida-sunbiz-business-extractor.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Categories:** Automation, Developer tools, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Sunbiz Business Extractor

Search the Florida business registry and pull complete company records into a spreadsheet. This Sunbiz scraper looks up Florida corporations, LLCs, limited partnerships and non-profits by business name, officer name, registered agent name, FEI/EIN number or document number, then returns the filing details, addresses, officers and document history for every match.

The Florida Division of Corporations publishes all of this, one record at a time, behind a search form. Copying it by hand is the slow part. Give the actor a list of names or numbers and you get structured JSON, CSV or Excel back.

### What it collects

For every business record:

- Business name, entity type and document number
- FEI/EIN number, date filed, state of formation
- Registration status, last event, event date filed and effective date
- Principal address and mailing address, plus the date each was last changed
- Registered agent name and address, with name and address change dates
- Officers, directors, managers, authorized persons or general partners, each with title and address
- Annual report years and the date each report was filed
- Filed document history with direct PDF links
- Cross reference name, when the record has one
- The registry URL for the record

Rejected filings and trademark records use different label sets. Anything the actor does not have a dedicated field for lands in `filingInformation`, so nothing gets dropped.

Fields the registry leaves blank are omitted from the output rather than returned as empty strings or nulls. A record with no cross reference name simply has no `crossReferenceName` key.

### Search modes

| Search by | What you enter | Typical use |
|---|---|---|
| Business name | `WALMART`, `PUBLIX SUPER MARKETS` | Company research, lead lists, name availability checks |
| Officer or registered agent name | `SMITH JOHN` | Finding every company a person is tied to |
| FEI/EIN number | `71-0415188` | Matching a federal tax ID to a Florida registration |
| Document number | `849374`, `L02000009779` | Direct lookup when you already have the number |

A name search on Sunbiz returns an alphabetical window around your term rather than an exact match, which is why a raw search for "WALMART" also shows you whatever sits next to it in the alphabet. The `nameMatchMode` setting handles that. Leave it on "Starts with" and you get the businesses whose names actually begin with your term, with punctuation and spacing ignored, so `WAL-MART ASSOCIATES, INC.` still matches `WALMART`. Switch to "Exact" for a single company, or "Any" to keep the full window.

### Input

```json
{
  "searchType": "entityName",
  "searchTerms": ["WALMART", "PUBLIX SUPER MARKETS"],
  "nameMatchMode": "startsWith",
  "statusFilter": "active",
  "includeEntityDetails": true,
  "includeOfficers": true,
  "includeAnnualReports": true,
  "includeFilingHistory": true,
  "maxItems": 20,
  "requestTimeoutSecs": 30
}
```

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchType` | string | `entityName` | `entityName`, `officerOrAgentName`, `feiEinNumber` or `documentNumber` |
| `searchTerms` | array | required | One search per value |
| `nameMatchMode` | string | `startsWith` | `startsWith`, `exact` or `any`. FEI/EIN searches always require an exact number |
| `statusFilter` | string | `all` | `all`, `active` or `inactive` |
| `includeEntityDetails` | boolean | `true` | Off gives a fast name, number and status list without opening each record |
| `includeOfficers` | boolean | `true` | Officers, managers, authorized persons, general partners |
| `includeAnnualReports` | boolean | `true` | Annual report years and filing dates |
| `includeFilingHistory` | boolean | `true` | Filed documents with PDF links |
| `maxItems` | integer | `20` | Record cap for the whole run, max 1000 |
| `requestTimeoutSecs` | integer | `30` | Per request timeout |

Pagination follows your limit. Each result page holds 20 rows, so `maxItems: 20` is a single page and `maxItems: 200` keeps paging until it has 200 records or the registry stops returning matches. There is no page count to set.

### Output

One dataset item per business record. Blank fields are left out, so the exact key set varies by record:

```json
{
  "searchTerm": "WALMART INC",
  "searchType": "entityName",
  "entityName": "WALMART INC.",
  "entityType": "Foreign Profit Corporation",
  "documentNumber": "849374",
  "feiEinNumber": "71-0415188",
  "dateFiled": "06/08/1981",
  "stateOfFormation": "DE",
  "entityStatus": "ACTIVE",
  "lastEvent": "AMENDMENT",
  "eventDateFiled": "08/21/2023",
  "eventEffectiveDate": "NONE",
  "principalAddress": "1 Customer Dr, Bentonville, AR 72716",
  "principalAddressLines": ["1 Customer Dr", "Bentonville, AR 72716"],
  "principalAddressChanged": "04/13/2026",
  "mailingAddress": "1 Customer Dr, Bentonville, AR 72716",
  "mailingAddressLines": ["1 Customer Dr", "Bentonville, AR 72716"],
  "mailingAddressChanged": "04/13/2026",
  "registeredAgentName": "C T CORPORATION SYSTEM",
  "registeredAgentAddress": "1200 SOUTH PINE ISLAND ROAD, PLANTATION, FL 33324",
  "registeredAgentAddressLines": ["1200 SOUTH PINE ISLAND ROAD", "PLANTATION, FL 33324"],
  "registeredAgentNameChanged": "03/02/2017",
  "registeredAgentAddressChanged": "03/02/2017",
  "officersHeading": "Officer/Director Detail",
  "officers": [
    {
      "officerTitle": "President/CEO",
      "officerName": "Furner, John",
      "officerAddress": "1 Customer Dr, Bentonville, AR 72716",
      "officerAddressLines": ["1 Customer Dr", "Bentonville, AR 72716"]
    }
  ],
  "annualReports": [
    { "reportYear": "2026", "filedDate": "04/13/2026" }
  ],
  "filedDocuments": [
    {
      "documentDate": "04/13/2026",
      "documentLabel": "ANNUAL REPORT",
      "pdfUrl": "https://search.sunbiz.org/Inquiry/CorporationSearch/GetDocument?aggregateId=forp-849374-01c0b9a5-f1e0-498f-82e8-db668c4beffc&transactionId=849374-9155080a-3201-4791-abd1-ad754255246a&formatType=PDF"
    }
  ],
  "detailUrl": "https://search.sunbiz.org/Inquiry/CorporationSearch/SearchResultDetail?inquirytype=EntityName&directionType=Initial&searchNameOrder=WALMART%208493741&aggregateId=forp-849374-01c0b9a5-f1e0-498f-82e8-db668c4beffc&searchTerm=WALMART&listNameOrder=WALMART%208493741",
  "scrapedAt": "2026-08-10T12:00:00+00:00"
}
```

`crossReferenceName` shows up on records that carry a prior or related name, which in practice means foreign entities registered under a different home-state name and rejected filings. Most records do not have one, so most records will not have the key.

Export the dataset as JSON, CSV, Excel, XML or HTML from the Apify console, or pull it through the API.

### What people use it for

Lead lists, mostly. Filter Florida registrations by status and filing date and you have a prospect file with mailing addresses and named officers already attached.

The other common one is verification. Before signing a contract, check that the counterparty is an active registrant and that the person signing actually appears on the record.

Officer search is the underrated mode. Search one name, get every company that person is tied to, and the shape of a corporate network falls out of it. Title companies and law firms use the same trick on registered agents.

### Notes

- Every field mirrors what the registry publishes. If a section is blank on Sunbiz, it comes back empty here.
- Section names shift by entity type. A corporation lists an `Officer/Director Detail` block, an LLC lists `Authorized Person(s) Detail`, and a limited partnership lists `General Partner Detail`. All three land in `officers`, and `officersHeading` tells you which one it was.
- A failed lookup writes a row carrying `searchTerm` and `error` instead of stopping the run.
- Officer and registered agent details are public record published by the state. Use the data in line with the Florida Division of Corporations terms and any privacy law that applies to you.

# Actor input Schema

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

How the values in Search terms should be looked up in the Florida business registry.

## `searchTerms` (type: `array`):

Business names, officer names, FEI/EIN numbers or document numbers to look up. Each value runs as its own search.

## `nameMatchMode` (type: `string`):

Applies to business name and officer name searches. The registry returns an alphabetical window of names around your term, so 'Starts with' keeps only the names that begin with it, 'Exact' keeps only a full match, and 'Any' keeps every returned row. Punctuation and spacing are ignored when matching. FEI/EIN searches always require an exact number match.

## `statusFilter` (type: `string`):

Keep only active businesses, only inactive ones, or everything.

## `includeEntityDetails` (type: `boolean`):

Open the full registry record for every hit to collect addresses, officers, agent details and filings. Turn this off for a fast name, document number and status list.

## `includeOfficers` (type: `boolean`):

Collect officers, directors, managers, authorized persons or general partners with their titles and addresses.

## `includeAnnualReports` (type: `boolean`):

Collect the annual report years and the date each one was filed.

## `includeFilingHistory` (type: `boolean`):

Collect the filed document history with dates and direct PDF links.

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

Maximum number of records to save per run. Result pages hold 20 rows each and the actor keeps paging on its own until this limit is filled or the results run out.

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

Per-request timeout in seconds.

## Actor input object example

```json
{
  "searchType": "entityName",
  "searchTerms": [
    "WALMART",
    "PUBLIX SUPER MARKETS"
  ],
  "nameMatchMode": "startsWith",
  "statusFilter": "all",
  "includeEntityDetails": false,
  "includeOfficers": false,
  "includeAnnualReports": false,
  "includeFilingHistory": false,
  "maxItems": 20,
  "requestTimeoutSecs": 30
}
```

# Actor output Schema

## `records` (type: `string`):

Company records with officers, registered agents, addresses, annual reports and filing history, stored in the default dataset.

## `overview` (type: `string`):

Open the extracted business records in the dataset table view.

# 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 = {
    "searchTerms": [
        "WALMART"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/florida-sunbiz-business-extractor").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 = { "searchTerms": ["WALMART"] }

# Run the Actor and wait for it to finish
run = client.actor("kawsar/florida-sunbiz-business-extractor").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 '{
  "searchTerms": [
    "WALMART"
  ]
}' |
apify call kawsar/florida-sunbiz-business-extractor --silent --output-dataset

```

## MCP server setup

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

```

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/fcn0KYgZsrXmhagiz/builds/Ur5NTmMJ05KRzVUgg/openapi.json
