视频(Video)
Veo 视频 API
使用 88API 提交 Veo 3.1 视频任务、轮询状态并下载生成结果
88API 的 Veo 接口采用异步任务模式:先提交生成任务,再使用返回的任务 ID 轮询状态。任务完成后,响应中会提供可下载的 video_url。
接口地址
https://88api.ai所有请求都需要携带 API Key:
Authorization: Bearer sk-xxxx
Content-Type: application/json可用模型
| 模型 | 规格 | 适用场景 |
|---|---|---|
veo-3.1-fast-1080p-8s | Veo 3.1 Fast、固定 8 秒 | 速度优先、日常生成 |
veo-3.1-1080p-8s | Veo 3.1 Standard、固定 8 秒 | 质量优先 |
请始终使用表中的 88API 模型名。响应中的 model 可能显示实际的上游模型名,客户端不应依赖该字段判断任务归属。
第一步:提交视频任务
请求
POST /v1/videos请求体为 JSON:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 使用上表中的模型名 |
prompt | string | 是 | 视频内容、镜头、运动和风格描述 |
size | string | 否 | 推荐横屏 1920x1080 或竖屏 1080x1920;其他尺寸由上游决定实际输出 |
duration | integer | 否 | 当前模型固定为 8 秒,建议明确传入 8 |
images | string[] | 否 | 图生视频参考图,支持图片 URL 或 Base64,最多 2 张 |
文生视频示例
curl --request POST 'https://88api.ai/v1/videos' \
--header 'Authorization: Bearer sk-xxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "veo-3.1-fast-1080p-8s",
"prompt": "电影感航拍镜头,夜晚的未来城市,霓虹灯倒映在湿润街道上,镜头缓慢向前推进",
"size": "1920x1080",
"duration": 8
}'竖屏只需将 size 改为:
{
"size": "1080x1920"
}图生视频示例
curl --request POST 'https://88api.ai/v1/videos' \
--header 'Authorization: Bearer sk-xxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "veo-3.1-1080p-8s",
"prompt": "保持主体外观一致,镜头缓慢靠近,背景云层自然移动",
"size": "1920x1080",
"duration": 8,
"images": [
"https://example.com/reference.jpg"
]
}'提交成功响应
接口会立即返回排队中的任务:
{
"id": "task_xxxxxxxxxxxxxxxxxxxxxxxx",
"task_id": "task_xxxxxxxxxxxxxxxxxxxxxxxx",
"object": "video",
"model": "veo-3.1-fast",
"status": "queued",
"progress": 0,
"created_at": 1786106645,
"size": "1920x1080"
}保存 id 或 task_id,下一步查询时使用。不要在客户端超时后直接重复提交相同的 POST 请求,否则可能创建并计费多个任务。
第二步:轮询任务状态
请求
GET /v1/videos/{id}curl 'https://88api.ai/v1/videos/task_xxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Authorization: Bearer sk-xxxx'推荐每隔 5~10 秒查询一次,总超时时间设置为至少 600 秒。
状态说明
| 状态 | 说明 |
|---|---|
queued | 已进入队列 |
processing | 正在生成 |
completed | 生成成功,读取 video_url |
failed | 生成失败,读取 error |
生成成功响应
{
"id": "task_xxxxxxxxxxxxxxxxxxxxxxxx",
"model": "veo-3.1-fast",
"status": "completed",
"video_url": "https://example-bucket.s3.amazonaws.com/video.mp4?...",
"created_at": 1786106645
}生成失败响应
{
"id": "task_xxxxxxxxxxxxxxxxxxxxxxxx",
"model": "veo-3.1-fast",
"status": "failed",
"error": {
"code": "generation_failed",
"message": "视频生成失败"
}
}JavaScript 完整示例
const apiKey = 'sk-xxxx';
const baseUrl = 'https://88api.ai';
async function createVideo() {
const response = await fetch(`${baseUrl}/v1/videos`, {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'veo-3.1-fast-1080p-8s',
prompt: '一架无人机掠过雪山山脊,清晨金色阳光,电影感航拍',
size: '1920x1080',
duration: 8,
}),
});
const data = await response.json();
if (!response.ok) throw new Error(data?.error?.message || '提交失败');
return data.id;
}
async function waitForVideo(id) {
const deadline = Date.now() + 10 * 60 * 1000;
while (Date.now() < deadline) {
await new Promise((resolve) => setTimeout(resolve, 8000));
const response = await fetch(`${baseUrl}/v1/videos/${id}`, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const data = await response.json();
if (!response.ok) throw new Error(data?.error?.message || '查询失败');
if (data.status === 'completed') return data.video_url;
if (data.status === 'failed') {
throw new Error(data?.error?.message || '视频生成失败');
}
}
throw new Error('视频生成超时');
}
const taskId = await createVideo();
const videoUrl = await waitForVideo(taskId);
console.log(videoUrl);下载和链接注意事项
- 完成后直接下载响应中的
video_url,不要拼接其他下载路径。 video_url通常是有有效期的签名地址,请在任务完成后及时保存视频。- JSON 文本中可能看到
\u0026,这是字符&的转义形式。请使用 JSON 解析器读取响应,不要手工复制未解析的原始字符串。 - 不要把 API Key 写入浏览器前端代码、公开仓库或日志。
常见问题
为什么提交后没有立即返回视频?
视频生成是异步任务。提交接口只返回任务 ID,必须继续调用查询接口,直到状态变为 completed 或 failed。
可以请求 15 秒或 30 秒吗?
不可以。当前公开的两个 Veo 模型均为固定 8 秒规格,请使用模型名中带有的 8s 作为能力边界。
应该使用 seconds 还是 duration?
Veo 接口请使用本文档中的 duration: 8。不要照搬旧版或其他视频供应商的 multipart/form-data 示例。