curl https://api.nodylink.com/v2/videos/generations \
-H "Authorization: Bearer sk-你的密钥" \
-H "Content-Type: application/json" \
-d '{
"model": "Doubao-Seedance-2.5-full",
"content": [
{"type": "text", "text": "第一视角穿越雨后的霓虹街道,镜头稳定前行,音频1作为背景音乐"},
{"type": "audio_url", "audio_url": {"url": "https://example.com/bgm.mp3"}, "role": "reference_audio"}
],
"resolution": "1080p",
"ratio": "16:9",
"duration": 20
}'
import time
import requests
API_KEY = "sk-你的密钥"
BASE = "https://api.nodylink.com"
headers = {"Authorization": f"Bearer {API_KEY}"}
submit = requests.post(
f"{BASE}/v2/videos/generations",
headers=headers,
json={
"model": "Doubao-Seedance-2.5-full",
"content": [
{"type": "text", "text": "第一视角穿越雨后的霓虹街道,镜头稳定前行,音频1作为背景音乐"},
{"type": "audio_url", "audio_url": {"url": "https://example.com/bgm.mp3"}, "role": "reference_audio"},
],
"resolution": "1080p",
"ratio": "16:9",
"duration": 20,
},
).json()
task_id = submit["id"]
def video_url(data):
task = data.get("task") or {}
if task.get("outputs"):
return task["outputs"][0]
return (data.get("content") or {}).get("video_url")
while True:
task = requests.get(f"{BASE}/v2/videos/generations/{task_id}", headers=headers).json()
if task["status"] == "SUCCESS":
print(video_url(task["data"]))
break
if task["status"] == "FAILURE":
raise RuntimeError(task["fail_reason"])
time.sleep(10)
const API_KEY = "sk-你的密钥";
const BASE = "https://api.nodylink.com";
const headers = {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
};
const submit = await fetch(`${BASE}/v2/videos/generations`, {
method: "POST",
headers,
body: JSON.stringify({
model: "Doubao-Seedance-2.5-full",
content: [
{ type: "text", text: "第一视角穿越雨后的霓虹街道,镜头稳定前行,音频1作为背景音乐" },
{ type: "audio_url", audio_url: { url: "https://example.com/bgm.mp3" }, role: "reference_audio" },
],
resolution: "1080p",
ratio: "16:9",
duration: 20,
}),
}).then((r) => r.json());
const videoUrl = (data) => data?.task?.outputs?.[0] ?? data?.content?.video_url;
while (true) {
const task = await fetch(`${BASE}/v2/videos/generations/${submit.id}`, { headers })
.then((r) => r.json());
if (task.status === "SUCCESS") {
console.log(videoUrl(task.data));
break;
}
if (task.status === "FAILURE") throw new Error(task.fail_reason);
await new Promise((r) => setTimeout(r, 10000));
}
{
"id": "a3e7c9d2-5f1b-4a86-b0d4-8c2e6f1a9b57",
"task_id": "a3e7c9d2-5f1b-4a86-b0d4-8c2e6f1a9b57",
"object": "video",
"model": "Doubao-Seedance-2.5-full",
"status": "queued",
"progress": 0,
"created_at": 1792000000
}
{
"code": "invalid_duration",
"message": "duration must be -1 or a positive integer",
"data": null
}
Doubao Seedance
Seedance 2.5 Full
Doubao Seedance 2.5 全分辨率视频生成:480p / 720p / 1080p,支持样片模式。请求体与火山方舟官方一致。
POST
/
v2
/
videos
/
generations
curl https://api.nodylink.com/v2/videos/generations \
-H "Authorization: Bearer sk-你的密钥" \
-H "Content-Type: application/json" \
-d '{
"model": "Doubao-Seedance-2.5-full",
"content": [
{"type": "text", "text": "第一视角穿越雨后的霓虹街道,镜头稳定前行,音频1作为背景音乐"},
{"type": "audio_url", "audio_url": {"url": "https://example.com/bgm.mp3"}, "role": "reference_audio"}
],
"resolution": "1080p",
"ratio": "16:9",
"duration": 20
}'
import time
import requests
API_KEY = "sk-你的密钥"
BASE = "https://api.nodylink.com"
headers = {"Authorization": f"Bearer {API_KEY}"}
submit = requests.post(
f"{BASE}/v2/videos/generations",
headers=headers,
json={
"model": "Doubao-Seedance-2.5-full",
"content": [
{"type": "text", "text": "第一视角穿越雨后的霓虹街道,镜头稳定前行,音频1作为背景音乐"},
{"type": "audio_url", "audio_url": {"url": "https://example.com/bgm.mp3"}, "role": "reference_audio"},
],
"resolution": "1080p",
"ratio": "16:9",
"duration": 20,
},
).json()
task_id = submit["id"]
def video_url(data):
task = data.get("task") or {}
if task.get("outputs"):
return task["outputs"][0]
return (data.get("content") or {}).get("video_url")
while True:
task = requests.get(f"{BASE}/v2/videos/generations/{task_id}", headers=headers).json()
if task["status"] == "SUCCESS":
print(video_url(task["data"]))
break
if task["status"] == "FAILURE":
raise RuntimeError(task["fail_reason"])
time.sleep(10)
const API_KEY = "sk-你的密钥";
const BASE = "https://api.nodylink.com";
const headers = {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
};
const submit = await fetch(`${BASE}/v2/videos/generations`, {
method: "POST",
headers,
body: JSON.stringify({
model: "Doubao-Seedance-2.5-full",
content: [
{ type: "text", text: "第一视角穿越雨后的霓虹街道,镜头稳定前行,音频1作为背景音乐" },
{ type: "audio_url", audio_url: { url: "https://example.com/bgm.mp3" }, role: "reference_audio" },
],
resolution: "1080p",
ratio: "16:9",
duration: 20,
}),
}).then((r) => r.json());
const videoUrl = (data) => data?.task?.outputs?.[0] ?? data?.content?.video_url;
while (true) {
const task = await fetch(`${BASE}/v2/videos/generations/${submit.id}`, { headers })
.then((r) => r.json());
if (task.status === "SUCCESS") {
console.log(videoUrl(task.data));
break;
}
if (task.status === "FAILURE") throw new Error(task.fail_reason);
await new Promise((r) => setTimeout(r, 10000));
}
{
"id": "a3e7c9d2-5f1b-4a86-b0d4-8c2e6f1a9b57",
"task_id": "a3e7c9d2-5f1b-4a86-b0d4-8c2e6f1a9b57",
"object": "video",
"model": "Doubao-Seedance-2.5-full",
"status": "queued",
"progress": 0,
"created_at": 1792000000
}
{
"code": "invalid_duration",
"message": "duration must be -1 or a positive integer",
"data": null
}
- 请求体与 火山方舟视频生成 API 官方格式一致。素材上限、时长和任务类型与 Seedance 2.5 相同,并开放全部输出分辨率。
- 支持样片模式:先用 480p 低成本出一段样片,确认画面、运镜、动作和对提示词的理解后,再基于这段样片出 1080p 正式片。正式片和样片画面基本一致。
- 异步接口:提交后立即返回任务
id,再调用 查询视频任务 获取结果。 - 计费与时长、分辨率、是否包含参考视频相关,见 模型价格。任务失败自动退款。
模型
| 模型 ID | 说明 | 分辨率 |
|---|---|---|
Doubao-Seedance-2.5-full | 全分辨率。支持文生视频、首尾帧、多模态参考、视频编辑、视频延长和样片模式 | 480p / 720p / 1080p |
分辨率
| 分辨率 | 位深 | 说明 |
|---|---|---|
480p | 8bit | 样片模式的样片必须使用这一档 |
720p | 8bit | 直接生成时可用 |
1080p | 10bit,H.265/HEVC | 样片模式的正式片必须使用这一档 |
1080p 使用 10bit 位深和 H.265/HEVC 编码,色彩层次更细。少数播放器无法解码时,换用 VLC、MPV 或 QuickTime Player。显示 各宽高比的输出像素
显示 各宽高比的输出像素
| 分辨率 | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 |
|---|---|---|---|---|---|---|
| 480p | 854×480 | 752×560 | 640×640 | 560×752 | 480×854 | 992×432 |
| 720p | 1280×720 | 1112×834 | 960×960 | 834×1112 | 720×1280 | 1470×630 |
| 1080p | 1920×1080 | 1664×1248 | 1440×1440 | 1248×1664 | 1080×1920 | 2206×946 |
draft,或传 "draft": false。两步样片流程见 样片模式。
curl https://api.nodylink.com/v2/videos/generations \
-H "Authorization: Bearer sk-你的密钥" \
-H "Content-Type: application/json" \
-d '{
"model": "Doubao-Seedance-2.5-full",
"content": [
{"type": "text", "text": "第一视角穿越雨后的霓虹街道,镜头稳定前行,音频1作为背景音乐"},
{"type": "audio_url", "audio_url": {"url": "https://example.com/bgm.mp3"}, "role": "reference_audio"}
],
"resolution": "1080p",
"ratio": "16:9",
"duration": 20
}'
import time
import requests
API_KEY = "sk-你的密钥"
BASE = "https://api.nodylink.com"
headers = {"Authorization": f"Bearer {API_KEY}"}
submit = requests.post(
f"{BASE}/v2/videos/generations",
headers=headers,
json={
"model": "Doubao-Seedance-2.5-full",
"content": [
{"type": "text", "text": "第一视角穿越雨后的霓虹街道,镜头稳定前行,音频1作为背景音乐"},
{"type": "audio_url", "audio_url": {"url": "https://example.com/bgm.mp3"}, "role": "reference_audio"},
],
"resolution": "1080p",
"ratio": "16:9",
"duration": 20,
},
).json()
task_id = submit["id"]
def video_url(data):
task = data.get("task") or {}
if task.get("outputs"):
return task["outputs"][0]
return (data.get("content") or {}).get("video_url")
while True:
task = requests.get(f"{BASE}/v2/videos/generations/{task_id}", headers=headers).json()
if task["status"] == "SUCCESS":
print(video_url(task["data"]))
break
if task["status"] == "FAILURE":
raise RuntimeError(task["fail_reason"])
time.sleep(10)
const API_KEY = "sk-你的密钥";
const BASE = "https://api.nodylink.com";
const headers = {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
};
const submit = await fetch(`${BASE}/v2/videos/generations`, {
method: "POST",
headers,
body: JSON.stringify({
model: "Doubao-Seedance-2.5-full",
content: [
{ type: "text", text: "第一视角穿越雨后的霓虹街道,镜头稳定前行,音频1作为背景音乐" },
{ type: "audio_url", audio_url: { url: "https://example.com/bgm.mp3" }, role: "reference_audio" },
],
resolution: "1080p",
ratio: "16:9",
duration: 20,
}),
}).then((r) => r.json());
const videoUrl = (data) => data?.task?.outputs?.[0] ?? data?.content?.video_url;
while (true) {
const task = await fetch(`${BASE}/v2/videos/generations/${submit.id}`, { headers })
.then((r) => r.json());
if (task.status === "SUCCESS") {
console.log(videoUrl(task.data));
break;
}
if (task.status === "FAILURE") throw new Error(task.fail_reason);
await new Promise((r) => setTimeout(r, 10000));
}
{
"id": "a3e7c9d2-5f1b-4a86-b0d4-8c2e6f1a9b57",
"task_id": "a3e7c9d2-5f1b-4a86-b0d4-8c2e6f1a9b57",
"object": "video",
"model": "Doubao-Seedance-2.5-full",
"status": "queued",
"progress": 0,
"created_at": 1792000000
}
{
"code": "invalid_duration",
"message": "duration must be -1 or a positive integer",
"data": null
}
鉴权
请求参数
string
必填
模型 ID:
Doubao-Seedance-2.5-full。array
必填
输入内容数组。直接生成时,每一项的结构与 Seedance 2.5 相同。样片转正式片时,数组里只放一个
在提示词中可以用「图片1」「视频1」「音频1」指代参考素材,序号按同类素材在数组中的顺序从 1 开始。
draft_task。显示 内容项与上限
显示 内容项与上限
type | role | 上限 |
|---|---|---|
text | 无 | 1 条 |
image_url | first_frame | 1 张 |
image_url | last_frame | 1 张,需与首帧一起使用 |
image_url | reference_image | 最多 30 张 |
video_url | reference_video | 最多 10 个,单个 2~30 秒,总时长不超过 30 秒 |
audio_url | reference_audio | 最多 10 段,单段 2~30 秒,总时长不超过 30 秒 |
draft_task | 无 | 1 个,仅用于把样片转成正式片 |
string
默认值:"adaptive"
宽高比:
16:9、4:3、1:1、3:4、9:16、21:9,或 adaptive。首帧 / 首尾帧、视频编辑、视频延长任务只能使用 adaptive。integer
默认值:"5"
视频时长(秒),取值 4~30。传
-1 时由模型自动决定时长,提交时按 30 秒上限预扣费用,完成后按实际结果结算。视频编辑任务只能使用 -1。boolean
默认值:"true"
是否生成与画面同步的音频。
boolean
默认值:"false"
是否开启样片模式。仅
Doubao-Seedance-2.5-full 支持。true 时 resolution 必须是 480p,其他分辨率返回 400。integer
随机种子,取值 -1 到 2^32-1。
boolean
默认值:"false"
是否添加「AI 生成」水印。
boolean
默认值:"false"
是否额外返回视频最后一帧的图片,用于连续生成。
string
默认值:"mp4"
输出格式:
mp4 或 mov。mov 面向调色、抠像等后期,部分播放器无法直接播放。array
增强工具。目前支持联网搜索:
[{"type": "web_search"}]。素材要求
| 素材 | 要求 |
|---|---|
| 图片 | jpeg / png / webp / bmp / tiff / gif / heic / heif;宽高比 0.4~2.5;边长 300~6000 px;单张小于 30 MB |
| 视频 | mp4 / mov,H.264 或 H.265 编码;480p~1080p;宽高比 0.4~2.5;帧率 24~60;单个不超过 200 MB |
| 音频 | wav / mp3;单个不超过 15 MB |
任务类型与限制
模型会根据参考素材和提示词意图判断任务类型。视频编辑、视频延长和首尾帧任务对参数有硬性要求,不满足时任务会在执行阶段失败(费用自动退回)。| 任务类型 | 触发方式 | 限制 |
|---|---|---|
| 文生视频 | 只有文本 | 无 |
| 参考生视频 | 参考素材 + 普通描述 | 无。提示词中避免出现「编辑」「延长」「续写」「删除」「替换」等词,以免被判为其他任务 |
| 视频编辑 | 参考视频 + 提示词含「编辑视频」「增加」「删除」「修改」「替换」等 | ratio 只能为 adaptive,duration 只能为 -1;待编辑视频为 4~30 秒 |
| 视频延长 | 参考视频 + 提示词含「向前延长」「向后延长」「续写」等 | ratio 只能为 adaptive |
| 首帧 / 首尾帧 | 图片 role 为 first_frame / last_frame | ratio 只能为 adaptive |
样片模式
只有Doubao-Seedance-2.5-full 支持。适合要反复尝试的镜头:不满意的样片直接丢掉,只为选中的那一条付 1080p 的费用。样片按 480p 计费,正式片按 1080p 另行计费。
普通 480p 任务不能当作样片。创建时要带 "draft": true。
第 1 步:出样片
正常提交,加"draft": true,resolution 必须是 480p(其他分辨率返回 400):
curl https://api.nodylink.com/v2/videos/generations \
-H "Authorization: Bearer sk-你的密钥" \
-H "Content-Type: application/json" \
-d '{
"model": "Doubao-Seedance-2.5-full",
"content": [
{ "type": "text", "text": "一只橘猫在阳光下的花园里追逐蝴蝶,镜头平稳跟随" }
],
"draft": true,
"resolution": "480p",
"duration": 5,
"ratio": "16:9"
}'
status 为 SUCCESS)后,记下 data.task.id(cgt- 开头的样片号),第 2 步要用。这时 data.task.draft 为 true。
{
"task_id": "b2028cb5-663b-4a43-9760-2cf73bccd3f2",
"status": "SUCCESS",
"data": {
"task": {
"id": "cgt-20261008150427-s4l8g",
"draft": true,
"resolution": "480p"
}
}
}
cgt-20261008150427-s4l8g,不是外层 task_id。
第 2 步:用样片出正式片
content 里只放一个 draft_task,resolution 填 1080p:
curl https://api.nodylink.com/v2/videos/generations \
-H "Authorization: Bearer sk-你的密钥" \
-H "Content-Type: application/json" \
-d '{
"model": "Doubao-Seedance-2.5-full",
"content": [
{ "type": "draft_task", "draft_task": { "id": "cgt-20261008150427-s4l8g" } }
],
"resolution": "1080p"
}'
| 规则 | 字段 |
|---|---|
| 从样片继承,不要再传 | 提示词和参考素材、duration、ratio、seed、generate_audio、omni_reference_task_type |
| 固定 | model 与样片相同;resolution 为 1080p;不传 draft |
| 可以重新指定 | watermark、return_last_frame、output_format、callback_url、execution_expires_after |
draft_task.id 填样片的 data.task.id(cgt-…),不是 task_id(例如 b2028cb5-663b-4a43-9760-2cf73bccd3f2)。填 UUID 会返回 400。样片必须已经完成(status 为 SUCCESS)。样片号自创建起 7 天内有效。提交响应
与 Seedance 2.0 相同:返回object 为 video、status 为 queued 的任务对象,用其中的 id 查询结果。
使用示例
多图参考
{
"model": "Doubao-Seedance-2.5-full",
"content": [
{"type": "text", "text": "图片1的模特穿着图片2的外套,在图片3的街景中走秀"},
{"type": "image_url", "image_url": {"url": "https://example.com/model.png"}, "role": "reference_image"},
{"type": "image_url", "image_url": {"url": "https://example.com/coat.png"}, "role": "reference_image"},
{"type": "image_url", "image_url": {"url": "https://example.com/street.png"}, "role": "reference_image"}
],
"resolution": "1080p",
"ratio": "9:16",
"duration": 12
}
视频编辑
{
"model": "Doubao-Seedance-2.5-full",
"content": [
{"type": "text", "text": "编辑视频1,把画面中的红色汽车替换为白色汽车,其余保持不变"},
{"type": "video_url", "video_url": {"url": "https://example.com/source.mp4"}, "role": "reference_video"}
],
"ratio": "adaptive",
"duration": -1,
"resolution": "1080p"
}
480p 直接生成
{
"model": "Doubao-Seedance-2.5-full",
"content": [
{"type": "text", "text": "海面升起一团雾,帆船缓缓驶出画面"}
],
"resolution": "480p",
"ratio": "16:9",
"duration": 5
}

