Rate limits
The API limits the number of requests per time window. Once the limit is exceeded, the request is rejected with 429 without being executed: it consumes no quota and produces no effects.
The window is one minute and the counter starts on each clock minute, not on the first request. A burst straddling two minutes is split across both counters.
Applicable limit
The counter depends on whether the request carries credentials and on the host serving it:
| request | counter | requests per minute |
|---|---|---|
API (api.…) with an API key | Per account, set by the plan | 60 to 900 |
API (api.…) with an API key | Per IP address, all keys together | 1,200 |
API (api.…) without credentials | Per IP address | 80 |
| Dashboard | Per IP address | 80 |
| Documentation | Per IP address | 50 |
| Public site | Per IP address | 40 |
Several clients behind one server do not compete for a single per-IP counter: each account counts on its own with the limit of its plan. The per-IP ceiling is a guard against abuse, and every key coming from the same origin shares it.
Certain operations apply stricter limits of their own because of their cost or sensitivity, such as sign-in, OTP delivery and broadcasts, and declare them on their reference page.
Limits per plan
| plan | API per key | Webhooks per host |
|---|---|---|
free | 60 | 10 |
personal | 120 | 30 |
negocio | 240 | 60 |
empresa | 480 | 120 |
volumen | 900 | 300 |
An account without a plan, or on a plan with no value of its own, takes the values of the free plan. GET /v1/usage/limits returns the ones that apply to the authenticated account.
Webhooks
Deliveries to the same destination host have two caps, and each delivery needs room under both:
| cap | applies to | deliveries per minute |
|---|---|---|
| Per host and account | One account towards one host, set by the plan | 10 to 300 |
| Global per host | All accounts together towards one host | 600 |
A delivery that does not fit is not lost. It is deferred and retried on the schedule described in webhooks architecture.
The 429 response
{
"errors": [
{
"status": "429",
"code": "rate_limit_exceeded",
"detail": "Request limit exceeded."
}
],
"meta": { "version": "1.57.0", "api_version": "v1", "request_id": "e6f7a8b9c0d1" }
}The response includes the headers needed to retry without guessing:
| header | content |
|---|---|
Retry-After | Seconds left before the window renews; on the per-IP counters, the full window (60) |
X-RateLimit-Limit | Maximum requests for the window |
X-RateLimit-Remaining | Requests left; on a 429 it is always 0 |
X-RateLimit-Reset | Renewal time, in seconds since the epoch |
On the API, a X-RateLimit-Limit of 1,200 identifies the per-IP ceiling; any other value is the per-key limit of the plan.
Consumption on every response
Every response of the API to a request with an API key carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset for the per-key counter, not only the 429. Remaining can be read to space out calls before reaching the limit.
X-RateLimit-Limit: 240
X-RateLimit-Remaining: 187
X-RateLimit-Reset: 1790812860The rest of the surfaces, and the requests without credentials, emit these headers only on 429 responses. A repetition of an idempotent operation answered from the stored result does not go through the limiter and does not carry them.
Recommended handling
The Retry-After value is the only data needed to retry: wait that margin and repeat the request. Retrying earlier consumes the counter again and extends the block.
Rate limits protect the system against bursts, not against total volume. Monthly volume is governed by the plan quota and its own error codes, described in the error taxonomy.