分清 403 和 401,三步定位到底是哪把 Key 没有权限
选一个模型,输入你的提示词,直接查看生成结果。
HiAPI Blog
HiAPI
现在就用 HiAPI 生成
调用 HiAPI 的 /v1/tasks 接口时,如果收到 HTTP 403,响应体通常是这样的结构:{"error": {"code": "permission_denied", "message": "...", "request_id": "...", "type": "hiapi_error"}}。这说明你的 API Key 本身有效、认证已经通过,但这把 Key 没有被授权调用你请求的这个模型或接口——这和「Key 无效或缺失」的 401 是两类不同的问题:401 是身份都没认出来,403 是认出来了但这把 Key 不让用当前资源。多数 403 的修复都很直接:核对 Key 和模型的匹配关系,换一把有权限的 Key 重试即可。
permission_denied 这个错误码在 401 和 403 下都可能出现,区分点是状态码而不是文案。permission_denied,可以用这一点辅助区分问题类型。request_id 联系支持,不要在没有确认原因的情况下反复重试同一请求。下面用一次会触发 403 的请求和修复后的重试,展示两种状态下的真实返回结构(MODEL_ID 替换成你实际调用、怀疑无权限的模型):
curl https://api.hiapi.ai/v1/tasks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MODEL_ID",
"prompt": "a simple test prompt"
}'
无权限时的响应:
{
"error": {
"code": "permission_denied",
"message": "当前 API Key 暂不能使用该模型,请检查权限或更换 Key。",
"request_id": "req_xxxxxxxx",
"type": "hiapi_error"
}
}
换一把有权限的 Key、其余参数不变后重试:
{
"code": 200,
"data": { "taskId": "tk-hiapi-xxxxxxxx" },
"message": "success"
}
可以注意到两种返回体的结构不一样:403 这类认证/权限层面的错误统一用 error 包一层对象;而 Key 通过权限校验、真正进入具体业务规则判断之后产生的错误(比如余额不足的 402),返回体是 code / data / message 这种平铺结构。看到哪种结构,大致就能判断问题出在认证权限层还是具体业务规则层。
403 和 401 具体有什么区别?
401 表示这把 Key 本身无效,或者请求里根本没带 Key——身份认证这一步都没通过。403 表示身份认证通过了(Key 本身有效),但这把 Key 没有被授权使用你请求的这个模型或资源。两者的返回体结构相同(都是 error.code 包一层对象),区分关键是 HTTP 状态码本身,不是错误信息里的文字。
换一把 Key 后还是 403,是账号出问题了吗?
先确认新 Key 确实属于同一个有权限的账号或项目,复制粘贴时没有多余空格、换行或截断。核对无误后仍然复现,带上响应体里的 request_id 联系支持。
403 是不是因为余额不足?
不是。余额不足对应的是另一个错误码(INSUFFICIENT_QUOTA,HTTP 402),和权限是两回事——403 只说明「这把 Key 有没有资格调用这个模型」,和账户余额多少无关。
错误信息里出现「权限」两个字,是不是就一定是 403?
不一定。permission_denied 这个错误码在 401 和 403 下都可能出现,不能只靠文字关键词判断,必须直接看 HTTP 状态码本身。