教程
API 密钥数据无效:此错误的原因及修复方法
在调用 hiapi 时看到类似 "the api keys data are invalid"(或你的应用给出的类似变体)的消息,意味着请求根本没有通过身份验证。在底层,hiapi 自身的 API 会为此返回一个特定的错误:HTTP 401,error.code: "permission_denied",消息为 "This API key is invalid. Check that it is correct or use another API key and try again."(此 API 密钥无效。请检查其是否正确,或使用另一个 API 密钥后重试。)任何封装 hiapi 的应用——后端代理、兼容 OpenAI 的客户端、内部 SDK——都会用自己的措辞重新标记同一个 401,这就是为什么你看到的确切文本很少与 hiapi 的原文一致。本指南将逐步说明它为何发生,以及如何在几分钟内确认并修复它。
错误实际长什么样
对 POST https://api.hiapi.ai/v1/tasks(或任何其他 hiapi 端点)的失败请求会返回:
{
"error": {
"code": "permission_denied",
"message": "This API key is invalid. Check that it is correct or use another API key and try again. If the issue persists, contact support with request ID: <id>",
"request_id": "<id>",
"type": "hiapi_error"
}
}
HTTP 状态码为 401。如果你的框架或 SDK 没有暴露原始响应,它可能会将此重新打包成通用的“API key(s) data are invalid”“unauthorized”或“invalid credentials”消息——但 hiapi 侧的根本原因始终是同一个 401。
常见原因(按可能性从高到低排列)
- 密钥值有误。复制粘贴被截断、多了一个空格,或从旧笔记而不是 Dashboard → API Keys 中的实时密钥复制而来,都会触发这个确切的错误——无论密钥是乱码、为空还是根本不存在,hiapi 返回的消息完全相同。
- 占位密钥从未被替换。从教程或模板复制的代码常常带有类似
sk-your-api-key的字面字符串——它产生的 401 和一个随机字符串完全一样。 - 密钥已被轮换或撤销。在仪表板中创建新密钥不会自动使旧密钥失效,但手动撤销或重新生成会——如果某个部署仍引用旧值(未重新部署的环境变量、未重新加载的
.env),每个请求都会 401。 - 密钥发送到了错误的请求头。hiapi 只从
Authorization请求头读取密钥。将其作为x-api-key、api-key或查询参数发送会产生相同的permission_denied响应,因为在这种情况下 hiapi 看不到格式错误的密钥——它只是根本看不到密钥。 - 运行时环境变量为空。如果你的进程在加载
.env文件之前读取密钥变量,就会把空字符串作为密钥发送——同样是 401。 - 密钥中混入了隐藏空白或换行符。这很隐蔽:在 shell 脚本中通过
echo管道传递机密会向值末尾追加一个换行符。如果它进入Authorization请求头,会以另一种方式破坏请求——不是干净的 401,而是带有乱码invalid json body消息的400,因为损坏的请求头会渗入请求体。如果你的错误看起来像格式错误的请求而不是干净的“invalid key”,请先检查密钥中是否有游离的空白或换行。
按顺序修复
- 打开 Dashboard → API Keys 并重新复制密钥。不要复用旧终端历史或消息中的值——直接从页面复制。
- 确认请求头格式完全匹配:
Authorization: Bearer YOUR_API_KEY。如果你在 shell 脚本中组装此值,请使用printf而不是echo——echo会追加一个printf不会追加的末尾换行符。 - 在请求发出前打印该值(
console.log、print或调试日志),确认它非空且没有游离的引号、空格或换行符。 - 用一次普通的
curl调用(见下文)将密钥与你的应用隔离测试。如果 curl 成功而你的应用仍然失败,那么 bug 在于你的应用如何构建请求,而不是密钥本身。 - 检查你实际收到的确切 HTTP 状态码。
401才是这个错误。402意味着账户余额为空,而不是密钥错误。403意味着密钥有效但缺少该特定模型的权限。429意味着你正受到速率限制。这三种都不应被视为密钥无效问题。
最小验证示例
直接运行以下命令(替换成你的真实密钥),以确认密钥本身是否有问题:
curl -X POST https://api.hiapi.ai/v1/tasks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "gpt-image-2", "input": {"prompt": "a small red apple on a white background"}}'
可用的密钥会立即返回任务 ID:
{"code": 200, "data": {"taskId": "tk-hiapi-..."}, "message": "success"}
错误的密钥则返回上面所示的 401。如果 curl 返回了 taskId 响应但你的应用仍抛出“invalid key”错误,那么问题在于你应用的请求构建代码,而不是密钥。
相关内容
- Authentication docs —— 完整的请求头格式、密钥轮换指南以及状态码参考。
- Dashboard → API Keys —— 创建、复制和撤销密钥的位置。
- Rate limits —— 429 与 401 的区别以及触发条件。
- Quickstart —— 如果你是首次设置 hiapi,这里有完整的首次请求演练。
常见问题
“invalid API key”和被速率限制是一回事吗?
不是。401 permission_denied 意味着密钥本身未被接受。带有 error_code: "RATE_LIMITED" 的 429 意味着密钥没问题,但请求到达得太快——阈值请参阅速率限制文档。
我刚创建了一个新密钥,但它仍然无效——为什么? 确保新密钥确实被复制到了发起请求的地方。仪表板中的新密钥不会自动修复硬编码的旧值、未设置的环境变量或未重新部署的配置文件。
hiapi 是否要求请求头中包含字面词“Bearer”?
文档中记录并支持的格式是 Authorization: Bearer YOUR_API_KEY——请始终使用它。不要依赖你在测试中可能观察到的任何宽容行为;未记录在文档中的行为可能在不通知的情况下改变。
为什么 curl 能用而我的应用不能?
如果使用相同密钥的 curl 成功,则密钥有效,问题在于你的应用如何组装请求——通常是代码中缺少 Bearer 前缀、在 .env 加载之前读取了环境变量,或在包装库中将密钥传给了错误的参数。
error.type: "hiapi_error" 是什么意思?
这是 hiapi 的通用错误信封,既用于此身份验证失败,也用于其他请求错误。请检查 error.code(此处为 permission_denied)来了解实际错误,而不仅仅是信封类型。