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

# Rate limits

> Frequency limits of the Public API.

Each API key has **two independent buckets of 60 requests per minute**,
against a sliding window:

* **General** — reads, tags, mailbox, notes, files.
* **Messages** — sends under `conversation.messages.*` (text, quick-reply, template).

Saturating one doesn't affect the other: you can exhaust the messages bucket
and keep reading conversations (and vice versa).

## When exceeded

Past the limit the API responds `429` with code `RATE_LIMIT_EXCEEDED`:

```json theme={null}
{ "code": "RATE_LIMIT_EXCEEDED", "message": "..." }
```

## Response headers

Every `429` response includes these headers:

<ResponseField name="Retry-After" type="integer">
  Seconds to wait before retrying.
</ResponseField>

<ResponseField name="X-RateLimit-Limit" type="integer">
  The limit of the bucket that applied to the request (60 in either one).
</ResponseField>

<ResponseField name="X-RateLimit-Remaining" type="integer">
  Requests available in the current window of the bucket that applied.
</ResponseField>

<ResponseField name="X-RateLimit-Reset" type="integer">
  The moment the window resets.
</ResponseField>

## How to handle a 429

<Steps>
  <Step title="Detect the status">
    Treat any `429` response as a rate limit, without parsing the body.
  </Step>

  <Step title="Read the Retry-After">
    Wait the number of seconds indicated by the `Retry-After` header.
  </Step>

  <Step title="Retry with backoff">
    Resend the request. For large workloads (campaigns), space out the requests
    instead of sending them in a burst.
  </Step>
</Steps>
