Rate limits
Open as markdownFor AI agents: the docs index is at /llms.txt, and every page is also served as markdown at its URL plus .md.
Each API key may make 200 requests per 10 seconds. The limit is the same for every plan and every operation under /v1.
How it works#
- Each key has a bucket that holds up to 200 requests. A request takes one. The bucket refills continuously at 20 requests per second.
- A burst of up to 200 requests succeeds at once. After that you can sustain 20 requests per second.
- The limit is per key, not per account or per IP address.
- The public endpoints
/health,/plans,/openapi.jsonand/llms.txtare not rate limited. - Requests that fail authentication are not counted.
- Each API server process keeps its own buckets in memory. If more than one process serves the API, the limit applies to each process separately.
Response headers#
Every authenticated response carries these headers.
| Header | Meaning |
|---|---|
X-RateLimit-Limit | The bucket size, 200. |
X-RateLimit-Remaining | Whole requests left right now, after this one. |
X-RateLimit-Reset | Unix time in seconds when the bucket is full again. |
Retry-After | Only on a refused request: seconds to wait before retrying. |
When you are limited#
The API answers HTTP 429 with the rate_limited code and retryable: true. Wait for Retry-After seconds and retry. See Errors.
{
"error": {
"code": "rate_limited",
"message": "Too many requests for this API key.",
"fix": "Wait the number of seconds in the Retry-After header, then retry. Spread requests out to stay under the X-RateLimit-Limit value.",
"docs_url": "/docs/errors#rate_limited",
"retryable": true,
"request_id": "req_Qx7RtVw3ZbN1pEs9fKd2Lm"
}
}async function withRetry(send, attempts = 4) {
for (let i = 0; i < attempts; i += 1) {
const res = await send();
if (res.status !== 429) return res;
const wait = Number(res.headers.get('retry-after') ?? 1);
await new Promise((resolve) => setTimeout(resolve, wait * 1000));
}
throw new Error('still rate limited');
}Other limits#
| Limit | Value | Error when exceeded |
|---|---|---|
| Request body size | 256 KiB | payload_too_large |
| Prospects per import request | 500 | invalid_input |
| Steps in a sequence | 6 | invalid_input |
| Variants per step | 4 | invalid_input |
| Days between steps | 0 to 30, and at least 1 after the first step | invalid_input |
| Reply body length | 20,000 characters | invalid_input |
| Domains, mailboxes and active campaigns | By plan, see Credits and billing | plan_limit |