HTTP 529 with "type": "overloaded_error" means the Claude API is temporarily overloaded. Anthropic documents it as high traffic across all users, which makes it categorically different from a 429, where your own account hit a limit. The official SDKs already retry it twice with exponential backoff and honour the retry-after header, so the first useful question is whether your client disabled that. Beyond the SDK default, the pattern that survives a real incident is a capped exponential backoff with full jitter over roughly 60 to 120 seconds, and then a failover to another model or another provider rather than a longer wait. Check status.claude.com before you change any code: August 2026 alone carried overload or degradation incidents on at least nine separate days.
- A 529 is Anthropic capacity, not your quota. Nothing in your billing or key changes it.
- The official SDKs retry it twice by default with exponential backoff and honour
retry-after. Check that yours is not set tomax_retries=0. - A 429 means your account hit a rate limit or an acceleration limit. Different error, different fix.
- Overload mid-stream arrives as an SSE error event on an HTTP 200, so a status-code-only handler will miss it.
- Retry with full jitter. A fleet retrying on the same schedule is the reason the second wave fails too.
- Past roughly two minutes of 529s, fail over. Waiting longer is not a strategy.
- Every response carries a
request-idheader. Keep it: support cannot help without it.
API error: 529, and what the body actually says
The Claude API returns a small, fixed set of error types, and 529 is the one that means the service itself is short of capacity. Anthropic describes it on the errors page in five words: the API is temporarily overloaded.
{
"type": "error",
"error": {
"type": "overloaded_error",
"message": "Overloaded"
},
"request_id": "req_011CcLPBRWGbL1Spc2GsDen6"
}
It helps to see 529 in the context of the whole family, because several of these get confused with each other and only two of them are worth retrying blind.
| Status | Type | Means | Retry? |
|---|---|---|---|
| 400 | invalid_request_error | Your request is malformed | No. Fix the request. |
| 401 | authentication_error | Key is malformed, revoked, or expired | No |
| 402 | billing_error | A billing or payment problem | No |
| 403 | permission_error | Key lacks permission for that resource | No |
| 404 | not_found_error | Resource missing. A retired model ID lands here. | No |
| 409 | conflict_error | Conflicts with current resource state | Sometimes |
| 413 | request_too_large | Over the byte cap (32MB on Messages) | No |
| 429 | rate_limit_error | Your account hit a limit | Yes, after retry-after |
| 500 | api_error | Internal failure at Anthropic | Yes, with backoff |
| 504 | timeout_error | Timed out while processing | Yes, or switch to streaming |
| 529 | overloaded_error | Anthropic is out of headroom | Yes, with backoff |
How 529 differs from 429, in Anthropic's own words
This is the distinction the whole page turns on, and Anthropic states it explicitly in a warning attached to the 529 row:
So the two errors point at opposite halves of the system, and the useful consequence is that they have different fixes and different time horizons.
| 429 rate_limit_error | 529 overloaded_error | |
|---|---|---|
| Whose problem | Yours | Everyone on the platform |
| Caused by | Your RPM, ITPM, or OTPM ceiling, or a sudden ramp hitting acceleration limits | Aggregate demand exceeding available capacity |
| Header to read | retry-after plus the anthropic-ratelimit-* family | retry-after when present, otherwise nothing |
| Fixed by | Slowing down, smoothing your ramp, raising your tier, or batching | Waiting, or going somewhere else |
| Typical duration | Until your window resets, usually under a minute | Minutes to hours, and outside your control |
| Worth escalating? | Yes, if you need a limit increase | Only with a request-id and a pattern |
A quick field test: if every key in your organization fails at the same moment and a completely unrelated project on a different account fails too, that is a 529. If only your busiest worker pool fails while a manual curl succeeds, that is a 429 and you are shaping your own traffic badly.
The retry that actually works
Start by checking that you have not turned off the behaviour you already had. The official SDKs handle this class of error out of the box:
529 falls inside that >=500 bucket, so it is already retried, and retry-after is already honoured. The most common reason a team sees raw 529s reaching application code is that somebody set max_retries=0 to make latency predictable and never revisited it.
from anthropic import Anthropic
# interactive path: fail fast, let the UI offer a retry
fast = Anthropic(max_retries=1, timeout=30.0)
# background path: absorb an incident instead of paging someone
patient = Anthropic(max_retries=6)
When you are writing the loop yourself
Anthropic recommends exponential backoff in the docs. It does not mention jitter anywhere, so treat the jitter part as general distributed-systems practice rather than a vendor instruction. It matters more than the backoff itself: a fleet of workers that all back off on an identical schedule reconverges into a synchronized second wave, which is exactly what the overloaded service does not need.
import random, time
import anthropic
BASE, CAP, MAX_ATTEMPTS = 1.0, 32.0, 6
def call_with_retry(client, **kwargs):
for attempt in range(MAX_ATTEMPTS):
try:
return client.messages.create(**kwargs)
except anthropic.APIStatusError as err:
# 529 and 5xx are capacity. 4xx other than 429 will never succeed.
if err.status_code not in (429, 500, 502, 503, 504, 529):
raise
if attempt == MAX_ATTEMPTS - 1:
raise
# the server's own number wins whenever it gives one
hinted = err.response.headers.get("retry-after")
if hinted:
delay = float(hinted)
else:
delay = random.uniform(0, min(CAP, BASE * (2 ** attempt)))
time.sleep(delay)
| Attempt | Backoff window | Worst-case elapsed |
|---|---|---|
| 1 | immediate | 0s |
| 2 | 0 to 1s | 1s |
| 3 | 0 to 2s | 3s |
| 4 | 0 to 4s | 7s |
| 5 | 0 to 8s | 15s |
| 6 | 0 to 16s | 31s |
| Cap reached | 0 to 32s each | add 32s per further attempt |
Six attempts buys you about half a minute of patience, which covers the ordinary blip. It does not cover an incident, and no retry schedule does. Somewhere around 60 to 120 seconds of continuous 529s, retrying stops being a fix and starts being a way to keep a user staring at a spinner.
The 529 that arrives as an HTTP 200
This one bites agent frameworks in particular, and it is worth knowing before it happens to you. Anthropic is explicit that streaming breaks the normal error contract:
In practice, capacity can run out after the connection is established and the first tokens are already on the wire. What you get is a well-formed 200, a partial response, and then an error event in the stream carrying the same overloaded_error body. Any handler that keys on response.status_code sees success, and any agent loop that treats a truncated turn as a finished turn will happily commit half an answer.
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Sure, I can"}}
event: error
data: {"type":"error","error":{"type":"overloaded_error","message":"Overloaded"}}
- Handle the
errorevent explicitly. The SDK stream helpers raise on it; a hand-rolled SSE reader usually does not. - Treat a stream that ends without
message_stopas a failure, not as a short answer. - Do not retry a partial turn by appending to it. Discard the fragment and resend the original request, or you will end up prefixing the assistant turn with whitespace and collecting a 400 as well.
Check the status page before you change anything
status.anthropic.com redirects to status.claude.com, which reports the API separately from claude.ai, the Console, and Claude Code. That separation matters: the web app can be fine while api.anthropic.com is degraded, and a working browser session tells you nothing about your integration.
It is worth being honest about how often this is real rather than something you did. Checked on 19 August 2026, the incident history for that month alone lists degraded performance or elevated errors on the 5th, 12th, 13th, 14th, 15th, 16th, 17th, 18th, and 19th, several of them naming specific models. Trailing 90-day uptime for the Claude API showed 99.46%. That is a good service, and it is also several hours a quarter where a 529 is the correct and expected response.
Read the status page, filtered to the API
An open incident ends the investigation. Nothing you deploy in the next ten minutes will help, and changes made under pressure are changes you will have to unpick later.
Capture the request-id
curl -sS -D /tmp/h -o /tmp/b https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-5","max_tokens":16,"messages":[{"role":"user","content":"ping"}]}'
grep -i '^request-id' /tmp/h
Every response carries a lowercase request-id header, mirrored as request_id in error bodies. Anthropic asks for it on every support ticket, and without one a report of "we saw some 529s" cannot be investigated.
Measure the rate, not the event
One 529 in a thousand calls is the platform working normally. Ten percent sustained over five minutes is an incident worth routing around. Alert on the ratio over a window, never on a single occurrence, or you will train everyone to ignore the alert.
When retrying stops working: failover
Every retry policy needs an exit. A 529 is the clearest case in the whole error taxonomy for having a second path, because the failure is provider-wide and time-unbounded: no amount of patience on your side changes the queue you are in.
There are three exits, in ascending order of effort.
- A second model on the same provider. Overload is often model-specific. The status incidents in August 2026 repeatedly named individual models rather than the whole API, so a fallback from a flagship to a smaller model frequently succeeds while the first one is still failing. This is the cheapest failover to build and it needs no new credential.
- A second route to the same model. Claude is served on the first-party API, Amazon Bedrock, Google Cloud, and Microsoft Foundry. Capacity pools differ. This costs you a second set of credentials and a small abstraction over request shapes, and it is the only option that preserves exact model behaviour.
- A different provider entirely. The most robust and the most work, because output shape, tool-calling conventions, and prompt sensitivity all shift. Worth it for anything where an outage is expensive; overkill for a nightly batch that can simply run an hour later.
Questions people ask
What does API error 529 mean?
It means the Anthropic API is temporarily overloaded. The error body carries "type": "overloaded_error" and Anthropic documents it as high traffic across all users, so it reflects platform capacity rather than anything about your account, your key, or your quota.
What is the difference between a 429 and a 529 from Anthropic?
A 429 is your account hitting a rate limit or an acceleration limit after a sharp ramp in usage, and it comes with a retry-after header plus anthropic-ratelimit-* headers telling you which ceiling you crossed. A 529 is Anthropic running short of capacity across all users. You can fix a 429 by slowing down or raising your limits; you cannot fix a 529 at all, only wait it out or route around it.
Should I retry a 529 error?
Yes, with capped exponential backoff and jitter. The official Anthropic SDKs already retry it twice by default and honour the retry-after header when present, so first check that your client has not been configured with max_retries=0. Beyond roughly two minutes of continuous 529s, retrying stops helping and you should fail over to another model or provider.
How long does an Anthropic 529 error last?
Anything from a single request to hours, and it is not predictable from your side. A one-off 529 in otherwise healthy traffic is normal background noise. A sustained rate usually corresponds to a posted incident at status.claude.com, and those have ranged from minutes to most of a day.
Is error 529 my fault?
No. Nothing in your billing, your API key, your model choice, or your code causes a 529. The one thing genuinely worth checking is that you are reading the error correctly: a retired model ID returns 404 not_found_error, and your own rate limit returns 429, and both get misreported as overload in bug threads.
Why do I get 529 errors in Claude Code?
Claude Code talks to the same API, so it sees the same capacity errors. It retries transient failures with exponential backoff before surfacing anything, which is why a 529 that reaches your terminal usually means the condition persisted through several attempts. Check status.claude.com rather than reinstalling the CLI.
Sources
Every figure above was read from these pages on August 2026. Vendors reprice without notice; if you find a stale number, tell us.
- Claude API errors reference status table, 529 warning, streaming caveat, request-id
- Claude API rate limits acceleration limits and the anthropic-ratelimit-* headers
- Anthropic Python SDK reference default of 2 retries, retried status codes
- Claude status component split and the August 2026 incident history
- Claude model deprecations retired IDs that return 404 rather than 529