返回文档

视频生成 API

使用你的 API Key 创建 Veo 3.1 文生视频和图生视频任务,再用与图片相同的 /api/status 接口查询结果。

Nano AI API 基础地址: https://nanobnana.com

认证

每个请求都要以 Bearer Token 的形式携带你的 API Key。创建任务和查询状态必须使用同一个 Key。你可以在控制台的 API Keys 页面创建 Key。

http
Authorization: Bearer YOUR_API_KEY

模型与积分

model 字段只能取下表中的值。其他任何取值都会返回 HTTP 400,并且不会扣除积分。

model 取值模型文生视频(积分)图生视频(积分)
veo3_fastVeo 3.1 Fast(默认)2535
veo3Veo 3.1 Quality180180

veo3-fast 可作为 veo3_fast 的别名。不传 model 时使用 veo3_fast。image_urls 中至少有一个地址时按图生视频计费。

创建视频任务

校验请求、扣除积分并返回 task_id。视频为异步生成:请轮询 /api/status,或设置 callback_url 接收结果。

请求体JSON
prompt:string

要生成的视频的文字描述。

model:可选string

veo3_fast(别名 veo3-fast)或 veo3。其他取值返回 HTTP 400。 默认值 veo3_fast.

image_urls:可选string[]

用于图生视频的公开图片地址。传 1 张图时,视频围绕该图片展开;传 2 张图时,分别作为首帧和尾帧。也可以使用驼峰写法 imageUrls 作为别名;两者同时传入时以 image_urls 为准。

aspect_ratio:可选string

16:9、9:16 或 Auto。Auto 会按上传图片裁切视频画面。 默认值 16:9.

translation:可选boolean

为 true 时,生成前会先把提示词翻译成英文。 默认值 true.

watermark:可选string

添加到视频上的水印文字。

callback_url:可选string

公网可访问的地址。任务结束时会向该地址发送一次带最终结果的 POST 请求。

不支持的字段

duration、resolution 和单数形式的 image_url 不属于本 API,会被忽略。视频时长由模型决定。图片请以 image_urls 数组传入。

bash
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 会自动识别,并在任务完成时返回视频地址。

查询参数
task_id:string

POST /api/video/generate 返回的 task_id。

model:可选string

设为 veo3 可以强制按视频任务查询,适用于不符合 veo…bksv 格式的 task_id。

bash
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 时停止。

javascript
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
}