API 报错排查大全:401 无效的令牌、额度不足、无可用渠道、404、429、524 怎么解决(附原文)
本页目录
怎么用这一页:先找到报错里的 HTTP 状态码(401、403、404、429……)和报错原文,在下面的速查表里对一下,再跳到对应小节看解决办法。
本页的报错原文来自 api.foo 的线上接口和我们在各工具里的实测(2026 年 10 月 15 日)。其他平台的文字会不一样,但状态码的含义和排查思路是通用的。
速查表
| 状态码 | 报错原文(节选) | 一句话原因 | 看哪一节 |
|---|---|---|---|
| 401 | 无效的令牌 |
密钥不对、没发出去、被禁用、过期或这把密钥的额度用完 | 401 |
| 403 | 您的 IP 不在令牌允许访问的列表中 |
密钥设了 IP 白名单 | 403 |
| 403 | 该令牌无权访问模型 xxx |
密钥限制了可用模型 | 403 |
| 403 | 用户额度不足, 剩余额度: ¥… |
账户余额不够 | 403 |
| 403 | 预扣费额度失败 |
这次请求预估费用超过余额 | 403 |
| 400 / 503 | 分组 xxx 下模型 xxx 无可用渠道 |
模型名不对,或这个分组没有这个模型 | 模型类 |
| — | 模型 xxx 的价格尚未由管理员配置 |
平台还没上架这个模型 | 模型类 |
| 404 | Invalid URL (POST /v1/…) |
请求路径写错了 | 404 |
| 429 | 您已达到请求数限制 / 负载已饱和 |
请求太频繁,或上游繁忙 | 429 |
| 524 | Cloudflare 超时页 | 单个请求超过 100 秒没回应 | 5xx |
先检查三件事
90% 的报错出在这三处,先逐项核对能省很多时间:
-
地址:用的是哪个工具,就按它要求的格式填。
工具 地址填法(以 api.foo 为例) Claude Code、Claude 原生 SDK https://api.foo(不带 /v1)Codex、OpenAI 兼容的软件和 SDK https://api.foo/v1Gemini CLI https://api.foo(不带 /v1beta) -
密钥:完整复制,前后没有空格、换行;是这个平台发的密钥,不是别家的。
-
模型名:和平台模型列表里的写法一字不差,包括大小写、连字符和日期后缀。
401 无效的令牌
{"error":{"code":"","message":"无效的令牌 (request id: …)","type":"new_api_error"}}
请求到了服务商,但服务商不认这把密钥。在 api.foo 上,下面这些情况返回的都是这一句:
- 密钥复制错了、少了字符、多了空格或换行;
- 根本没发出去:环境变量没设成功、配置文件写错了位置、请求头名字写错;
- 密钥已经被你删除或禁用;
- 密钥设置了过期时间,已经过期;
- 这把密钥自己设了额度上限,已经用完(和账户余额是两回事)。
排查办法:
-
登录控制台,打开 API 密钥,看这把密钥的状态和剩余额度。过期或用完的,延长时间、调高额度,或者新建一把。
-
用命令行单独测一下密钥(把
sk-你的密钥换掉):curl https://api.foo/v1/models -H "Authorization: Bearer sk-你的密钥"返回模型列表说明密钥本身没问题,问题出在你的工具配置上;仍然报「无效的令牌」就是密钥的问题。
-
用的是环境变量的,新开一个终端运行
echo $变量名,确认真的设上了。
请求头带 Accept-Language: en 时,同样的报错会显示成英文 Invalid token。
403 权限和余额
| 报错原文 | 原因 | 解决 |
|---|---|---|
您的 IP 不在令牌允许访问的列表中 |
这把密钥设了 IP 白名单,你当前的出口 IP 不在里面 | 在控制台编辑密钥,加上当前 IP 或清空白名单。用代理、换网络后 IP 会变 |
该令牌无权访问模型 xxx |
这把密钥开启了「模型限制」,没勾选这个模型 | 编辑密钥,勾选要用的模型,或关闭模型限制 |
无权访问 xxx 分组 |
密钥指定的分组,你的账户不能用 | 编辑密钥改成你能用的分组 |
用户额度不足, 剩余额度: ¥0.000000 |
账户余额用完了 | 充值后重试 |
预扣费额度失败, 用户剩余额度: ¥…, 需要预扣费额度: ¥… |
余额还有一点,但这次请求预估要扣的更多。常见于上下文很长、max_tokens 设得很大 |
充值,或者调小 max_tokens、清理过长的对话 |
用户已被封禁 |
账户被停用 | 联系客服 |
模型名不对、无可用渠道
分组 default 下模型 xxx 无可用渠道(distributor)
意思是:在你这个分组里,没有能提供这个模型的通道。按顺序查:
- 模型名拼对了吗?到平台的模型列表(api.foo 是「模型广场」)复制完整名字,别凭记忆手打。
- 这把密钥用的是哪个分组?有的模型只在特定分组里有。
- 平台某个模型暂时下线时也会这样,过一会儿再试或换一个模型。
模型 xxx 的价格尚未由管理员配置,暂时无法使用,请联系站点管理员开启该模型
这是平台还没给这个模型定价、上架,换一个已上架的模型,或联系客服。
未指定模型名称,模型名称不能为空
请求里没带 model 字段,检查工具或代码里的模型设置。
404 Invalid URL
{"error":{"message":"Invalid URL (POST /v1/chat/completion)","type":"invalid_request_error","param":"","code":""}}
报错里括号中的就是你实际请求的路径,对照正确写法改:
| 你请求的路径 | 问题 | 正确的 |
|---|---|---|
/v1/chat/completion |
少了个 s | /v1/chat/completions |
/api/v1/chat/completions |
多了一层 /api |
/v1/chat/completions |
/v1/v1/messages |
地址填成了 …/v1,工具又自己加了一次 |
Claude Code 的地址不带 /v1 |
api.foo 对常见的写法做了兼容:带密钥的请求少写了 /v1 会自动补上,Claude Code 地址多写了 /v1 也会自动去掉一层。但换到别家平台不一定有这个兼容,按标准写法填最稳。
429 请求太多
| 报错原文 | 原因 | 解决 |
|---|---|---|
您已达到请求数限制:x分钟内最多请求y次 |
平台对单个用户限了速 | 降低并发、加重试间隔 |
当前分组上游负载已饱和,请稍后再试 |
平台的上游渠道正忙 | 稍后重试,或换一个分组/模型 |
| 上游原样返回的 429 | 上游服务商限流 | 稍后重试;长期出现就联系平台 |
写程序调用时,遇到 429 应该等一会儿再重试,并且每次等得更久一点(指数退避),不要立刻狂刷。官方的 OpenAI、Anthropic SDK 默认就会自动重试几次。
5xx 和 524:上游或网络问题
- 500 / 502 / 503:平台或上游临时出问题。等几十秒重试;持续出现就把报错里的 request id 发给客服。
- 529 overloaded(Claude 特有):Anthropic 那边过载,稍后重试。
- 524:这是 Cloudflare 返回的超时。请求经过 Cloudflare 时,超过 100 秒还没收到回应就会被断开。常见于非流式的长回答、批量脚本和生成图片。两个办法:
- 改用流式输出(
stream: true)。Claude Code、Codex 这类工具默认就是流式,一般不会碰到。 - 把地址换成不经过 CDN 的直连线路。api.foo 的直连线路是
https://dc.api.foo,只提供 API 接口,没有 100 秒限制。
- 改用流式输出(
各个工具里的报错长什么样
同一个「密钥不对」,在不同工具里显示得不一样。下面是我们用同一把错误密钥连 api.foo 时看到的原文,搜报错时可以对照:
| 工具 | 显示 |
|---|---|
| Claude Code 2.1.251 | Failed to authenticate. API Error: 401 无效的令牌 (request id: …) |
| Codex 0.162.1 | ERROR: unexpected status 401 Unauthorized: 无效的令牌 (request id: …), url: https://api.foo/v1/responses |
| Gemini CLI 0.64.0 | _ApiError: {"error":{"code":"","message":"无效的令牌 (request id: …)","type":"new_api_error"}} |
| OpenCode 2.0.29 | Error: 无效的令牌 (request id: …) |
| Python openai 库 | AuthenticationError Error code: 401 - {'error': {… '无效的令牌 …'}} |
工具自己的报错(安装、配置文件格式等)见各工具的教程:
- Claude Code 报错:command not found、安装脚本报错、npm 权限
- Codex 报错:wire_api、profile、TOML 格式
- Gemini CLI 报错:Invalid auth method selected、地区限制
- OpenCode 报错:V1、V2 混用
- CC Switch 常见问题:切换不生效、环境变量冲突
还是解决不了
把下面三样发给客服,问题能最快定位:
- 报错原文,一定要包含括号里的 request id;
- 你用的工具和版本,或者代码片段(删掉密钥);
- 你填的地址和模型名。
api.foo 的联系方式见关于页。
相关阅读
常见问题
无效的令牌是什么意思?
服务商不认你发过去的 API 密钥。常见原因有:密钥复制错了或多了空格、根本没把密钥发出去、密钥已被删除或禁用、已过期、这把密钥自己的额度用完了。在 api.foo 上这几种情况返回的都是同一句「无效的令牌」,要到控制台「API 密钥」页看这把密钥的状态。
报错 model not found 或无可用渠道是什么意思?
意思是你请求的模型名在服务商那里不存在,或者你的分组下没有能提供这个模型的渠道。先核对模型名是否和服务商模型列表里的写法完全一致,再确认这把密钥所在的分组能用这个模型。
用户额度不足怎么办?
账户余额不够了。充值后重试即可;报错里会显示当前剩余额度。如果余额明明够,报的是「预扣费额度失败」,说明这次请求预估要扣的钱比余额多,常见于很长的上下文或很大的 max_tokens。
404 Invalid URL 怎么解决?
请求地址的路径写错了,比如少了字母、多了一层 /api,或者 /v1 该加没加、不该加加了。对照工具要求的地址格式改:Claude Code 和 Gemini CLI 只填域名,Codex 和 OpenAI 兼容的软件一般要带 /v1。
请求跑到一半报 524 是什么原因?
524 是 Cloudflare 的超时错误:一个请求超过 100 秒还没收到回应就会被断开,常见于非流式输出的长回答。改用流式输出,或者把地址换成不经过 CDN 的直连线路(api.foo 是 https://dc.api.foo)。
报错里的 request id 有什么用?
它是这一次请求的编号。联系客服时把它连同报错原文一起发过去,客服可以直接查到这次请求在哪一步出了问题。
发现内容有误?发邮件到 [email protected] 告诉我们。