APIMaster.ai

Seedance 幂等提交与异常恢复

Seedance 幂等提交与异常恢复 — Idempotency-Key, HTTP 409, acceptance_unknown.

Seedance 幂等提交与异常恢复

为 seedance-2.0、seedance-2.0-fast、seedance-2.0-mini、seedance-2.5 的生成请求添加 Idempotency-Key。支持 POST /v1/videos、POST /v1/videos/generations 和 POST /v1/video/generations,三个路径共享键空间。图片生成、报价、remix 路径及其他视频模型不在本次支持范围内。不带键的请求保留现有行为,不具备通用提交去重保证。

范围与键

键的范围是 APIMaster 用户账户内的 Seedance 视频生成操作,不限于某一 API Key 或某一模型。每次新生成使用新的随机键,长度为 8–128 个可见 ASCII 字符。同一账户的有效 API Key 可查询回执;额度耗尽的令牌仍可查询或重放已有回执,过期、撤销、删除的令牌及被禁用的账户不能访问。新生成仍要求有效凭证和足够额度。

原子去重与冲突

路由、计费及联系生成供应商前,数据库先原子保存受理记录。同键同内容返回 HTTP 202、原受理记录和预生成任务 ID,并发重试及服务器重启也不会再次提交或预扣。同键改内容返回 HTTP 409(idempotency_conflict)。忽略 JSON 对象字段顺序与空白;数组顺序、数字、省略参数与显式默认值、模型、通知设置、路由分组及指定渠道均参与比较。multipart 忽略边界和文件名,但比较文件字节及顺序。请保持原正文和路由设置不变;JSON 与 multipart 不视为相同请求。记录至少保留 30 天,本版本不自动删除或允许旧键重新使用;新生成始终用新键。

响应

首次请求保留正常创建响应,请保存 X-Video-Submission-Id、请求 ID 和任务 ID。重放返回受理回执,不保证与首次响应格式相同。预生成的任务 ID 本身不代表上游已受理。accepted 表示供应商受理,不表示生成完成;只有 task_ready=true 时才查询原任务,否则联系支持,勿重新提交。

提交状态

pending:网关已记录,尚未开始提交供应商。submitting:已开始提交,结果待确认。accepted:已收到供应商任务 ID。not_accepted:未向供应商提交,可修正错误后用新键新建请求。acceptance_unknown:供应商可能已受理,但没有确认回执,不能再次创建生成。崩溃遗留的未完成记录在 30 分钟后查询时分类:提交前变为 not_accepted,提交后变为 acceptance_unknown,任何状态都不会自动重提。这些是提交状态,不是账务状态;现有预扣、结算和退款对账流程继续适用。

恢复流程

超时或 5xx 后,即使没有任务 ID,也先用原键查询。在支持范围内,同键同内容重放是安全的,但不会重启失败的提交。查询 404、任务列表为空或没有消费日志都不能证明未受理:原请求可能仍在途中,也可能未带键或发生在功能上线前。same_key_replay_safe 表示可安全取回同一回执;只有明确的 not_accepted 回执才会返回 new_submission_safe=true。结果未知或 accepted 且 task_ready=false 时,提供受理/请求 ID、模型及 UTC 时间给支持,勿发送 API Key。不承诺上游幂等,直接给官方接口传此请求头不等于获得本网关保证。历史真人素材回执保留原重放流程,按键查询可能返回旧版结构。

调用示例

curl --fail-with-body 'https://apimaster.ai/v1/videos' \
  -H "Authorization: Bearer $APIMASTER_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: seedance-order-20261014-001' \
  -d '{"model":"seedance-2.0","prompt":"A paper boat on a pond","duration":4,"resolution":"480p","generate_audio":false}'

curl --fail-with-body 'https://apimaster.ai/v1/video-submissions/by-key' \
  -H "Authorization: Bearer $APIMASTER_KEY" \
  -H 'Idempotency-Key: seedance-order-20261014-001'
{
  "code": 200,
  "data": {
    "submission_id": "HASH",
    "task_id": "task_PUBLIC_ID",
    "request_id": "ORIGINAL_REQUEST_ID",
    "model": "seedance-2.0",
    "status": "accepted",
    "task_ready": true,
    "created_at": 1791936000,
    "updated_at": 1791936001,
    "next_action": "query_task",
    "same_key_replay_safe": true,
    "new_submission_safe": false,
    "retention": "at_least_30_days_no_automatic_key_reuse"
  }
}
curl --fail-with-body 'https://apimaster.ai/v1/videos/task_PUBLIC_ID' \
  -H "Authorization: Bearer $APIMASTER_KEY"
curl --fail-with-body 'https://apimaster.ai/v1/videos/task_PUBLIC_ID/billing' \
  -H "Authorization: Bearer $APIMASTER_KEY"