Google Veo3.1 Lite Text To Video API Documentation
Playground
Try it on WaveSpeedAI!Google Veo 3.1 Lite Text-to-Video generates high-fidelity 720p or 1080p videos with natively generated audio from text prompts. Lightweight variant optimized for cost efficiency. Supports landscape and portrait aspect ratios, dialogue with lip-sync, and customizable duration. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Veo 3.1 Lite is an efficient text-to-video model, generating high-quality cinematic video from natural language prompts at accessible pricing. With native synchronized audio generation, negative prompt guidance, landscape and portrait aspect ratios, and resolution up to 1080p, it delivers strong results for a wide range of creative and production workflows.
- Need maximum quality? Try Veo 3 Text-to-Video
Why Choose This?
-
High-quality video generation Produces detailed, visually coherent video with natural motion, lighting, and scene composition from text descriptions.
-
Negative prompt guidance Describe unwanted elements to guide generation. Exclusion of specific elements is not guaranteed.
-
Resolution options Generate at 720p or 1080p to match your quality and budget requirements. 1080p requires an 8-second duration.
-
Flexible aspect ratios Supports landscape 16:9 and portrait 9:16 for cinematic and social formats.
-
Seed control Set a seed when experimenting with generation settings. Identical outputs are not guaranteed.
-
Synchronized audio Generates audio alongside the video. Describe dialogue, sound effects, and ambient sounds in your prompt.
Parameters
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Text description of the scene, motion, camera style, and atmosphere. May include dialogue and sound cues. |
| aspect_ratio | No | Output aspect ratio: 16:9 or 9:16. Default: 16:9. |
| duration | No | Clip length in seconds: 4, 6, or 8. Default: 6. Must be 8 when resolution is 1080p. |
| resolution | No | Output resolution: 720p or 1080p. Default: 720p. 1080p requires duration to be 8. |
| negative_prompt | No | Guidance describing elements to avoid in the generated video; exclusion is not guaranteed. |
| seed | No | Random seed for generation. Does not guarantee identical results. |
How to Use
- Write your prompt — describe the scene, characters, camera movement, lighting, and atmosphere. Include sound effects or dialogue if needed.
- Select aspect ratio — choose 16:9 for landscape or 9:16 for portrait.
- Set duration — choose 4, 6, or 8 seconds. Select 8 seconds if you plan to use 1080p.
- Select resolution — 720p for standard output, 1080p for higher-resolution results. When selecting 1080p, explicitly set duration to 8.
- Add negative prompt (optional) — describe elements you want the model to avoid.
- Set seed (optional) — specify a seed for controlled experimentation, without expecting exact reproduction.
- Submit — generate, preview, and download your video.
Pricing
| Resolution | Duration | Cost |
|---|---|---|
| 720p | 4s | $0.20 |
| 720p | 6s | $0.30 |
| 720p | 8s | $0.40 |
| 1080p | 8s | $0.64 |
Best Use Cases
- Cinematic Storytelling — Render atmospheric, narrative-driven scenes from detailed text descriptions.
- Social Media Content — Generate platform-optimized video clips with synchronized audio.
- Marketing & Advertising — Produce high-quality promotional video content without a film crew.
- Concept Visualization — Bring creative ideas and moods to life quickly for pitching and review.
- Audio-Visual Content — Describe ambient sounds, dialogue, and sound effects for immersive scenes.
Pro Tips
- Be specific in your prompt — include camera angle, lighting style, subject behavior, and atmosphere.
- Use negative_prompt as guidance for unwanted elements rather than a strict exclusion rule.
- Use 720p to rapidly test and iterate on prompts before committing to an 8-second 1080p final render.
- Keep the prompt and settings consistent when comparing results; a fixed seed does not guarantee identical output.
- Include clear audio cues in your prompt when particular sounds or dialogue are important.
Notes
- Only prompt is required; all other parameters are optional.
- The default output settings are 720p, 6 seconds, and 16:9.
- Selecting 1080p requires explicitly setting duration to 8; the default 6-second duration is not valid at 1080p.
- Audio generation is enabled by default.
- Please follow applicable content usage policies when crafting prompts.
Related Models
- Veo 3.1 Lite Image-to-Video — Animate a reference image into a cinematic video clip with Veo 3.1 Lite.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic ocean wave at sunrise, highly detailed",
"aspect_ratio": "16:9",
"duration": 6,
"resolution": "720p"
}
JSON
)
# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 \
-X POST "https://api.wavespeed.ai/api/v3/google/veo3.1-lite/text-to-video" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}"); then
printf 'Submit failed. %s\n' "${CHECK}" >&2
exit 1
fi
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id. %s\n' "${CHECK}" >&2
exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"
# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
# Transient errors (429, 5xx) are retried, honoring Retry-After.
HTTP_CODE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
--output "${BODY_FILE}" --write-out '%{http_code}' \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
case "${HTTP_CODE}" in
2??) ;;
000|429|5??) # dropped connection or temporary error: keep polling
printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
sleep 10; continue ;;
*) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
cat "${BODY_FILE}" >&2; exit 1 ;;
esac
RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout|deleted)
printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneRetry temporary errors only while polling, never the submit request. Errors, retries and timeouts
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | Text prompt for generation; Positive text prompt. | |
| aspect_ratio | string | No | 16:9 | 16:9, 9:16 | Aspect ratio of the video. |
| duration | integer | No | 6 | 8, 6, 4 | The duration of the generated media in seconds. |
| resolution | string | No | 720p | 720p, 1080p | Video resolution. |
| negative_prompt | string | No | - | Negative prompt for the generation. | |
| seed | integer | No | - | - | The random seed to use for the generation. |
Every model also accepts the global request options enable_sync_mode and enable_base64_output; see their pages for details.
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |