国内用户请注意: 中国大陆用户请使用
https://toapis.cn 作为接口地址(Base URL)。文档示例中的 https://toapis.com 请替换为 https://toapis.cn。id 保持不变,但不保证恰好一次。接收方必须先持久化 event ID,再执行订单更新、发货等副作用;重复 event ID 应直接返回 2xx。
配置 Token
在 ToAPIs 控制台编辑 Token:- 配置 HTTPS 默认 callback URL。
- 生成 32 字节签名密钥。密钥仅在生成或轮换时显示一次,请立即安全保存。
- 启用“任务 Webhook”并保存。
- 发送测试事件,确认接收端能验签并返回
2xx。
callback_url 时,ToAPIs 使用 Token 默认地址。请求级 callback_url 只能覆盖路径和查询参数,协议、域名和端口必须与 Token 默认地址相同。
如果 Token 未启用 Webhook,或缺少默认地址/签名密钥,却在请求中传入 callback_url,ToAPIs 返回:
事件类型与 Payload
task_type 只会是 image 或 video。result 与对应任务查询接口的标准化公开结果一致,不包含渠道 ID、上游任务 ID、上游密钥、内部凭证或 PrivateData。
用量, 计费与查询差异
图片和视频成功事件都可包含data.usage, 包括计费量, 可用的模型 token 明细及工具次数. 字段定义与任务查询一致, 见任务用量字段. 视频事件还可包含 data.generation, Seedance 的字段及兼容用量见视频任务查询.
data.billing 可包含 status, credits, cost_usd. 金额为十进制字符串; pending 时省略金额, refunded 表示已确认净费用为零. 无法确认时省略对象, 不代表免费. Webhook 与任务查询使用同一确认条件: 已确认扣费的任务, 包括提交时一次扣清的固定计费任务, 两者均返回 settled 和实际金额; data.usage 返回 charge_type 等计费量时, 一定同时返回 settled 金额.
data.billing 字段取值
成功事件为
settled, 结算退回全部预扣时为 refunded; 失败事件在退款完成后发送, 为 refunded. 无法确认金额时省略整个 data.billing.
data.usage 字段取值
charge_type 到 input_images 是计费量, 只与 data.billing.status=settled 同时返回. token 明细和工具次数按供应商实际提供情况独立返回. 未返回的字段直接省略, 不补零.
Webhook 是事件创建时的快照, 任务查询读取最新已确认状态. 缺少用量或金额不会等待补齐, 不延迟投递或改变重试; 已创建事件不回填, 重试沿用原始事件负载.
事件结构和 api_version: "v1" 保持不变. Webhook 使用 data.task_id, SUCCESS / FAILURE 和字符串进度 "100%"; 查询使用 id, 小写状态和整数进度. 时间字段与公开 generation.task 查询同名同口径, 均为 Unix 秒: data.created_at 为任务提交时间, data.finished_at 为结束时间, 成功时另返回 data.completed_at 和 data.expires_at (结果过期时间, 结束时间加 24 小时), 缺少值的字段直接省略. 原 data.submitted_at 已由 data.created_at 取代, 不再返回. 事件顶层 created_at 是事件创建时间, 不是任务提交时间. 两者的媒体 URL 可能因访问策略不同而不同.
Seedance 视频成功事件示例
以下样例用于展示字段, 不代表模型的当前价格或固定计费方式. 实际字段和金额以本次任务返回为准. Seedance 成功事件的data.result.data[] 也可包含 fallback_url 和 fallback_last_frame_url. 优先使用 url 和 last_frame_url, 原地址无法访问时才使用对应备用地址. 备用字段缺省不表示任务失败. 事件保留创建时的地址快照, 后续副本变化不会改写已创建事件或其重试负载. 字段定义和完整使用规则见视频任务查询.
generation.completed
generation.failed
错误标识的含义与处理建议见错误码速查. Webhook 的data.error 不保证包含任务查询中的 reason 字段.
只有内部重试已经结束、最终计费或退款已经完成时,ToAPIs 才会发送失败事件。暂时性失败不会触发 generation.failed。
endpoint.test
请求头与签名
v1 签名。接收方应拆分逗号分隔的签名,并接受任意一个有效值。
Python
Node.js
Go
投递、重试与安全
- 首次投递立即执行;失败后约在 10 秒、30 秒、2 分钟、10 分钟、1 小时、6 小时和 24 小时后重试。
- 只有
2xx被视为成功。3xx不会自动跟随,4xx和5xx都会按计划重试。 - 单次 HTTP 请求超时为 10 秒,ToAPIs 最多读取 4 KB 响应体用于脱敏后的诊断。
- callback URL 必须使用 HTTPS,禁止 userinfo、fragment、私网、回环、链路本地、保留地址和非法端口。
- 每次投递都会重新执行 DNS/IP 与 SSRF 校验,并把连接固定到已校验的公网 IP,避免 DNS rebinding。
- 回调延迟或最终失败时,请使用任务查询接口兜底;轮询应遵守异步任务速率限制。
- 结果 URL 可能具有有效期,请在收到事件后及时下载和保存所需文件。
callback_url、支付 Webhook 和 OAuth callback 保持原有协议,不属于异步生成任务 Webhook。