> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flow.engineer/llms.txt
> Use this file to discover all available pages before exploring further.

# Rate limits

> Read your request budget and retry a 429 response at the right time.

Requests are limited per API key, and every answer tells you where you stand, so a client can slow down before it is refused.

```http theme={null}
RateLimit-Limit: 100
RateLimit-Remaining: 97
RateLimit-Reset: 12
```

## Rules

* `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset` (seconds) come with every answer.
* Over the limit, the API answers `429` with type [`rate_limited`](https://docs.flow.engineer/unified-messaging-api/errors/rate_limited), a `Retry-After` header and `error.retry_after` in seconds. Wait that long, then retry with the **same** idempotency key.
* The TypeScript SDK retries `429` and `5xx` answers for you (2 retries by default, `maxRetries` to change it), honouring `Retry-After`.
* **Each sender also has a sending rate (pacing).** [The send gate](https://docs.flow.engineer/unified-messaging-api/concepts/send-gate.md) lets a sender send only so many messages a second; a send over it is also refused with `429 rate_limited`, `Retry-After` and `error.retry_after`, and `error.sender` names the sender. Retry the same way, with the same idempotency key. The `RateLimit-*` headers describe only the per-key limit.
* **New-contact budgets are separate.** How many new conversations a sender may start is decided by the send gate (`new_contact_limit`, `sender_throttled`), not by these headers.
* Use webhooks or the live stream instead of polling `GET /v0/events` in a tight loop.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.