OpenAI API 401/403/404 怎么分?一张表+最小 curl 排查 Key、权限和路径
简答:OpenAI API 返回 401,先查 API Key、Bearer 格式、组织或项目;403,重点看响应体指出的地区、网络或访问控制;404,先核对最终 Base URL、接口路径、模型或资源 ID。先运行最小 curl,再按 error.type、error.code、error.message 分流;不要把不同服务的地址、模型名或权限规则混在一起。
定义:OpenAI API 的 401、403、404 是用于初步定位请求失败位置的 HTTP 状态码,分别常见于认证失败、访问被拒绝和路径或资源不可用,但最终原因必须结合响应体与具体服务文档判断。
先跑最小请求:先判断是 Key、权限还是地址
截至 2026 年 10 月 27 日,最稳妥的排查顺序不是反复改模型或请求体,而是先绕过业务代码、SDK 和插件,验证请求是否发到了预期接口。原生 OpenAI API 的模型列表接口是 https://api.openai.com/v1/models,认证示例使用 Authorization: Bearer。可参考OpenAI Models API Reference。
- Linux、macOS、Git Bash:
curl -i --connect-timeout 10 --max-time 30 "https://api.openai.com/v1/models" -H "Authorization: Bearer $OPENAI_API_KEY" - PowerShell:
curl.exe -i --connect-timeout 10 --max-time 30 "https://api.openai.com/v1/models" -H "Authorization: Bearer $env:OPENAI_API_KEY" - 成功判定:收到 HTTP 2xx,并且响应体可以解析为 JSON;连接建立不等于 API 调用成功。
如果你使用兼容网关,只能把地址替换为该服务公开确认的 Base URL。先确认 Base URL 是否已经包含 /v1,以及 SDK 是否会自动追加版本路径;否则可能出现重复的 /v1/v1 或缺少版本路径。
| 状态码 | 先看什么 | 常见处理方向 |
|---|---|---|
| 401 | API Key、Bearer 格式、组织或项目 | 确认变量已加载、密钥未写错或撤销,并核对请求使用的组织与项目。 |
| 403 | 响应体中的拒绝原因 | 按具体服务文档检查地区、网络访问控制、IP allowlist 或资源访问策略。 |
| 404 | 最终 URL、接口路径、模型或资源 ID | 逐段核对 Base URL、版本路径、模型标识和资源所属项目。 |
401:先确认应用真的发出了正确的 API Key
OpenAI 官方错误代码文档把 401 细分为无效认证、错误 API Key、不是组织成员和 IP 未授权等情况。这里的重点是:不要只在终端检查变量,要确认实际发起请求的应用进程读取到了同一个值。可参考OpenAI API 官方错误代码文档。
- 检查变量是否为空:只输出长度和脱敏片段,例如
python -c "import os; k=os.getenv('OPENAI_API_KEY',''); print(len(k), k[:7], k[-4:] if k else '')"。不要打印完整密钥。 - 检查 Header:格式应为
Authorization: Bearer 你的密钥。如果环境变量本身已经包含Bearer,就不要再次拼接。 - 检查密钥归属:确认使用的是当前项目或组织对应的 Key,而不是旧环境、其他项目或已删除的密钥。
- 检查组织信息:如果错误信息涉及组织成员资格或组织 ID,按当前账户和项目设置核对,不要凭记忆填写 ID。
- 检查 IP allowlist:只有响应或项目配置明确涉及 IP 未授权时,才检查实际出口 IP。容器、云函数和 CI 的出口 IP 可能不同于本机。
如果最小 curl 仍返回 401,先修复密钥或组织配置,不要通过增加重试次数解决。若 curl 成功而业务程序失败,优先检查环境变量注入、进程重启、代理和 SDK 的 Base URL。
403:状态码只是初筛,必须按响应体定位拒绝原因
403 表示服务器理解请求但拒绝授权,但不同服务返回 403 的具体原因并不完全相同。OpenAI 官方错误代码页明确列出不支持的国家、地区或领土这一类原因;Azure OpenAI 官方文档还列出网络访问控制、IP 限制、私有端点和资源状态等排查方向。不要把“403”等同于“API Key 一定错了”。
- 原生 OpenAI API:先读取
error.message和error.code,再按官方文档提示检查地区或项目配置。没有明确提示时,不要自行推断为模型权限问题。 - Azure OpenAI:检查资源的 Networking 设置、IP 防火墙、私有端点 DNS 和网络安全组;这些检查只适用于对应 Azure 场景。
- 兼容网关:以平台公开文档和实际响应体为准。网关可能使用自定义错误结构或不同权限模型。
修复访问控制后,重新执行一次最小请求即可。日志中只保留状态码、错误类型、脱敏后的路径、发生时间和可用的请求 ID;不要公开完整 Authorization Header。
广告|如果你已确认 Key、路径和权限,仍需要统一的 API 接入与错误排查入口,可了解犀速-AI 的开发者服务。
404:按最终 URL、模型和资源三层核对
404 不一定只是接口地址拼错。Agents API 官方文档将 not_found_error 和 model_not_found 分别归为资源或模型对当前请求不可用,但这类说明不能直接外推到所有 API 或兼容服务。遇到 404 时,应以实际响应体和对应 API Reference 为准。可参考OpenAI Agents API 官方错误恢复文档。
- 核对 Base URL:确认没有把控制台地址、文档地址或旧地址当成 API 地址。
- 核对接口路径:确认 SDK 方法对应的路径,避免把模型列表、Responses、聊天或嵌入接口混用。
- 核对版本段:确认
/v1是由 Base URL 提供,还是由 SDK 自动拼接。不要重复添加。 - 核对模型 ID:使用当前账户或服务文档确认的模型标识,不要把展示名称、别名或部署名称直接当成模型 ID。
- 核对资源归属:文件、会话或其他资源可能已删除、属于其他项目,或当前 Key 无法访问。
Azure OpenAI 还要单独检查资源 endpoint、deployment name 和 API version。Azure 官方文档明确把这三项列为 404 常见原因,因此不能直接把原生 OpenAI 的请求地址复制到 Azure。
原生 OpenAI、兼容网关与 Azure OpenAI:哪些配置不能混用
| 场景 | 认证与地址 | 404 优先检查 | 写法边界 |
|---|---|---|---|
| 原生 OpenAI API | 官方 API 地址,通常使用 Authorization: Bearer API_KEY | /v1、接口路径、模型或资源 ID | 以 OpenAI API Reference 和错误文档为准。 |
| OpenAI 兼容网关 | Base URL、认证 Header、模型映射和错误结构由具体服务决定 | 服务文档规定的版本路径、模型名和路由配置 | 未核实的域名、路径、模型、价格和权限规则不要写死。 |
| Azure OpenAI | 使用 Azure 资源 endpoint;可使用 API Key 或 Microsoft Entra ID,配置方式不同于原生 API | endpoint、deployment name、API version | 以对应 Azure 资源和 API 版本文档为准。 |
Azure 的 401、403、404 处理可参考Microsoft Learn:Azure OpenAI 常见 HTTP 错误排查。对于具体兼容网关,如果公开资料无法确认完整配置,应以当前账户页面和官方文档为准。
Python 和 Node.js:用标准库复现最小请求
下面的示例只验证模型列表接口,不写死任何兼容网关地址或模型名。使用其他服务时,请先确认 OPENAI_BASE_URL 的来源、是否含 /v1,以及该服务是否真的提供兼容的模型列表接口。
Python 3:import os, urllib.request, urllib.error
base = os.getenv('OPENAI_BASE_URL', 'https://api.openai.com/v1').rstrip('/')
key = os.environ['OPENAI_API_KEY']
req = urllib.request.Request(base + '/models', headers={'Authorization': 'Bearer ' + key, 'Accept': 'application/json'})
try:
with urllib.request.urlopen(req, timeout=30) as r:
print(r.status, r.read().decode('utf-8'))
except urllib.error.HTTPError as e:
print('HTTP', e.code, e.read().decode('utf-8', errors='replace'))
except urllib.error.URLError as e:
print('NETWORK', e.reason)
Node.js 18+:const base = (process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1').replace(/\/$/, '');
const key = process.env.OPENAI_API_KEY;
if (!key) throw new Error('OPENAI_API_KEY is missing');
const res = await fetch(base + '/models', {headers: {Authorization: `Bearer ${key}`, Accept: 'application/json'}});
const text = await res.text();
console.log(res.status, text);
如果最小示例返回 401、403 或 404,继续检查服务端配置;如果最小示例成功而 SDK 失败,再检查 SDK 的 base_url、自动拼接路径、变量加载时机和代理配置。
错误处理与安全记录清单
- 只在服务端或密钥管理服务中读取 API Key,不要放进浏览器代码、移动端包或公开仓库。
- 日志记录状态码、
error.type、error.code、error.message、最终请求路径和发生时间;Key 只保留脱敏片段。 - 认证、权限、路径和资源错误不要盲目重试。只有确认是临时网络、服务端错误、超时或限速时,才根据响应头和服务文档采用有限次数退避。
- 提交支持请求时,可提供模型、错误代码、脱敏后的请求信息、时间和时区,以及响应中的请求 ID;不要提交完整密钥或完整 Authorization Header。
本文是第三方排障整理,不代表任何特定 API 网关的官方文档。具体域名、模型、权限、价格和可用功能如果无法从公开资料核实,应以当前账户页面和对应官方文档为准。
常见问题
OpenAI API 返回 401 Unauthorized,最先检查什么?
先确认实际发起请求的进程读取到了正确的 <code>OPENAI_API_KEY</code>,再检查请求头是否为 <code>Authorization: Bearer 你的密钥</code>。随后核对密钥是否写错、已删除、属于其他项目或组织;如果响应明确涉及 IP 未授权,再检查应用实际出口 IP。
OpenAI API 返回 403,是不是 API Key 一定错了?
不一定。403 只能说明请求被拒绝,具体原因要看 <code>error.message</code>、<code>error.code</code> 和服务文档。原生 API、Azure OpenAI 和兼容网关的 403 规则可能不同,不要只通过更换 Key 处理。
OpenAI API 返回 404,怎么区分 URL 错误和模型不存在?
先用最小模型列表请求检查 Base URL、认证和路径。如果模型列表成功而业务请求 404,重点核对业务接口路径、模型 ID、资源 ID和项目归属;Azure OpenAI 还要检查 endpoint、deployment name 和 API version。
兼容网关出现 401、403、404,可以直接套用原生 OpenAI 地址吗?
不能直接套用。兼容网关的 Base URL、是否包含 <code>/v1</code>、认证 Header、模型映射和错误格式都可能不同。只使用已公开确认的配置,无法核实时不要猜测域名、路径、模型名或价格。
排查 API 错误时应该记录哪些信息?
记录发生时间、时区、HTTP 状态码、<code>error.type</code>、<code>error.code</code>、<code>error.message</code>、最终请求路径、模型或资源 ID,以及响应中提供的请求 ID。API Key 只保留脱敏片段,不要公开完整 Authorization Header。
相关阅读
- 继续检查 Codex 的 API Key 与 Base URL 配置
- 了解 API 路由网关的配置差异与迁移核验重点
- 理解 API Router、兼容接口与模型路由的基本概念
- 查看更多 AI API 接入与错误排查文章