Skip to content

Video Generation

POST /v1/videos/generations # submit job
GET /v1/videos/generations/{id} # poll status

Video generation is asynchronous. The submit call returns immediately with a job id and a poll_url; the client polls until status is completed (or failed).

Field Type Default Description
model string "auto" Video model (see Providers). Use "auto" for health-aware routing.
prompt string required Text description. 1–8000 chars.
duration_seconds number provider default 1–60 seconds. Most models cap at 4–10s on free tier.
aspect_ratio string "16:9" One of "16:9", "9:16", "1:1".
image_url string — Public HTTPS image URL for image-to-video models (Wan 2.6, Wan 2.2 I2V).
project_id string — Body-level project tag. Alternative to x-gateway-project-id header.
Header Required Description
Authorization: Bearer <GATEWAY_API_KEY> yes Gateway API key.
x-gateway-project-id yes (or body project_id) 1–64 chars [a-zA-Z0-9._:-].

All video models currently route through Together AI (TOGETHER_API_KEY required).

Model ID Upstream Model Capabilities
sora-2 openai/sora-2 Text-to-video
veo-3-audio google/veo-3.0-audio Text-to-video with audio
veo-3-fast-audio google/veo-3.0-fast-audio Faster Veo 3 variant with audio
veo-2 google/veo-2.0 Text-to-video
kling-2.1-master kwaivgI/kling-2.1-master High-quality Kling
kling-2.1-pro kwaivgI/kling-2.1-pro Kling pro tier
kling-2.0-master kwaivgI/kling-2.0-master Previous-gen Kling
kling-1.6-pro kwaivgI/kling-1.6-pro Kling 1.6
wan-2.6-image Wan-AI/Wan2.6-image Image-to-video
wan-2.2-i2v Wan-AI/Wan2.2-I2V-A14B Image-to-video
vidu-q1 vidu/vidu-q1 Text-to-video
seedream-3 ByteDance-Seed/Seedream-3.0 ByteDance Seedream
seedream-4 ByteDance-Seed/Seedream-4.0 ByteDance Seedream v4

Daily free-tier limits are tight (typically 10–30 requests per model per day). See GET /v1/models for the live enabled list.

Status 202 Accepted when the job is queued, or 200 OK if the provider happens to return a finished job synchronously.

{
"id": "job_abc123",
"status": "processing",
"poll_url": "/v1/videos/generations/job_abc123",
"x_gateway": {
"provider": "together",
"model": "openai/sora-2",
"attempts": 1,
"request_id": "req_xyz",
"project_id": "my_project"
}
}
{
"id": "job_abc123",
"status": "completed",
"video_url": "https://cdn.example/video.mp4",
"x_gateway": {
"provider": "together",
"model": "openai/sora-2",
"attempts": 1,
"request_id": "req_poll1",
"project_id": "my_project"
}
}

status is one of "processing", "completed", "failed". When failed, error contains the upstream message.

Terminal window
curl https://ai-gateway.sassmaker.com/v1/videos/generations \
-H "Authorization: Bearer <GATEWAY_API_KEY>" \
-H "x-gateway-project-id: my_project" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-2",
"prompt": "A slow aerial drone shot over a misty mountain lake at dawn",
"duration_seconds": 5,
"aspect_ratio": "16:9"
}'
const BASE = 'https://ai-gateway.sassmaker.com';
async function pollUntilDone(jobId, { interval = 5000, timeout = 300_000 } = {}) {
const deadline = Date.now() + timeout;
while (Date.now() < deadline) {
const res = await fetch(`${BASE}/v1/videos/generations/${jobId}`, {
headers: { 'Authorization': 'Bearer <GATEWAY_API_KEY>' },
});
const body = await res.json();
if (body.status === 'completed') return body.video_url;
if (body.status === 'failed') throw new Error(body.error ?? 'job failed');
await new Promise((r) => setTimeout(r, interval));
}
throw new Error('poll timeout');
}
const videoUrl = await pollUntilDone('job_abc123');
console.log(videoUrl);
Terminal window
curl https://ai-gateway.sassmaker.com/v1/videos/generations \
-H "Authorization: Bearer <GATEWAY_API_KEY>" \
-H "x-gateway-project-id: my_project" \
-H "Content-Type: application/json" \
-d '{
"model": "wan-2.2-i2v",
"prompt": "Camera pans right as clouds roll in",
"image_url": "https://example.com/source-frame.jpg",
"duration_seconds": 4
}'
Status code Meaning
400 invalid_project_id Missing/invalid project_id.
404 — Job ID unknown, or upstream poll endpoint returned 404 (see beta caveat above).
502 provider_error Submit or poll failed at upstream.
503 no_video_provider TOGETHER_API_KEY not configured.