Skip to navigation

Veo 3.1

Generate 8-second videos with sound at 720p, 1080p or 4K from text, one or two frames, or up to three reference images; pick Quality, Fast or Lite, each priced on its own.

  • Asynchronous: the create call returns a task ID; the video arrives when the task succeeds.
  • One model ID, three tiers: quality chooses Quality, Fast or Lite, and each is priced on its own at each resolution.
  • There is no duration field: the model sets the length, and the price is per video (the price list describes it as 8 seconds with sound).
  • Reference images need Fast or Lite: leave quality out and Fast is used; asking for Quality is refused. Text and frame requests default to Quality.
  • Billed per video by tier and resolution, not by the second. A failed task costs nothing.
POST/v1/videos/tasksTry it

Opens this model in the API Explorer. Enter your BeatAPI API key to create a task: the call is real and is billed to your own balance.

Endpoint and authentication

POST https://api.beatapi.io/v1/videos/tasks

Authorization string Required

Your BeatAPI API key, sent as Bearer <BEATAPI_API_KEY>. Create keys in the Dashboard. Keep keys on your server; never ship them in a browser or mobile app.

Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.

How a request works

1

Create the task

POST the parameters below to the endpoint. A 201 means the task was accepted and its price reserved from your balance; the work runs in the background. Save data.id.

2

Wait for it to finish

Call GET /v1/tasks/{task_id} and wait data.poll_after_seconds between calls (5 s for images, 8 s for videos) until status is succeeded or failed. Or register a webhook for task.succeeded and task.failed; keep polling as the fallback, because a task stopped by the processing timeout sends no event.

3

Save the result

On succeeded, download every data.output.media[].url and store the files you need; BeatAPI does not promise how long result URLs stay available. On failed, read data.error_code and data.error_message: the reserved amount was returned to your balance, and data.retryable says whether sending the same request again can succeed.

Input modes

ModeRequired inputsNotes
Text to videomodel, promptAny tier. Without quality, Quality is used.
First framemodel, prompt, images (1 link)The video starts from the image. Any tier.
First and last framemodel, prompt, images (2 links)images[0] is the first frame, images[1] the last. Any tier.
Reference imagesmodel, prompt, reference_images (1–3 links)Fast or Lite only (Fast if quality is left out). aspect_ratio must be 16:9 or 9:16. Cannot be combined with images.

Request parameters

model string Required

The model to run. Veo 3.1 is one ID; the tier is chosen with quality.

Value: veo-3.1

If the value is wrong

  • Missing: "model" is required
  • An image model sent to this endpoint: "model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint

prompt string Required

What happens in the video: subject, action, camera movement, style and sound.

Length: 1–5000 characters

  • Length is counted in characters (a CJK character counts as one).
  • With reference images, say what each one is for and refer to it by position, for example “the first reference image”.

If the value is wrong

  • Missing: "prompt" is required
  • Empty or longer than the limit: "prompt" has an unsupported length

quality string Optional

The tier: Quality, Fast or Lite. Each tier is priced on its own at each resolution.

Allowed values: Quality, Fast, Lite

  • The value is case sensitive: Fast, not fast.
  • If you leave it out: text and frame requests use Quality; reference-image requests use Fast, the cheaper tier that accepts references.
  • Quality cannot be used with reference_images. Send Fast or Lite, or leave quality out.
  • The tier decides the price; see Billing. usage on the finished task shows what was charged.

Leaving quality out is not the same price in every mode: text and frame requests are billed as Quality, the most expensive tier. Send quality explicitly.

If the value is wrong

  • A value not in the list: "quality" must be one of: [Quality Fast Lite]
  • Quality with reference_images: Veo 3.1 Quality does not support reference images

images string[] Optional

A first frame, or a first and a last frame.

Items: 1–2
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • One link: the video starts from this image. Two links: images[0] is the first frame and images[1] the last.
  • For pictures that guide the video without being frames, use reference_images (Fast or Lite).

If the value is wrong

  • More than two links: "images" accepts at most 2 items
  • An empty array: "images" requires at least 1 item
  • Combined with reference_images: Cannot combine "images" with reference inputs in one task
  • Not an https:// link: "images[0]" must be a public HTTPS URL

reference_images string[] Optional

One to three pictures that guide the content, characters or style of the video.

Items: 1–3
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Needs Fast or Lite. If you leave quality out, Fast is used.
  • aspect_ratio must be 16:9 or 9:16 (it is 16:9 if you leave it out).
  • Images are used in list order; refer to them in the prompt by position.

If the value is wrong

  • More than three links: "reference_images" accepts at most 3 items
  • An empty array: "reference_images" requires at least 1 item
  • Combined with images: Cannot combine "images" with reference inputs in one task
  • With quality: "Quality": Veo 3.1 Quality does not support reference images
  • With aspect_ratio: "auto": Veo 3.1 reference mode requires aspect_ratio 16:9 or 9:16

aspect_ratio string OptionalDefault: 16:9

Shape of the video as width:height. auto leaves the choice to the model.

Allowed values: 16:9, 9:16, auto
Default: 16:9

  • auto is not accepted with reference_images: use 16:9 or 9:16.

If the value is wrong

  • A value not in the list: "aspect_ratio" must be one of: [16:9 9:16 auto]
  • auto with reference_images: Veo 3.1 reference mode requires aspect_ratio 16:9 or 9:16

resolution string OptionalDefault: 720p

Output resolution. Each tier has its own price at each resolution; 4K costs the most.

Allowed values: 720p, 1080p, 4k
Default: 720p

  • 4k and 4K mean the same thing; both are accepted. The other values are lower case.
  • The price list names the tier 4K.

If the value is wrong

  • A value not in the list (for example 1080P): "resolution" must be one of: [720p 1080p 4k 4K]

watermark string Optional

Optional watermark text, passed to the model unchanged. Leave it out for the model’s default.

  • It is a string, not a switch: true or false is refused.

If the value is wrong

  • Not a string: "watermark" must be a string

enable_translation boolean Optional

Passed to the model as its prompt-translation switch. Leave it out for the model’s default.

If the value is wrong

  • Not true or false: "enable_translation" must be a boolean

The gateway also checks these combinations before creating the task:

  • images cannot be combined with reference inputs

Input media limits

The gateway reads every input before the task is created and refuses one outside these limits with a 400 bad_request that names the input. Nothing is charged.

  • The gateway checks only that every image is a public HTTPS link. It does not measure size, format or dimensions before the task is created, so an image the model cannot use fails the task after submission; the message says what to change and the whole reservation is returned.
  • Have a local file? Upload it with POST /v1/files and pass the returned data.url.

Choosing a tier

One model ID covers three tiers. They are separate products with separate prices, picked with quality.

qualityText and framesReference imagesWhen you leave quality out
QualityAcceptedRefusedUsed for text and frame requests
FastAcceptedAcceptedUsed for reference-image requests
LiteAcceptedAcceptedNever chosen for you
  • Prices at each resolution are in the table under Billing. Quality is the most expensive tier and Lite the cheapest at every resolution.

Fields this model does not accept

Sending one of these is refused before anything is charged, instead of being ignored:

  • duration → field "duration" is not supported by model veo-3.1. Every Veo 3.1 video is 8 seconds long; there is nothing to choose.
  • reference_videos, reference_audios, generate_audio, seed, sound, task_type, output_format → field "<name>" is not supported by model veo-3.1 (with the field you sent). There is no field to turn sound on or off.
  • Any other unknown field → unknown field: <name>.

Request examples

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "veo-3.1",
"prompt": "A slow tracking shot along a rain-lit night market, neon reflections on wet stone, ambient crowd sound",
"quality": "Fast",
"aspect_ratio": "16:9",
"resolution": "720p"
}'

Text to video (Fast)

An 8-second 720p clip on the Fast tier. quality is sent on purpose: left out, a text request is billed as Quality.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "veo-3.1",
"prompt": "A slow tracking shot along a rain-lit night market, neon reflections on wet stone, ambient crowd sound",
"quality": "Fast",
"aspect_ratio": "16:9",
"resolution": "720p"
}'

Text to video (Quality, 1080p)

The Quality tier at 1080p, portrait.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "veo-3.1",
"prompt": "A cinematic aerial reveal of a quiet coastal village at sunrise, gulls calling, waves on the shore",
"quality": "Quality",
"aspect_ratio": "9:16",
"resolution": "1080p"
}'

Text to video (Lite, 4K)

4k and 4K are the same value.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "veo-3.1",
"prompt": "A close-up of coffee being poured into a white cup, steam rising, soft kitchen sounds",
"quality": "Lite",
"aspect_ratio": "16:9",
"resolution": "4k"
}'

First and last frame

The video moves from the first image to the second. With one link in images it starts from that image.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "veo-3.1",
"prompt": "The camera pushes in from the bottle on the table to the singer on a neon stage in one continuous move",
"images": [
"https://media.beatapi.io/samples/smart-bottle.png",
"https://media.beatapi.io/samples/neon-singer.png"
],
"quality": "Quality",
"aspect_ratio": "16:9",
"resolution": "720p"
}'

Reference images

Needs Fast or Lite, and aspect_ratio 16:9 or 9:16.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "veo-3.1",
"prompt": "The singer from the second reference image walks past the bottle from the first reference image on a neon street, handheld camera",
"reference_images": [
"https://media.beatapi.io/samples/smart-bottle.png",
"https://media.beatapi.io/samples/neon-singer.png"
],
"quality": "Fast",
"aspect_ratio": "16:9",
"resolution": "720p"
}'

Responses

Create a task (201)

The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "veo-3.1",
"capability_version": 1,
"media_type": "video",
"model": "veo-3.1",
"status": "queued",
"stage": "queued",
"created_at": 1791993600,
"updated_at": 1791993600,
"completed_at": null,
"poll_after_seconds": 8,
"output": null,
"usage": {
"credits_reserved": 0.3,
"credits_settled": 0,
"credits_refunded": 0,
"credits_charged": 0.3
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}
FieldTypeDescription
data.idstringTask ID: task_ followed by 32 letters and digits. Use it to poll and to match webhook events.
data.objectstringAlways task.
data.task_kindstringimage or video.
data.capability_idstringThe model ID you sent.
data.capability_versionintegerContract version of the model, currently 1.
data.media_typestringimage or video.
data.modelstringThe model ID you sent (same as capability_id).
data.statusstringqueued, processing, succeeded or failed. Only the last two are final.
data.stagestringRepeats status; kept for older clients.
data.created_atintegerWhen the task was created, Unix seconds.
data.updated_atintegerLast change, Unix seconds.
data.completed_atinteger | nullWhen the task finished, Unix seconds; null while it runs.
data.poll_after_secondsintegerWhile running: how long to wait before the next poll (5 for images, 8 for videos).
data.typical_secondsobjectWhile running, when enough recent tasks exist: p50 and p90 completion times in seconds over the last window, from samples tasks.
data.outputobject | nullThe result; null until status is succeeded. See the output fields below.
data.usage.credits_reservednumberUSD held from your balance when the task was created.
data.usage.credits_chargednumberUSD this task costs; 0 on a failed task.
data.usage.credits_settlednumberUSD finally taken; set when the task succeeds, otherwise 0.
data.usage.credits_refundednumberUSD returned to your balance; equals the reservation on a failed task once the refund is recorded.
data.usage.billable_duration_secondsintegerVideo only: the seconds the price is based on. Absent when the model reports no duration.
data.request_idstringRequest ID. Include it when you contact support.
data.error_codestring | nullFailure code; null unless the task failed.
data.error_messagestring | nullWhat went wrong and what to change; null unless the task failed.

Finished task

GET /v1/tasks/{task_id} returns HTTP 200 with status: "succeeded" and the result in data.output.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "veo-3.1",
"capability_version": 1,
"media_type": "video",
"model": "veo-3.1",
"status": "succeeded",
"stage": "succeeded",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": {
"media": [
{
"type": "video",
"url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.mp4",
"mime_type": "video/mp4"
}
],
"r2_url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.mp4"
},
"usage": {
"credits_reserved": 0.3,
"credits_settled": 0.3,
"credits_refunded": 0,
"credits_charged": 0.3
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}

Output fields

FieldTypeDescription
output.mediaobject[]The generated files; one 8-second video for this model.
output.media[].typestringAlways video.
output.media[].urlstringHTTPS link to the stored video. Download and keep it; no retention period is promised.
output.media[].mime_typestringThe media type of the file, normally video/mp4.
output.r2_urlstringThe video URL again, for older clients. Read media instead.

Failed task

A failed task is still HTTP 200 on GET /v1/tasks/{task_id}: the failure is in the body. The reservation is returned in full, so nothing is charged.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "veo-3.1",
"capability_version": 1,
"media_type": "video",
"model": "veo-3.1",
"status": "failed",
"stage": "failed",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": null,
"usage": {
"credits_reserved": 0.3,
"credits_settled": 0,
"credits_refunded": 0.3,
"credits_charged": 0
},
"retryable": true,
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": "processing_failed",
"error_message": "The task failed during processing on our side. Retry; a failed task is refunded."
}
}
FieldTypeDescription
data.error_codestringOne of bad_request and content_policy_violation (change the request) or processing_unavailable, processing_timeout, processing_failed and result_transfer_failed (try again later). See Errors.
data.error_messagestringA sentence that names the problem and the fix.
data.retryablebooleanPresent only on a failed task: true when the same request can succeed if you send it again.
data.usageobjectOnce the refund is recorded (normally at the moment the task fails): credits_charged and credits_settled are 0, and credits_refunded equals credits_reserved.

Complete example

Create a task, wait for it with the server’s polling hint, and print the result URLs. Set BEATAPI_API_KEY in your environment and install requests.

import os
import time
import uuid
import requests
API = "https://api.beatapi.io"
HEADERS = {"Authorization": f"Bearer {os.environ['BEATAPI_API_KEY']}"}
def create_task(body: dict) -> dict:
# One Idempotency-Key per logical request: a retry with the same key cannot create a second task.
headers = {**HEADERS, "Idempotency-Key": str(uuid.uuid4())}
for attempt in range(3):
response = requests.post(f"{API}/v1/videos/tasks", headers=headers, json=body, timeout=60)
if response.status_code in (429, 503) and attempt < 2:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
break
try:
payload = response.json()
except ValueError: # an edge error page is not JSON
response.raise_for_status()
raise
if not response.ok:
error = payload["error"]
raise RuntimeError(f"{response.status_code} {error['code']}: {error['message']} (request_id={error.get('request_id')})")
return payload["data"]
def wait_for_task(task_id: str, timeout_seconds: int = 1800) -> dict:
deadline = time.monotonic() + timeout_seconds
while time.monotonic() < deadline:
response = requests.get(f"{API}/v1/tasks/{task_id}", headers=HEADERS, timeout=30)
if response.status_code == 429 or response.status_code >= 500:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
response.raise_for_status()
task = response.json()["data"]
if task["status"] in ("succeeded", "failed"):
return task
time.sleep(task.get("poll_after_seconds", 5))
raise TimeoutError(f"task {task_id} is still running; keep polling later")
task = create_task({
"model": "veo-3.1",
"prompt": "A slow tracking shot along a rain-lit night market, neon reflections on wet stone, ambient crowd sound",
"quality": "Fast",
"aspect_ratio": "16:9",
"resolution": "720p"
})
print("created", task["id"])
task = wait_for_task(task["id"])
if task["status"] == "failed":
raise SystemExit(f"{task['error_code']}: {task['error_message']}")
for item in task["output"]["media"]:
print(item["url"])

Billing

  • The price is per video, not per second: every video is 8 seconds, and the price depends on the tier (quality) and the resolution. Sound is included.
  • The list below has one row per tier and resolution. Quality is the most expensive tier and Lite the cheapest at every resolution; 4K costs the most within a tier.
  • Leave quality out and a text or frame request is billed as Quality, while a reference-image request is billed as Fast. Send quality to be sure of the price.
  • The price is reserved when the task is created and settled when the video is ready. A failed task, including one refused by moderation after submission, is refunded in full.

Current list prices, the same as on Pricing. An account with a negotiated discount pays less; data.usage on the task always shows the amount actually charged.

OptionList price (USD)
8 sec · Lite · 720p · audio$0.15
8 sec · Lite · 1080p · audio$0.25
8 sec · Lite · 4K · audio$0.75
8 sec · Fast · 720p · audio$0.3
8 sec · Fast · 1080p · audio$0.4
8 sec · Fast · 4K · audio$0.9
8 sec · Quality · 720p · audio$1.85
8 sec · Quality · 1080p · audio$1.9
8 sec · Quality · 4K · audio$2.5

Common errors

Error or symptomCauseFix
400 Veo 3.1 Quality does not support reference imagesquality: "Quality" with reference_images.Send Fast or Lite, or leave quality out (Fast is used).
400 Veo 3.1 reference mode requires aspect_ratio 16:9 or 9:16aspect_ratio: "auto" with reference_images.Send 16:9 or 9:16, or leave it out.
400 Cannot combine "images" with reference inputs in one taskFrames (images) and reference_images in the same request.Use frames or reference images, not both.
400 field "duration" is not supported by model veo-3.1Veo 3.1 videos are always 8 seconds, so there is no duration field.Remove duration.
400 "quality" must be one of: [Quality Fast Lite]A different spelling, such as fast or quality.Send Quality, Fast or Lite, with the capital first letter.
400 "watermark" must be a stringwatermark sent as true or false.Send text, or remove the field.
The bill is higher than expectedquality was left out of a text or frame request, which is billed as Quality.Send quality: "Fast" or "Lite"; check usage.credits_charged on the task.
Task failed with content_policy_violationThe prompt, an input image or the result was refused by moderation.Change the prompt or the images. Retrying unchanged fails again; nothing is charged.
402 insufficient_creditsThe balance is below the price of this tier and resolution.Top up, or pick a cheaper tier or resolution.

HTTP errors at a glance

Errors before a task exists arrive as a non-2xx response, and nothing is charged. Branch on error.code or error.retryable; message names the problem. The full list and retry policy are on Errors.

{
"error": {
"code": "bad_request",
"message": "\"prompt\" is required",
"retryable": false,
"request_id": "req_5f0c2a9e4b7d4e31"
}
}
HTTP statuserror.codeWhat to do
400bad_request, content_policy_violationFix the request; the message names the field. Do not retry unchanged.
401missing_api_key, invalid_api_key (older clients may see unauthorized)Send a valid key as Authorization: Bearer <key>.
402insufficient_creditsTop up, or raise the key’s quota, then send it again.
403forbiddenThe key or account may not use this model (for example, free credit only covers some models). Do not retry unchanged.
404not_foundOn GET /v1/tasks/{task_id}: the task does not exist for this key’s account. Check the ID.
409idempotency_conflictUse a new Idempotency-Key, or wait for the first request with this key to finish.
429rate_limit_exceededWait Retry-After seconds (also error.retry_after_seconds), then retry.
500internal_errorRetry with backoff; contact support with request_id if it continues.
503processing_unavailable, processing_timeout, processing_failed, result_transfer_failedNothing was charged. Retry with exponential backoff.

Authentication

AuthorizationBearer

Send your API key as Authorization: Bearer <BEATAPI_API_KEY>.

Headers

Idempotency-KeystringOptional<=255 characters

Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.

Request

This endpoint expects an object.
modelenumRequired

The model to run. Veo 3.1 is one ID; the tier is chosen with quality.

Value: veo-3.1

If the value is wrong

  • Missing: "model" is required
  • An image model sent to this endpoint: "model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint
Allowed values:
promptstringRequired1-5000 characters

What happens in the video: subject, action, camera movement, style and sound.

Length: 1–5000 characters

  • Length is counted in characters (a CJK character counts as one).
  • With reference images, say what each one is for and refer to it by position, for example “the first reference image”.

If the value is wrong

  • Missing: "prompt" is required
  • Empty or longer than the limit: "prompt" has an unsupported length
aspect_ratioenumOptionalDefaults to 16:9

Shape of the video as width:height. auto leaves the choice to the model.

Allowed values: 16:9, 9:16, auto

Default: 16:9

  • auto is not accepted with reference_images: use 16:9 or 9:16.

If the value is wrong

  • A value not in the list: "aspect_ratio" must be one of: [16:9 9:16 auto]
  • auto with reference_images: Veo 3.1 reference mode requires aspect_ratio 16:9 or 9:16
Allowed values:
enable_translationbooleanOptional

Passed to the model as its prompt-translation switch. Leave it out for the model’s default.

If the value is wrong

  • Not true or false: "enable_translation" must be a boolean
imageslist of stringsOptional

A first frame, or a first and a last frame.

Items: 1–2

Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • One link: the video starts from this image. Two links: images[0] is the first frame and images[1] the last.
  • For pictures that guide the video without being frames, use reference_images (Fast or Lite).

If the value is wrong

  • More than two links: "images" accepts at most 2 items
  • An empty array: "images" requires at least 1 item
  • Combined with reference_images: Cannot combine "images" with reference inputs in one task
  • Not an https:// link: "images[0]" must be a public HTTPS URL
qualityenumOptional

The tier: Quality, Fast or Lite. Each tier is priced on its own at each resolution.

Allowed values: Quality, Fast, Lite

  • The value is case sensitive: Fast, not fast.
  • If you leave it out: text and frame requests use Quality; reference-image requests use Fast, the cheaper tier that accepts references.
  • Quality cannot be used with reference_images. Send Fast or Lite, or leave quality out.
  • The tier decides the price; see Billing. usage on the finished task shows what was charged.

Notes: Leaving quality out is not the same price in every mode: text and frame requests are billed as Quality, the most expensive tier. Send quality explicitly.

If the value is wrong

  • A value not in the list: "quality" must be one of: [Quality Fast Lite]
  • Quality with reference_images: Veo 3.1 Quality does not support reference images
Allowed values:
reference_imageslist of stringsOptional

One to three pictures that guide the content, characters or style of the video.

Items: 1–3

Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Needs Fast or Lite. If you leave quality out, Fast is used.
  • aspect_ratio must be 16:9 or 9:16 (it is 16:9 if you leave it out).
  • Images are used in list order; refer to them in the prompt by position.

If the value is wrong

  • More than three links: "reference_images" accepts at most 3 items
  • An empty array: "reference_images" requires at least 1 item
  • Combined with images: Cannot combine "images" with reference inputs in one task
  • With quality: "Quality": Veo 3.1 Quality does not support reference images
  • With aspect_ratio: "auto": Veo 3.1 reference mode requires aspect_ratio 16:9 or 9:16
resolutionenumOptionalDefaults to 720p

Output resolution. Each tier has its own price at each resolution; 4K costs the most.

Allowed values: 720p, 1080p, 4k

Default: 720p

  • 4k and 4K mean the same thing; both are accepted. The other values are lower case.
  • The price list names the tier 4K.

If the value is wrong

  • A value not in the list (for example 1080P): "resolution" must be one of: [720p 1080p 4k 4K]
Allowed values:
watermarkstringOptional

Optional watermark text, passed to the model unchanged. Leave it out for the model’s default.

  • It is a string, not a switch: true or false is refused.

If the value is wrong

  • Not a string: "watermark" must be a string

Response

The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.

Errors

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
403
Forbidden Error
409
Conflict Error
429
Too Many Requests Error
500
Internal Server Error
503
Service Unavailable Error