# LLCDrop API

A read-only JSON API for Florida business filings: search businesses, look one up by id or state document number, list officers, and read daily filing counts, county and statewide stats.

## Base URL

Every request goes to `https://api.llcdrop.com` over HTTPS. Every endpoint is a GET that returns JSON, and paths below are relative to it. Lists return a `data` array and a `pagination` block with limit, offset, has_more and total.

## Authentication

Send your key as a Bearer token in the Authorization header of every request. No other method is accepted.

```
Authorization: Bearer sk_live_YOUR_KEY
```

Accounts on the Starter, Agency and Enterprise plans can create API keys under Settings, API keys. A key for this API carries the data scope. A key is shown once, when you create it. Keep it out of browser code.

## Limits

Limits belong to the account, not to a key: all keys of an account share them. Over a limit you get a 429 with a Retry-After header. GET /v1/me shows what is left.

| Plan | Requests per minute | Requests per day | Requests per month | Rows per call | Max offset | Daily filings window (days) | Active keys |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Starter | 20 | 1,000 | 10,000 | 50 | 1,000 | 30 | 2 |
| Agency | 60 | 5,000 | 50,000 | 100 | 2,000 | 90 | 5 |
| Enterprise | 120 | 20,000 | 200,000 | 100 | 5,000 | 365 | 20 |

- Rows per call: a limit above this is reduced to it, and the response reports the limit applied.
- Max offset: a page offset above this is a 400.
- Daily filings window: how far back daily filings and date-range searches reach. Today counts as day 1. A businesses search without q also spans at most 92 days.

## Errors

A failed call returns a JSON body with the status code and a message. The message is a string, or a list of strings when several parameters are wrong. Every error body also has a docs_url field that links to the full reference as Markdown.

```json
{
  "statusCode": 429,
  "message": "Rate limit exceeded (minute limit)",
  "docs_url": "https://api.llcdrop.com/docs.md"
}
```

| Status | Meaning |
| --- | --- |
| 400 | The query is invalid: an unknown parameter, a value out of bounds, or a missing narrowing filter. |
| 401 | The key is missing or not valid. |
| 403 | Your plan does not include API access, the key lacks the data scope, or the date asked for is outside your plan's daily filings window. |
| 404 | The business, county or route does not exist. |
| 429 | Your account is over a limit. The Retry-After header gives the seconds to wait before you call again. |
| 503 | Key checking or the data is briefly unavailable. Try the same call again shortly. |

## Connect over MCP

The API is also available as a remote MCP (Model Context Protocol) server, so an AI tool can call it without hand-written requests. The server is at `https://api.llcdrop.com/mcp`. It uses streamable HTTP: send a POST per request. It is stateless and answers with JSON.

Authentication is the same Bearer key as the REST API: send it as `Authorization: Bearer YOUR_KEY` with every request. Replace YOUR_KEY in the snippets below with your key.

### Client setup

**Claude Code**

Run this in your terminal.

```bash
claude mcp add --transport http llcdrop https://api.llcdrop.com/mcp --header "Authorization: Bearer YOUR_KEY"
```

**Cursor**

Save as .cursor/mcp.json in your project, or in your home folder to use it everywhere.

```json
{
  "mcpServers": {
    "llcdrop": {
      "url": "https://api.llcdrop.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_KEY"
      }
    }
  }
}
```

**VS Code**

Save as .vscode/mcp.json in your project.

```json
{
  "servers": {
    "llcdrop": {
      "type": "http",
      "url": "https://api.llcdrop.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_KEY"
      }
    }
  }
}
```

**Claude Desktop**

Add to claude_desktop_config.json. Needs Node.js, because mcp-remote runs through npx.

```json
{
  "mcpServers": {
    "llcdrop": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.llcdrop.com/mcp",
        "--header",
        "Authorization: Bearer YOUR_KEY"
      ]
    }
  }
}
```

### Tools

One tool per endpoint, each with the same parameters as the endpoint.

| Tool | Endpoint | What it does |
| --- | --- | --- |
| `get_account` | `GET /v1/me` | Get account and key status |
| `search_businesses` | `GET /v1/fl/businesses` | Search Florida businesses |
| `get_business_by_document` | `GET /v1/fl/businesses/by-document/{document_number}` | Get a business by document number |
| `get_business` | `GET /v1/fl/businesses/{id}` | Get a business by id |
| `list_business_officers` | `GET /v1/fl/businesses/{id}/officers` | List a business's officers |
| `get_daily_filing_counts` | `GET /v1/fl/filings/daily` | Get daily filing counts |
| `list_daily_filings` | `GET /v1/fl/filings/daily/{date}` | List businesses filed on a day |
| `list_counties` | `GET /v1/fl/counties` | List Florida counties |
| `get_county` | `GET /v1/fl/counties/{key}` | Get one county |
| `get_stats` | `GET /v1/fl/stats` | Get Florida filing stats |
| `list_industries` | `GET /v1/fl/industries` | List industry filter values |
| `list_entity_types` | `GET /v1/fl/entity-types` | List entity type filter values |

### Rules

- The tools are read-only, like the REST endpoints. They return the same data and never contact data.
- MCP calls use the same limits as REST calls: your plan's limits, shared by all keys of the account.
- Each HTTP request counts as one request against your limits, including the handshake. A session costs about 2 extra requests on top of its tool calls.
- A failed tool call comes back as a tool result with `isError: true`. Its text is the same error body as the REST API, including `docs_url`.
- Batch requests are not supported: send one JSON-RPC message per HTTP request.
- There is no OAuth yet. A client has to send the Authorization header itself. The custom connector screen in the claude.ai web app does not work with this server yet.

## Rules for agents

- A narrowing filter is required on the businesses list: send q, city, zip or a filed_from date. County, type, industry and status never narrow a search on their own.
- Starter plan: at most 50 rows per call and an offset up to 1,000. Daily filings reach back 30 days.
- Agency plan: at most 100 rows per call and an offset up to 2,000. Daily filings reach back 90 days.
- Enterprise plan: at most 100 rows per call and an offset up to 5,000. Daily filings reach back 365 days.
- On a 429, wait the number of seconds in the Retry-After header, then retry. Do not retry sooner.
- No contact data such as phone numbers or emails is ever returned. Contact data stays in the LLCDrop app.
- The API is read-only. Every endpoint is a GET and nothing you send changes data.
- Use limit and offset to page. Stop when has_more is false.

## Account endpoints

### GET /v1/me

Shows which key you are calling with: its scopes, its request caps and how many requests are left in each window. A good first call to check a new key.

Auth: Bearer key (any scope).

**Parameters**

None.

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/me"
```

**Example response**

```json
{
  "kind": "client",
  "id": "example-key-id",
  "scopes": [
    "data"
  ],
  "limits": {
    "perMinute": 20,
    "perDay": 1000,
    "perMonth": 10000
  },
  "remaining": {
    "minute": 19,
    "day": 999,
    "month": 9999
  }
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 401 | Missing or invalid key. |
| 403 | The account's plan does not include API access. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

## Businesses endpoints

### GET /v1/fl/businesses

Search Florida business filings by name prefix, or list filings in a date range. Newest filings first. Every call needs a narrowing filter.

Auth: Bearer key with the data scope.

- Send q, city, zip or a filed_from date. County, type, industry and status never narrow a search on their own.
- With q, filed_from and filed_to are free: search any period.
- Without q, filed_from is required, must not be older than your plan's daily window (403 otherwise), and the range from filed_from to filed_to (today in Eastern time when omitted) spans at most 92 days.
- Name search matches the start of the name only. There is no contains or fuzzy match.
- Fictitious name filings are listed with type=fictitious.

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `q` | query | string | no | Start of the business name, 2 to 80 characters. Lets filed_from and filed_to be free. |
| `city` | query | string | no | City name, up to 40 characters. Narrows the search on its own. |
| `zip` | query | string | no | A 5-digit ZIP code, or a prefix of 3 to 4 digits. Narrows the search on its own. |
| `county` | query | string | no | Florida county name, up to 40 characters, for example Broward. Does not narrow a search on its own. |
| `filed_from` | query | date | no | First filing date, YYYY-MM-DD. Required when there is no q, city or zip and you search by date. |
| `filed_to` | query | date | no | Last filing date, YYYY-MM-DD. Defaults to today in Eastern time. Needs filed_from when there is no q. |
| `type` | query | string | no | One of llc, corporation, partnership, nonprofit, fictitious, trust. The values are listed by GET /v1/fl/entity-types. |
| `industry` | query | string | no | A key from GET /v1/fl/industries: a sector, a sector.type key or a named segment. |
| `status` | query | string | no | active (default) or all. all includes dissolved businesses and needs a q of 2 or more characters. |
| `limit` | query | integer | no | Rows to return, 1 to 1,000. Default 25. A value above your plan's rows per call is reduced to it, and the response reports the limit applied. |
| `offset` | query | integer | no | Rows to skip, 0 to 100,000. Default 0. A value above your plan's max offset is a 400. |

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/fl/businesses?q=example&limit=1"
```

**Example response**

```json
{
  "data": [
    {
      "id": "1234567",
      "document_number": "L00000000000",
      "name": "Example Holdings LLC",
      "entity_type": "llc",
      "company_type": "LLC",
      "status": "active",
      "filed_date": "2026-10-09",
      "dissolved_date": null,
      "city": "Miami",
      "zip": "33101",
      "county": "Miami-Dade",
      "industry": {
        "sector": "construction",
        "type": "construction.general_contractor"
      },
      "url": "https://llcdrop.com/business/1234567"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "has_more": true,
    "total": 1234
  }
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 400 | Invalid query: an unknown parameter, a value out of bounds, no narrowing filter, an offset above your plan's max offset, or a filed range over 92 days without q. |
| 401 | Missing or invalid key. |
| 403 | The plan or scope does not allow API access, or filed_from is older than your plan's daily window. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

### GET /v1/fl/businesses/by-document/{document_number}

One business by its state document number. Case does not matter. Returns the same fields as the lookup by id.

Auth: Bearer key with the data scope.

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `document_number` | path | string | yes | The state document number, 6 to 12 letters or digits. |

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/fl/businesses/by-document/L00000000000"
```

**Example response**

```json
{
  "data": {
    "id": "1234567",
    "document_number": "L00000000000",
    "name": "Example Holdings LLC",
    "entity_type": "llc",
    "company_type": "LLC",
    "status": "active",
    "filed_date": "2026-10-09",
    "dissolved_date": null,
    "city": "Miami",
    "zip": "33101",
    "county": "Miami-Dade",
    "industry": {
      "sector": "construction",
      "type": "construction.general_contractor"
    },
    "url": "https://llcdrop.com/business/1234567",
    "principal_address": {
      "street": "100 Example Street",
      "street2": "Suite 1",
      "city": "Miami",
      "state": "FL",
      "zip": "33101",
      "country": "US"
    },
    "mailing_address": null,
    "registered_agent_name": "Example Registered Agent Inc.",
    "formation_state": "FL",
    "last_annual_report_year": 2026,
    "officer_count": 2,
    "license_count": 0
  }
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 400 | document_number is not 6 to 12 letters or digits. |
| 401 | Missing or invalid key. |
| 403 | The account's plan does not include API access, or the key lacks the data scope. |
| 404 | No business has that document number. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

### GET /v1/fl/businesses/{id}

One business by its LLCDrop id, with addresses, the registered agent's name, formation state, last annual report year and officer and license counts.

Auth: Bearer key with the data scope.

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | yes | The id returned by the list endpoints, a positive integer. |

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/fl/businesses/1234567"
```

**Example response**

```json
{
  "data": {
    "id": "1234567",
    "document_number": "L00000000000",
    "name": "Example Holdings LLC",
    "entity_type": "llc",
    "company_type": "LLC",
    "status": "active",
    "filed_date": "2026-10-09",
    "dissolved_date": null,
    "city": "Miami",
    "zip": "33101",
    "county": "Miami-Dade",
    "industry": {
      "sector": "construction",
      "type": "construction.general_contractor"
    },
    "url": "https://llcdrop.com/business/1234567",
    "principal_address": {
      "street": "100 Example Street",
      "street2": "Suite 1",
      "city": "Miami",
      "state": "FL",
      "zip": "33101",
      "country": "US"
    },
    "mailing_address": null,
    "registered_agent_name": "Example Registered Agent Inc.",
    "formation_state": "FL",
    "last_annual_report_year": 2026,
    "officer_count": 2,
    "license_count": 0
  }
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 400 | id is not a positive integer. |
| 401 | Missing or invalid key. |
| 403 | The account's plan does not include API access, or the key lacks the data scope. |
| 404 | No business has that id. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

### GET /v1/fl/businesses/{id}/officers

Names and titles of a business's officers, sorted by name, at most 25. No contact details.

Auth: Bearer key with the data scope.

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | yes | The id returned by the list endpoints, a positive integer. |

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/fl/businesses/1234567/officers"
```

**Example response**

```json
{
  "data": [
    {
      "name": "Jane Example",
      "title": "Manager"
    }
  ]
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 400 | id is not a positive integer. |
| 401 | Missing or invalid key. |
| 403 | The account's plan does not include API access, or the key lacks the data scope. |
| 404 | No business has that id. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

## Filings endpoints

### GET /v1/fl/filings/daily

How many businesses filed on each recent day, counting back from today in Eastern time.

Auth: Bearer key with the data scope.

- days is also capped by your plan's daily window, so a larger value returns fewer days, not an error.
- The pagination block is always a single page.

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `days` | query | integer | no | Days to count back, today included, 1 to 90. Default 30. |

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/fl/filings/daily?days=2"
```

**Example response**

```json
{
  "data": [
    {
      "date": "2026-10-10",
      "count": 412
    },
    {
      "date": "2026-10-09",
      "count": 398
    }
  ],
  "pagination": {
    "limit": 2,
    "offset": 0,
    "has_more": false,
    "total": 2
  }
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 400 | days is not a whole number in range. |
| 401 | Missing or invalid key. |
| 403 | The account's plan does not include API access, or the key lacks the data scope. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

### GET /v1/fl/filings/daily/{date}

The businesses that filed on one day, newest first, paginated.

Auth: Bearer key with the data scope.

- The date must fall inside your plan's daily window and cannot be in the future.

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `date` | path | date | yes | The filing day, YYYY-MM-DD. |
| `limit` | query | integer | no | Rows to return, 1 to 1,000. Default 25. A value above your plan's rows per call is reduced to it, and the response reports the limit applied. |
| `offset` | query | integer | no | Rows to skip, 0 to 100,000. Default 0. A value above your plan's max offset is a 400. |

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/fl/filings/daily/2026-10-10?limit=1"
```

**Example response**

```json
{
  "data": [
    {
      "id": "1234567",
      "document_number": "L00000000000",
      "name": "Example Holdings LLC",
      "entity_type": "llc",
      "company_type": "LLC",
      "status": "active",
      "filed_date": "2026-10-09",
      "dissolved_date": null,
      "city": "Miami",
      "zip": "33101",
      "county": "Miami-Dade",
      "industry": {
        "sector": "construction",
        "type": "construction.general_contractor"
      },
      "url": "https://llcdrop.com/business/1234567"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "has_more": true,
    "total": 412
  }
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 400 | date is not a real YYYY-MM-DD day or is in the future, or limit or offset is out of bounds. |
| 401 | Missing or invalid key. |
| 403 | The plan or scope does not allow API access, or the date is older than your plan's daily window. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

## Counties and stats endpoints

### GET /v1/fl/counties

New-filing counts for every Florida county. Not paginated.

Auth: Bearer key with the data scope.

**Parameters**

None.

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/fl/counties"
```

**Example response**

```json
{
  "data": [
    {
      "key": "BROWARD",
      "name": "Broward",
      "filings_last_7_days": 10,
      "filings_last_30_days": 40,
      "filings_previous_30_days": 35,
      "active_businesses": 900
    }
  ]
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 401 | Missing or invalid key. |
| 403 | The account's plan does not include API access, or the key lacks the data scope. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

### GET /v1/fl/counties/{key}

New-filing counts for one county. There is no per-county filings list; use the businesses search with county.

Auth: Bearer key with the data scope.

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `key` | path | string | yes | A county key from GET /v1/fl/counties, for example BROWARD. Case does not matter. |

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/fl/counties/BROWARD"
```

**Example response**

```json
{
  "data": {
    "key": "BROWARD",
    "name": "Broward",
    "filings_last_7_days": 10,
    "filings_last_30_days": 40,
    "filings_previous_30_days": 35,
    "active_businesses": 900
  }
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 400 | key is not a valid county key. |
| 401 | Missing or invalid key. |
| 403 | The account's plan does not include API access, or the key lacks the data scope. |
| 404 | Unknown county. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

### GET /v1/fl/stats

Totals, filings over recent periods, a monthly series and the split by business type for the last 30 days. Timestamps are ISO 8601 in UTC.

Auth: Bearer key with the data scope.

- The monthly series may include the current month, marked partial.

**Parameters**

None.

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/fl/stats"
```

**Example response**

```json
{
  "data": {
    "businesses_total": 1000000,
    "latest_filing_date": "2026-10-10",
    "updated_at": "2026-10-11T06:00:00.000Z",
    "filings": {
      "last_7_days": 2800,
      "last_30_days": 12000,
      "previous_30_days": 11500,
      "last_365_days": 140000
    },
    "monthly": [
      {
        "month": "2026-09",
        "total": 11800,
        "partial": false,
        "by_type": {
          "llc": 8000,
          "corporation": 1500,
          "partnership": 100,
          "nonprofit": 200,
          "trust": 50,
          "fictitious": 1500,
          "other": 450
        }
      }
    ],
    "type_split_30d": [
      {
        "type": "llc",
        "n": 8100
      }
    ]
  }
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 401 | Missing or invalid key. |
| 403 | The account's plan does not include API access, or the key lacks the data scope. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

## Reference lists endpoints

### GET /v1/fl/industries

The values the industry filter accepts: sectors with their types, and named segments. Not paginated. Lists are shortened in this example.

Auth: Bearer key with the data scope.

- A key that is both a sector and a segment, such as retail, means the sector.

**Parameters**

None.

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/fl/industries"
```

**Example response**

```json
{
  "data": {
    "sectors": [
      {
        "sector": "construction",
        "types": [
          "construction.general_contractor",
          "construction.roofing"
        ]
      }
    ],
    "segments": [
      {
        "key": "trades",
        "sectors": [
          "construction"
        ],
        "types": []
      }
    ]
  }
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 401 | Missing or invalid key. |
| 403 | The account's plan does not include API access, or the key lacks the data scope. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

### GET /v1/fl/entity-types

The values the type filter accepts, with a plain label for each. Not paginated.

Auth: Bearer key with the data scope.

**Parameters**

None.

**Example request**

```bash
curl -H "Authorization: Bearer sk_live_YOUR_KEY" "https://api.llcdrop.com/v1/fl/entity-types"
```

**Example response**

```json
{
  "data": [
    {
      "key": "llc",
      "label": "Limited liability company"
    },
    {
      "key": "corporation",
      "label": "Corporation"
    },
    {
      "key": "partnership",
      "label": "Partnership"
    },
    {
      "key": "nonprofit",
      "label": "Nonprofit"
    },
    {
      "key": "fictitious",
      "label": "Fictitious name"
    },
    {
      "key": "trust",
      "label": "Trust"
    }
  ]
}
```

**Errors**

| Status | Meaning |
| --- | --- |
| 401 | Missing or invalid key. |
| 403 | The account's plan does not include API access, or the key lacks the data scope. |
| 429 | Over a limit for your account. Wait the number of seconds in the Retry-After header. |
| 503 | Key check or data temporarily unavailable. Try again shortly. |

## Links

- OpenAPI 3.1: https://api.llcdrop.com/openapi.json
- Short index for agents: https://api.llcdrop.com/llms.txt
- Human docs: https://llcdrop.com/developers
