Rate limits and quotas
Two independent controls: a per-minute burst limit and a monthly request allowance.
Per plan
| Plan | Requests per minute | Requests per month |
|---|---|---|
| Free | 30 | 500 |
| Pro | 120 | 10,000 |
| Business | 600 | 100,000 |
The quota is account-wide
One monthly allowance is shared by every API key on the account and by authenticated MCP usage. Creating more keys does not create more quota. It resets at the start of each UTC calendar month.
Quota is consumed atomically in the database, so parallel requests cannot overspend it. A request rejected for authentication never consumes quota.
Headers on every response
| x-request-id | Unique id for this call. Also present as meta.request_id. |
| x-api-version | API version that served the request (v1). |
| x-ratelimit-limit | Requests allowed per minute for the account's plan. |
| x-ratelimit-remaining | Requests left in the current minute window. |
| x-quota-limit | Requests allowed in the current UTC calendar month. |
| x-quota-remaining | Requests left in the current UTC calendar month. |
| retry-after | Seconds to wait, sent with 429 RATE_LIMIT_EXCEEDED. |
When you are limited
json
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit of 60 requests per minute exceeded.",
"request_id": "req_9f2c41a7be03d5710c8e2b44",
"limit": 60,
"retry_after_seconds": 24
}
}429 RATE_LIMIT_EXCEEDED is transient: wait for retry-after and retry. 429 API_QUOTA_EXCEEDED is not: it clears at the next monthly reset or when you upgrade.
Staying inside the limits
- Cache results. Date arithmetic for a fixed input never changes.
- Read
x-quota-remainingand alert before you hit zero. - Use exponential backoff with jitter, not a fixed retry loop.
Limits are resolved from the account's live plan, so an upgrade applies on the next request. See plans.