Veo 3.1
Google Veo 3.1 — async video generation in five channels. Fast, Quality, and Lite for per-generation pricing; Fast Official and Quality Official for per-second pricing with audio and 4K.
Google's VEO 3.1 video model on reAPI. Five channels share one
endpoint and submit shape — pick the channel via model.
| Channel | Bills | Notes |
|---|---|---|
veo3.1-fast | per generation | Image-to-video (≤ 3 refs), remix-able |
veo3.1-quality | per generation | Frame-mode I2V only, remix-able |
veo3.1-lite | per generation | Prompt-only — no images |
veo3.1-fast-official | per second | First/last-frame I2V, audio, 4K |
veo3.1-quality-official | per second | Premium per-second tier |
8-second outputs on alt channels (4 / 6 / 8 seconds on official) at 720p / 1080p / 4K. Use the remix endpoint to extend Fast or Quality clips to 15 seconds. See current pricing on the model page.
Quick example
curl https://reapi.ai/api/v1/videos/generations \
-H "Authorization: Bearer rk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "veo3.1-fast",
"prompt": "A dolphin leaping through cobalt ocean waves at sunrise",
"aspect_ratio": "16:9",
"resolution": "720p"
}'import requests
resp = requests.post(
"https://reapi.ai/api/v1/videos/generations",
headers={
"Authorization": "Bearer rk_live_xxx",
"Content-Type": "application/json",
},
json={
"model": "veo3.1-fast",
"prompt": "A dolphin leaping through cobalt ocean waves at sunrise",
"aspect_ratio": "16:9",
"resolution": "720p",
},
)
task_id = resp.json()["data"][0]["task_id"]const res = await fetch('https://reapi.ai/api/v1/videos/generations', {
method: 'POST',
headers: {
Authorization: 'Bearer rk_live_xxx',
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'veo3.1-fast',
prompt: 'A dolphin leaping through cobalt ocean waves at sunrise',
aspect_ratio: '16:9',
resolution: '720p',
}),
});
const { data } = await res.json();
const taskId = data[0].task_id;package main
import (
"bytes"
"encoding/json"
"io"
"net/http"
)
func main() {
body, _ := json.Marshal(map[string]any{
"model": "veo3.1-fast",
"prompt": "A dolphin leaping through cobalt ocean waves at sunrise",
"aspect_ratio": "16:9",
"resolution": "720p",
})
req, _ := http.NewRequest("POST", "https://reapi.ai/api/v1/videos/generations", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer rk_live_xxx")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
_ = out
}Endpoint
POST /api/v1/videos/generations
Returns a task_id immediately. Poll GET /api/v1/tasks/{task_id} until
status is completed to retrieve the video URL.
Request fields
Common (every channel)
| Field | Type | Required | Notes |
|---|---|---|---|
model | string | yes | One of the five channel ids above |
prompt | string | yes | ≤ 4000 chars; English recommended |
aspect_ratio | enum | no | 16:9 (default landscape) or 9:16 |
resolution | enum | no | 720p (default), 1080p, or 4k |
Alt channels (veo3.1-fast, veo3.1-quality, veo3.1-lite)
| Field | Type | Notes |
|---|---|---|
duration | int | Fixed at 8 upstream |
image_urls | string[] | Up to 3 public http(s) URLs (Fast / Quality only) |
generation_type | enum | frame or reference (Quality channel: frame only) |
enable_gif | bool | Output GIF instead of mp4. Mutex with 1080p / 4k |
veo3.1-lite rejects image_urls and generation_type. Send only
prompt + the common fields.
Official channels (veo3.1-fast-official, veo3.1-quality-official)
| Field | Type | Notes |
|---|---|---|
duration | int | 4, 6, or 8 (default 8) |
negative_prompt | string | What to avoid |
first_frame_image | string | Public http(s) URL — anchors opening frame |
last_frame_image | string | Requires first_frame_image; interpolation target |
seed | int | 0–4294967295 |
sample_count | int | 1–4 (default 1) |
generate_audio | bool | Adds synthesized audio (audio pricing tier) |
person_generation | enum | allow_adult (default) or disallow |
resize_mode | enum | pad (default) or crop |
enhance_prompt | bool | Must be true if sent — omit to disable |
Image inputs are URLs only. Every reference image / frame field
rejects base64 and data: URIs at the gateway. Upload the image to
any public HTTPS host first.
Image-to-video — alt channel
curl https://reapi.ai/api/v1/videos/generations \
-H "Authorization: Bearer rk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "veo3.1-fast",
"prompt": "The cat slowly walks forward and looks around",
"image_urls": ["https://example.com/cat.png"],
"generation_type": "frame",
"aspect_ratio": "16:9",
"resolution": "720p"
}'Image-to-video — official channel (first / last frame)
curl https://reapi.ai/api/v1/videos/generations \
-H "Authorization: Bearer rk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "veo3.1-quality-official",
"prompt": "Smooth cinematic transition from the first frame to the last frame",
"first_frame_image": "https://example.com/start.png",
"last_frame_image": "https://example.com/end.png",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": 8,
"generate_audio": true
}'Remix — extend an 8s clip to 15s
POST /api/v1/videos/{task_id}/remix
Available on veo3.1-fast and veo3.1-quality only. The path task_id
is the reApi task id returned by the original generation; the source
task must be in completed status. The model in the body must match
the source task's model.
curl https://reapi.ai/api/v1/videos/{TASK_ID}/remix \
-H "Authorization: Bearer rk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "veo3.1-fast",
"prompt": "The dolphin dives back into the wave and surfaces a moment later",
"raw": false,
"aspect_ratio": "16:9",
"resolution": "720p"
}'| Field | Type | Notes |
|---|---|---|
model | enum | veo3.1-fast or veo3.1-quality — must equal source |
prompt | string | Continuation prompt; ≤ 4000 chars |
raw | bool | true returns only the extension segment; false (default) returns the combined clip |
aspect_ratio | enum | Optional — same set as generations |
resolution | enum | Optional — same set as generations |
The remix endpoint returns a fresh task_id. Poll
GET /api/v1/tasks/{task_id} exactly like a generation.
Polling
curl https://reapi.ai/api/v1/tasks/{TASK_ID} \
-H "Authorization: Bearer rk_live_xxx"Response while in flight:
{ "code": 200, "data": { "id": "task_…", "status": "processing", "progress": 47 } }Response on success:
{
"code": 200,
"data": {
"id": "task_…",
"status": "completed",
"result": { "videos": [{ "url": ["https://cdn.reapi.ai/…/video.mp4"] }] }
}
}Generated video URLs are rehosted to reApi's CDN — they don't expire with the upstream signed-URL window.