API 概览
推理 API 的基础地址、鉴权、请求格式、幂等、响应、结果信封与错误约定,以及全部接口索引。
本页列出所有推理接口共用的约定。各接口页面只描述该接口特有的参数和行为;遇到共性问题(鉴权、幂等、错误码、结果查询)时回到这里查。
基础地址#
| 用途 | 地址 | 说明 |
|---|---|---|
| HTTP 推理接口 | https://api.tokentosea.com/v1 | 本节全部 POST / GET 接口 |
| 实时音频 | wss://api.tokentosea.com/v1/realtime?model=<型号> | 见 实时音频 |
| 工具 API | https://tokentosea.com/api/v1/tool-api | 见 工具 API,不在本节 |
| OAuth 委托接口 | https://tokentosea.com/api/v1/connect | 见 TokenToSea 登录,不在本节 |
api.tokentosea.com 是唯一公开入口。平台按请求体中的 model 精确路由到对应区域的执行节点(国内型号与海外型号使用不同节点),不做跨区域回退,也不自动重试。执行节点不接受直接访问。
只从服务端调用
api.tokentosea.com 不返回 CORS 响应头,浏览器页面无法直接调用。请把密钥保存在你的服务器上,由服务端发起请求。需要让最终用户用自己的余额调用时,使用 TokenToSea 登录。
鉴权#
在请求头中携带密钥,二选一:
Authorization: Bearer sk-relay_xxxxxxxx…
x-api-key: sk-relay_xxxxxxxx…两个请求头同时存在时以 Authorization: Bearer 为准。实时音频 只接受 Authorization: Bearer。
| 密钥 | 格式 | 能否调用本节接口 |
|---|---|---|
| 全能密钥(模型 + 工具) | sk-relay_ + 64 位十六进制 | 可以;同一把密钥还能调用工具 API |
| 模型密钥 | sk-relay_ + 64 位十六进制 | 可以 |
| 订单专用密钥 | sk-relay_…(绑定某笔已购订单) | 不可以,返回 403 |
| 工具密钥 | tts_tool_… | 不可以,只用于工具 API |
| OAuth 访问令牌 | tts_at_… | 不可以,只用于 /api/v1/connect |
密钥在 控制台 → 我的 Key 创建,明文只显示一次。服务端只保存密钥的 SHA-256 摘要,无法找回明文。每次请求都会重新校验:
- 密钥未撤销、未删除、未过期;
- 密钥所属账号状态正常、已绑定手机号,且密钥属于买家工作区;
- 请求的型号在密钥的调用范围内(指定型号或指定服务商,未限制则为全部型号);
- 本次预留金额与 token 数不超过密钥在当前周期内的限额。
撤销或删除密钥立即生效,此后使用该密钥的请求返回 401;删除不可恢复。密钥的类型、范围和限额见鉴权与密钥。
格式校验:密钥必须是 16–2048 个可打印 ASCII 字符,否则直接返回 401 invalid_api_key。
请求格式#
| 项目 | 规则 |
|---|---|
| 方法 | 推理接口为 POST,查询接口为 GET |
| 请求体 | application/json(UTF-8),最大 48 MB。model 字段必填,取值与 GET /v1/models 返回的 id 完全一致(区分大小写) |
| 文件上传 | /v1/audio/transcriptions 与 /v1/files 支持 multipart/form-data:只能有一个名为 file 的文件(最大 25 MB),最多 40 个字段,单个字段值最大 1 MB |
| System One | /v1/systemone 另行接受 gzip / zstd 压缩与 multipart,上限见该页 |
| 查询字符串 | POST 请求不允许带查询字符串,否则返回 400 query_parameters_not_supported。所有参数放在请求体中 |
| 未验收的组合 | 每个型号只开放已验收的接口、响应方式(JSON / SSE / WebSocket)和输入类型,其余组合返回 422。以 GET /v1/models 的 verified_endpoints、response_modes、verified_inputs 为准 |
multipart 请求中,messages、input、parameters、provider_options、content、voice_setting、audio_setting 可以写成 JSON 字符串(以 { 或 [ 开头),stream、n、duration、speed、sample_rate 按 JSON 字面量解析(例如 true、5)。
请求头#
| 请求头 | 必填 | 说明 |
|---|---|---|
Authorization / x-api-key | 必填 | 见鉴权 |
Content-Type | 必填 | application/json 或 multipart/form-data |
Idempotency-Key | 可选(强烈建议) | 本次调用的唯一键,见幂等与请求 ID |
Content-Encoding | 可选 | 仅 /v1/systemone:gzip 或 zstd |
TypeSafe-Danger-Zone-Images | 可选 | 仅 Jev 图片判断:true,见 System One |
幂等与请求 ID#
每个 POST 都可以携带 Idempotency-Key。格式为 16–128 个字符,只能包含字母、数字、_、.、:、-(正则 ^[\w.:-]{16,128}$),否则返回 400 idempotency_key_invalid。UUID 满足要求。
不带这个请求头时,网关自动生成 tts-auto-<uuid> 作为本次调用的键。无论哪种情况,响应都会在 X-Request-Id 和 X-TokenToSea-Request-Id 中返回本次使用的键。
| 情况 | 结果 |
|---|---|
| 同一密钥、同一键、同一请求体,原调用已完成 | 返回原结果(同步接口直接返回原响应体,流式接口一次性返回原 SSE 文本),不会再次调用上游,也不会再次扣费 |
| 同一密钥、同一键、同一请求体,原调用仍在处理 | 202 结果信封,或 409 request_already_accepted |
| 同一密钥、同一键、不同请求体 | 409,不会执行新请求 |
| 不同密钥使用同一个键 | 互不影响:键按密钥隔离 |
结果只能用创建它的那把密钥查询。保存每次调用的键,网络中断或超时后用同一个键查询 GET /v1/results/{key},或用同一个键、同一个请求体重发。不要换一个新键重新提交:那会被当作一次新的调用并再次计费。完整说明见幂等与重试。
响应#
| 状态码 | 响应体 | 何时出现 |
|---|---|---|
200 | 对话、向量、重排等接口:上游原生响应体(OpenAI / Anthropic / 厂商原生格式),包含上游返回的 usage;生成文件的接口(图像、视频、3D 等):平台规范化的 { id, model, data: [{ url, asset_id, mime_type }] } | 同步调用成功并已完成结算 |
200 + text/event-stream | 上游原生 SSE 帧 | 请求 "stream": true 且该型号已验收 SSE |
200 + 音频 MIME | 音频二进制 | /v1/audio/speech 生成单个音频文件 |
202 | 结果信封 | 异步任务已受理(视频、3D、部分图像与语音识别等),或结算 / 归档尚未完成 |
422 | 结果信封(status: "failed"),或错误对象 | 调用已失败;或请求不符合该型号已验收的能力 |
4xx / 5xx | 错误对象 | 见下文 |
对话、向量、重排等接口原样返回上游的成功响应体。生成文件的接口会把文件转存到私有存储,响应改为上面的规范化 data[]:只给出 TokenToSea 的签名下载链接与 asset_id,不暴露厂商的临时地址。少数型号的资源 ID 也会替换为平台 ID(例如 glm-tts-clone 返回的 voice、file_id,见 /v1/tools/invoke)。所有响应都不含费用字段,每次调用的实际扣费在 控制台 → 账单 中查看。
响应头#
| 响应头 | 说明 |
|---|---|
X-Request-Id / X-TokenToSea-Request-Id | 本次调用的幂等键(你传入的,或网关生成的 tts-auto-…) |
Cache-Control: no-store | 所有接口的响应都不可缓存 |
x-should-retry: false | 目前只出现在网关入口校验失败的错误上(鉴权、参数、型号能力、幂等键格式等),OpenAI、Anthropic 官方 SDK 遇到它不会自动重试。余额、并发、上游失败、结算待定等错误不保证带此头,SDK 可能对其中的 409 与 5xx 自动重试。请始终显式传入 Idempotency-Key 并关闭 SDK 自动重试(见使用官方 SDK) |
X-TokenToSea-Asset-Id | 仅 GET /v1/files/{id}/content:本次返回文件的资产 ID |
结果信封#
异步受理、处理中、失败的调用,以及 GET /v1/results 的返回,都使用同一个结构:
{
"id": "result_3f6c…(64 位十六进制)",
"run_id": "cm2…",
"status": "succeeded",
"billing_status": "succeeded",
"output": { "…": "完成后的输出" },
"status_code": 200,
"response_type": "application/json"
}| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 结果 ID,result_ + 64 位十六进制。可用于 GET /v1/tasks/{id}、GET /v1/videos/{id} |
run_id | string | 平台账单中的调用记录 ID |
status | string | 处理状态,见下表 |
billing_status | string | 结算状态:succeeded 已按实际用量扣费,failed 未扣费且预留已释放,needs_review 待人工核对。尚未结算时可能缺省 |
error | object | 仅在未成功时出现:{ "code": "…" } |
output | object | 仅 status 为 succeeded 时出现。同步接口为原响应体;媒体结果为 { id, model, data: [{ url, asset_id, mime_type }], usage? };流式调用另含 stream(完整 SSE 文本) |
status_code | number | 仅成功时出现,原调用的 HTTP 状态码 |
response_type | string | 仅成功时出现,application/json 或 text/event-stream |
status | 含义 | 你应该 |
|---|---|---|
planned / sending / streaming | 已预留费用,正在调用上游 | 稍后再查 |
upstream_pending | 上游异步任务处理中(平台每 5 秒轮询一次,最长 24 小时) | 稍后再查 |
billing / archiving | 上游已返回,正在结算或把生成文件存入私有存储 | 稍后再查 |
succeeded | 已完成,output 可用 | 读取结果 |
failed | 已失败 | 查看 error.code 与 billing_status |
needs_review | 上游结果或用量无法确认,待人工核对;不会自动重新生成 | 不要重复提交,稍后再查 |
输出上限与预留#
- 未指定输出上限时,网关按型号的默认值补上:Chat Completions 使用该型号的输出字段(
max_tokens或max_completion_tokens),Responses 使用max_output_tokens;目前绝大多数型号的默认值为 4096。 - 输出上限必须在 1 到该型号的
max_output_tokens之间,超出返回400。 - 每次调用先按「最长输入 + 输出上限」与价格表中适用的最高档位预留金额,完成后按上游实际
usage结算并释放余额。输出上限设得越大,需要的可用余额越多。 - 上游请求最长等待 21 分钟。耗时更长的媒体生成走异步任务。
计费规则(官方原价、原币种、汇率快照、6 位小数向上取整)见计费与余额。
错误#
网关生成的错误使用统一结构:
{
"error": {
"code": "model_operation_not_supported",
"message": "可选:经过脱敏的上游错误描述,最长 300 字符"
}
}code 是稳定的机器可读值,请按它分支处理;message 只在上游返回了错误描述时出现,内容可能变化,不要解析。
| 状态码 | 常见 code | 含义 |
|---|---|---|
400 | invalid_json_body、query_parameters_not_supported、idempotency_key_invalid、request_too_deep | 请求格式错误 |
400 | main_wallet_authorization_failed | 请求超出型号限制(例如输出上限大于 max_output_tokens、输入超出价格表上限) |
401 | invalid_api_key | 缺少密钥或格式错误 |
401 | main_key_authorization_failed、main_wallet_authorization_failed | 密钥无效、已撤销、已删除或已过期,或所属账号不可用 |
403 | main_key_authorization_failed、main_wallet_authorization_failed | 密钥不能调用该型号:订单专用密钥、型号或服务商不在调用范围、密钥限额已用尽、型号暂无有效价格 |
403 | model_not_allowed | 文件或音色接口指定的型号不在密钥的调用范围内 |
404 | model_not_offered、endpoint_not_offered | 型号或接口不存在 |
404 | result_not_found、task_not_found、asset_not_found、resource_not_found | 查询对象不存在,或不属于当前密钥 |
409 | main_wallet_authorization_failed | 余额不足、并发调用超过 8 个,或同一幂等键对应了不同的请求体 |
409 | request_already_accepted、request_already_dispatched、idempotency_conflict | 同一幂等键的调用已受理或冲突 |
413 | multipart_limit_or_invalid_field、request_too_complex、legacy_model_payload_limit | 请求过大或结构过于复杂 |
415 | json_body_required | 请求体不是 JSON |
422 | model_operation_not_supported、endpoint_not_verified、response_mode_not_verified、input_modality_not_verified、streaming_required | 该型号未开放这个接口、响应方式或输入类型 |
422 | auxiliary_product_not_priced、hosted_tools_not_priced、explicit_cache_not_priced、stateful_responses_not_supported、audio_output_not_priced | 请求使用了没有单独定价的附加能力(联网搜索、托管工具、未定价的显式缓存、有状态 Responses 等) |
429 | resource_daily_limit | 文件或音色的每日创建次数已用完 |
4xx | provider_http_<状态码> | 上游拒绝了请求(原样透传状态码),未扣费 |
502 | provider_http_5xx、execution_result_pending、provider_response_pending_reconciliation | 上游失败或结果尚待确认。用同一个键查询结果,不要换新键重发 |
503 | model_not_enabled、model_price_activation_pending、provider_not_configured、region_not_configured | 型号暂不可用或正在更新价格 |
关于 main_wallet_authorization_failed
鉴权、限额、余额与并发校验由主站完成,网关把这类失败统一返回为 main_wallet_authorization_failed(或 main_key_authorization_failed),并保留主站的 HTTP 状态码。请结合状态码判断:401 换密钥、403 检查密钥范围与限额、409 检查余额与并发、400 检查输出上限与输入长度。
完整的错误码表和处理建议见错误处理。
限制#
| 限制 | 值 | 超出时 |
|---|---|---|
| 每个账号同时处理中的调用 | 8 个(含预留中、执行中、待核对) | 409 |
| 每分钟请求数 | 无固定 RPM 限制,不返回限流响应头 | — |
| 密钥周期限额 | 每把密钥可设置每小时 / 天 / 周 / 月或自定义窗口内的费用与 token 上限 | 403 |
| 预留有效期 | 已预留但 5 分钟内未发往上游的调用自动释放 | — |
| 上游等待时间 | 21 分钟 | 结果进入待确认,用 /v1/results 查询 |
| 文件上传 | 每个账号每 UTC 日 100 次 | 429 resource_daily_limit |
| 音色创建 | 每个账号每 UTC 日 20 次 | 429 resource_daily_limit |
| 实时音频会话 | 60 秒、最多 8 轮 | 会话结束 |
各项限制的完整说明见限制与配额。
接口索引#
| 方法 | 路径 | 用途 |
|---|---|---|
GET | /v1/models | 当前密钥可调用的型号、能力与价格 |
POST | /v1/chat/completions | OpenAI Chat Completions 对话 |
POST | /v1/responses | OpenAI Responses(无状态) |
POST | /v1/messages | Anthropic Messages 对话 |
WS | /v1/realtime | 实时语音对话、识别、合成与翻译 |
POST | /v1/images/generations | 文生图 |
POST | /v1/images/edits | 图像编辑 |
POST | /v1/videos | 视频生成(异步) |
POST | /v1/3d/generations | 3D 模型生成(异步) |
POST | /v1/audio/speech | 语音合成 |
POST | /v1/audio/transcriptions | 语音识别 |
POST | /v1/embeddings | 向量 |
POST | /v1/rerank | 重排序 |
POST | /v1/systemone | System One 结构化判断与抽取 |
POST | /v1/tools/invoke | 专用模型(翻译、OCR、音色复刻、音效等) |
POST | /v1/invoke | 厂商原生协议透传(深度研究、长文本语音) |
POST / GET | /v1/files | 上传与查询模型所需文件 |
POST / GET | /v1/audio/voices | 创建与查询复刻音色 |
GET | /v1/results/{key} | 按幂等键查询结果 |
GET | /v1/tasks/{id}、/v1/videos/{id} | 按结果 ID 查询 |
GET | /v1/assets/{asset_id}/download-url | 重新获取生成文件的下载链接 |
使用官方 SDK#
协议兼容的接口可以直接使用厂商 SDK,只需替换地址与密钥:
| SDK | 设置 | 可用接口 |
|---|---|---|
| OpenAI Python / Node.js | base_url="https://api.tokentosea.com/v1"(Node.js 为 baseURL) | chat.completions、responses、models.list |
| Anthropic Python / Node.js | base_url="https://api.tokentosea.com"(不带 /v1;Node.js 为 baseURL) | messages |
使用 SDK 时注意:
- 显式传入
Idempotency-Key。SDK 默认不发送它,遇到网络错误或部分状态码会自动重试;不带键的重试会被当作新的调用。Python 用extra_headers={"Idempotency-Key": key},Node.js 在第二个参数中传{ headers: { "Idempotency-Key": key } }。本文档示例同时把 SDK 的自动重试设为 0,由你的代码决定何时用同一个键重试。 - 厂商扩展参数(如千问的
enable_thinking、DeepSeek / Kimi / 豆包的thinking)在 OpenAI Python SDK 中放入extra_body,Node.js 直接写在请求对象中。 - 其余接口(图像、视频、语音、向量等)使用普通 HTTP 请求,本文档给出
requests与fetch示例。
下一步#
- 快速开始:三步发出第一个请求
GET /v1/models:查询型号能力与价格- 结果查询:异步任务与断线恢复
- 错误处理:完整错误码与重试策略