Veo 3.1
用提示词或首帧生成带声音的视频,有三个版本,按出片时长计费。
Veo 3.1(产品 veo)用提示词或首帧生成视频,出片带声音(lite 可以关掉)。有三个版本,价格不同,能传的参数也不同。
版本
每个任务用 variant 选一个:
variant | 说明 | resolution |
|---|---|---|
standard | 标准版,画质最好。生成前会把提示词扩写成详细的分镜描述 | 720p、1080p、4k |
fast | 比 standard 便宜。和 standard 一样会扩写提示词 | 720p、1080p、4k |
lite | 最便宜,按提示词原文生成。只有它能加尾帧、关掉声音(generate_audio)、让比例跟随首帧(aspect_ratio: auto) | 720p |
每个版本的每秒单价不同,见价格。GET /v1/products 的 prices 按版本列出各自可选的分辨率。
创建任务
https://api.nanoapi.ai/v1/tasks用所有模型共用的创建任务接口,model 传 "veo-3.1"。接口通常不到 1 秒返回,几秒内冻结费用,一般 1–2 分钟出片;任务结束后获取结果。
请求头
| 请求头 | 必填 | 说明 |
|---|---|---|
Authorization | 是 | Bearer <API Key>,见鉴权 |
Content-Type | 是 | application/json |
Idempotency-Key | 否 | 每个新任务一个唯一字符串,建议用 UUID(1–255 个字符),见防止重复创建 |
请求体
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | veo-3.1 |
variant | string | 是 | standard、fast 或 lite,见版本,决定价格 |
mode | string | 是 | text_to_video 或 image_to_video |
prompt | string | 是 | 描述要生成的画面,最长 8000 字符,建议用英文 |
image_urls | string[] | image_to_video 必填;text_to_video 不能传 | 首帧;lite 可以再传第 2 张作为尾帧。见图生视频 |
resolution | string | 是 | standard、fast:720p、1080p 或 4k;lite:720p。决定价格 |
aspect_ratio | string | 是 | 16:9 或 9:16。lite 的 image_to_video 还可以传 auto,跟随首帧 |
duration | integer | 是 | 出片时长(秒):4、6 或 8(lite 带了尾帧时必须是 8),按它计费,见价格 |
generate_audio | boolean | 否 | 只有 lite 能传:出片是否带声音,默认 true,带不带都是同一个价。standard、fast 总是带声音,传了返回 400 invalid_request |
webhook_url | string | 否 | 任务成功或失败时通知该地址:https,最长 2048 字符,不能指向内网、回环或保留地址。见回调 |
- 参数检查:参数不符合所选版本、模式的规则时(例如
fast传了 2 张图、standard传了generate_audio、lite选了1080p),返回400 invalid_request,param是对应的参数名,任务不会创建;传了其他参数也一样。见错误。 - 提示词:建议用英文写,效果更好。
standard、fast生成前会把提示词扩写成详细的分镜描述;lite按原文生成。
响应:200 OK。data 是刚创建的任务,只有下面这几个字段,各字段的含义见创建任务的返回。保存 data.id,用它获取结果。任务创建后仍可能失败(例如余额不够这次的费用),以查询或回调的结果为准。
{
"code": 200,
"message": "success",
"data": {
"object": "task",
"id": "tk_01jbq3v6n9c2x5b8m1q4w7e0r3",
"model": "veo-3.1",
"status": "queued",
"error": null,
"created_at": "2026-11-11T08:30:00Z"
}
}文生视频
只用 prompt 生成视频,三个版本都可以。
standard、1080p、16:9、8 秒:
curl https://api.nanoapi.ai/v1/tasks \
-H "Authorization: Bearer $NANOAPI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f8a2c71-9d4e-4b6a-8e1f-7c0b5a2d9e46" \
-d '{
"model": "veo-3.1",
"variant": "standard",
"mode": "text_to_video",
"prompt": "A paper boat drifts down a rainy city street gutter, close-up, soft morning light",
"resolution": "1080p",
"aspect_ratio": "16:9",
"duration": 8
}'图生视频
从 image_urls 的第 1 张图开始生成,prompt 描述接下来发生什么。
variant | image_urls | aspect_ratio | duration |
|---|---|---|---|
standard、fast | 1 张:首帧 | 16:9 或 9:16 | 4、6 或 8 |
lite | 1–2 张:首帧,可以再加 1 张尾帧 | 16:9、9:16 或 auto(跟随首帧) | 4、6 或 8;带尾帧时只能是 8 |
aspect_ratio 请和首帧的方向一致:横图选 16:9,竖图选 9:16(lite 也可以选 auto)。
fast、只有首帧、1080p、4 秒:
curl https://api.nanoapi.ai/v1/tasks \
-H "Authorization: Bearer $NANOAPI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6b1d9e42-7a3c-4f85-b2e0-1c8f4a6d3b97" \
-d '{
"model": "veo-3.1",
"variant": "fast",
"mode": "image_to_video",
"image_urls": ["https://example.com/first_frame.jpg"],
"prompt": "The cat slowly turns its head, looks at the camera and meows, the camera slowly pushes in",
"resolution": "1080p",
"aspect_ratio": "16:9",
"duration": 4
}'lite 首尾帧(所以 duration 是 8),比例跟随首帧:
curl https://api.nanoapi.ai/v1/tasks \
-H "Authorization: Bearer $NANOAPI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: c4e7a0b3-2f6d-4a19-9c8e-5b3d1f7a2e60" \
-d '{
"model": "veo-3.1",
"variant": "lite",
"mode": "image_to_video",
"image_urls": [
"https://example.com/first_frame.jpg",
"https://example.com/last_frame.jpg"
],
"prompt": "The camera slowly orbits around the cat sitting on the car hood",
"resolution": "720p",
"aspect_ratio": "auto",
"duration": 8
}'获取结果
一般 1–2 分钟出片。任务结束(成功或失败)后用下面任一方式拿结果:
- 回调(生产环境推荐):创建时传了
webhook_url,任务结束时会把完整的任务推送一次,见回调。 - 轮询:用
data.id调用GET /v1/tasks/{task_id},间隔 15 秒以上,直到status为succeeded或failed;多个任务用列出任务的ids一次查询。
| 字段 | Veo 3.1 |
|---|---|
outputs[0].url | 成片,mp4(H.264,24fps,例如 1080p 16:9 是 1920×1080),除非 lite 传了 generate_audio: false,都带声音。从任务完成起保存 15 天 |
outputs[0].preview_url | 无声的压缩版,适合预览,宽最多 600;压缩失败时为 null(请用 url)。见结果 |
billing.billed_seconds | duration |
input | 你提交的参数;image_urls、generate_audio 传了才有 |
失败时冻结的钱全额退回,原因在 data.error.type,见错误。完整的字段见任务对象。
素材
图片以公开的 http(s) 链接放在 image_urls 里提交。不提供上传接口,请自行托管文件。链接最长 4096 字符,必须能直接下载,不能指向 localhost 或内网、回环、保留地址。
Veo 3.1 的图片在任务提交给生成服务后才读取(创建后几秒内),这时已经冻结过费用:下载不了、读不了(损坏、格式不支持)时任务失败(invalid_media),冻结的费用全额退回。任务结束前所有链接都要保持可访问,有有效期的链接也不能提前过期。
价格
费用 = 出片时长 duration × 所选版本和分辨率的每秒单价正在读取当前价格…
计费秒数就是请求的 duration(4、6 或 8 秒)。每秒单价只看 variant 和 resolution:模式、图片、出片带不带声音(generate_audio)都不影响价格。
例如上面的图生视频请求(fast、1080p、4 秒)冻结 4 × fast 的 1080p 每秒单价,成功后扣同样的金额,失败全额退回。冻结和扣费的通用规则见计费。
正在读取当前价格…
价格只看请求就能算出来,可以在提交前显示:当前单价从 GET /v1/products 读取,prices 每个版本、每个分辨率一行(看这一行的 variant)。价格会调整,不要写死;实际费用以查询任务返回的 billing.frozen 为准。
错误
Veo 3.1 特有的错误和失败原因。创建任务的全部错误见创建任务 → 错误,全部失败原因见失败原因。
创建请求出错:请求返回 HTTP 错误,任务不会创建。param 是对应的参数名。
| 状态码 | error.type | 何时出现 | 怎么处理 |
|---|---|---|---|
400 | invalid_request | 少传了必填参数(Field required),或者 variant、mode、resolution、aspect_ratio、duration 不是允许的值(例如 Input should be 4, 6 or 8 for veo-3.1;lite 选了 1080p:Input should be '720p' for veo-3.1 variant lite) | 必填参数都要传,取值见创建任务 |
400 | invalid_request | 不符合版本或模式的规则:text_to_video 传了 image_urls(image_urls is not allowed for mode text_to_video),或者 image_to_video 没传;standard、fast 传了 2 张图(image_urls takes 1 image (the first frame) for variant fast; only lite supports a last frame);带了尾帧但 duration 不是 8(duration must be 8 when image_urls has a last frame);不是 lite 的 image_to_video 却传了 aspect_ratio: auto(aspect_ratio auto is only allowed for variant lite with mode image_to_video);standard、fast 传了 generate_audio(generate_audio is only allowed for variant lite; standard always has audio) | 按 param 改好参数后重新请求 |
400 | invalid_request | 传了这个模型没有的参数(Extra inputs are not permitted) | 去掉这个参数 |
创建接口的其他错误(401、402、429 等)见创建任务 → 错误。
任务失败:创建请求成功(200),任务之后变成 failed。这种情况没有 HTTP 状态码,原因在任务的 error.type,通过查询任务或回调拿到。
error.type | 何时出现 | 怎么处理 |
|---|---|---|
insufficient_balance | 可用余额不够 duration × 每秒单价。创建后几秒内出现,不冻结费用 | 充值后重新创建 |
spend_limit_exceeded | 加上这个任务的费用会超出 API Key 的消费限额。创建后几秒内出现,不冻结费用 | 到控制台 → API Keys 调高限额,或等限额重置后重新创建 |
invalid_media | 图片下载不了或读不了(损坏、格式不支持)。任务提交给生成服务时才发现,这时已经冻结过费用 | 按 error.message 换掉那张图,重新创建 |
content_policy | 提示词或图片不符合内容政策:含不适宜内容,或含受保护的肖像、版权内容(例如公众人物照片)。被模型服务商的审核拦下的图片也算。提交给生成服务时或生成过程中被拦下 | 原样重新提交还会失败,请更换提示词或图片 |
generation_failed | 生成失败或超时。Veo 3.1 偶尔会有一段时间整体不可用,期间所有任务都会失败;我们会先自动重试,最终失败时才是这个原因 | 稍后重新创建 |
queue_timeout / internal_error | 排队超过 30 分钟未开始 / 内部错误 | 稍后重新创建 |
所有失败的任务都已全额退回冻结金额,billing.charged 为 "0.00"。