Rate limits
Two independent limits apply to the data plane. They answer different questions, so hitting one tells you nothing about the other.
| Limit | Window | Exceeded response |
|---|---|---|
| Request-unit quota | Billing period | 429 quota_exceeded |
| Short-term request rate | Per second | 429 rate_limit_exceeded |
The quota is the durable, billable limit — see Usage & quotas. The per-second rate is a burst control that protects shared capacity.
Per-plan rate
| Plan | Requests per second |
|---|---|
| Free | 2 |
| Developer | 10 |
| Pro | 25 |
| Business | 50 |
| Enterprise | 100 (or as agreed) |
These are the defaults. The current values for every plan are on the
website’s pricing page and in GET /v1/pricing.
Headers
Every billable data-plane response carries:
X-RateLimit-Limit— your plan’s per-second allowance.X-RateLimit-Remaining— allowance left in the current second.
A throttled response additionally carries Retry-After, in whole seconds.
Throttled response — 429
{
"code": "rate_limit_exceeded",
"message": "Short-term request rate exceeded for your plan.",
"request_id": "...",
"limit": 2,
"retry_after_seconds": 1
}A throttled request is not billed — it never reaches the rate store, so no request unit is consumed.
Handling throttling
Wait for Retry-After and retry. Because the window is one second, a
single short sleep is almost always enough; exponential backoff with
jitter is still the right shape if you are driving many concurrent
workers.
Do not pattern-match on message. Branch on code:
rate_limit_exceeded means “slow down and retry”, quota_exceeded means
“this billing period is finished — retrying will not help”.