五家 LLM API 报错码对照:400 到 529
OpenAI、Anthropic、Google、DeepSeek、OpenRouter 各自的状态码含义,哪些能安全重试,以及余额耗尽为什么在三家是 402、在一家是 429。
摘要:状态码告诉你的比你以为的少。余额耗尽在 Anthropic、DeepSeek、OpenRouter 是 402,在 OpenAI 是 429。服务端过载几乎处处是 503,在 Anthropic 是 529,一个非标准 HTTP 码,会从大多数错误处理里漏过去。这一页是跨服务商对照:五家各自文档化的每一个码、哪些能安全重试,以及我们复现并修好过的具体故障。
Last updated 2026-08-31。下面每一个码都是当天从对应服务商自己的错误文档里读的。
每家分别文档化了哪些状态码?
空格表示该服务商没有把这个码写进文档,不代表它永远不会返回。
| 码 | OpenAI | Anthropic | Google Gemini | DeepSeek | OpenRouter |
|---|---|---|---|---|---|
| 400 | invalid service_tier | invalid_request_error | invalid_request、failed_precondition、parameter_unknown | Invalid Format | Bad Request、参数缺失或非法、CORS |
| 401 | 鉴权无效、key 不对、无组织、IP 不在白名单 | authentication_error | authentication | Authentication Fails | 凭证无效、OAuth 会话过期 |
| 402 | billing_error | Insufficient Balance | 额度不足 | ||
| 403 | 所在国家或地区不支持 | permission_error | permission_denied | 权限、护栏拦截、内容审核 | |
| 404 | not_found_error | not_found、model_not_found | |||
| 408 | 请求超时 | ||||
| 409 | conflict_error | already_exists、aborted | |||
| 413 | request_too_large | ||||
| 416 | out_of_range | ||||
| 422 | Invalid Parameters | ||||
| 429 | 5 种不同成因,见下 | rate_limit_error | rate_limit_exceeded、quota_exceeded、too_many_requests | Rate Limit Reached | 被限速 |
| 499 | cancelled | ||||
| 500 | 服务端错误 | api_error | api_error | Server Error | |
| 501 | unimplemented | ||||
| 502 | 所选模型宕机或返回了非法响应 | ||||
| 503 | 引擎过载、Slow Down | service_unavailable | Server Overloaded | 没有满足路由要求的可用 provider | |
| 504 | timeout_error | deadline_exceeded | |||
| 529 | overloaded_error |
这张表里有四行是线上事故真正的来源。
为什么 429 代表五件不同的事?
429 是全行业含义最重载的一个码。 在 OpenAI 它覆盖五种彼此独立、修法也不同的情况:请求数超限、余额耗尽、组织花费上限、项目花费上限、组织用量上限。只有第一种是限速,另外四种是钱的问题,退避重试清不掉。
Google 至少把这些含义在同一个状态码下拆成了不同的 code:rate_limit_exceeded 对应每分钟限制,quota_exceeded 对应每日配额,too_many_requests 对应突发。
Anthropic 给的判据最锋利。它的文档写明,用量档花费上限触发的 429 不带 retry-after 头,并且会一直失败到访问恢复为止。于是这个头在不在本身就是诊断依据:有头就等,没头就去处理账号。另外,当你自己设的花费上限被撞到时,Anthropic 返回的是 400 而不是 429,唯一的例外是 Claude Code 工作区,那里可能返回 429。
判断流程我们单独写过一篇:429 Too Many Requests:什么意思、什么时候该重试。Claude Code 里限速 429 和额度 429 在界面上长得一模一样,Claude Code 里的 Rate Limit Reached 把两者拆开了。如果你要的是各家的限额本身而不是报错,五家五套规则 是横向对比;OpenRouter 上 Kimi K3 的 429 是聚合器场景,那里切换比等待更快。
为什么 529 会击穿错误处理?
529 不是注册在案的 HTTP 状态码。Anthropic 自己的参考只给了它一行:
529 -
overloaded_error: The API is temporarily overloaded.
其他每一家都用 503 表达同一种情况。而 Anthropic 的错误参考里根本没有 503。
这件事之所以要紧,是因为大量重试代码写成 if 500 <= status <= 504。这个区间不包含 529,于是 Anthropic 的过载错误逃出重试路径,直接以硬失败的形式呈现给用户。Anthropic 自己的 SDK 默认对瞬时失败重试两次并在有头时遵守 retry-after,所以这个 bug 主要出现在手写的 HTTP 客户端里。
Anthropic 文档里还有一句值得读两遍:如果是你自己的组织流量陡增,你看到的可能是 429 而不是 529,因为有加速限制。同样的症状,相反的成因,不同的修法。
完整复现和八种修法在 Claude API 529 overloaded_error,那是我们流量最大的一篇排错文。想要架构层的答案而不是重试层的,Claude Code fallbackModel 搭的是三层切换;Opus 宕机与 529 讲的是某个模型长期过载时怎么迁移。
为什么同一个模型名在一家返回 404、在另一家返回 400?
一个解析不了的模型名,在 Google 是 404 not_found(它还有专门的 model_not_found),在 OpenAI 是 404,在一些会先校验 model 字段再路由的网关那里是 400。用户看到的报文通常是「模型不存在或你没有访问权限」的某种变体,而「访问权限」才是关键的那一半:在 OpenAI 上,一个真实存在但没给你的组织开通的模型,返回的是同一句话。
两种情况都在 OpenAI 404 模型不存在 里。新模型那一类(模型确实发布了,但你的账号还看不到)在 GPT-5.6 model not available。
为什么 402 在三家存在、在 OpenAI 不存在?
Anthropic、DeepSeek 和 OpenRouter 在账户没钱时都返回 402。OpenAI 把同一件事归到了 429。
实际后果是:一个「4xx 当致命、429 当可重试」的朴素处理器,在 Anthropic 上行为正确,在 OpenAI 上行为错误:它会对着一个空余额一直退避重试。按报文正文分支,不要按码分支。
DeepSeek 的 402 Insufficient Balance 从 2026 年 8 月改成峰谷计费后还多了一层:同样的负载在不同时段消耗余额的速度不一样。DeepSeek API 涨价 里有窗口和倍率。
哪些码该重试?
| 可以重试 | 不要重试 |
|---|---|
| 408 超时 | 400 请求格式错误 |
| 409 冲突或被中止 | 401 鉴权 |
| 带 Retry-After 头的 429 | 402 计费 |
| 500、502、503、504 | 403 权限、地区、内容审核 |
| 529 Anthropic 过载 | 404 模型或资源不存在 |
| 413 请求体过大 | |
| 422 参数非法 | |
| 不带 Retry-After 头的 429 |
这张表之外还有三条实操笔记。
Retry-After 不是普遍存在的。 OpenRouter 在 429 和 503 上都文档化了它。Anthropic 的 SDK 在头存在时遵守它,对瞬时失败「twice by default, honoring the retry-after header when present」。OpenAI 对限速 429 的建议是控制发送节奏并遵守 Retry-After 头。没有任何一家保证这个头一定存在,所以你的退避逻辑需要一个默认值。
Google 在它的排错页里把 408 列为值得重试的瞬时错误,但它的错误码参考里没有 408 这一行,所以上面那张表的对应格是空的。
413 是体积问题,不是上下文问题。 Anthropic 公布了硬性的请求体积上限:Messages 和 Token Counting 是 32 MB,Batch API 是 256 MB,Files API 是 500 MB。在直连 API 上这些是由 Cloudflare 在请求到达 Anthropic 之前拦掉的,所以报文可能根本不像一个 Anthropic 的错误。
哪些失败根本到不了状态码这一层?
有些失败返回 200,然后照样坏掉。
流中途的错误。 走 server-sent events 时,错误可能在 API 已经返回 200 之后才到。Anthropic 明确写了这一点:标准错误处理在这里不适用,你必须在流内部处理 error 事件。
TLS 失败。 这类根本到不了 API。Claude Code SSL 证书错误 讲的是企业 CA 拦截,它看起来像宕机,其实不是。
导入和 SDK 错误。 SDK 改名会以 Python traceback 的形式出现,而不是一个 HTTP 码。2026 年 6 月改名后的 claude-code-sdk 导入错误 里有完整对照。
生图的超时。 长耗时的图像调用和聊天调用失败方式不同。GPT-Image-2 变慢与 504 里有五个根因。
接下来该看什么?
如果你走的是聚合器,还有一层值得知道:OpenRouter 会给 provider 的错误打上一个规范化的 error_type 字符串,并建议你优先用它而不是状态码,因为它「stable across all three API skins even when the native protocol code is lossy」。这正是整页在讲的那件事,只不过被网关自己写进了文档。
想要代码模式而不是码的含义,AI API 错误处理 里有带抖动的指数退避、多模型兜底和可直接粘贴的熔断器。想看某个具体工具而不是某家服务商的报错面,Codex 报错索引 把 15 个症状对到了修复方法。
参考信息来源
常见问题
- 529 和 503 是一回事吗?
- 功能上是,但只有 Anthropic 会返回 529。它是一个非标准状态码,含义是
overloaded_error,而 Anthropic 的文档里根本没有 503 这一行。OpenAI、Google、DeepSeek 和 OpenRouter 都用 503 表达同一种情况。如果你的错误处理只捕获 500 到 504,Anthropic 的过载错误会直接漏过去。 - 为什么余额空了 OpenAI 返回的是 429?
- 因为 OpenAI 把账单耗尽归到了限速下面。它的错误参考里,credit balance exhausted、organization spend limit reached、project spend limit reached、organization usage limit reached 全部是 429。Anthropic、DeepSeek 和 OpenRouter 对同一件事返回 402。对一个计费类 429 做退避重试永远不会成功,所以必须读报文正文,而不是只看状态码分支。
- 哪些报错码可以自动重试?
- 408、409 冲突、带 Retry-After 头的 429,以及 5xx 一族,包括 502、503、504 和 Anthropic 的 529。不要重试 400、401、402、403、404、413、422,这些需要改请求、改 key 或者处理账号。最危险的是中间那种:不带 Retry-After 头的 429,在 Anthropic 那里代表花费上限而不是限速,会一直失败到窗口重置为止。
- Anthropic 的 402 billing_error 是什么意思?
- 是你的账单或支付信息有问题,跟限速和 key 都没关系。Anthropic 把 402 文档化为
billing_error,并指向 Console 里的支付信息,如果你走的是 AWS 上的 Claude Platform 就指向 AWS Marketplace。它和「你自己设了花费上限时 Anthropic 返回的 400」是两回事。 - 是不是所有服务商都会发 Retry-After 头?
- 不是,而且例外很关键。OpenRouter 在 429 和 503 上都文档化了 Retry-After。Anthropic 的 SDK 在头存在时会遵守,默认重试两次。但用量档的花费上限 429 根本不带 Retry-After。头缺席本身就是信号:说明这不是一个靠等待能过去的状况。


