跳到导航

Seedance 2.5

根据文本、首尾帧,或最多 30 张图片、10 段视频和 10 段音频作为参考,生成 4–30 秒的 480p、720p 或 1080p 视频;也可以编辑或延长视频。

  • 异步:创建调用返回任务 ID;任务成功后才能拿到视频(通常需要几分钟)。
  • 四种输入方式:纯文本、首帧、首尾帧,或任意组合的参考图、参考视频和参考音频(只传音频也可以)。
  • task_type 用来说明参考视频是用于生成新视频的素材、要编辑的视频,还是要延长的视频,这样请求会在你付费之前就被检查。
  • 默认生成声音,不额外收费;默认输出 MP4,可按需输出 MOV。
  • 按视频的尺寸和时长计费,另加所有参考视频的时长。失败的任务不收费。
POST/v1/videos/tasks试一试

在调试窗口里打开本模型,填入你的 BeatAPI API 密钥即可创建任务。调用是真实的,费用从你自己的余额中扣除。

模型 ID

四个 Seedance 模型共用这个接口。下方的取值直接来自网关契约;只有 Seedance 2.5 接受 task_type、output_format 和 seed。

模型 IDduration(秒)resolution参考图上限参考视频上限参考音频上限适用场景
seedance-2.54–30480p, 720p, 1080p301010需要最长 30 秒的片段、大量参考素材、编辑或延长视频,或输出 MOV。
seedance-24–15480p, 720p, 1080p, 4k933需要 4K 输出,或在相同分辨率下比 2.5 价格更低。
seedance-2-fast4–15480p, 720p933想在 480p 或 720p 下获得更低的价格,并保留 generate_audio。
seedance-2-mini4–15480p, 720p933最看重价格;480p 或 720p,没有 generate_audio 字段。

接口与鉴权

POST https://api.beatapi.io/v1/videos/tasks

Authorization string 必需

你的 BeatAPI API 密钥,以 Bearer <BEATAPI_API_KEY> 形式发送。在控制台创建密钥。密钥只能保存在你的服务端,不要放进浏览器或移动端应用。

请求体使用 JSON,并设置 Content-Type: application/json。Idempotency-Key 为可选:每个逻辑请求发送一个唯一值(最长 255 个字符),仅在重试完全相同的请求体时复用。24 小时内,用相同的键和请求体重试会再次返回第一次的响应,并带上 Idempotent-Replayed: true;相同的键搭配不同的请求体则返回 409 idempotency_conflict。非 2xx 的响应不会被保存,因此 400 或 402 之后的重试会重新执行。

请求流程

1

创建任务

向接口 POST 下方的参数。返回 201 表示任务已被接受,其价格已从你的余额中预留;任务在后台运行。保存 data.id。

2

等待任务完成

调用 GET /v1/tasks/{task_id},两次调用之间等待 data.poll_after_seconds 秒(图片 5 秒,视频 8 秒),直到 status 为 succeeded 或 failed。也可以为 task.succeeded 和 task.failed 注册 Webhook;仍需保留轮询作为兜底,因为因处理超时而终止的任务不会发送事件。

3

保存结果

状态为 succeeded 时,下载每个 data.output.media[].url 并保存你需要的文件;BeatAPI 不承诺结果链接的保留时长。状态为 failed 时,读取 data.error_code 和 data.error_message:预扣的金额已退回你的余额,data.retryable 表示再次发送相同请求是否可能成功。

输入模式

模式必填输入说明
文生视频model, prompt不要传任何媒体数组。
首帧model, prompt, images(1 个链接)视频从该图片开始,并沿用它的宽高比。
首尾帧model, prompt, images(2 个链接)images[0] 是首帧,images[1] 是尾帧。
参考素材model, prompt,以及 reference_images、reference_videos、reference_audios 中至少一个可任意组合,包括只传音频。不能与 images 同时使用。要编辑或延长参考视频,请使用 task_type。

请求参数

model string 必需

要运行的模型。

取值:seedance-2.5

取值有误时

  • 缺失:"model" is required
  • 把图片模型发到了这个接口:"model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint

prompt string 必需

视频中发生什么:主体、动作、镜头运动、风格和声音。使用参考素材时,请说明每个输入的用途。

长度:1–5000 个字符

  • 长度按字符计算(一个中日韩文字算一个字符)。
  • 按位置指代输入,例如“第一张参考图”或“第二段参考视频”。
  • 用参考视频生成新视频时,避免使用“替换”“移除”“延长”之类的词(replace、remove、extend),否则模型可能把请求理解为编辑;为保险起见,请发送 task_type: "reference"。对于 edit,说明要改什么、保留什么。对于 extend,描述接下来发生什么。

取值有误时

  • 缺失:"prompt" is required
  • 为空或超过长度上限:"prompt" has an unsupported length

images string[] 可选

首帧,或首帧加尾帧。

数量:1–2
每一项都必须是公网 https:// 链接。本地文件请先上传(POST /v1/files),再传入返回的 data.url。

  • 一个链接:视频从这张图片开始。两个链接:images[0] 是首帧,images[1] 是尾帧。
  • 视频沿用第一张图片的宽高比;aspect_ratio 不生效。
  • 需要更多图片,或图片只是引导视频而不是作为帧时,请改用 reference_images。

取值有误时

  • 超过两个链接:"images" accepts at most 2 items
  • 与任一 reference_* 字段同时使用:Cannot combine "images" with reference inputs in one task
  • 不是 https:// 链接:"images[0]" must be a public HTTPS URL

reference_images string[] 可选

用来引导视频内容、角色、商品或风格的图片。

数量:1–30
每一项都必须是公网 https:// 链接。本地文件请先上传(POST /v1/files),再传入返回的 data.url。

  • 图片按列表顺序使用;在提示词中按位置指代它们。

取值有误时

  • 超过数量上限:"reference_images" accepts at most 30 items
  • 与 images 同时使用:Cannot combine "images" with reference inputs in one task

reference_videos string[] 可选

用来提取动作、镜头运动或内容的视频,或要编辑、延长的视频(见 task_type)。

数量:1–10
每一项都必须是公网 https:// 链接。本地文件请先上传(POST /v1/files),再传入返回的 data.url。

  • 每个链接必须返回 MP4 或 MOV 文件,且其主机允许字节范围请求(byte-range):网关在创建任务之前会读取每段视频的时长,因为参考视频的秒数要计费。
  • task_type 为 edit 和 extend 时必填。

参考视频的每一秒都会计入价格(见计费)。请只保留你需要的部分。

取值有误时

  • 超过数量上限:"reference_videos" accepts at most 10 items
  • 无法读取该视频:A reference video could not be read: reference_videos[0]: its host does not allow byte-range requests. Send an MP4 or MOV file at a public HTTPS URL whose host allows byte-range requests.

reference_audios string[] 可选

要参照的音乐、人声或声音。只传音频、不带任何图片或视频参考也可以。

数量:1–10
每一项都必须是公网 https:// 链接。本地文件请先上传(POST /v1/files),再传入返回的 data.url。

  • WAV 和 MP3 会按下方限制进行检测;其他格式不经检测直接交给模型。

取值有误时

  • 超过数量上限:"reference_audios" accepts at most 10 items

duration integer 可选默认值: 5

视频时长,单位为秒,必须是整数。

默认值:5
范围:4–30

  • 不传时会发送 5——task_type 为 auto 和 reference 时同样如此。
  • 使用 task_type: "extend" 时请务必传:它是包含源视频在内的成片总时长。要给一段 5 秒的视频再延长 5 秒,请发送 10;不传则表示总共 5 秒。
  • 使用 task_type: "edit" 时请不要传:结果保持源视频的时长。

取值有误时

  • 超出范围或不是整数:"duration" is outside its supported range
  • 与 task_type: "edit" 一起发送:task_type "edit" keeps the reference video's length: leave "duration" out

aspect_ratio string 可选默认值: adaptive

视频的形状,以 宽:高 表示。adaptive 由模型根据输入自行选择。

可选值:adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16
默认值:adaptive

  • 当 images 携带首帧时会被忽略:视频沿用该帧的宽高比。
  • task_type 为 edit 或 extend 时,请不要传,或传 adaptive:结果保持源视频的形状。
  • 使用 adaptive(或传帧)时,预扣按所选分辨率下的最大画幅估算,因此可能比固定比例略高。

取值有误时

  • 取值不在列表中:"aspect_ratio" must be one of: [adaptive 21:9 16:9 4:3 1:1 3:4 9:16]
  • edit 或 extend 时传了固定比例:task_type "edit" keeps the reference video's aspect ratio: leave "aspect_ratio" out or send "adaptive"

resolution string 可选默认值: 720p

输出分辨率。分辨率越高,每秒越贵。

可选值:480p, 720p, 1080p
默认值:720p

  • 只能用小写。Seedance 2.5 不提供 4K(请使用 seedance-2)。

取值有误时

  • 取值不在列表中(例如 4k 或 720P):"resolution" must be one of: [480p 720p 1080p]

generate_audio boolean 可选默认值: true

视频是否带生成的音轨。两种情况价格相同。

默认值:true

取值有误时

  • 不是 true 或 false:"generate_audio" must be a boolean

seed integer 可选

固定一个数字可以让结果更容易复现;不传或传 -1 则使用随机种子。

范围:-1–4294967295

  • 相同的种子配合相同的请求,得到的结果相近,但不保证完全一致。

取值有误时

  • 超出范围:"seed" is outside its supported range

task_type string 可选

如何处理 reference_videos:用它们生成新视频(reference)、编辑其中一个(edit),或延长其中一个(extend)。auto(或不传)由模型根据提示词判断。

可选值:auto, reference, edit, extend

  • 指明类型后,网关可以在扣费之前检查请求;各类型的规则见下方任务类型。
  • 使用 auto 或 reference 时总会发送一个时长(不传则为 5),因此模型理解为编辑的提示词,会在提交后失败(会退款),或被当作编辑重新运行,并按源视频的时长计费。如果你的意图是编辑,请发送 edit。

取值有误时

  • 取值不在列表中:"task_type" must be one of: [auto reference edit extend]
  • edit 或 extend 但没有参考视频:task_type "edit" needs a video in "reference_videos"
  • reference 但没有任何参考输入:task_type "reference" needs reference inputs

output_format string 可选

结果的容器格式:mp4(不传时使用)或 mov。价格相同。

可选值:mp4, mov

  • mov 适合后续剪辑。它并非始终可用;不可用时,请求会在扣费之前被拒绝,并附一句话说明你当前可以使用哪些格式。

取值有误时

  • 取值不在列表中:"output_format" must be one of: [mp4 mov]

网关还会在创建任务之前检查以下组合:

  • images 不能与参考素材字段同时使用。

输入素材限制

网关会在创建任务之前读取每一项输入,超出这些限制的输入会被拒绝,并返回点名该输入的 400 bad_request。不扣费。

素材创建任务前检查的限制
图片宽和高均为 300–6000 像素;宽高比(宽 ÷ 高)0.4–2.5;每个不超过 30 MB
视频每段 2–30 秒;合计不超过 30 秒;宽和高均为 300–6000 像素;宽高比(宽 ÷ 高)0.4–2.5;每帧 407,696–8,295,044 像素(宽 × 高);24–60 FPS;每个不超过 200 MB
音频每段 2–30 秒;合计不超过 30 秒;每个不超过 15 MB
  • 参考视频必须是 MP4 或 MOV,位于公网 HTTPS 链接上,且其主机响应字节范围请求。无法读取时长的视频一律被拒绝,因为它的秒数要计费。
  • 主机上报图片尺寸时才会检查图片尺寸。请使用 JPEG、PNG 或 WebP;模型无法使用的文件会在提交后以 bad_request 使任务失败,并退款。
  • 限制按以下顺序报告:时长、边长、宽高比、像素、帧率和大小。message 会按列表和位置点名该输入,位置与字段错误一样从 0 开始计数:reference_videos[0] is 1.5 seconds long; this model takes reference video of 2 to 30 seconds.
  • 时长的测量有 0.1 秒的容差。尺寸只有在主机上报时才会检查。
  • 图片和音频链接只有在主机返回 4xx 错误或返回空文件时才会在创建时被拒绝,例如 images[1] could not be downloaded: the URL returned HTTP 404.;它们的其他问题会在提交后才暴露。
  • 帧率为 23.976 FPS 的片段会被视为低于 24 而被拒绝;请以 24 FPS 或更高重新导出。
  • 有本地文件?先用 POST /v1/files 上传,再传入返回的 data.url。

任务类型

“需要”和“不要传”两列在创建任务时检查:违反规则的请求会以 400 bad_request 被拒绝,且不收费。

task_type作用需要不要传
auto 或不传由模型根据提示词判断参考视频是素材、要编辑的视频还是要延长的视频。——
reference用参考素材生成新视频。至少一个 reference_* 输入—
edit修改一段参考视频。结果保持其时长和宽高比。reference_videosduration;aspect_ratio(或传 adaptive)
extend接着一段参考视频继续,并保持其宽高比。duration 是包含源视频在内的总时长。reference_videosaspect_ratio(或传 adaptive)
  • 任务创建之后仍可能失败(bad_request,会退款):编辑的源视频短于 4 秒或长于 30 秒,以及模型把提示词理解为与你指定的不同的任务类型。message 会说明该改什么——应发送哪个 task_type,或如何调整提示词的措辞。

按任务类型撰写提示词

你想要发送提示词这样写
用参考素材生成新视频task_type: "reference"描述一个新镜头,并说明每个参考素材的用途。避免使用“替换”“移除”“延长”或“接着”(replace、remove、extend、continue)。
修改一段视频task_type: "edit"说明要添加、移除或替换什么,以及哪些内容必须保持不变。
接着一段视频继续task_type: "extend"描述接下来发生什么,并把 duration 设为总时长。

该模型不接受的字段

发送下列字段会在扣费之前被拒绝,而不是被忽略:

  • watermark、quality、sound、multi_shots 或 character_orientation → field "watermark" is not supported by model seedance-2.5(其中是你发送的字段名)。
  • 任何 BeatAPI 视频模型都不使用的名称 → unknown field: <name>。
  • duration: -1(由模型决定时长)→ "duration" is outside its supported range;请发送整数秒数。

请求示例

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5",
"prompt": "A slow tracking shot through a rain-lit night market, neon reflections on wet stone, ambient crowd sound",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p"
}'

文生视频

一段 5 秒、带声音的 720p 横版视频。

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5",
"prompt": "A slow tracking shot through a rain-lit night market, neon reflections on wet stone, ambient crowd sound",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p"
}'

首尾帧

视频从第一张图片过渡到第二张图片。

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5",
"prompt": "The camera pushes in from the bottle on the table to the singer on a neon stage in one continuous move",
"images": [
"https://media.beatapi.io/samples/smart-bottle.png",
"https://media.beatapi.io/samples/neon-singer.png"
],
"duration": 6,
"resolution": "720p"
}'

参考图与参考音频

参照角色图片和音乐片段生成的表演。

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5",
"prompt": "The singer from the first reference image performs on stage in time with the reference music, warm spotlights, slow orbiting camera",
"reference_images": [
"https://media.beatapi.io/samples/neon-singer.png"
],
"reference_audios": [
"https://media.beatapi.io/samples/neon-singer-preview.mp3"
],
"duration": 8,
"resolution": "720p",
"task_type": "reference"
}'

参考图、参考视频与参考音频

请把视频链接换成你自己的 MP4 或 MOV。参考视频的每一秒都会计费(见计费)。

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5",
"prompt": "A product film: the bottle from the first reference image on a turntable, camera movement like the first reference video, cut to the beat of the reference music",
"reference_images": [
"https://media.beatapi.io/samples/smart-bottle.png"
],
"reference_videos": [
"https://your-cdn.example.com/clips/source.mp4"
],
"reference_audios": [
"https://media.beatapi.io/samples/neon-singer-preview.mp3"
],
"duration": 8,
"resolution": "720p",
"task_type": "reference"
}'

编辑视频

请把链接换成你自己的 4 到 30 秒的 MP4 或 MOV。不要传 duration 和 aspect_ratio:结果保持源视频的时长和形状。

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5",
"prompt": "Change the jacket of the person in the first reference video to bright red; keep everything else the same",
"reference_videos": [
"https://your-cdn.example.com/clips/source.mp4"
],
"resolution": "720p",
"task_type": "edit",
"output_format": "mov"
}'

延长视频

请把链接换成你自己的视频。源视频为 5 秒时,duration: 10 会再延长五秒。

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5",
"prompt": "The car keeps driving along the coast road as the sun sets, the camera rises to a wide aerial view",
"reference_videos": [
"https://your-cdn.example.com/clips/source.mp4"
],
"duration": 10,
"resolution": "720p",
"task_type": "extend"
}'

响应

创建任务(201)

任务对象。任务成功之前 output 为 null。标注“运行中”的字段会在任务结束后消失。

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "seedance-2.5",
"capability_version": 1,
"media_type": "video",
"model": "seedance-2.5",
"status": "queued",
"stage": "queued",
"created_at": 1791993600,
"updated_at": 1791993600,
"completed_at": null,
"poll_after_seconds": 8,
"output": null,
"usage": {
"credits_reserved": 1.148671,
"credits_settled": 0,
"credits_refunded": 0,
"credits_charged": 1.148671,
"billable_duration_seconds": 5
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}
字段类型说明
data.idstring任务 ID:task_ 后接 32 位字母和数字。用于轮询以及匹配 Webhook 事件。
data.objectstring固定为 task。
data.task_kindstringimage 或 video。
data.capability_idstring你发送的模型 ID。
data.capability_versioninteger模型的契约版本,当前为 1。
data.media_typestringimage 或 video。
data.modelstring你发送的模型 ID(与 capability_id 相同)。
data.statusstringqueued、processing、succeeded 或 failed。只有后两个是终态。
data.stagestring与 status 相同;为旧版客户端保留。
data.created_atinteger任务创建时间,Unix 秒。
data.updated_atinteger最后一次变更时间,Unix 秒。
data.completed_atinteger | null任务结束时间,Unix 秒;运行中为 null。
data.poll_after_secondsinteger运行中:下一次轮询前需要等待的秒数(图片 5,视频 8)。
data.typical_secondsobject运行中且近期样本足够时出现:在最近的 window 内,根据 samples 个任务统计的完成时间 p50 和 p90,单位为秒。
data.outputobject | null任务结果;status 为 succeeded 之前为 null。见下方输出字段。
data.usage.credits_reservednumber创建任务时从你的余额中预扣的美元金额。
data.usage.credits_chargednumber该任务的费用(美元);失败的任务为 0。
data.usage.credits_settlednumber最终结算扣除的美元金额;任务成功时设置,否则为 0。
data.usage.credits_refundednumber退回你余额的美元金额;失败的任务在退款记录完成后等于预扣金额。
data.usage.billable_duration_secondsinteger仅视频:计价所依据的秒数。模型未上报时长时不出现。
data.request_idstring请求 ID。联系支持时请附上。
data.error_codestring | null失败码;任务未失败时为 null。
data.error_messagestring | null出了什么问题以及该改什么;任务未失败时为 null。

任务完成

GET /v1/tasks/{task_id} 返回 HTTP 200 和 status: "succeeded",结果在 data.output 中。

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "seedance-2.5",
"capability_version": 1,
"media_type": "video",
"model": "seedance-2.5",
"status": "succeeded",
"stage": "succeeded",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": {
"media": [
{
"type": "video",
"url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.mp4",
"mime_type": "video/mp4"
}
],
"r2_url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.mp4"
},
"usage": {
"credits_reserved": 1.148671,
"credits_settled": 1.148671,
"credits_refunded": 0,
"credits_charged": 1.148671,
"billable_duration_seconds": 5
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}

输出字段

字段类型说明
output.mediaobject[]生成的文件;该模型只有一个视频。
output.media[].typestring固定为 video。
output.media[].urlstring已保存视频的 HTTPS 链接。请下载并自行保存;不承诺保留期限。
output.media[].mime_typestringvideo/mp4,output_format: "mov" 时为 video/quicktime。
output.r2_urlstring视频链接的重复,供旧版客户端使用。请读取 media。

任务失败

失败的任务在 GET /v1/tasks/{task_id} 上仍然是 HTTP 200:失败信息在响应体里。预扣金额会全额退回,因此不会扣费。

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "seedance-2.5",
"capability_version": 1,
"media_type": "video",
"model": "seedance-2.5",
"status": "failed",
"stage": "failed",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": null,
"usage": {
"credits_reserved": 1.148671,
"credits_settled": 0,
"credits_refunded": 1.148671,
"credits_charged": 0,
"billable_duration_seconds": 5
},
"retryable": true,
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": "processing_failed",
"error_message": "The task failed during processing on our side. Retry; a failed task is refunded."
}
}
字段类型说明
data.error_codestringbad_request 和 content_policy_violation(需修改请求)之一,或 processing_unavailable、processing_timeout、processing_failed 和 result_transfer_failed(稍后重试)之一。见错误码。
data.error_messagestring一句话,指出问题和处理方式。
data.retryableboolean仅在任务失败时出现:为 true 表示再次发送相同请求可能成功。
data.usageobject退款记录完成后(通常就在任务失败的那一刻):credits_charged 和 credits_settled 为 0;credits_refunded 等于 credits_reserved。

完整示例

创建任务,按服务端给出的轮询提示等待,然后打印结果链接。请在环境变量中设置 BEATAPI_API_KEY 并安装 requests。

import os
import time
import uuid
import requests
API = "https://api.beatapi.io"
HEADERS = {"Authorization": f"Bearer {os.environ['BEATAPI_API_KEY']}"}
def create_task(body: dict) -> dict:
# One Idempotency-Key per logical request: a retry with the same key cannot create a second task.
headers = {**HEADERS, "Idempotency-Key": str(uuid.uuid4())}
for attempt in range(3):
response = requests.post(f"{API}/v1/videos/tasks", headers=headers, json=body, timeout=60)
if response.status_code in (429, 503) and attempt < 2:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
break
try:
payload = response.json()
except ValueError: # an edge error page is not JSON
response.raise_for_status()
raise
if not response.ok:
error = payload["error"]
raise RuntimeError(f"{response.status_code} {error['code']}: {error['message']} (request_id={error.get('request_id')})")
return payload["data"]
def wait_for_task(task_id: str, timeout_seconds: int = 1800) -> dict:
deadline = time.monotonic() + timeout_seconds
while time.monotonic() < deadline:
response = requests.get(f"{API}/v1/tasks/{task_id}", headers=HEADERS, timeout=30)
if response.status_code == 429 or response.status_code >= 500:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
response.raise_for_status()
task = response.json()["data"]
if task["status"] in ("succeeded", "failed"):
return task
time.sleep(task.get("poll_after_seconds", 5))
raise TimeoutError(f"task {task_id} is still running; keep polling later")
task = create_task({
"model": "seedance-2.5",
"prompt": "A slow tracking shot through a rain-lit night market, neon reflections on wet stone, ambient crowd sound",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p"
})
print("created", task["id"])
task = wait_for_task(task["id"])
if task["status"] == "failed":
raise SystemExit(f"{task['error_code']}: {task['error_message']}")
for item in task["output"]["media"]:
print(item["url"])

计费

  • 价格取决于视频的尺寸和时长:秒数越多、分辨率越高、画幅越大,价格越高。声音和 output_format 不影响价格;参考图和参考音频不增加费用。
  • 没有参考视频时,16:9 的片段每秒约 0.106(480p)、0.106(480p)、0.228(720p)或 $0.564(1080p)。其他宽高比相差几个百分点。
  • 使用 reference_videos 时,整个请求改按较低的“含视频输入”费率计算,且参考视频的每一秒都与输出的一秒同等计入:16:9 下,每秒输出加参考约 0.064(480p)、0.064(480p)、0.137(720p)或 $0.337(1080p)。
  • 下表按 8 秒的片段列出;其中“含视频输入”的行包含一段 8 秒的参考视频。
  • 编辑会为源视频付两次费——一次作为参考,一次作为输出(输出保持源视频的时长,向上取整到整秒)。usage.billable_duration_seconds 显示输出的秒数。
  • 价格在创建任务时预留。使用 adaptive 或传帧时,预留按该分辨率下的最大画幅估算。你支付预留金额;如果交付的视频实际费用更高,则按实际金额支付。
  • 很短的参考视频可能按最短计费时长收费,结算金额因此可能高于预扣金额;任务完成后,usage 显示实际扣费。
  • 失败的任务(包括提交后被内容审核拒绝的任务)全额退款。

当前牌价,与价格页一致。享有协商折扣的账户实付更低;任务的 data.usage 始终显示实际扣费金额。

选项牌价(美元)
8 秒 · 480p · 无视频输入$0.851963
8 秒 · 480p · 有视频输入$1.019707
8 秒 · 720p · 无视频输入$1.832178
8 秒 · 720p · 有视频输入$2.192918
8 秒 · 1080p · 无视频输入$4.534641
8 秒 · 1080p · 有视频输入$5.403976

常见错误

错误或现象原因处理方式
400 resolution "1080p" is not available for this model right now; available: …当前没有任何服务该模型的线路接受该取值;aspect_ratio 也可能出现同样的情况。请使用列出的取值之一,或稍后重试。
400 field "watermark" is not supported by model seedance-2.5传了该模型不接受的字段(还有 quality、sound)。删除该字段。
400 "resolution" must be one of: [480p 720p 1080p]使用了 4k、2k,或大写形式如 720P。发送 480p、720p 或 1080p;需要 4K 请使用 seedance-2。
400 "duration" is outside its supported range不是范围内的整数,或以字符串形式发送。发送整数,例如 5。
400 Cannot combine "images" with reference inputs in one task同一请求中同时使用了帧和 reference_*。二选一:用帧或用参考素材。有多张图片时,请全部放进 reference_images。
400 task_type "edit" keeps the reference video's length: leave "duration" out编辑时传了 duration。删除 duration。
400 A reference video could not be read: reference_videos[0]: …不是 MP4 或 MOV、主机不支持字节范围请求、404,或文件为空。把视频放到支持范围请求的公网 HTTPS 存储上,或用 POST /v1/files 上传。
400 The reference videos run 35 seconds in total; this model takes at most 30.参考视频的总时长过长。裁剪或去掉部分视频。
任务 failed,错误码 bad_request:“Seedance read the prompt as an edit of the reference video …”使用 auto,提示词听起来像编辑:总会发送一个时长(默认 5 秒),而编辑会保持源视频的时长。发送 task_type: "edit" 且不带 duration 和 aspect_ratio;或发送 task_type: "reference",并用描述新镜头的提示词。
任务 failed,错误码 bad_request:“For task_type “edit”, the video being edited must be 4 to 30 seconds long …”编辑的源视频短于 4 秒或长于 30 秒。裁剪或更换源视频;失败的任务已退款。
任务 failed,错误码 content_policy_violation提示词、某个输入或结果被内容审核拒绝(真人、公众人物、受版权保护的角色)。显示真人的输入可能被拒绝,且无法申请通过某张人脸。修改输入。原样重试仍会失败;不收费。
402 insufficient_credits余额低于预扣金额;较长的参考视频和 adaptive 会抬高预扣金额。充值、缩短参考视频,或选择固定的 aspect_ratio。

HTTP 错误速查

任务生成之前的错误会以非 2xx 响应返回,不扣费。请根据 error.code 或 error.retryable 判断处理方式;message 会指出问题所在。完整列表和重试策略见错误码。

{
"error": {
"code": "bad_request",
"message": "\"prompt\" is required",
"retryable": false,
"request_id": "req_5f0c2a9e4b7d4e31"
}
}
HTTP 状态码error.code处理方式
400bad_request, content_policy_violation修改请求;message 会点名出错的字段。不要原样重试。
401missing_api_key, invalid_api_key(旧版客户端可能看到 unauthorized)以 Authorization: Bearer <key> 发送有效的密钥。
402insufficient_credits充值,或提高密钥的额度,然后重新发送。
403forbidden该密钥或账户不能使用此模型(例如免费额度只覆盖部分模型)。不要原样重试。
404not_found在 GET /v1/tasks/{task_id} 上:该任务在此密钥所属账户下不存在。请检查 ID。
409idempotency_conflict换一个新的 Idempotency-Key,或等待使用该键的第一个请求完成。
429rate_limit_exceeded等待 Retry-After 秒(也见 error.retry_after_seconds)后重试。
500internal_error退避重试;若持续出现,请带上 request_id 联系支持。
503processing_unavailable, processing_timeout, processing_failed, result_transfer_failed未扣费。使用指数退避重试。

与 Seedance 2.0 的区别

Seedance 2.5Seedance 2.0、2.0 Fast、2.0 Mini
最长视频30 秒15 秒
参考素材数量最多 30 张图片、10 段视频、10 段音频最多 9 张图片、3 段视频、3 段音频
参考视频时长每段 2–30 秒,合计 30 秒每段 1.8–15 秒,合计 15 秒
仅音频参考支持不支持:至少需要一张图片或一段视频作参考
task_type(编辑、延长)支持不支持
output_format(MOV)支持不支持(MP4)
seed支持不支持
4K不支持仅 seedance-2

身份验证

AuthorizationBearer

Send your API key as Authorization: Bearer <BEATAPI_API_KEY>.

请求头

Idempotency-Keystring可选<=255 characters

请求体使用 JSON,并设置 Content-Type: application/json。Idempotency-Key 为可选:每个逻辑请求发送一个唯一值(最长 255 个字符),仅在重试完全相同的请求体时复用。24 小时内,用相同的键和请求体重试会再次返回第一次的响应,并带上 Idempotent-Replayed: true;相同的键搭配不同的请求体则返回 409 idempotency_conflict。非 2xx 的响应不会被保存,因此 400 或 402 之后的重试会重新执行。

请求

This endpoint expects an object.
modelenum必需

要运行的模型。

取值:seedance-2.5

取值有误时

  • 缺失:"model" is required
  • 把图片模型发到了这个接口:"model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint
允许的值:
promptstring必需1-5000 characters

视频中发生什么:主体、动作、镜头运动、风格和声音。使用参考素材时,请说明每个输入的用途。

长度:1–5000 个字符

  • 长度按字符计算(一个中日韩文字算一个字符)。
  • 按位置指代输入,例如“第一张参考图”或“第二段参考视频”。
  • 用参考视频生成新视频时,避免使用“替换”“移除”“延长”之类的词(replace、remove、extend),否则模型可能把请求理解为编辑;为保险起见,请发送 task_type: "reference"。对于 edit,说明要改什么、保留什么。对于 extend,描述接下来发生什么。

取值有误时

  • 缺失:"prompt" is required
  • 为空或超过长度上限:"prompt" has an unsupported length
aspect_ratioenum可选默认为 adaptive

视频的形状,以 宽:高 表示。adaptive 由模型根据输入自行选择。

可选值:adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16

默认值:adaptive

  • 当 images 携带首帧时会被忽略:视频沿用该帧的宽高比。
  • task_type 为 edit 或 extend 时,请不要传,或传 adaptive:结果保持源视频的形状。
  • 使用 adaptive(或传帧)时,预扣按所选分辨率下的最大画幅估算,因此可能比固定比例略高。

取值有误时

  • 取值不在列表中:"aspect_ratio" must be one of: [adaptive 21:9 16:9 4:3 1:1 3:4 9:16]
  • edit 或 extend 时传了固定比例:task_type "edit" keeps the reference video's aspect ratio: leave "aspect_ratio" out or send "adaptive"
durationinteger可选4-30默认为 5

视频时长,单位为秒,必须是整数。

默认值:5

范围:4–30

  • 不传时会发送 5——task_type 为 auto 和 reference 时同样如此。
  • 使用 task_type: "extend" 时请务必传:它是包含源视频在内的成片总时长。要给一段 5 秒的视频再延长 5 秒,请发送 10;不传则表示总共 5 秒。
  • 使用 task_type: "edit" 时请不要传:结果保持源视频的时长。

取值有误时

  • 超出范围或不是整数:"duration" is outside its supported range
  • 与 task_type: "edit" 一起发送:task_type "edit" keeps the reference video's length: leave "duration" out
generate_audioboolean可选默认为 true

视频是否带生成的音轨。两种情况价格相同。

默认值:true

取值有误时

  • 不是 true 或 false:"generate_audio" must be a boolean
imageslist of strings可选

首帧,或首帧加尾帧。

数量:1–2

每一项都必须是公网 https:// 链接。本地文件请先上传(POST /v1/files),再传入返回的 data.url。

  • 一个链接:视频从这张图片开始。两个链接:images[0] 是首帧,images[1] 是尾帧。
  • 视频沿用第一张图片的宽高比;aspect_ratio 不生效。
  • 需要更多图片,或图片只是引导视频而不是作为帧时,请改用 reference_images。

取值有误时

  • 超过两个链接:"images" accepts at most 2 items
  • 与任一 reference_* 字段同时使用:Cannot combine "images" with reference inputs in one task
  • 不是 https:// 链接:"images[0]" must be a public HTTPS URL
output_formatenum可选

结果的容器格式:mp4(不传时使用)或 mov。价格相同。

可选值:mp4, mov

  • mov 适合后续剪辑。它并非始终可用;不可用时,请求会在扣费之前被拒绝,并附一句话说明你当前可以使用哪些格式。

取值有误时

  • 取值不在列表中:"output_format" must be one of: [mp4 mov]
允许的值:
reference_audioslist of strings可选

要参照的音乐、人声或声音。只传音频、不带任何图片或视频参考也可以。

数量:1–10

每一项都必须是公网 https:// 链接。本地文件请先上传(POST /v1/files),再传入返回的 data.url。

  • WAV 和 MP3 会按下方限制进行检测;其他格式不经检测直接交给模型。

取值有误时

  • 超过数量上限:"reference_audios" accepts at most 10 items
reference_imageslist of strings可选

用来引导视频内容、角色、商品或风格的图片。

数量:1–30

每一项都必须是公网 https:// 链接。本地文件请先上传(POST /v1/files),再传入返回的 data.url。

  • 图片按列表顺序使用;在提示词中按位置指代它们。

取值有误时

  • 超过数量上限:"reference_images" accepts at most 30 items
  • 与 images 同时使用:Cannot combine "images" with reference inputs in one task
reference_videoslist of strings可选

用来提取动作、镜头运动或内容的视频,或要编辑、延长的视频(见 task_type)。

数量:1–10

每一项都必须是公网 https:// 链接。本地文件请先上传(POST /v1/files),再传入返回的 data.url。

  • 每个链接必须返回 MP4 或 MOV 文件,且其主机允许字节范围请求(byte-range):网关在创建任务之前会读取每段视频的时长,因为参考视频的秒数要计费。
  • task_type 为 edit 和 extend 时必填。

说明:参考视频的每一秒都会计入价格(见计费)。请只保留你需要的部分。

取值有误时

  • 超过数量上限:"reference_videos" accepts at most 10 items
  • 无法读取该视频:A reference video could not be read: reference_videos[0]: its host does not allow byte-range requests. Send an MP4 or MOV file at a public HTTPS URL whose host allows byte-range requests.
resolutionenum可选默认为 720p

输出分辨率。分辨率越高,每秒越贵。

可选值:480p, 720p, 1080p

默认值:720p

  • 只能用小写。Seedance 2.5 不提供 4K(请使用 seedance-2)。

取值有误时

  • 取值不在列表中(例如 4k 或 720P):"resolution" must be one of: [480p 720p 1080p]
允许的值:
seedinteger可选-1-4294967295

固定一个数字可以让结果更容易复现;不传或传 -1 则使用随机种子。

范围:-1–4294967295

  • 相同的种子配合相同的请求,得到的结果相近,但不保证完全一致。

取值有误时

  • 超出范围:"seed" is outside its supported range
task_typeenum可选

如何处理 reference_videos:用它们生成新视频(reference)、编辑其中一个(edit),或延长其中一个(extend)。auto(或不传)由模型根据提示词判断。

可选值:auto, reference, edit, extend

  • 指明类型后,网关可以在扣费之前检查请求;各类型的规则见下方任务类型。
  • 使用 auto 或 reference 时总会发送一个时长(不传则为 5),因此模型理解为编辑的提示词,会在提交后失败(会退款),或被当作编辑重新运行,并按源视频的时长计费。如果你的意图是编辑,请发送 edit。

取值有误时

  • 取值不在列表中:"task_type" must be one of: [auto reference edit extend]
  • edit 或 extend 但没有参考视频:task_type "edit" needs a video in "reference_videos"
  • reference 但没有任何参考输入:task_type "reference" needs reference inputs
允许的值:

响应

任务对象。任务成功之前 output 为 null。标注“运行中”的字段会在任务结束后消失。

错误

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
403
Forbidden Error
409
Conflict Error
429
Too Many Requests Error
500
Internal Server Error
503
Service Unavailable Error