# Rate limits

Two limits apply to every request, and the stricter one answers first:

| Limit | Value | Counted per |
| --- | --- | --- |
| API key | 3000 requests per minute | Key |
| IP address | 200 requests per minute | Address the request comes from |

Both answer `429 rate_limited` with a `Retry-After` header: wait that many seconds. The TypeScript SDK waits for `Retry-After` and retries for you.

## Limits per organization

Some routes call a system of yours, or send test traffic, and have their own limit for the whole organization, whatever key sends the request. They are counted across all the servers of Lelemon and answer `429 rate_limited` with `Retry-After`.

| Route | Value per minute |
| --- | --- |
| `POST /v2/actions/{id}/test` | 10 |
| `POST /v2/data-connectors/{id}/check` | 20 |
| `POST /v2/mcp-servers/{id}/discover` | 20 |

## Headers

Every answer to a request with a valid key carries the state of the key limit:

| Header | Meaning |
| --- | --- |
| `RateLimit-Limit` | Requests the key can send in the window |
| `RateLimit-Remaining` | Requests left in the window |
| `RateLimit-Reset` | Seconds until the window resets |
| `RateLimit-Policy` | The policy as `limit;w=seconds`, for example `3000;w=60` |

Spread work that arrives in bursts: a queue worker that sends one request per message stays far below the key limit, while a loop over every contact does not.

If you hit a limit while polling, subscribe to [webhooks](/webhooks/receive) instead. An organization can have up to 16 webhook endpoints; the next one answers `422 webhook_endpoint_limit`.
