Skip to content

Rate limits and quotas

Two independent controls: a per-minute burst limit and a monthly request allowance.

Per plan

PlanRequests per minuteRequests per month
Free30500
Pro12010,000
Business600100,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-idUnique id for this call. Also present as meta.request_id.
x-api-versionAPI version that served the request (v1).
x-ratelimit-limitRequests allowed per minute for the account's plan.
x-ratelimit-remainingRequests left in the current minute window.
x-quota-limitRequests allowed in the current UTC calendar month.
x-quota-remainingRequests left in the current UTC calendar month.
retry-afterSeconds 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-remaining and 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.