OpenAI API Rate Limits

Last verified: 2026-11-04

Build tier: 5,000 RPM · 1,000,000 TPM (Astra, Sol, Terra). Full table by tier below.

If you're here because you hit a 429, scroll to Error shapes or Retry logic.

Usage tiers

OpenAI's paid tiers upgrade automatically as your total credit purchases reach each threshold. Rate limits are defined at the organization level, not user level.

TierQualificationMonthly usage limit
FreeAllowed geography$100 / month
Build$5 in total credit purchases$500 / month
Launch$100 in total credit purchases$5,000 / month
Grow$500 in total credit purchases$200,000 / month

Rate limits by tier (standard)

TierModelRPMTPM
BuildAstra, Sol, Terra5,0001,000,000
BuildLuna5,0002,000,000
LaunchAstra, Sol, Terra10,0004,000,000
LaunchLuna10,00010,000,000
GrowAstra, Sol, Terra15,00040,000,000
GrowLuna30,000180,000,000
Note: No RPM/TPM is published for the Free tier in the standard table. Check Settings → Organization → Limits in your OpenAI dashboard for your actual limits — they can differ from this baseline. Some model families share rate limits; all calls to any model in a "shared limit" group count toward the same TPM ceiling.

What a 429 (and 503) looks like

Two distinct errors matter:

HTTPerror.typeerror.codeWhat it means
429rate_limit_errorslow_downYour request rate increased too quickly — even if you're within RPM/TPM.
503service_unavailable_errorserver_is_overloadedThe requested model is temporarily overloaded.

Example 429 body:

{
  "error": {
    "message": "Rate limit reached for gpt-5.5 in organization org-xxx on requests per min (RPM): Limit 5000, Used 5000, Requested 1.",
    "type": "rate_limit_error",
    "code": "slow_down"
  }
}
Rule of thumb: once your traffic reaches 1 million input TPM, increase it by no more than 50% every 15 minutes. The slow_down error is about rate of increase, not absolute limit. Hitting 4,999 RPM in one second can trigger it even if your ceiling is 5,000 RPM.

Headers on every response

Check these headers to see where you stand before you get a 429:

HeaderMeaning
Retry-AfterSeconds to wait before retrying (only on 429/503)
x-ratelimit-limit-requestsYour RPM ceiling
x-ratelimit-limit-tokensYour TPM ceiling
x-ratelimit-remaining-requestsRequests left this window
x-ratelimit-remaining-tokensTokens left this window
x-ratelimit-reset-requestsTime until RPM resets
x-ratelimit-reset-tokensTime until TPM resets

Retry logic (Python, with Retry-After)

OpenAI's own docs note that their fallback examples do not inspect Retry-After. This snippet does. It respects the header when present, falls back to exponential backoff with jitter when it isn't, and stops on non-retryable errors.

import time, random
from openai import OpenAI, RateLimitError, InternalServerError

client = OpenAI()

def call_with_retry(prompt, max_attempts=5, max_total_seconds=120):
    start = time.time()
    for attempt in range(max_attempts):
        if time.time() - start > max_total_seconds:
            raise TimeoutError("retry budget exhausted")
        try:
            return client.chat.completions.create(
                model="gpt-5.5",
                messages=[{"role": "user", "content": prompt}],
            )
        except (RateLimitError, InternalServerError) as e:
            if attempt == max_attempts - 1:
                raise
            retry_after = None
            if getattr(e, "response", None) is not None:
                retry_after = e.response.headers.get("retry-after")
            if retry_after:
                wait = float(retry_after)
            else:
                wait = (2 ** attempt) + random.uniform(0, 1)
            time.sleep(wait)

Note: unsuccessful requests still count against your per-minute limit. Continuously resending a request won't help — wait and ramp.

Escape hatch

If you're stuck on 429s with legitimate traffic:

Source: OpenAI Rate Limits documentation · Verified 2026-11-04 · Report an error · ← All APIs