Rate limits

Limits keep the platform responsive for everyone and protect you from runaway spend. They are set per plan and apply to the account, across all of its API keys.

Limits by plan#

PlanRequests / minTokens / minConcurrent requestsMax contextAPI keys
Pay as you go60200,0004128K5
Starter60300,0004128K5
Pro3001,000,00010256K20
Power1,0004,000,00030256K50
Business3,00015,000,000100256K200

Current values for your account are returned by GET /v1/account and shown on the Usage page. Individual models may carry lower limits during capacity incidents; the effective limit is always the lower of the two.

Tokens per minute counts the estimated prompt size plus the expected output (up to 4,096 tokens) at the time the request starts, so a burst of long prompts can hit the token limit well before the request limit.

Max context caps the prompt size regardless of the model's own window. A pay-as-you-go or Starter request to a 256K model is still limited to 128K tokens and fails with context_length_exceeded above that.

Reading the headers#

Every chat completion response includes the current state of your request and token windows:

HTTP
x-ratelimit-limit-requests: 300
x-ratelimit-remaining-requests: 287
x-ratelimit-limit-tokens: 1000000
x-ratelimit-remaining-tokens: 942115
x-ratelimit-reset-requests: 41s
x-request-id: req_01J9X3Q5K7M2N8P4R6T0V2W4Y6

When a limit is exceeded the response is 429 with a retry-after header (in seconds) and one of these codes:

codeTriggerTypical retry-after
rate_limit_exceededRequests per minuteSeconds until the window resets
tokens_per_minute_exceededTokens per minuteSeconds until the window resets
concurrency_limit_exceededIn-flight requests2
daily_limit_exceededPlan's daily token cap (if any)Seconds until UTC midnight
monthly_limit_exceededPlan's monthly token cap (if any)Seconds until UTC midnight
JSON
{
  "error": {
    "message": "Rate limit reached: 300 requests per minute. Retry in 41s.",
    "type": "rate_limit_error",
    "code": "rate_limit_exceeded",
    "request_id": "req_01J9X3Q5K7M2N8P4R6T0V2W4Y6"
  }
}

Rate-limited requests are never billed.

Other limits#

LimitValue
Request body size2 MB
Messages per request200
Text content per message1,000,000 characters
Tools per request128
API key creation20 per hour

Staying under the limits#

Use the SDK's built-in retries

The official OpenAI SDKs retry 429 and 5xx responses with exponential back-off and honour retry-after automatically. Set maxRetries (JavaScript) or max_retries (Python) to tune it.

  • Respect retry-after. Retrying sooner just consumes more of the window.
  • Use a client-side semaphore equal to your plan's concurrency limit. Excess parallelism turns into concurrency_limit_exceeded and wasted round trips.
  • Stream long responses. Streaming does not change the limits but lets you show progress instead of waiting.
  • Keep prompts tight. Fewer prompt tokens means more requests per token window and a lower bill.
  • Watch x-ratelimit-remaining-* and pre-emptively slow down when they approach zero rather than waiting for a 429.

If you consistently need more headroom, upgrade your plan from Billing. Limits apply immediately after the plan changes.