Writing ·
How should an AI agent retry OpenAI 429 slow_down vs 503 server_is_overloaded errors in 2026?
Branch retry control on the documented failure meaning, not the HTTP status: reduce ramp after a 429 slow_down, use exponential backoff for a temporary 503 server_is_overloaded, and honor Retry-After when either is present.
By Youssef Hemimy · OpenAI · agent reliability · AgentOps
An OpenAI 429 slow_down and a 503 server_is_overloaded are different failure meanings, not interchangeable bad statuses. OpenAI documents slow_down as a signal that requests are increasing too quickly, and server_is_overloaded as a temporary model-capacity condition. Build retry control around that distinction: honor Retry-After when either response includes it, otherwise use exponential backoff — then let the two codes diverge in what happens next.
slow_down
Requests increasing too quickly
- 1Retry-After present → wait at least that duration
- 2Retry-After absent → exponential backoff
- 3Reduce request ramp, then increase gradually
server_is_overloaded
Temporary model-capacity condition
- 1Retry-After present → wait at least that duration
- 2Retry-After absent → exponential backoff
- 3No ramp diagnosis — this is provider capacity, not your rate limit
One idempotent, logged retry
429 slow_down: the client's own ramp is the pressure
OpenAI's error-codes guide defines slow_downand prescribes gradual traffic reduction. Read literally: this is a client-side signal about the client's own request pattern, not a generic rate-limit rejection. After honoring Retry-After (or backing off exponentially when it is absent), the correct next move is to reduce the request ramp — not just wait once and resume at the same rate — then increase traffic gradually again.
That gradual re-increase matters because OpenAI's rate-limits guide documents limits at multiple dimensions: organization, project, model, and metric (for example requests-per-minute versus tokens-per-minute). A ramp that recovers instantly back to peak rate can trip the same limit again immediately. Recovering slower is the deliberate tradeoff, not an oversight.
503 server_is_overloaded: a temporary provider-capacity condition
server_is_overloadedsignals temporary overload on OpenAI's side, not a property of the client's traffic shape. The same first step applies — honor Retry-After if the response carries it, otherwise use exponential backoff — but there is no ramp to diagnose or reduce here, because the client did not necessarily do anything wrong.
| 429 slow_down | 503 server_is_overloaded | |
|---|---|---|
| What it signals | Client requests increasing too quickly | Temporary model overload on OpenAI's side |
| Retry-After present | Wait at least that duration | Wait at least that duration |
| Retry-After absent | Exponential backoff | Exponential backoff |
| After the wait | Reduce request ramp, then increase gradually | Resume; no ramp diagnosis — this is provider capacity, not the client's limit |
Keep the retry idempotent and record what happened
Both paths converge on the same operational requirement: the retried request must be safe to repeat, and the attempt itself must be legible after the fact. That means the retry should reuse the same idempotent tool-call discipline used elsewhere in an agent harness — a retried call after slow_down or server_is_overloaded should not double-execute a side effect just because the first response was a failure rather than a timeout.
Record, per attempt: the error code returned, the Retry-After value if one was present, the attempt number, and the outcome. That log is what lets you tell, after the fact, whether a client kept ramping into repeated slow_down responses versus absorbing a run of provider-side server_is_overloaded responses — two very different incidents that a single retry-count metric would blur together.
The tradeoff: slower ramp recovery, less prolonged throttling
Reducing ramp after slow_down and then re-increasing it gradually means a client takes longer to get back to its prior request rate than if it just resumed immediately after the wait. That is the deliberate tradeoff: repeatedly pushing back to peak rate right after a slow_down response is exactly the pattern that produces more slow_down responses, which prolongs the throttled state longer than a slower, monotonic ramp-up would. This is the same operating posture as not treating every OpenAI 429 the same — the documented error code decides the response, not the HTTP status by itself.
None of this is a substitute for capacity or cost controls upstream of the retry layer; it is the boundary-level discipline that keeps those controls from fighting the provider's own signals. That separation of provider signal, retry policy, and logged outcome is the same posture covered in AgentOps.
Sources
FAQ
Does OpenAI's 429 slow_down mean the same thing as a 503 server_is_overloaded?
No. OpenAI documents slow_down (429) as a signal that requests are increasing too quickly on the client side, and server_is_overloaded (503) as a temporary model-capacity condition on the provider side. Retry control should branch on which one was returned, not treat both as one generic failure.
Should an agent always honor Retry-After?
Yes, when it is present: OpenAI's Sep. 2 changelog says both slow_down and server_is_overloaded may include a Retry-After header, and to wait at least that duration. When the header is absent, use exponential backoff instead.
Does a 503 server_is_overloaded response mean the client exceeded its own rate limit?
No. OpenAI documents server_is_overloaded as a temporary provider-capacity condition, not a client rate-limit signal. Diagnosing it as evidence the client exceeded its own limit is a scope error worth guarding against explicitly in retry logic.
Does this retry guidance generalize to any HTTP 429 or 503 response?
No. This is scoped to OpenAI's documented API error codes. Other providers and services define their own 429/503 semantics, and this post does not claim a universal cause or policy for those responses.
Building something that has to hold up?
We do this work for teams — agent reliability hardening, custom MCP servers, and full-stack AI systems built to survive production.