Skip to main content

简短回答

用任务接口按 task_id 查,返回的 quota 就是这条视频的总消费。 日志里的两条记录(预扣 + 结算)相加等于它,「异步任务」页详情里的 quota 也是它。
quota ÷ 500,000 = 美元。认证用系统令牌(不是 sk- 开头的 API Key),获取方式见日志查询 API 不要试图用日志查询 API 逐单配对:两条日志记录里都没有 task_id,结算那条连 request_id 都是空的。

三个数字是什么关系

Seedance 视频按「提交时预扣、完成后多退少补」计费,所以一条视频会在日志里留下两条记录,而任务接口 / 任务详情页只有一个 quota 结算也可能是退回:一条 fast 480p 4 秒文生视频预扣 144,000,实际 40,594 tokens × 18.5 × 0.18 = 135,179,结算行记 −8,821(退回 $0.02),任务接口 quota = 135,179。 上面第一组数字来自一条真实的 2.0 图生视频(含参考视频):368,100 tokens × 14(含视频输入档倍率)× 0.18(分组倍率)= 927,612,即 $1.86。结算行 other 里的 final_quota 就是 927,612,original_quota 是 224,999,adjustment_quota 是 702,613,三者在一条记录里都能看到。

按 status 判断真实消费

注意两套词表不同:视频查询接口 /seedance/api/v3/.../tasks/{id} 的成功状态是 succeeded,任务接口 /api/task/self 的成功状态是 completed,别把轮询代码里的判断条件直接搬过来。
对失败任务直接拿 quota 求和会把预扣额算成消费。程序化对账要按 status 过滤;用日志 API 对账则要同时拉 type=2type=11,后者是退款行,quota 为负数。

参数写法(与日志 API 相反)

任务接口的分页参数是下划线 page_size、页码 p 从 1 开始;日志 API 是驼峰 pageSizep 从 0 开始。写错不报错,只会退回默认分页。 已验证可用的过滤参数: 批量对账时按时间窗拉取即可,每条都带 task_idstatusquotasubmit_timefinish_timemodel_name

如果一定要在日志里人工核对

结算行有三个字段能对上任务接口:
  • 「时间」(created_at)等于任务的 finish_time,相差不超过 1 秒
  • completion_tokens 等于任务的 usage.completion_tokens
  • other.final_quota 等于任务的 quota
预扣行的 request_id 等于提交响应头里的 X-Shellapi-Request-Id,可以用它反查(/api/log/self?request_id=…)。注意响应头里另有一个 X-Request-Id,那是原厂的请求 ID,在 API易 日志里搜不到。但同一秒批量提交多条任务时预扣行会撞在一起,而且结算行没有 request_id,所以日志只适合人工核对个别任务,程序化对账请走任务接口。

常见问题

先看任务状态。submitted / in_progressquota 只是预扣,还没有第二条日志;failedquota 仍是预扣额,而日志里多了一条负数退款行,两条相加为 0。completed 状态下两者一定相等,若不等请把 task_id 发给客服核查。
结算是任务完成时由系统补记的,不经过网关请求链路,所以不带令牌、分组和 request_id,控制台上还会标成「流式」。这是正常现象,不代表异常。
/v1/videos 等通用端点时,预扣行的 content 里会带 任务ID: cgt-…,但结算行仍然没有。而且这些端点目前对 Seedance 的分辨率参数透传不完整,请一律走文档路径 /seedance/api/v3/contents/generations/tasks,见视频生成 API
/api/task/self 只返回本账号的任务。系统令牌等价于账号凭证,请像保管密码一样保管,不要写进代码仓库。

相关文档