A traceur sprints across city rooftops at golden hour and vaults a low vent, dynamic follow camera swinging with the stride, long shadows raking across gravel and antennas. Natural sound: rhythmic footsteps, a soft scuff on the vault, wind between buildings, distant traffic hum. Realistic athletic motion, no text, no logos.
Veo 3.1 Fast Official Text-to-Video API
google/veo3.1-fast/text-to-videoVeo 3.1 Fast Official is engineered for high-frequency commercial production: rapid turnaround without sacrificing high-fidelity materials, multi-axis camera motion, or action-aligned native audio. With 720p / 1080p / 4K and transparent per-second pricing, it is the workhorse engine for daily volume pipelines.
Examples
REST API
Quick Start
Authenticate with the API, submit the inputs and instructions, then retrieve the video using the task ID.
Connect to the Vidgo API
Create an API key, keep it only on your server, and send Authorization: Bearer VIDGO_API_KEY.
- Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer VIDGO_API_KEY
Submit one generation task
Fill in the inputs and settings for this endpoint using the request example, then save the returned task_id to query generation progress and results.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "google/veo3.1-fast/text-to-video",
"input": {
"prompt": "A traceur sprints across city rooftops at golden hour and vaults a low vent, dynamic follow camera swinging with the stride, long shadows raking across gravel and antennas. Natural sound: rhythmic footsteps, a soft scuff on the vault, wind between buildings, distant traffic hum. Realistic athletic motion, no text, no logos.",
"duration": 8,
"aspect_ratio": "16:9",
"sound": true,
"resolution": "720p"
}
}
JSON
)
RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
CODE=$(printf '%s' "$RESPONSE" | jq -r '.code // empty')
if [ "$CODE" != "0" ] && [ "$CODE" != "200" ]; then
printf 'API error: %s
' "$RESPONSE" >&2
exit 1
fi
printf '%s
' "$RESPONSE"Wait for the result
Query with task_id, continue for not_started/running, and stop for finished/failed. On success, read data.files[].file_url.
Track status
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll status with a 2-second base interval, and increase the interval for longer tasks. Continue only while status is not_started or running, and stop once finished or failed. You can also specify callback_url in the request payload to receive webhook notifications.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "running",
"created_time": "2026-09-17T10:00:00Z"
}
}{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "finished",
"files": [
{
"file_url": "https://storage.vidgo.ai/generated/video.mp4",
"file_type": "video"
}
],
"created_time": "2026-08-22T10:00:00Z",
"progress": 100,
"error_message": null
}
}Complete runnable example
Expand for a complete script with HTTP and business-code checks, task_id validation, polling, terminal-state handling, and a timeout boundary.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "google/veo3.1-fast/text-to-video",
"input": {
"prompt": "A traceur sprints across city rooftops at golden hour and vaults a low vent, dynamic follow camera swinging with the stride, long shadows raking across gravel and antennas. Natural sound: rhythmic footsteps, a soft scuff on the vault, wind between buildings, distant traffic hum. Realistic athletic motion, no text, no logos.",
"duration": 8,
"aspect_ratio": "16:9",
"sound": true,
"resolution": "720p"
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
BUSINESS_CODE=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Submit failed:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
START_TIME=$(date +%s)
POLL_DELAY=2
while true; do
if [ $(( $(date +%s) - START_TIME )) -ge 600 ]; then
printf 'Timed out after 600 seconds
' >&2
exit 1
fi
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
BUSINESS_CODE=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Status request failed:
%s
' "$STATUS_RESPONSE" >&2
exit 1
fi
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep "$POLL_DELAY"
if [ "$POLL_DELAY" -lt 10 ]; then POLL_DELAY=$((POLL_DELAY + 1)); fi
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneInput parameters
The table lists available input parameters, types, and defaults. Request examples also include the required top-level model field. Prepare the inputs for this task and configure the output.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Yes | — | 1–1,000 characters after trimming. |
| duration | integer | No | 8 | 4, 6, or 8, in seconds. |
| aspect_ratio | string | No | 16:9 | 16:9 or 9:16. |
| resolution | string | No | 720p | 720p / 1080p / 4k. |
| sound | boolean | No | true | true generates native audio; false returns a silent clip. |
Response Fields
A successful submission returns a task ID. Status queries provide progress, output files, and error details when a task fails.
| Field | Type | Description |
|---|---|---|
| code | integer | Application result code; successful responses use 0 or 200. |
| message | string | Human-readable message or error detail when present. |
| data.task_id | string | Task ID used in the status endpoint path. |
| data.status | string | not_started, running, finished, or failed. |
| data.created_time | string | Task creation time in date-time format. |
| data.progress | integer | Task progress from 0 to 100, when included in the response. |
| data.files[] | array | All output files from a successful task, in response order. |
| data.files[].file_url | string | Public URL for a generated video. |
| data.files[].file_type | string | File type, such as video. |
| data.error_message | string | null | Failure detail when status is failed. |
Task Lifecycle
Continue querying while the status is not_started or running. End polling at finished or failed, then process the output files or error details respectively.
not_startedThe task was accepted and is waiting to begin.
runningGeneration is in progress. Continue polling the same task_id.
finishedGeneration succeeded. Read every video URL from data.files[].file_url.
failedGeneration stopped with an error. Read data.error_message and stop polling.
Polling and Errors
- AuthenticationFor a 401 response, check the Bearer API key in Authorization, update the credentials, and retry.
- ValidationFor a 400 response, use the response details to check required inputs, parameter values, and available credits, then make the indicated adjustments before submitting again.
- Network and timeoutIf a status query encounters a network error or timeout, retain the original task_id and retry the query, then handle the result according to the returned task status.
- Polling intervalPoll status with a 2-second base interval, and gradually increase the interval for longer tasks.
- Terminal statesContinue only for not_started or running. Stop immediately on finished or failed.
- Callback optionProvide callback_url at the request top level to receive the final flat task object; polling remains available if delivery fails.
Endpoint limits
| Specification | Value | Details |
|---|---|---|
| Input mode | Text only | A prompt defines the scene, camera, lighting, mood, and sound. |
| Output | Video with optional native audio | The endpoint returns an asynchronous task ID; finished tasks include a video file. |
| Resolution | 720p / 1080p / 4k | Default is 720p. |
| Duration | 4 / 6 / 8 seconds | Default is 8 seconds. |
| Aspect ratio | 16:9 / 9:16 | Default is 16:9. |
| Billing basis | Per second | 720p silent 10 credits/s; audio 15 credits/s. 1080p silent 10 credits/s; audio 15 credits/s. 4k silent 30 credits/s; audio 35 credits/s. |
Related Models
Veo 3.1 Fast Official Text-to-Video API frequently asked questions
What is the Veo 3.1 Fast Official Text-to-Video API?
Veo 3.1 Fast Official is the balanced tier of Google's Veo 3.1 family built for high-frequency production. This endpoint turns text prompts into 4–8 second videos with authentic physics, cinematic camera control, and synchronized native audio up to 4K—ideal as a daily commercial workhorse via Vidgo API or the online playground.
What model ID should I use in API requests?
Specify google/veo3.1-fast/text-to-video in the model field. For Quality or Lite, use google/veo3.1/text-to-video and google/veo3.1-lite/text-to-video respectively. Do not submit URL paths containing -official.
How does native audio generation work on Fast?
Veo 3.1 features native audiovisual co-generation. By setting sound: true and including sound descriptors in your prompt, the model embeds synchronized Foley, atmospheric soundscapes, and mechanical audio directly into the output MP4—especially valuable for shortening post work in batch pipelines.
Which resolutions does Fast support, and when should I use 4K?
Fast supports 720p, 1080p, and 4K. Use 720p/1080p for daily iteration and social volume; switch to 4K when shots need large-format display, brand hero assets, or high-resolution final delivery that preserves textures and lighting detail.
How do I direct camera motion through prompt engineering?
Use dedicated cinematic phrasing in distinct clauses, such as 'slow push-in', 'low tracking camera at wheel height', or '360-degree orbit around the subject'. Fast reliably executes standard cinematography terminology when shot size changes and move rates are also specified.
When should I choose Fast instead of Lite or Quality?
Choose Lite for high-volume, low-cost prompt exploration; choose Quality for flagship cinematic fidelity and premium finals; choose Fast when you need the golden balance of speed, high-fidelity visuals, and 4K capability for high-frequency commercial production.
What are the benefits of per-second pricing for volume production?
Per-second billing keeps batch costs granular and transparent. Pay only for the exact 4s, 6s, or 8s you need, disable audio during previews to reduce spend, then enable audio and higher resolution once creative direction is locked.
Does this text-to-video endpoint support image inputs?
This text-to-video endpoint is dedicated to text prompts. To animate a single starting image or interpolate between start and end frames, use the Veo 3.1 Fast Official Image-to-Video endpoint.















