# 视频生成（OpenAI Video 别名）
> 与 OpenAI 兼容接口行为一致，路径走 OpenAI 官方别名
> 部分第三方 SDK 与工具链默认使用这个路径
> 参数、响应与「视频生成（OpenAI 兼容）」完全相同
`POST /v1/videos`
## 认证
- `Authorization` (string / 必填) — 所有接口均使用 Bearer Token 进行认证。 Seedance 系列的接口需要在 [ark 站](https://ark.oairoute.com/) 单独获取 Key，与 api 站的 Key 不通用。 请求时在请求头中添加： ```http Authorization: Bearer YOUR_ARK_KEY ```
## 请求结构
请求体与[视频生成（OpenAI 兼容）](openai.html)完全一致：`prompt`、`image`、`duration`、`size` 等字段平铺在顶层，没有 `content` 数组。区别只在路径：官方 OpenAI Video 用 `/v1/videos`，旧版兼容路径是 `/v1/video/generations`。
## 支持的场景
| 场景 | 字段组合 |
|---|---|
| 文生视频 | `prompt` |
| 图生视频·首帧 | `prompt` + `image` |
| 图生视频·首尾帧 | 改用豆包原生通道，见[视频生成（豆包原生）](doubao.html) |
| 全模态参考 | 改用豆包原生通道，见[视频生成（豆包原生）](doubao.html) |
| 编辑视频 | 改用豆包原生通道，见[视频生成（豆包原生）](doubao.html) |
| 延长视频 | 改用豆包原生通道，见[视频生成（豆包原生）](doubao.html) |
OpenAI 兼容结构只有 `prompt` 与 `image` 两个创作字段，能表达的场景比豆包原生少。需要首尾帧、参考图、视频编辑或延长时，用豆包原生通道提交，任务查询仍然走同一个任务状态接口。
## 请求参数
- `model` (string / 必填) — 视频模型 ID。
- `prompt` (string / 必填) — 视频描述。
- `image` (string / 可选) — 首帧图片地址。
- `duration` (integer / 可选) — 时长，单位秒。
- `size` (string / 可选) — 输出画幅，像素值或比例字符串。
- `callback_url` (string / 可选) — 完成回调地址。
## 响应
- `id` (string) — 任务 ID。
- `object` (string) — 固定为 `video`。
- `status` (string) — 任务状态，提交后为 `queued`。
- `created` (integer) — 创建时间戳。
## 错误码
| HTTP | 含义 |
|---|---|
| 400 | 参数错误，type 为 invalid_request_error |
| 401 | Token 缺失或无效，type 为 authentication_error |
| 402 | 余额不足，type 为 permission_error |
| 429 | 触发限流 |
更多状态码与重试建议见[错误码与限流](../../support/errors.html)，常见报错的排查步骤见[常见问题](../../support/faq.html)。
## 与 `/v1/video/generations` 的关系
两个路径指向同一套逻辑，差异只在路径拼写：
| 路径 | 说明 |
|---|---|
| `/v1/video/generations` | 单数形式，早期版本使用 |
| `/v1/videos` | 复数形式，与 OpenAI 官方命名对齐 |
已有代码用哪个都能跑。新项目建议用复数形式，与 OpenAI 生态保持一致。
## 支持的模型列表
以下视频模型均可通过本接口提交任务，清单只列各厂商最新一代，实际可用范围以你的账号分组为准：
:::models video
各型号的能力差异：
| 项目 | 2.0 家族 | 2.5 |
|---|---|---|
| 最长时长 | 15 秒 | 30 秒 |
| 分辨率 | 480p / 720p / 1080p / 4k | 480p / 720p / 1080p |
2.0 家族里 fast 与 mini 只支持 480p 与 720p，4K 仅 2.0 标准版可用。
> **Note:** 完整模型目录（含时长上限、音画能力）可读取 `GET https://ark.oairoute.com/api/pricing`。
## 使用示例
### 基础提交
`/v1/videos` 是 OpenAI 官方路径，`/v1/video/generations` 是旧版兼容路径，两者参数完全一致，选一条固定下来即可。
### 带首帧
`image` 按首帧处理，提示词描述后续运动。首帧建议与目标画面比例一致，否则会被裁剪。
### 异步回调
服务端处理耗时较长时用回调，避免客户端长时间轮询。
**文生视频{Text to video}::cURL**
```
curl --request POST \
  --url 'https://ark.oairoute.com/v1/videos' \
  --header 'Authorization: Bearer YOUR_ARK_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "seedance-2.5",
  "prompt": "海面日落，镜头缓慢前推",
  "seconds": "5",
  "metadata": {
    "ratio": "16:9",
    "resolution": "1080p"
  }
}'
```
**文生视频{Text to video}::Python**
```
import requests
url = "https://ark.oairoute.com/v1/videos"
headers = {
    "Authorization": "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
}
payload = {
  "model": "seedance-2.5",
  "prompt": "海面日落，镜头缓慢前推",
  "seconds": "5",
  "metadata": {
    "ratio": "16:9",
    "resolution": "1080p"
  }
}
res = requests.post(url, headers=headers, json=payload)
print(res.json())
```
**文生视频{Text to video}::JavaScript**
```
const res = await fetch("https://ark.oairoute.com/v1/videos", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "model": "seedance-2.5",
  "prompt": "海面日落，镜头缓慢前推",
  "seconds": "5",
  "metadata": {
    "ratio": "16:9",
    "resolution": "1080p"
  }
}),
});
console.log(await res.json());
```
**首帧{First frame}::cURL**
```
curl --request POST \
  --url 'https://ark.oairoute.com/v1/videos' \
  --header 'Authorization: Bearer YOUR_ARK_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "seedance-2.5",
  "prompt": "女孩睁开眼，温柔地看向镜头",
  "image": "https://example.com/first.png",
  "seconds": "5",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p"
  }
}'
```
**首帧{First frame}::Python**
```
import requests
url = "https://ark.oairoute.com/v1/videos"
headers = {
    "Authorization": "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
}
payload = {
  "model": "seedance-2.5",
  "prompt": "女孩睁开眼，温柔地看向镜头",
  "image": "https://example.com/first.png",
  "seconds": "5",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p"
  }
}
res = requests.post(url, headers=headers, json=payload)
print(res.json())
```
**首帧{First frame}::JavaScript**
```
const res = await fetch("https://ark.oairoute.com/v1/videos", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "model": "seedance-2.5",
  "prompt": "女孩睁开眼，温柔地看向镜头",
  "image": "https://example.com/first.png",
  "seconds": "5",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p"
  }
}),
});
console.log(await res.json());
```
**首尾帧{First and last frame}::cURL**
```
curl --request POST \
  --url 'https://ark.oairoute.com/v1/videos' \
  --header 'Authorization: Bearer YOUR_ARK_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "seedance-2.5",
  "prompt": "让人物从站立缓缓转身",
  "seconds": "5",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p",
    "content": [
      {
        "type": "image_url",
        "image_url": {
          "url": "https://example.com/first.png"
        },
        "role": "first_frame"
      },
      {
        "type": "image_url",
        "image_url": {
          "url": "https://example.com/last.png"
        },
        "role": "last_frame"
      }
    ]
  }
}'
```
**首尾帧{First and last frame}::Python**
```
import requests
url = "https://ark.oairoute.com/v1/videos"
headers = {
    "Authorization": "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
}
payload = {
  "model": "seedance-2.5",
  "prompt": "让人物从站立缓缓转身",
  "seconds": "5",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p",
    "content": [
      {
        "type": "image_url",
        "image_url": {
          "url": "https://example.com/first.png"
        },
        "role": "first_frame"
      },
      {
        "type": "image_url",
        "image_url": {
          "url": "https://example.com/last.png"
        },
        "role": "last_frame"
      }
    ]
  }
}
res = requests.post(url, headers=headers, json=payload)
print(res.json())
```
**首尾帧{First and last frame}::JavaScript**
```
const res = await fetch("https://ark.oairoute.com/v1/videos", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "model": "seedance-2.5",
  "prompt": "让人物从站立缓缓转身",
  "seconds": "5",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p",
    "content": [
      {
        "type": "image_url",
        "image_url": {
          "url": "https://example.com/first.png"
        },
        "role": "first_frame"
      },
      {
        "type": "image_url",
        "image_url": {
          "url": "https://example.com/last.png"
        },
        "role": "last_frame"
      }
    ]
  }
}),
});
console.log(await res.json());
```
**图片参考{Image reference}::cURL**
```
curl --request POST \
  --url 'https://ark.oairoute.com/v1/videos' \
  --header 'Authorization: Bearer YOUR_ARK_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "seedance-2.5",
  "prompt": "@图片1 的人物在海边行走，镜头跟随",
  "seconds": "8",
  "metadata": {
    "ratio": "16:9",
    "resolution": "1080p",
    "content": [
      {
        "type": "image_url",
        "image_url": {
          "url": "https://example.com/ref.png"
        },
        "role": "reference_image"
      }
    ]
  }
}'
```
**图片参考{Image reference}::Python**
```
import requests
url = "https://ark.oairoute.com/v1/videos"
headers = {
    "Authorization": "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
}
payload = {
  "model": "seedance-2.5",
  "prompt": "@图片1 的人物在海边行走，镜头跟随",
  "seconds": "8",
  "metadata": {
    "ratio": "16:9",
    "resolution": "1080p",
    "content": [
      {
        "type": "image_url",
        "image_url": {
          "url": "https://example.com/ref.png"
        },
        "role": "reference_image"
      }
    ]
  }
}
res = requests.post(url, headers=headers, json=payload)
print(res.json())
```
**图片参考{Image reference}::JavaScript**
```
const res = await fetch("https://ark.oairoute.com/v1/videos", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "model": "seedance-2.5",
  "prompt": "@图片1 的人物在海边行走，镜头跟随",
  "seconds": "8",
  "metadata": {
    "ratio": "16:9",
    "resolution": "1080p",
    "content": [
      {
        "type": "image_url",
        "image_url": {
          "url": "https://example.com/ref.png"
        },
        "role": "reference_image"
      }
    ]
  }
}),
});
console.log(await res.json());
```
**视频参考{Video reference}::cURL**
```
curl --request POST \
  --url 'https://ark.oairoute.com/v1/videos' \
  --header 'Authorization: Bearer YOUR_ARK_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "seedance-2.5",
  "prompt": "参考 @视频1 的运镜节奏，生成一段城市夜景",
  "seconds": "11",
  "metadata": {
    "ratio": "16:9",
    "resolution": "1080p",
    "omni_reference_task_type": "reference",
    "content": [
      {
        "type": "video_url",
        "video_url": {
          "url": "https://example.com/ref.mp4"
        },
        "role": "reference_video"
      }
    ]
  }
}'
```
**视频参考{Video reference}::Python**
```
import requests
url = "https://ark.oairoute.com/v1/videos"
headers = {
    "Authorization": "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
}
payload = {
  "model": "seedance-2.5",
  "prompt": "参考 @视频1 的运镜节奏，生成一段城市夜景",
  "seconds": "11",
  "metadata": {
    "ratio": "16:9",
    "resolution": "1080p",
    "omni_reference_task_type": "reference",
    "content": [
      {
        "type": "video_url",
        "video_url": {
          "url": "https://example.com/ref.mp4"
        },
        "role": "reference_video"
      }
    ]
  }
}
res = requests.post(url, headers=headers, json=payload)
print(res.json())
```
**视频参考{Video reference}::JavaScript**
```
const res = await fetch("https://ark.oairoute.com/v1/videos", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "model": "seedance-2.5",
  "prompt": "参考 @视频1 的运镜节奏，生成一段城市夜景",
  "seconds": "11",
  "metadata": {
    "ratio": "16:9",
    "resolution": "1080p",
    "omni_reference_task_type": "reference",
    "content": [
      {
        "type": "video_url",
        "video_url": {
          "url": "https://example.com/ref.mp4"
        },
        "role": "reference_video"
      }
    ]
  }
}),
});
console.log(await res.json());
```
**视频编辑{Video editing}::cURL**
```
curl --request POST \
  --url 'https://ark.oairoute.com/v1/videos' \
  --header 'Authorization: Bearer YOUR_ARK_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "seedance-2.5",
  "prompt": "视频编辑：删除 @视频1 中的行人，只保留主角",
  "seconds": "-1",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p",
    "omni_reference_task_type": "edit",
    "output_format": "mov",
    "content": [
      {
        "type": "video_url",
        "video_url": {
          "url": "https://example.com/source.mp4"
        },
        "role": "reference_video"
      }
    ]
  }
}'
```
**视频编辑{Video editing}::Python**
```
import requests
url = "https://ark.oairoute.com/v1/videos"
headers = {
    "Authorization": "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
}
payload = {
  "model": "seedance-2.5",
  "prompt": "视频编辑：删除 @视频1 中的行人，只保留主角",
  "seconds": "-1",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p",
    "omni_reference_task_type": "edit",
    "output_format": "mov",
    "content": [
      {
        "type": "video_url",
        "video_url": {
          "url": "https://example.com/source.mp4"
        },
        "role": "reference_video"
      }
    ]
  }
}
res = requests.post(url, headers=headers, json=payload)
print(res.json())
```
**视频编辑{Video editing}::JavaScript**
```
const res = await fetch("https://ark.oairoute.com/v1/videos", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "model": "seedance-2.5",
  "prompt": "视频编辑：删除 @视频1 中的行人，只保留主角",
  "seconds": "-1",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p",
    "omni_reference_task_type": "edit",
    "output_format": "mov",
    "content": [
      {
        "type": "video_url",
        "video_url": {
          "url": "https://example.com/source.mp4"
        },
        "role": "reference_video"
      }
    ]
  }
}),
});
console.log(await res.json());
```
**延长视频{Extend video}::cURL**
```
curl --request POST \
  --url 'https://ark.oairoute.com/v1/videos' \
  --header 'Authorization: Bearer YOUR_ARK_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "seedance-2.5",
  "prompt": "延长 @视频1，镜头继续向前推进，进入室内",
  "seconds": "11",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p",
    "omni_reference_task_type": "extend",
    "output_format": "mov",
    "content": [
      {
        "type": "video_url",
        "video_url": {
          "url": "https://example.com/source.mp4"
        },
        "role": "reference_video"
      }
    ]
  }
}'
```
**延长视频{Extend video}::Python**
```
import requests
url = "https://ark.oairoute.com/v1/videos"
headers = {
    "Authorization": "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
}
payload = {
  "model": "seedance-2.5",
  "prompt": "延长 @视频1，镜头继续向前推进，进入室内",
  "seconds": "11",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p",
    "omni_reference_task_type": "extend",
    "output_format": "mov",
    "content": [
      {
        "type": "video_url",
        "video_url": {
          "url": "https://example.com/source.mp4"
        },
        "role": "reference_video"
      }
    ]
  }
}
res = requests.post(url, headers=headers, json=payload)
print(res.json())
```
**延长视频{Extend video}::JavaScript**
```
const res = await fetch("https://ark.oairoute.com/v1/videos", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_ARK_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "model": "seedance-2.5",
  "prompt": "延长 @视频1，镜头继续向前推进，进入室内",
  "seconds": "11",
  "metadata": {
    "ratio": "adaptive",
    "resolution": "1080p",
    "omni_reference_task_type": "extend",
    "output_format": "mov",
    "content": [
      {
        "type": "video_url",
        "video_url": {
          "url": "https://example.com/source.mp4"
        },
        "role": "reference_video"
      }
    ]
  }
}),
});
console.log(await res.json());
```
**200 文生视频{Text to video}**
```
{
  "id": "task_abc123def456",
  "object": "video",
  "model": "seedance-2.5",
  "status": "queued",
  "progress": 0,
  "seconds": "5",
  "created_at": 1763088289
}
```
**200 首帧{First frame}**
```
{
  "id": "task_abc123def457",
  "object": "video",
  "model": "seedance-2.5",
  "status": "queued",
  "progress": 0,
  "seconds": "5",
  "created_at": 1763088289
}
```
**200 首尾帧{First and last frame}**
```
{
  "id": "task_abc123def458",
  "object": "video",
  "model": "seedance-2.5",
  "status": "queued",
  "progress": 0,
  "seconds": "5",
  "created_at": 1763088289
}
```
**200 图片参考{Image reference}**
```
{
  "id": "task_abc123def459",
  "object": "video",
  "model": "seedance-2.5",
  "status": "queued",
  "progress": 0,
  "seconds": "8",
  "created_at": 1763088289
}
```
**200 视频参考{Video reference}**
```
{
  "id": "task_abc123def460",
  "object": "video",
  "model": "seedance-2.5",
  "status": "queued",
  "progress": 0,
  "seconds": "11",
  "created_at": 1763088289
}
```
**200 视频编辑{Video editing}**
```
{
  "id": "task_abc123def461",
  "object": "video",
  "model": "seedance-2.5",
  "status": "queued",
  "progress": 0,
  "seconds": "-1",
  "created_at": 1763088289
}
```
**200 延长视频{Extend video}**
```
{
  "id": "task_abc123def462",
  "object": "video",
  "model": "seedance-2.5",
  "status": "queued",
  "progress": 0,
  "seconds": "11",
  "created_at": 1763088289
}
```
**基础提交{Basic submit}::cURL**
```
curl --request POST \
  --url 'https://ark.oairoute.com/v1/videos' \
  --header 'Authorization: Bearer YOUR_OAIRoute_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "seedance-2.5",
    "prompt": "森林晨雾，阳光穿过树梢",
    "duration": 5,
    "size": "1280x720"
  }'
```
**基础提交{Basic submit}::Python**
```
import requests
url = "https://ark.oairoute.com/v1/videos"
headers = {"Authorization": "Bearer YOUR_OAIRoute_KEY"}
payload = {
    "model": "seedance-2.5",
    "prompt": "森林晨雾，阳光穿过树梢",
    "duration": 5,
    "size": "1280x720"
  }
res = requests.post(url, headers=headers, json=payload)
print(res.json())
```
**基础提交{Basic submit}::JavaScript**
```
const res = await fetch("https://ark.oairoute.com/v1/videos", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_OAIRoute_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "model": "seedance-2.5",
    "prompt": "森林晨雾，阳光穿过树梢",
    "duration": 5,
    "size": "1280x720"
  }),
});
console.log(await res.json());
```
**带首帧{With first frame}::cURL**
```
curl --request POST \
  --url 'https://ark.oairoute.com/v1/videos' \
  --header 'Authorization: Bearer YOUR_OAIRoute_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "seedance-2.5",
    "prompt": "镜头缓慢后拉，露出全景",
    "image": "https://example.com/scene.jpg",
    "duration": 5
  }'
```
**带首帧{With first frame}::Python**
```
import requests
url = "https://ark.oairoute.com/v1/videos"
headers = {"Authorization": "Bearer YOUR_OAIRoute_KEY"}
payload = {
    "model": "seedance-2.5",
    "prompt": "镜头缓慢后拉，露出全景",
    "image": "https://example.com/scene.jpg",
    "duration": 5
  }
res = requests.post(url, headers=headers, json=payload)
print(res.json())
```
**带首帧{With first frame}::JavaScript**
```
const res = await fetch("https://ark.oairoute.com/v1/videos", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_OAIRoute_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "model": "seedance-2.5",
    "prompt": "镜头缓慢后拉，露出全景",
    "image": "https://example.com/scene.jpg",
    "duration": 5
  }),
});
console.log(await res.json());
```
**200 基础提交{Basic submit}**
```
{
  "id": "task_abc123def456",
  "object": "video",
  "model": "seedance-2.5",
  "status": "queued",
  "progress": 0,
  "seconds": "5",
  "created_at": 1763088289
}
```
**200 带首帧{With first frame}**
```
{
  "id": "task_abc123def456",
  "object": "video",
  "model": "seedance-2.5",
  "status": "queued",
  "progress": 0,
  "seconds": "5",
  "created_at": 1763088289
}
```
