API Documentation
Search and retrieve Florida business filing data programmatically
Overview
The Sunbiz Daily API provides read-only access to the full Florida business filing record across three datasets, each its own resource:
| Resource | What it is | Records | Endpoint |
|---|---|---|---|
| Corporate filings | Corporations & LLCs | 12,912,118 | /api/v2/filings/ |
| Fictitious names | DBA registrations | 778,024 | /api/v2/fictitious-names/ |
| Partnerships | General partnerships | 31,238 | /api/v2/partnerships/ |
Record counts as of August 23, 2026.
This is the complete Florida business registry — every corporation, LLC, fictitious name, and partnership on file with the state, not just recently registered businesses. New filings are added every business day, and counts grow continuously.
All responses are JSON, and the API is free for any registered user. Interactive API explorer available at /api/v2/docs/ (requires authentication).
Authentication
All API requests require an API key sent via the X-API-Key header.
API access is available to all authenticated users.
curl -H "X-API-Key: sb_your_key_here" \
https://sunbizdaily.com/api/v2/filings/
Keys use the format sb_<32 characters>. The full key is shown once at creation
time — store it securely. You can create and manage keys from your
API Keys dashboard.
Corporate Filings
Florida corporations and LLCs. Each filing carries officers, a registered agent, and addresses.
GET /api/v2/filings/
List and search corporate filings.
curl -H "X-API-Key: sb_your_key_here" \
"https://sunbizdaily.com/api/v2/filings/?city=miami&filing_type=FLAL&per_page=5"GET /api/v2/filings/{corporation_number}/
Get one filing with its officers and registered agent.
{
"corporation_number": "P24000012345",
"corporation_name": "MIAMI GRILL LLC",
"filing_type": "FLAL",
"filing_type_display": "Florida Limited Liability Company",
"status": "A",
"file_date": "2025-01-15",
"fei_number": "12-3456789",
"principal_address": { "address_1": "123 BISCAYNE BLVD", "city": "MIAMI", "state": "FL", "zip": "33101", "country": "US" },
"mailing_address": null,
"registered_agent": { "name": "JOHN SMITH", "agent_type": "P", "address": { } },
"officers": [ { "position": 1, "name": "JOHN SMITH", "title": "MGR", "officer_type": "P" } ]
}Resource-specific filters:
| Parameter | Description | Example |
|---|---|---|
corporation_name | Business name (substring; matched as a whole value, commas included) | GRILL |
corporation_number | Exact corporation number | P24000012345 |
officer_name | Officer name (substring) | smith |
registered_agent_name | Registered agent name (substring) | CT CORPORATION |
filing_type | Comma-separated filing type codes (see below) | DOMP,FLAL |
county | County of the principal address (see note below) | Orange |
Recognized filing_type codes for /api/v2/filings/. Any unrecognized code is
ignored; a value containing no recognized code returns no results.
| Code | Entity type |
|---|---|
FLAL | Florida Limited Liability Company |
FORL | Foreign Limited Liability Company |
DOMP | Domestic Profit Corporation |
FORP | Foreign Profit Corporation |
DOMNP | Domestic Non-Profit Corporation |
FORNP | Foreign Non-Profit Corporation |
DOMLP | Domestic Limited Partnership |
FORLP | Foreign Limited Partnership |
TRUST | Trust |
COOP | Cooperative |
NPREG | Name Registration |
AGENT | Registered Agent |
Date filters use file_date. Sort fields:
corporation_name, corporation_number, filing_type,
file_date (default), city, state, zip,
county, source_date.
Corporate filings also carry source_date — the daily file a
filing first appeared in, as opposed to file_date, which is the date
Florida filed the document. Filter it with
source_date_start/source_date_end to ask “what
arrived in the feed since …” rather than “what was filed
since …”, which is the more useful question when polling, because
filings reach the feed days after their file date.
Caveat: source_date is null for
filings that predate the daily feed and were loaded from the state's bulk
extract — the large majority of the registry. A
source_date window therefore excludes them, so use it for feed
monitoring, not for historical queries. Fictitious names and partnerships do
not carry this field.
county for corporate filings is derived from address enrichment,
which is still backfilling across the registry — filings whose address has
not been enriched yet have an empty county and are not matched
by the filter. Coverage grows continuously; a missing county does not mean
the business has none. A trailing “County” is tolerated
(Orange County = Orange).
Fictitious-Name Filings
"Doing business as" (DBA) registrations. Each filing carries owners and a principal address — no registered agent or mailing address.
GET /api/v2/fictitious-names/
List and search fictitious-name filings.
curl -H "X-API-Key: sb_your_key_here" \
"https://sunbizdaily.com/api/v2/fictitious-names/?fictitious_name=bakery&county=PINELLAS"GET /api/v2/fictitious-names/{document_number}/
Get one filing with its owners.
{
"document_number": "G24000056789",
"fictitious_name": "SUNSHINE BAKERY",
"status": "A",
"filing_date": "2025-02-03",
"county": "PINELLAS",
"fei_number": "",
"principal_address": { "address_1": "55 GULF BLVD", "city": "ST PETERSBURG", "state": "FL", "zip": "33706", "country": "US" },
"owners": [ { "position": 1, "name": "MARIA LOPEZ" } ]
}Resource-specific filters:
| Parameter | Description | Example |
|---|---|---|
fictitious_name | Trade name (substring; matched as a whole value, commas included) | bakery |
document_number | Exact document number | G24000056789 |
owner_name | Owner name (substring) | lopez |
county | County of filing | PINELLAS |
Date filters use filing_date. Sort fields:
fictitious_name, document_number, filing_date (default),
county, city, state, zip.
Partnerships
Florida general partnerships. Each carries partners, a registered agent, and addresses.
GET /api/v2/partnerships/
List and search partnerships.
curl -H "X-API-Key: sb_your_key_here" \
"https://sunbizdaily.com/api/v2/partnerships/?name=acme&state=FL"GET /api/v2/partnerships/{document_number}/
Get one partnership with its partners and registered agent.
{
"document_number": "A24000098765",
"name": "ACME PARTNERS",
"status": "A",
"filed_date": "2025-01-20",
"fei_number": "98-7654321",
"county": "ORANGE",
"principal_address": { "address_1": "200 MAIN ST", "city": "ORLANDO", "state": "FL", "zip": "32801", "country": "US" },
"mailing_address": null,
"registered_agent": { "name": "JANE ROE", "agent_type": "P", "address": { } },
"partners": [ { "name": "ALICE STONE", "partner_type": "I" } ]
}Resource-specific filters:
| Parameter | Description | Example |
|---|---|---|
name | Partnership name (substring; matched as a whole value, commas included) | acme |
document_number | Exact document number | A24000098765 |
partner_name | Partner name (substring) | stone |
registered_agent_name | Registered agent name (substring) | CT CORPORATION |
county | County of the principal address (enrichment-derived, same caveat as corporate filings) | Orange |
Date filters use filed_date. Sort fields:
name, document_number, filed_date (default),
city, state, zip, county.
Industry Categories
Every filing is assigned an industry category by matching keyword rules
against the business name. The industry filter accepts a
category from this vocabulary and works on all three resources above.
GET /api/v2/industries/
List the industry vocabulary the industry filter accepts.
curl -H "X-API-Key: sb_your_key_here" \
"https://sunbizdaily.com/api/v2/filings/?industry=Restaurant&city=miami"
Categories are derived from the business name alone — they describe
what a name suggests, not verified activity. A name that matches no rule is
categorized General Business, so that value means “no
signal in the name” rather than a positive classification. Filter on a
value outside the vocabulary and the API returns 422 rather than
silently ignoring it.
Common Parameters
These apply to every resource above. All parameters are optional and combined
with AND logic; most text parameters accept comma-separated values, ORed within
that filter. The business-name filters are the exception —
corporation_name, fictitious_name, and the partnership
name are each matched as a single whole value (commas included), so a
pasted name like Acme Holdings, LLC is one lookup, not two terms.
Shared filters
| Parameter | Description | Example |
|---|---|---|
city | City (case-insensitive) | miami |
state | State code | FL |
zip | ZIP code prefix | 331 |
status | active, inactive, or a raw status code (see note below) | active |
industry | Industry category from the vocabulary (see below); an unknown value returns 422 | Restaurant |
period | Date preset: yesterday, 7d, 14d, 30d, all (see note below) | 7d |
start_date | Start of date range (YYYY-MM-DD) | 2025-01-01 |
end_date | End of date range (YYYY-MM-DD) | 2025-01-31 |
include | parties inlines officers / owners / partners and the registered agent on each list row; omit for null | parties |
period accepts only the five values listed above. Any other
value — 60d, 90d, 1y — is
silently treated as 7d rather than rejected, so a
window wider than 30 days must use start_date/end_date.
status=active matches filings with status code A;
status=inactive matches everything else — corporate filings
use I, but partnerships carry several terminal codes (revoked,
dissolved, merged, …), so “inactive” means “not
active”. A raw single-character code (e.g. A, I)
is accepted verbatim; any other value returns 422. Responses keep
emitting the raw code in status.
Date filters operate on each resource's filing date (see each section above). Future-dated values are never returned.
Pagination & Sorting
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number (1-indexed, max 100) |
per_page | integer | 25 | Results per page (max 100) |
sort | string | filing date | Sort field (see each resource) |
order | string | desc | asc or desc |
For very broad filters, counting every match is more expensive than
returning the page itself — so counting stops at 10,000. When that
happens the envelope reports "total": 10000 with
"total_capped": true, meaning at least 10,000 matches;
narrow the filters (a date range helps most) for an exact
total. Exact counts report total_capped: false.
Asynchronous Searches
Most queries return immediately. A few are inherently expensive — for example, finding every business tied to a common officer or agent name across the whole registry. Rather than make you wait (or time out), the API runs each list request under a short time budget and, if it would exceed it, hands back a background job instead of the results.
This is automatic and uses the same list endpoints — you don't choose
up front. When a query is offloaded, the list endpoint returns
202 Accepted with a job id and a poll URL:
GET /api/v2/filings/?officer_name=john+smith
202 Accepted
{
"job_id": "f1a2b3c4-...",
"status": "queued",
"poll_url": "/api/v2/jobs/f1a2b3c4-.../"
}GET /api/v2/jobs/{job_id}/
Poll the job until status is done. While it runs,
the status is queued or running. When done, the
response carries the result in the same
filings + pagination envelope the
synchronous endpoints use, paged with the normal page and
per_page parameters. Left unset, they default to the values
from your original request, so the job result matches what the
synchronous response would have been:
GET /api/v2/jobs/f1a2b3c4-.../?page=1&per_page=25
{
"job_id": "f1a2b3c4-...",
"status": "done",
"resource": "corporate",
"truncated": false,
"filings": [ ... ],
"pagination": { "total": 842, "page": 1, "per_page": 25, "total_pages": 34 }
}
Notes: fetchable results are capped — for very common names
truncated is true, meaning only the first
page-load of rows is reachable. total is then held at that cap
with total_capped set — a floor, not the true match count —
and total_pages reflects the reachable rows, not total. Every search term must be
3 or more characters (otherwise 422) — a one- or
two-character name term matches most of the registry and could never
finish. Each user may
have up to 3 jobs in flight at once (a 4th returns 429).
Job results expire after 24 hours; polling an expired job returns
410. Jobs are private to the key's owner.
Privacy
Florida business filings are public record. A business owner who used a home address can request a privacy takedown; for those filings the API hides the people (officers, owners, or partners), the registered agent, and the mailing address, and generalizes the principal address to city level. The filing itself still appears in results.
Rate Limits
Rate limits are enforced per API key using a sliding 1-hour window.
Every response includes rate limit headers:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 998
When the limit is exceeded, the API returns a 429 status.
Wait for the window to reset before retrying.
Error Responses
Errors return a JSON object with error and optional detail fields.
| Status | Meaning | When |
|---|---|---|
200 |
OK | Request succeeded |
202 |
Accepted | Query offloaded to a background job (see Asynchronous Searches) |
401 |
Unauthorized | Missing, invalid, or expired API key |
404 |
Not Found | Document/corporation number or job does not exist |
410 |
Gone | Background job result has expired |
422 |
Unprocessable Entity | Background search term too short (under 3 characters) |
429 |
Too Many Requests | Rate limit exceeded, or too many in-flight search jobs |
500 |
Internal Server Error | Unexpected server error |
Example error response:
{
"error": "Rate limit exceeded.",
"detail": "1000 requests per hour."
}Get Started
Create an API key to start making requests. Free for all authenticated users.
Manage API Keys Interactive Docs