What should you do when the OpenAI or Claude API goes down? First confirm it is the provider: read the error code and body from your own requests, because the status page updates after your users notice. Then stop retry storms, fail over to a provider or model you have already tested for the workload, queue anything that can wait, and tell users what still works. Do not retry errors that need a human — invalid keys, exhausted balances and spend caps fail until someone acts.
Keep this page open in the incident. Each step lists what to check and what to change.
Minute 0–5: is it the provider, or is it you?
The fastest signal is your own error rate by status code, per provider and model. Status pages such as status.openai.com list components separately for the API, ChatGPT and Codex1, so check the API components, not the product most people talk about.
Then read the codes:
| You see | OpenAI meaning | Anthropic meaning | Retry? |
|---|---|---|---|
| 500 | Issue on OpenAI's servers | api_error, internal | Yes, with backoff |
503 server_is_overloaded | Model temporarily overloaded | — | Yes, honour Retry-After |
529 overloaded_error | — | API temporarily overloaded | Yes, with backoff |
504 timeout_error | — | Request timed out while processing | Once; consider streaming |
| 429 rate limit | Requests or tokens too fast | Rate limit exceeded | Yes, after Retry-After |
429 slow_down | Request rate rose too quickly | Acceleration limit (sharp increase) | Yes, ramp up gradually |
| 429 spend or usage limit | Organization or project spend limit, or org usage limit | Monthly spend cap: enforced_spend_limit_reached | No |
| 429 exhausted balance | No balance remains on the account | — | No |
| 400 spend limit you set | — | "You have reached your specified API usage limits" | No |
| 401 / 403 | Invalid key, wrong org, IP not allowed, region | authentication_error, permission_error | No |
Two rows cause most misdiagnoses:
- A 429 that is not a rate limit. OpenAI returns 429 for an organization or project spend limit, an organization usage limit and an exhausted balance, each with its own code2. Anthropic returns 429 when an organization reaches its tier's monthly spend cap, with
error.details.error_codeset toenforced_spend_limit_reachedand noretry-afterheader; retrying, including the SDK's automatic retries, fails until access resumes3. A spend limit you set yourself on Anthropic returns 400, not 4294. If your dashboards group every 429 as "rate limited", you will spend the incident tuning backoff for a problem that needs a billing change. - A sharp traffic increase. Both providers can refuse a sudden ramp: OpenAI's
slow_downand Anthropic's acceleration limits24. A deploy that doubled traffic can look exactly like an outage.
Minute 5–10: stop making it worse
- Cap retries now. OpenAI notes that failed attempts count toward your per-minute limit, so rapid resending makes things worse; treat
Retry-Afteras a minimum, add jitter, and cap both the number of attempts and the total retry time5. Remember that SDKs retry by default; Anthropic's SDK retries transient failures twice4. Three layers of retries during an overload is a self-inflicted outage. - Open the circuit. If a provider's error rate is above your threshold, stop sending it traffic for a short interval instead of letting every request discover the failure. Circuit breakers for LLM providers explains why throttling should not trip the same breaker as failure.
- Pause background jobs. Batch backfills, evaluation runs and re-indexing compete with user traffic for the same limits. Stop them first.
Minute 10–20: fail over, or degrade
Failover is only safe to a target you have tested for this workload: prompts tuned for one model can behave differently on another, and structured output, tool calling and context limits differ.
Choose, per feature:
- Same model, another provider. Claude on the Claude API and on Google Cloud; GPT models on OpenAI and Azure OpenAI. The behaviour is closest; the provider account and quota are separate.
- Another model, tested. A fallback model that has passed your evaluation for this task.
- Degrade. Show cached or partial results, switch the feature to a simpler mode, or queue the request and notify the user when it completes.
- Fail clearly. If none of the above is acceptable, tell the user the AI feature is unavailable and that the rest of the product works.
Streaming adds a rule: once a response has started reaching the user, a failure ends that response. Retrying silently would show the user two different beginnings. Fail over before the first byte, and let a broken stream end with a clear message. Streaming LLM failures covers recovery.
Minute 20–30: communicate and watch
- Tell users what works. "Summaries are delayed; everything else is normal" is better than a generic error.
- Watch cost as well as errors. Failover to a larger model, or a retry storm on a provider that bills failed-but-started requests, can make an outage expensive. Check spend per minute alongside error rate.
- Plan the return. When the provider recovers, ramp traffic back gradually; a sudden return of full traffic can trip acceleration limits4.
After the incident
- Record which errors you saw, per provider, model and minute, and how long until you noticed.
- Note which fallbacks were used and whether quality held.
- Turn the decisions you made by hand into configuration: failure rules, breaker thresholds, fallback chains.
- Schedule a failover drill so the next switch is rehearsed rather than improvised.
How INFRO behaves in a provider outage
INFRO routes over provider accounts you connected. On a route, each kind of upstream failure has its own rule — rate_limit, server_error, timeout, connection, credential, moderation — set to retry on the same target, fail over to the next target at once, or stop. Failover happens before any bytes reach your client, and once a stream has started INFRO will not silently restart it. Every attempt is on the request's trace with the connection that made it and the error that ended it, so the post-incident timeline is already written. INFRO holds no provider capacity of its own, so failover moves only between your own connections; if none of them can serve the request, it fails with an error naming each attempt.
Summary
Read the codes before the status page, separate rate limits from spend caps, stop retry storms, fail over only to tested targets, degrade where you cannot, and make each manual decision from the incident into configuration before the next one.
