视频生成 API
使用你的 API Key 创建 Veo 3.1 文生视频和图生视频任务,再用与图片相同的 /api/status 接口查询结果。
认证
每个请求都要以 Bearer Token 的形式携带你的 API Key。创建任务和查询状态必须使用同一个 Key。你可以在控制台的 API Keys 页面创建 Key。
Authorization: Bearer YOUR_API_KEY模型与积分
model 字段只能取下表中的值。其他任何取值都会返回 HTTP 400,并且不会扣除积分。
| model 取值 | 模型 | 文生视频(积分) | 图生视频(积分) |
|---|---|---|---|
veo3_fast | Veo 3.1 Fast(默认) | 25 | 35 |
veo3 | Veo 3.1 Quality | 180 | 180 |
veo3-fast 可作为 veo3_fast 的别名。不传 model 时使用 veo3_fast。image_urls 中至少有一个地址时按图生视频计费。
创建视频任务
校验请求、扣除积分并返回 task_id。视频为异步生成:请轮询 /api/status,或设置 callback_url 接收结果。
要生成的视频的文字描述。
veo3_fast(别名 veo3-fast)或 veo3。其他取值返回 HTTP 400。 默认值 veo3_fast.
用于图生视频的公开图片地址。传 1 张图时,视频围绕该图片展开;传 2 张图时,分别作为首帧和尾帧。也可以使用驼峰写法 imageUrls 作为别名;两者同时传入时以 image_urls 为准。
16:9、9:16 或 Auto。Auto 会按上传图片裁切视频画面。 默认值 16:9.
为 true 时,生成前会先把提示词翻译成英文。 默认值 true.
添加到视频上的水印文字。
公网可访问的地址。任务结束时会向该地址发送一次带最终结果的 POST 请求。
不支持的字段
duration、resolution 和单数形式的 image_url 不属于本 API,会被忽略。视频时长由模型决定。图片请以 image_urls 数组传入。
curl -X POST "https://nanobnana.com/api/video/generate" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "The camera slowly pushes in as the city lights turn on at dusk",
"model": "veo3_fast",
"image_urls": ["https://example.com/first-frame.jpg"],
"aspect_ratio": "16:9"
}'{
"code": 200,
"message": "success",
"data": {
"task_id": "veo24223f74e4f445ec9c4403b532cc328fbksv"
}
}查询任务状态
视频任务 ID 以 veo 开头、以 bksv 结尾。/api/status 会自动识别,并在任务完成时返回视频地址。
POST /api/video/generate 返回的 task_id。
设为 veo3 可以强制按视频任务查询,适用于不符合 veo…bksv 格式的 task_id。
curl "https://nanobnana.com/api/status?task_id=veo24223f74e4f445ec9c4403b532cc328fbksv" \
-H "Authorization: Bearer YOUR_API_KEY"{
"code": 200,
"message": "success",
"data": {
"task_id": "veo24223f74e4f445ec9c4403b532cc328fbksv",
"request": {
"prompt": "The camera slowly pushes in as the city lights turn on at dusk",
"model": "veo3_fast",
"image_urls": [
"https://example.com/first-frame.jpg"
],
"aspect_ratio": "16:9"
},
"response": null,
"status": "IN_PROGRESS",
"status_code": 3,
"status_text": "IN_PROGRESS",
"consumed_credits": 35,
"created_at": "2026-10-04 17:05:12",
"model": "veo3"
},
"model": "veo3"
}状态取值
IN_PROGRESS·status_code: 3— 视频仍在生成中,请继续轮询。COMPLETED·status_code: 1— 视频已生成,response 中包含视频地址。FAILED·status_code: 2— 生成失败。error_message 会说明原因,积分会自动退回。
计费与退款
- 积分在创建任务时、开始生成之前扣除。
- 如果创建请求没有返回 HTTP 200,就不会产生任务,已扣积分会立即退回。响应中会写明退回了多少积分。
- 已创建的任务如果最终状态为 FAILED,积分会自动退回,状态响应中的 consumed_credits 会变为 0。
轮询示例
视频生成通常需要几分钟。status_code 为 3 时每 10 秒查询一次,为 1 或 2 时停止。
async function waitForVideo(taskId) {
while (true) {
const res = await fetch(`https://nanobnana.com/api/status?task_id=${taskId}`, {
headers: { Authorization: 'Bearer YOUR_API_KEY' }
});
const payload = await res.json();
if (!res.ok) throw new Error(payload.message);
const task = payload.data;
if (task.status_code === 1) return task.response[0];
if (task.status_code === 2) throw new Error(task.error_message || 'Video generation failed');
await new Promise((resolve) => setTimeout(resolve, 10000));
}
}回调
设置 callback_url 后,任务完成或失败时我们会向该地址发送带以下 JSON 内容的 POST 请求。该地址必须能从公网访问。
{
"code": 200,
"message": "success",
"data": {
"request": {
"prompt": "The camera slowly pushes in as the city lights turn on at dusk",
"model": "veo3_fast",
"image_urls": [
"https://example.com/first-frame.jpg"
],
"aspect_ratio": "16:9"
},
"response": [
"https://example.com/generated-video.mp4"
],
"status": "COMPLETED",
"created_at": "2026-10-04 17:05:12"
}
}常见错误
{
"code": 400,
"message": "prompt is required",
"data": null
}