Flexible parameters
Configure 6 documented parameters, including aspect_ratio, duration_seconds, first_frame_image_url, input_mode, last_frame_image_url.
Highest-fidelity Veo 3.1 generation with 4/6/8s duration control
curl -X POST https://runapi.ai/api/v1/veo_3_1/text_to_video \
-H "Authorization: Bearer $RUNAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "veo-3.1",
"prompt": "Generate an 8-second cinematic drone shot of a coastal highway at golden hour, with waves crashing below and ambient wind audio."
}'
import { Veo31Client } from "@runapi.ai/veo-3-1";
const client = new Veo31Client();
const result = await client.textToVideo.run({
model: "veo-3.1",
prompt: "Generate an 8-second cinematic drone shot of a coastal highway at golden hour, with waves crashing below and ambient wind audio.",
});
import os
import requests
response = requests.post(
"https://runapi.ai/api/v1/veo_3_1/text_to_video",
headers={"Authorization": f"Bearer {os.environ['RUNAPI_API_KEY']}"},
json={"model":"veo-3.1","prompt":"Generate an 8-second cinematic drone shot of a coastal highway at golden hour, with waves crashing below and ambient wind audio."}
)
response.raise_for_status()
<?php
$client = curl_init("https://runapi.ai/api/v1/veo_3_1/text_to_video");
curl_setopt_array($client, [
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("RUNAPI_API_KEY"), "Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
'model' => 'veo-3.1',
'prompt' => 'Generate an 8-second cinematic drone shot of a coastal highway at golden hour, with waves crashing below and ambient wind audio.',
])
]);
$response = curl_exec($client);
RunApi client = new RunApi(System.getenv("RUNAPI_API_KEY"));
Task task = client.textToVideo().run({"model":"veo-3.1","prompt":"Generate an 8-second cinematic drone shot of a coastal highway at golden hour, with waves crashing below and ambient wind audio."});
task.waitForResult();
require "runapi/veo_3_1"
client = RunApi::Veo31::Client.new
result = client.text_to_video.run(
model: "veo-3.1",
prompt: "Generate an 8-second cinematic drone shot of a coastal highway at golden hour, with waves crashing below and ambient wind audio."
)
client := runapi.NewClient(os.Getenv("RUNAPI_API_KEY"))
task, err := client.textToVideo.Run({"model":"veo-3.1","prompt":"Generate an 8-second cinematic drone shot of a coastal highway at golden hour, with waves crashing below and ambient wind audio."})
if err != nil { log.Fatal(err) }
task.Wait()
$ runapi generate \
--model veo-3.1 \
--endpoint text_to_video \
--wait
3 versions available
Pick any model and generate in seconds.
Pick any model and generate in seconds.
| Provider | |
| Model ID | veo-3.1 |
| Modality | Video |
| Task types | Asynchronous |
| API endpoint | /api/v1/veo_3_1/text_to_video |
| Billing unit | call |
| Input parameters | aspect_ratio, duration_seconds, first_frame_image_url, input_mode, last_frame_image_url, reference_image_urls |
| Max duration | 4s, 6s, 8s |
| Aspect ratios | 16:9, 9:16, auto |
| Catalog status | Operational |
Sign up for free and create an API key for veo-3.1 from the dashboard.
POST to /api/v1/veo_3_1/text_to_video with the veo-3.1 model slug and your parameters.
Poll the task or follow the callback to retrieve the completed veo-3.1 result.
Configure 6 documented parameters, including aspect_ratio, duration_seconds, first_frame_image_url, input_mode, last_frame_image_url.
Exposes 1 public endpoint(s): text_to_video.
Metered by call with no subscription requirement.
input_modeNo description available. (text, first_and_last_frames, reference)
aspect_ratioNo description available. (16:9, 9:16, auto)
duration_secondsNo description available. (4, 6, 8)
last_frame_image_urlNo description available.
reference_image_urlsNo description available.
first_frame_image_urlNo description available.
Generate product launch clips and short-form ads from a text brief, cutting production from weeks to hours.
Convert lesson scripts into animated explainer videos at scale without a camera or crew.
Produce viral short-form content for social platforms directly from a prompt.
Pass the model ID shown in the quickstart.
Per-key rate limits scale with your usage tier. The pricing page shows current limits. If you need higher throughput, contact support to discuss tier upgrades.
Yes. Variant is a parameter in the request. Switch by changing the model ID — no code changes, no re-authentication, no separate billing setup. All variants share the same API key and request shape.
Where streaming is available, RunAPI streams end-to-end. LLM models support token-level streaming. Media models use async task polling or webhook callbacks for result delivery.
Open an issue on the public GitHub repo or email support at [email protected]. Include the task ID and model ID so the team can investigate the specific generation.
No. Your RunAPI API key is enough to access this variant and every other model in the catalog. You do not need accounts with the underlying provider.
We're here to help with enterprise setup, integrations, and technical questions.
Contact Us