Seedance 视频生成 API
Seedance 视频生成接入指南:文生视频、首帧与首尾帧、图片/视频/音频参考,包含素材上传、异步任务、幂等重试与计费规则。
接入准备
更新于 2026-09-28。请先登录并创建归属于 Seedance 分组的 dacall.AI API Key(厂商选择 OpenAI);账户余额与 Key 可用额度必须足够。其他模型分组的 Key 不代表拥有视频权限。
| 项目 | 值 |
|---|---|
| 服务地址 | https://api.dacall.ai |
| 鉴权 | Authorization: Bearer <DACALL_API_KEY> |
| 请求格式 | 任务创建使用 application/json;素材上传使用 multipart/form-data。 |
| 创建任务 | POST /api/v3/contents/generations/tasks |
| 查询任务 | GET /api/v3/contents/generations/tasks/{task_id} |
| 能力查询 | GET /api/v3/contents/generations/capabilities?model=... |
| 素材上传 | POST /api/v3/contents/generations/assets?model=...&kind=image|video|audio |
- B 方集成时,API Key 仅存放于服务端环境变量或密钥管理系统,勿硬编码进网页、App 包或公开仓库。个人可在本站 Seedance 工作台临时填入自己的 Key;工作台只在当前页面内存中保留 Key,刷新后需重新填写。
- 以下均为示例数据与占位符;调用会产生实际费用。
在线工作台
无需编写代码,在工作台连接 Seedance 分组 Key 后,选择模型、生成模式、清晰度、时长、画幅与生成声音;使用素材时选择角色和文件并点击「上传素材」,确认预览后生成。点击生成会产生实际费用。
- 支持文生、首帧、首尾帧和参考素材;可选组合由连接后的能力查询决定。切换 Key、型号或模式会清空未提交素材,需重新上传。
- API Key 只保留在页面内存中,刷新后重新连接原 Key。「我的任务」是本机浏览器记录,不是账户云端历史;更换浏览器、域名或清除存储后,使用原 Key 和任务 ID 查询。
- 任务记录含提示词、请求体、素材地址及短期凭证、任务 ID 和重试标识;导出文件请勿公开分享。
- 停止查询或关闭页面不会取消生成;提交结果不明时使用「沿用原请求重试」。结果链接可能过期,请及时保存。
支持的模型与时长
以下是模型的总体参数范围,时长为整数秒;并非所有模式、清晰度、画幅和声音选项都可任意组合。提交前查询 capabilities,并匹配同一条完整能力记录。
| model(区分大小写) | duration | resolution |
|---|---|---|
| SEEDANCE_2_0 | 4–15 | 480p / 720p / 1080p / 4k |
| SEEDANCE_2_0_FAST | 4–15 | 480p / 720p |
| SEEDANCE_2_0_MINI | 4–15 | 480p / 720p |
| SEEDANCE_2_5 | 4–30 | 480p / 720p / 1080p |
- 2.0 / Fast / Mini 支持的画幅范围为 16:9、9:16、1:1;2.5 另有 adaptive、4:3、3:4、21:9。生成声音使用布尔值 true/false,具体组合以能力接口为准。
- 2.5 不支持单首帧;其首尾帧模式要求 ratio=adaptive。参考音频须搭配参考图片或视频,不能单独输入音频;首帧/首尾帧不能混用参考素材。
- 暂未开放自动时长、回调、任务取消及账户云端任务列表接口。
- 分辨率为档位名称;实际文件像素尺寸、帧数及播放时长以生成结果为准,不保证精确像素或毫秒对齐。
请求参数
任务 JSON 不超过 1 MiB;字段名区分大小写,不接受重复字段、未知字段或未定价组合。不要发送 seed、watermark、callback_url、input_type、duration_seconds、cost_credits 或 billable_seconds;输入模式和计费时长由服务端解析。
| 字段 | 类型 / 必填 | 说明 |
|---|---|---|
| model | string / 是 | 使用上表模型 ID。 |
| content | array / 是 | 恰好一个非空 text 对象,可追加媒体对象;字段结构与角色见下方。 |
| content 中的 text | string / 是 | 非空提示词,不得包含双连字符 --;使用独立字段设置时长、画幅与声音。 |
| resolution | string / 是 | 对应模型支持的分辨率,4k 使用小写。 |
| duration | integer / 是 | 按模型填写 4–15 或 4–30。 |
| ratio | string / 是 | 按完整能力记录选择;2.5 首尾帧必须使用 adaptive。 |
| generate_audio | boolean / 是 | 显式传 true 或 false,不能省略或传字符串;必须匹配当前能力。 |
| Idempotency-Key | 请求头 / 是 | 每个业务订单唯一,建议 UUID;最多 200 字节,重试保持相同。 |
先查询当前可用能力
同一条 capabilities 记录同时限定 input_type、resolution、ratio、generate_audio、min_duration 和 max_duration;不要把不同记录的字段拼成新组合。输入模式仅用于能力匹配,不作为创建任务的顶层字段。
- 响应包含 model、capabilities、media_enabled、scope=retail_policy_intersection 和 verification=not_asserted。能力列表不是每种组合都已实测成功的承诺。
- 媒体能力不可用或查询上游失败时,可能仅返回原有文生范围;请勿自行推断更多可用组合。
- input_type 包括 text、first_frame、first_last_frame、reference_image、reference_image_audio、reference_video、reference_video_audio。
curl --fail-with-body --silent --show-error \
'https://api.dacall.ai/api/v3/contents/generations/capabilities?model=SEEDANCE_2_0_MINI' \
-H "Authorization: Bearer $DACALL_API_KEY"上传素材与有效期
每次上传一个本地文件,model 使用将要生成的型号,kind 为 image、video 或 audio。仅接受名为 file 的文件字段,不接受额外表单字段或任意 URL 抓取。不要手动设置 multipart boundary,交由 curl 生成。
| 素材 | 格式与单文件上限 | 数量与时长限制 |
|---|---|---|
| 图片 | JPEG / PNG / WebP,30 MiB | 参考图:2.0 系列最多 9 张,2.5 最多 30 张;首帧和尾帧各 1 张。 |
| 视频 | MP4 / MOV,50 MiB;参考素材至少 480p | 2.0 系列最多 3 段,单段 2–15 秒、合计 ≤15 秒;2.5 最多 10 段,单段 2–30 秒、合计 ≤30 秒。 |
| 音频 | MP3 / WAV,15 MiB | 2.0 系列最多 3 段,单段 2–15 秒、合计 ≤15 秒;2.5 最多 10 段,单段 2–30 秒、合计 ≤30 秒。视频与音频分别累计。 |
- 成功返回 HTTP 200,字段包括 url、asset_token、expires_at(Unix 秒)、kind、mime_type、size_bytes;图片/视频含宽高,视频/音频含可信 duration_seconds。
- 创建任务时原样使用返回的 URL 与 asset_token,必须与上传时同一 Key、分组和型号,不能更换 URL 或跨 Key 复用。素材约 50 分钟内有效,以 expires_at 为准;创建新任务时至少剩余 60 秒,过期请重新上传。
- 图片/视频单边不超过 4096,像素总数不超过 4096×2160。真实格式与时长会被校验;上传成功不代表生成一定受理。
- 参考素材数量是协议上限,仍需匹配当前能力。上传本身不产生视频生成费;同一 Key 请串行上传,遇到 429 按 Retry-After 重试。
curl --fail-with-body --silent --show-error \
'https://api.dacall.ai/api/v3/contents/generations/assets?model=SEEDANCE_2_0_MINI&kind=image' \
-H "Authorization: Bearer $DACALL_API_KEY" \
-F 'file=@./first-frame.png'媒体对象与素材角色
content 保留一个文本对象,再按模式追加以下对象。URL 与凭证必须使用实际上传响应;下列为占位结构,不能直接用于生成。
| type | role | 媒体字段 |
|---|---|---|
| image_url | first_frame / last_frame / reference_image | image_url: {url, asset_token} |
| video_url | reference_video | video_url: {url, asset_token} |
| audio_url | reference_audio | audio_url: {url, asset_token} |
- 单首帧:1 个 first_frame;首尾帧:1 个 first_frame 加 1 个 last_frame,不能只传尾帧。
- 参考素材使用 reference_image、reference_video、reference_audio;如需参考音频,必须同时提供参考图或视频。
- 视频与音频的 duration_seconds 由上传探测确定,不要作为媒体对象字段传回,也不要自行声明计费时长。
首帧生成请求示例
先确认能力接口开放该组合,再用同一型号上传图片,将返回值填入下方 JSON 并保存为 task.json。向创建接口 POST,携带 Authorization、Content-Type: application/json 和本订单唯一的 Idempotency-Key。此操作会实际计费。
{
"model": "SEEDANCE_2_0_MINI",
"content": [
{
"type": "text",
"text": "让画面中的橘色积木缓慢向右移动,保持主体形状,固定镜头。"
},
{
"type": "image_url",
"role": "first_frame",
"image_url": {
"url": "https://example.com/replace-with-upload-url.png",
"asset_token": "REPLACE_WITH_UPLOAD_ASSET_TOKEN"
}
}
],
"resolution": "480p",
"duration": 4,
"ratio": "16:9",
"generate_audio": false
}首尾帧与多媒体请求变体
以下为 content 中追加的对象示例。使用 2.5 首尾帧时上传两张图,角色分别是 first_frame / last_frame,并设置 ratio=adaptive;不要混入参考素材。参考视频和音频模式可按下面结构追加,全部素材必须按同一型号上传。
- 参考音频输入不等于开启声音输出;若需要输出音轨,请选择能力允许的 generate_audio=true。
- 多段参考视频先合计可信时长,再向上取整计费;不要对每段分别取整。
[
{
"type": "video_url",
"role": "reference_video",
"video_url": {
"url": "https://example.com/replace-with-video-url.mp4",
"asset_token": "REPLACE_WITH_VIDEO_TOKEN"
}
},
{
"type": "audio_url",
"role": "reference_audio",
"audio_url": {
"url": "https://example.com/replace-with-audio-url.mp3",
"asset_token": "REPLACE_WITH_AUDIO_TOKEN"
}
}
]创建文生任务与提交方式
先在服务端安全设置 DACALL_API_KEY 环境变量。为每个新订单生成并持久化一个 UUID,替换下面的 Idempotency-Key;本订单重试时沿用该值与原请求体。成功受理返回 HTTP 202,请立即持久化返回的 id。202 表示异步受理,不代表视频已经生成。 下例是纯文生请求;提交上述媒体 JSON 时使用相同接口和请求头,将 --data-binary 的值改为 @task.json。
curl --fail-with-body --silent --show-error \
'https://api.dacall.ai/api/v3/contents/generations/tasks' \
-H "Authorization: Bearer $DACALL_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: 3c824da0-b527-4aa5-8b28-934890c6ff98' \
--data-binary '{
"model": "SEEDANCE_2_0",
"content": [
{
"type": "text",
"text": "清晨的海边,海浪轻拍沙滩,镜头缓慢向前推进,自然光,电影质感。"
}
],
"resolution": "480p",
"duration": 5,
"ratio": "16:9",
"generate_audio": false
}'创建响应示例
以下展示任务标识与状态字段,省略 pricing 等报价字段。实际响应中的金额采用 USD 十进制字符串;请读取 pricing.retail_usd 获取本任务锁定的应付金额,不要在客户端写死价格。
{
"id": "dacall_vid_00000000-0000-4000-8000-000000000001",
"model": "SEEDANCE_2_0",
"status": "queued",
"billing_status": "held"
}查询任务
使用创建任务时的同一个 API Key 和返回的完整 id 查询,成功返回 HTTP 200。建议每 10 秒轮询一次,遇到限流遵循 Retry-After。客户端停止等待不会取消生成,稍后可继续查询。
- 不要更换 Key 或把 Key 移出原分组来查询已有任务;任务访问校验用户、Key 和分组归属。
- 已有任务不会因可用余额或 Key 额度耗尽而无法查询,但 Key 仍须有效且拥有原任务权限。
TASK_ID='替换为创建响应的 id'
curl --fail-with-body --silent --show-error \
"https://api.dacall.ai/api/v3/contents/generations/tasks/$TASK_ID" \
-H "Authorization: Bearer $DACALL_API_KEY"获取视频结果
status=succeeded 时读取 content.video_url。以下 URL 仅为示意,请使用实际返回值,并及时下载到自有存储;不要把结果 URL 当作永久存储地址,也不要向结果域名发送 dacall API Key。 示例省略 pricing 等报价字段,实际金额以任务响应为准。
{
"id": "dacall_vid_00000000-0000-4000-8000-000000000001",
"model": "SEEDANCE_2_0",
"status": "succeeded",
"billing_status": "settled",
"content": {
"video_url": "https://example.com/generated-video.mp4"
}
}任务与账单状态
| 字段 | 值 | 含义 / 处理 |
|---|---|---|
| status | queued | 排队,继续查询。 |
| status | submitting | 正在提交或确认受理,继续查询,勿创建重复订单。 |
| status | running | 生成中,继续查询。 |
| status | succeeded | 生成成功,读取 content.video_url。 |
| status | failed | 生成失败,检查 billing_status。 |
| billing_status | held | 费用已预扣 / 冻结,尚未最终结算。 |
| billing_status | settled | 成功任务已结算,不会再重复扣同一笔费用。 |
| billing_status | released | 失败任务的预扣费用已退回,Key 额度已释放。 |
- 生成状态与账单状态分别读取;不要只凭 HTTP 200 判断生成成功。
- 超时或暂时查不到结果不等于失败或退款。长时间停留在处理中,请携带任务 id 联系支持,保留原订单避免重复付费。
幂等与重试
- 同一 Key、同一分组下,相同 Idempotency-Key 与相同请求重放返回原任务,正常返回 HTTP 202,不重复创建或收费。
- 相同 Idempotency-Key 修改模型、提示词、时长等会返回 HTTP 409 idempotency_conflict。新业务订单才使用新的幂等键。
- 创建请求断网、超时或返回 5xx 时,保留原幂等键和请求体重试;不要立即换键重新提交。已获得任务 id 后优先查询。
- 已经受理的媒体任务重放必须保持原请求体(包括素材 URL/token)和幂等键;不要重新上传后替换原请求。已受理任务的重放不会因素材后来过期而变成新订单。
- 查询的网络错误、429 和 5xx 可退避重试;建议 10、20、40、60 秒递增,遵循 Retry-After。身份、参数与权限错误先修正原因,勿无限重试。
- DELETE 取消当前未开放,调用已有视频任务的取消接口返回 405。
计费说明
费用根据所用模型、清晰度、计费时长及当前账户适用的价格配置确定。任务创建时锁定报价,后续价格变更不追溯该任务。请以创建响应中的 pricing.retail_usd 和 billing_status 为准。
- 创建时占用账户资金及 Key 额度;成功结算一次,确认失败后退回预扣款及额度。
- 不按 Token 计费;查询和相同请求的幂等重放不会额外产生视频生成费。
- 计费秒数 = 输出秒数 + ceil(全部参考视频可信时长之和);无参考视频时只计算输出秒数。
- 例如,输出 4 秒,两个参考视频各 2.125 秒;先合计为 4.25 秒,再向上取整为 5 秒,最终按 9 秒计费。
- 图片、参考音频、生成声音、画幅与上传本身不另收附加费。
- pricing.retail_usd 为该任务锁定的应付金额;billing_status=released 时该任务最终收费为零。金额使用十进制处理,避免二进制浮点累计误差。
常见错误
鉴权和网关层可能返回其他错误。保留 HTTP 状态、响应体和 Request ID(如有);联系支持时提供发生时间、模型、任务 id 与错误信息,勿发送 API Key。
| HTTP / code | 含义 | 处理 |
|---|---|---|
| 400 / invalid_request_error | 缺失幂等键或请求无效 | 检查请求头、JSON 与必填字段。 |
| 400 / unsupported_price_combination | 组合未开放、未知字段或提示词含 -- | 查询并匹配完整能力记录,检查媒体结构、素材角色与模型限制。 |
| 401 | 鉴权失败 | 检查 Key 是否有效。 |
| 403 / insufficient_balance | 余额或 Key 额度不足 | 补充余额或调整 Key 额度。 |
| 403 / permission_error | 分组权限不满足 | 使用已开通 Seedance 的分组 Key。 |
| 403 / unsupported_quota_mode | 账户额度模式不兼容 | 联系支持调整账户配置。 |
| 404 / not_found_error | 任务不存在或不属于当前调用方 | 使用原 Key、原分组和完整任务 id。 |
| 409 / idempotency_conflict | 幂等键已被其他请求使用 | 恢复原请求;新订单使用新键。 |
| 429 | 触发限流 | 按 Retry-After 退避,降低并发。 |
| 503 / feature_disabled | 新任务创建暂时暂停 | 稍后重试,已有任务继续查询。 |
| 503 / api_error | 暂时不可用 | 创建沿用原幂等键重试;查询退避重试。 |
| 400 | 素材无效、过期或归属不符 | 使用同一 Key、分组和型号上传;新任务使用有效素材,已受理任务沿用原请求重放。 |
| 400 / 413 | 上传字段或文件体积不合要求 | 只提交一个 file 字段,检查非空文件及类型大小上限。 |
| 415 | 上传 Content-Type 不正确 | 使用 multipart/form-data;不要上传 JSON 或手写 boundary。 |
| 4xx / 5xx · media_upload_error | 素材上传未被接受 | 检查真实格式、大小、时长与型号限制,保留错误信息并按需联系支持。 |
dacall