TokenToSea开发者文档
控制台

API 概览

推理 API 的基础地址、鉴权、请求格式、幂等、响应、结果信封与错误约定,以及全部接口索引。

本页内容

本页列出所有推理接口共用的约定。各接口页面只描述该接口特有的参数和行为;遇到共性问题(鉴权、幂等、错误码、结果查询)时回到这里查。

基础地址#

用途地址说明
HTTP 推理接口https://api.tokentosea.com/v1本节全部 POST / GET 接口
实时音频wss://api.tokentosea.com/v1/realtime?model=<型号>见 实时音频
工具 APIhttps://tokentosea.com/api/v1/tool-api见 工具 API,不在本节
OAuth 委托接口https://tokentosea.com/api/v1/connect见 TokenToSea 登录,不在本节

api.tokentosea.com 是唯一公开入口。平台按请求体中的 model 精确路由到对应区域的执行节点(国内型号与海外型号使用不同节点),不做跨区域回退,也不自动重试。执行节点不接受直接访问。

只从服务端调用

api.tokentosea.com 不返回 CORS 响应头,浏览器页面无法直接调用。请把密钥保存在你的服务器上,由服务端发起请求。需要让最终用户用自己的余额调用时,使用 TokenToSea 登录。

鉴权#

在请求头中携带密钥,二选一:

HTTP
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"
}
字段类型说明
idstring结果 ID,result_ + 64 位十六进制。可用于 GET /v1/tasks/{id}、GET /v1/videos/{id}
run_idstring平台账单中的调用记录 ID
statusstring处理状态,见下表
billing_statusstring结算状态:succeeded 已按实际用量扣费,failed 未扣费且预留已释放,needs_review 待人工核对。尚未结算时可能缺省
errorobject仅在未成功时出现:{ "code": "…" }
outputobject仅 status 为 succeeded 时出现。同步接口为原响应体;媒体结果为 { id, model, data: [{ url, asset_id, mime_type }], usage? };流式调用另含 stream(完整 SSE 文本)
status_codenumber仅成功时出现,原调用的 HTTP 状态码
response_typestring仅成功时出现,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含义
400invalid_json_body、query_parameters_not_supported、idempotency_key_invalid、request_too_deep请求格式错误
400main_wallet_authorization_failed请求超出型号限制(例如输出上限大于 max_output_tokens、输入超出价格表上限)
401invalid_api_key缺少密钥或格式错误
401main_key_authorization_failed、main_wallet_authorization_failed密钥无效、已撤销、已删除或已过期,或所属账号不可用
403main_key_authorization_failed、main_wallet_authorization_failed密钥不能调用该型号:订单专用密钥、型号或服务商不在调用范围、密钥限额已用尽、型号暂无有效价格
403model_not_allowed文件或音色接口指定的型号不在密钥的调用范围内
404model_not_offered、endpoint_not_offered型号或接口不存在
404result_not_found、task_not_found、asset_not_found、resource_not_found查询对象不存在,或不属于当前密钥
409main_wallet_authorization_failed余额不足、并发调用超过 8 个,或同一幂等键对应了不同的请求体
409request_already_accepted、request_already_dispatched、idempotency_conflict同一幂等键的调用已受理或冲突
413multipart_limit_or_invalid_field、request_too_complex、legacy_model_payload_limit请求过大或结构过于复杂
415json_body_required请求体不是 JSON
422model_operation_not_supported、endpoint_not_verified、response_mode_not_verified、input_modality_not_verified、streaming_required该型号未开放这个接口、响应方式或输入类型
422auxiliary_product_not_priced、hosted_tools_not_priced、explicit_cache_not_priced、stateful_responses_not_supported、audio_output_not_priced请求使用了没有单独定价的附加能力(联网搜索、托管工具、未定价的显式缓存、有状态 Responses 等)
429resource_daily_limit文件或音色的每日创建次数已用完
4xxprovider_http_<状态码>上游拒绝了请求(原样透传状态码),未扣费
502provider_http_5xx、execution_result_pending、provider_response_pending_reconciliation上游失败或结果尚待确认。用同一个键查询结果,不要换新键重发
503model_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/completionsOpenAI Chat Completions 对话
POST/v1/responsesOpenAI Responses(无状态)
POST/v1/messagesAnthropic Messages 对话
WS/v1/realtime实时语音对话、识别、合成与翻译
POST/v1/images/generations文生图
POST/v1/images/edits图像编辑
POST/v1/videos视频生成(异步)
POST/v1/3d/generations3D 模型生成(异步)
POST/v1/audio/speech语音合成
POST/v1/audio/transcriptions语音识别
POST/v1/embeddings向量
POST/v1/rerank重排序
POST/v1/systemoneSystem 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.jsbase_url="https://api.tokentosea.com/v1"(Node.js 为 baseURL)chat.completions、responses、models.list
Anthropic Python / Node.jsbase_url="https://api.tokentosea.com"(不带 /v1;Node.js 为 baseURL)messages

使用 SDK 时注意:

  1. 显式传入 Idempotency-Key。SDK 默认不发送它,遇到网络错误或部分状态码会自动重试;不带键的重试会被当作新的调用。Python 用 extra_headers={"Idempotency-Key": key},Node.js 在第二个参数中传 { headers: { "Idempotency-Key": key } }。本文档示例同时把 SDK 的自动重试设为 0,由你的代码决定何时用同一个键重试。
  2. 厂商扩展参数(如千问的 enable_thinking、DeepSeek / Kimi / 豆包的 thinking)在 OpenAI Python SDK 中放入 extra_body,Node.js 直接写在请求对象中。
  3. 其余接口(图像、视频、语音、向量等)使用普通 HTTP 请求,本文档给出 requests 与 fetch 示例。

下一步#

    输入关键词搜索全部文档与模型。