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:
qualitychooses Quality, Fast or Lite, and each is priced on its own at each resolution. - There is no
durationfield: 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
qualityout 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.
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
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.
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.
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
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, notfast. - If you leave it out: text and frame requests use
Quality; reference-image requests useFast, the cheaper tier that accepts references. Qualitycannot be used withreference_images. SendFastorLite, or leavequalityout.- The tier decides the price; see Billing.
usageon 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] Qualitywithreference_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 andimages[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
FastorLite. If you leavequalityout,Fastis used. aspect_ratiomust be16:9or9:16(it is16:9if 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
autois not accepted withreference_images: use16:9or9:16.
If the value is wrong
- A value not in the list:
"aspect_ratio" must be one of: [16:9 9:16 auto] autowithreference_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
4kand4Kmean 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:
trueorfalseis 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/filesand pass the returneddata.url.
Choosing a tier
One model ID covers three tiers. They are separate products with separate prices, picked with quality.
- 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
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.
Text to video (Quality, 1080p)
The Quality tier at 1080p, portrait.
Text to video (Lite, 4K)
4k and 4K are the same value.
First and last frame
The video moves from the first image to the second. With one link in images it starts from that image.
Reference images
Needs Fast or Lite, and aspect_ratio 16:9 or 9:16.
Responses
Create a task (201)
The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.
Finished task
GET /v1/tasks/{task_id} returns HTTP 200 with status: "succeeded" and the result in data.output.
Output fields
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.
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.
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
qualityout and a text or frame request is billed as Quality, while a reference-image request is billed as Fast. Sendqualityto 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.
Common errors
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.
Authentication
Send your API key as Authorization: Bearer <BEATAPI_API_KEY>.
Headers
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
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
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
Shape of the video as width:height. auto leaves the choice to the model.
Allowed values: 16:9, 9:16, auto
Default: 16:9
autois not accepted withreference_images: use16:9or9:16.
If the value is wrong
- A value not in the list:
"aspect_ratio" must be one of: [16:9 9:16 auto] autowithreference_images:Veo 3.1 reference mode requires aspect_ratio 16:9 or 9:16
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
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 andimages[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
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, notfast. - If you leave it out: text and frame requests use
Quality; reference-image requests useFast, the cheaper tier that accepts references. Qualitycannot be used withreference_images. SendFastorLite, or leavequalityout.- The tier decides the price; see Billing.
usageon 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] Qualitywithreference_images:Veo 3.1 Quality does not support reference images
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
FastorLite. If you leavequalityout,Fastis used. aspect_ratiomust be16:9or9:16(it is16:9if 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
Output resolution. Each tier has its own price at each resolution; 4K costs the most.
Allowed values: 720p, 1080p, 4k
Default: 720p
4kand4Kmean 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]
Optional watermark text, passed to the model unchanged. Leave it out for the model’s default.
- It is a string, not a switch:
trueorfalseis 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.

