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.
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.
| Tier | Qualification | Monthly usage limit |
|---|---|---|
| Free | Allowed 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 |
| Tier | Model | RPM | TPM |
|---|---|---|---|
| Build | Astra, Sol, Terra | 5,000 | 1,000,000 |
| Build | Luna | 5,000 | 2,000,000 |
| Launch | Astra, Sol, Terra | 10,000 | 4,000,000 |
| Launch | Luna | 10,000 | 10,000,000 |
| Grow | Astra, Sol, Terra | 15,000 | 40,000,000 |
| Grow | Luna | 30,000 | 180,000,000 |
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.
Two distinct errors matter:
| HTTP | error.type | error.code | What it means |
|---|---|---|---|
| 429 | rate_limit_error | slow_down | Your request rate increased too quickly — even if you're within RPM/TPM. |
| 503 | service_unavailable_error | server_is_overloaded | The 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"
}
}
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.
Check these headers to see where you stand before you get a 429:
| Header | Meaning |
|---|---|
Retry-After | Seconds to wait before retrying (only on 429/503) |
x-ratelimit-limit-requests | Your RPM ceiling |
x-ratelimit-limit-tokens | Your TPM ceiling |
x-ratelimit-remaining-requests | Requests left this window |
x-ratelimit-remaining-tokens | Tokens left this window |
x-ratelimit-reset-requests | Time until RPM resets |
x-ratelimit-reset-tokens | Time until TPM resets |
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.
If you're stuck on 429s with legitimate traffic:
max_tokens — your effective TPM is the max of max_tokens and the estimated tokens from your prompt. Set it close to your actual expected output.Source: OpenAI Rate Limits documentation · Verified 2026-11-04 · Report an error · ← All APIs