认证与密钥
请求头格式、四类密钥的用途与限制、调用范围、限额与有效期、撤销、删除和轮换。
TokenToSea API 用 API Key 认证。本页说明如何在请求中携带密钥、各类密钥能调用什么、如何限制一把密钥的范围与花费,以及安全地轮换和删除密钥。
在请求中携带密钥#
HTTP 请求任选一种请求头:
| 请求头 | 示例 | 说明 |
|---|---|---|
Authorization | Authorization: Bearer sk-relay_… | 推荐。OpenAI SDK 使用这种方式。 |
x-api-key | x-api-key: sk-relay_… | 仅在没有 Authorization: Bearer 时读取。Anthropic SDK 使用这种方式。 |
- 密钥必须是 16–2048 个可打印 ASCII 字符,否则返回
401 invalid_api_key。 - 实时音频 WebSocket 只接受
Authorization: Bearer,见实时音频。 - 推理接口不接受查询参数,不要把密钥放在 URL 中。
密钥类型#
所有密钥都在控制台 → 我的 Key 管理。
| 类型 | 格式 | 可调用 | 说明 |
|---|---|---|---|
| 全能密钥 | sk-relay_ + 64 位十六进制 | api.tokentosea.com/v1/* 全部模型接口,以及工具 API | 模型与工具共用同一把密钥、同一个余额和同一组限额。 |
| 模型密钥 | sk-relay_ + 64 位十六进制 | api.tokentosea.com/v1/* | 不能调用工具 API;用工具 API 时返回 403 tool_access_not_allowed。 |
| 工具密钥 | tts_tool_ + 64 位十六进制 | 仅工具 API | 不能调用模型接口。每个账号最多 20 把未撤销的工具密钥。 |
| 订单专用密钥 | sk-relay_ + 64 位十六进制 | 交易市场中绑定的已购额度 | 只在你有交易市场订单时出现。调用 api.tokentosea.com 返回 403。 |
第三方应用通过 TokenToSea 登录 获得的 OAuth 访问令牌只能调用 /api/v1/connect/* 委托接口,不能调用 api.tokentosea.com。
密钥何时有效#
每次请求都会实时检查以下条件,任一不满足即拒绝:
- 密钥未撤销、未删除、未过期;
- 密钥创建者的账号处于正常状态,并已完成手机号验证;
- 密钥是在「买家」身份下创建的全能密钥或模型密钥(调用模型时)。
每个工作区最多保留 50 把未撤销的全能密钥与模型密钥。
创建密钥#
- 打开我的 Key,选择 新建密钥。
- 密钥类型:全能密钥、模型密钥或工具密钥。
- 调用范围(全能密钥与模型密钥):全部模型、指定服务商或指定模型,见下文。
- 限额与有效期:限额周期、token 上限、金额上限和到期时间,均可留空。
- 保存显示的完整密钥。密钥在你的浏览器中用安全随机数生成,平台只接收并保存它的 SHA-256 摘要,之后无法再查看明文。可以下载为文本文件,或复制控制台提供的 cURL 示例直接测试。
调用范围#
全能密钥和模型密钥可以限制能调用的型号:
| 范围 | 含义 |
|---|---|
| 全部模型 | 可调用目录中全部已上线型号,包括以后新上线的型号。 |
| 指定服务商 | 只能调用所选服务商的型号,最多 20 个服务商;该服务商以后新上线的型号自动可用。 |
| 指定模型 | 只能调用列出的型号,最多 100 个。 |
同时设置服务商和型号时,型号必须同时满足两个条件才可调用。服务商标识与 GET /v1/models 返回的 owned_by 一致:
| 标识 | 服务商 | 标识 | 服务商 |
|---|---|---|---|
qwen | 千问(阿里云百炼) | kimi | Kimi(月之暗面) |
zhipu | 智谱 | deepseek | DeepSeek |
minimax | MiniMax | typesafe | TypeSafe |
doubao | 豆包(火山方舟) | cloudflare | Cloudflare Workers AI |
stepfun | 阶跃星辰 |
范围外的型号不会出现在该密钥的 GET /v1/models 结果中;直接调用返回 403(错误码见错误处理)。
限额与有效期#
| 设置 | 规则 |
|---|---|
| 限额周期 | 每小时、每天、每周、每月(30 天)或自定义(60 秒到 365 天)。周期是滚动窗口:始终统计“从现在往前一个周期”内的用量,不在整点或月初清零。设置 token 上限或金额上限时必须选择周期。 |
| token 上限 | 窗口内全部调用的 token 总数上限。 |
| 金额上限 | 窗口内全部调用的扣费上限。平台以美元记账;控制台按你的显示币种输入并换算为美元保存。全能密钥的工具调用费用也计入。 |
| 到期时间 | 到期后密钥立即失效,返回 401。 |
限额在受理请求时检查:窗口内已结算的用量、所有进行中调用的预留量,加上本次请求的预留量,超过上限即拒绝(403)。预留量是按请求上限估算的保守值,因此接近上限时,一个实际用量很小的请求也可能被拒绝。预留规则见计费与结算。
验证密钥#
GET /v1/models 返回这把密钥当前可调用的型号,是检查密钥是否有效、范围是否正确的最快方式。
curl https://api.tokentosea.com/v1/models \
-H "Authorization: Bearer $TOKENTOSEA_API_KEY"import os
import requests
response = requests.get(
"https://api.tokentosea.com/v1/models",
headers={"Authorization": f"Bearer {os.environ['TOKENTOSEA_API_KEY']}"},
timeout=30,
)
response.raise_for_status()
models = response.json()["data"]
print(len(models), "个可调用型号")
for model in models[:5]:
print(model["id"], model["owned_by"], model["region"], model["modality"])const response = await fetch('https://api.tokentosea.com/v1/models', {
headers: { Authorization: `Bearer ${process.env.TOKENTOSEA_API_KEY}` },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const { data } = await response.json();
console.log(`${data.length} 个可调用型号`);
for (const model of data.slice(0, 5)) console.log(model.id, model.owned_by, model.region, model.modality);返回结构与字段说明见 GET /v1/models。注意不要与 https://tokentosea.com/api/v1/models 混淆,后者只列出订单专用密钥对应的已购模型。
撤销与删除#
| 操作 | 效果 |
|---|---|
| 撤销 | 立即生效,之后所有使用这把密钥的请求都会被拒绝。撤销不可恢复,密钥仍显示在列表中并标为已撤销。 |
| 删除 | 立即撤销并从列表中移除,不可恢复。已经发生的调用记录、账单流水和用量统计保留。已撤销的密钥只能删除。 |
结果与资源绑定到创建它们的密钥
/v1/results、/v1/tasks、/v1/videos、资产下载链接、file_tts_… 文件和 voice_tts_… 音色都只能用创建它们的那把密钥访问。撤销或删除密钥后,这些结果和资源也无法再查询。撤销前请确认没有仍在处理的异步任务,并已下载需要保留的生成文件。
轮换密钥#
不停机轮换的推荐步骤:
- 新建一把范围和限额相同的密钥。
- 把新密钥部署到所有调用方,并确认新请求都使用新密钥。
- 等待旧密钥发起的异步任务完成并取回结果。
- 撤销或删除旧密钥。
怀疑密钥泄露时不要等待,立即撤销,然后在账单中检查异常扣费。更多建议见安全最佳实践。
认证相关错误#
| HTTP | error.code | 原因 |
|---|---|---|
| 401 | invalid_api_key | 缺少密钥,或格式不合法 |
| 401 | main_key_authorization_failed | 密钥不存在(工具密钥 tts_tool_… 不能调用模型,也返回这个错误)、已撤销、已删除或已过期;或账号已停用、未完成手机号验证 |
| 403 | main_key_authorization_failed | 密钥类型不能调用模型,例如订单专用密钥 |
| 403 | main_wallet_authorization_failed | 型号不在密钥的调用范围内,或会超出密钥限额 |
| 403 | tool_access_not_allowed | 用未开启工具权限的密钥调用工具 API |