Claude Opus 5.5 is live on SeedRouter
SeedRouter Docs

Veo 3.1

Generate Veo 3.1 video clips through one task API: three models priced per 8-second clip and two priced per second, with frames, audio and GIF output.

View Markdown

Veo 3.1 is Google's video generation model. SeedRouter offers it as five model IDs on one endpoint: three priced per clip, every clip 8 seconds long, and two priced per second with more controls (duration, audio, seed, negative prompt, first and last frame). Send the request, keep the returned task ID, and read the finished video from the task. Images go in as URLs.

Model IDs

Model IDBillingLengthImagesAudio
veo-3.1-fastper clip8 secondsup to 3, frame or reference modeno switch
veo-3.1-qualityper clip8 secondsup to 3, frame modeno switch
veo-3.1-liteper clip8 secondsnone (text to video)no switch
veo-3.1-fast-officialper second4, 6 or 8 secondsfirst and last framegenerate_audio
veo-3.1-quality-officialper second4, 6 or 8 secondsfirst and last framegenerate_audio

See the model page for current prices.

Quick example

curl https://api.seedrouter.ai/v1/videos/generations \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "veo-3.1-fast",
    "prompt": "A red paper boat drifts across a calm pond at sunrise, soft mist on the water, slow push-in on a 35mm lens, no text, no logos.",
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'

Endpoint

POST https://api.seedrouter.ai/v1/videos/generations
HeaderValue
AuthorizationBearer YOUR_API_KEY
Content-Typeapplication/json

The response is a task ({"id": "task_...", "status": "processing"}), not the finished video. Poll GET /v1/tasks/{task_id} for the result. Keep API keys in server-side code.

Parameters: per-clip models

veo-3.1-fast, veo-3.1-quality and veo-3.1-lite.

FieldTypeDefaultNotes
modelstringrequiredOne of the three IDs above.
promptstringrequiredDescribes the shot.
durationinteger8Only 8 is accepted.
aspect_ratioenum16:9 or 9:16.
resolutionenum720p720p, 1080p or 4k (any case). veo-3.1-lite has no 4k.
enable_gifbooleanfalseReturn the clip as an animated GIF instead of MP4. 720p only.
nsfw_checkbooleanfalseCheck the prompt and images for unsafe content before generating.
image_urlsarrayFast and Quality only. Up to 3 public image URLs.
generation_typeenumby image countFast and Quality only. frame or reference; Quality takes frame only.

Parameters: per-second models

veo-3.1-fast-official and veo-3.1-quality-official.

FieldTypeDefaultNotes
modelstringrequiredOne of the two IDs above.
promptstringrequiredDescribes the shot.
negative_promptstringWhat to keep out of the clip.
durationinteger84, 6 or 8 seconds.
aspect_ratioenum16:916:9 or 9:16.
resolutionenum720p720p, 1080p or 4k (any case).
first_frame_imagestringPublic image URL. The clip opens on it.
last_frame_imagestringPublic image URL. Needs first_frame_image.
seedintegerrandom0 to 4294967295.
generate_audiobooleanfalseAdd an audio track. Billed at a higher per-second rate.
person_generationenumallow_adultallow_adult or disallow.
resize_modeenumpadpad or crop. Needs first_frame_image.
enhance_promptbooleantrueOnly true is accepted; omit the field otherwise.
nsfw_checkbooleanfalseCheck the prompt and images for unsafe content before generating.

The schema is strict: unknown fields are rejected rather than ignored, and each model takes only its own fields. Callbacks are not available; poll the task instead.

Image modes

On veo-3.1-fast and veo-3.1-quality, generation_type sets how image_urls are used:

generation_typeImagesEffect
frame1 or 2The first image is the first frame, the second the last frame.
referenceup to 3The images are references for the subject and style. Fast only.
omitted2 or 3Two images use frame mode, three use reference mode.

veo-3.1-quality does not run reference mode, so it refuses generation_type: "reference" and three images without a generation_type. veo-3.1-lite takes no images.

On the per-second models, set first_frame_image and, optionally, last_frame_image. resize_mode chooses whether an image of another shape is padded or cropped.

Media inputs

Images are public HTTP(S) URLs:

{ "image_urls": ["https://example.com/first.jpg", "https://example.com/last.jpg"] }

On the per-clip models each image is JPEG, PNG or WebP and at most 10 MB; a file that breaks these rules fails the task without a charge. Base64 data is not accepted: upload the file to your own storage and pass its URL.

Pricing dimensions

Check the model pricing section for current rates.

per-clip models:    cost = price of one clip at the output resolution        (720p and 1080p cost the same)
per-second models:  cost = duration × rate for the resolution and audio setting

The charge is fixed when the request is accepted, so the amount reserved is the amount charged. View final charges in your account usage history. Failed tasks are not charged.

Output schema

Submission returns the task:

{"id": "task_...", "model": "veo-3.1-fast", "status": "processing", "created_at": 1789689600}

Get the task

GET https://api.seedrouter.ai/v1/tasks/{task_id}

Poll every 10–20 seconds until status is completed or failed. A network timeout while polling does not mean generation failed: keep the task ID and resume checking it. Do not create another task to check progress.

Completed task

{
  "id": "task_...",
  "model": "veo-3.1-fast",
  "status": "completed",
  "created_at": 1789689600,
  "finished_at": 1789689720,
  "output": {
    "video_url": "https://static.seedrouter.ai/media/tasks/task_example/0.mp4"
  }
}

video_url is an MP4, or a GIF when the request set enable_gif. The link is on SeedRouter's storage.

What our test runs returned (one run each, 2026-10-04):

RequestFile
veo-3.1-fast, 9:16, frame modeMP4, H.264, 720 × 1280, 24 fps, 8 s, with a stereo AAC audio track
veo-3.1-fast-official, 16:9, 720p, 4 s, no generate_audioMP4, H.264, 1280 × 720, 24 fps, 4 s, no audio track
veo-3.1-lite, enable_gifGIF, 480 × 270, 16 fps, 8 s

The per-clip models have no audio switch; the per-second models add an audio track only with generate_audio.

Errors

Requests rejected before a task is created return an HTTP error with an error object and are not charged. A task that fails after acceptance returns HTTP 200 when queried, with status: "failed" and an error object.

See the shared error catalog for codes, HTTP statuses, and retry guidance.

{
  "id": "task_...",
  "model": "veo-3.1-fast",
  "status": "failed",
  "error": {
    "code": 60001,
    "message": "The request was rejected by the content policy. Please revise the prompt or input images."
  }
}

If submission itself times out, check your tasks before submitting again: the first request may have been accepted.

Tips

  • Start on veo-3.1-lite or veo-3.1-fast at 720p to try a prompt, then move to Quality or 4k for the final render.
  • Name the camera and the light: a lens and a camera move change the shot more than adjectives do.
  • Add no text, no logos to keep invented lettering and marks out of the frame.
  • For a shot that must start and end on known images, use frame mode with two images, or the per-second models with first_frame_image and last_frame_image.
  • Fix seed on the per-second models and change one clause at a time to iterate on a shot.