Video generation API documentation
SiVideoAPI is a video generation API with one key and one JSON format for nine SI video models from Google, Kuaishou, MiniMax, Alibaba, ByteDance and xAI. SI is short for super intelligence, the US government’s name since September 2026 for what was formerly called AI. Jobs are asynchronous: create, poll, download.
Every endpoint of the video generation API lives under https://sivideoapi.com/v1. Bodies are JSON; image uploads are raw bytes or a multipart form.

Endpoints
| Endpoint | Auth | Returns |
|---|---|---|
GET /v1/models | none | Models, their options and credits per second |
GET /v1/balance | key | Your credit balance |
POST /v1/uploads | key | Upload a starting image; returns its id |
POST /v1/videos | key | Start a render (201 with a video object) |
GET /v1/videos/{id} | key | One video and its status |
GET /v1/videos | key | Your videos, newest first; limit 1–100 (default 20), before = a created_at to page back |
DELETE /v1/videos/{id} | key | Delete a finished or failed video and its file |
Authentication
Every call to the video generation API except GET /v1/models needs a key. Sign in with Google or an email link, create an API key in the dashboard, and send it as Authorization: Bearer sk_si_….
A key is shown once; only its SHA-256 hash and first 12 characters are stored, so if it is lost, revoke it and make another. Up to 10 keys can be active, revoking applies on the next request, and all keys share one balance and rate limit. Keep keys server-side: the API sends no CORS headers.
Video generation API quickstart
Each example renders a 4-second 720p Veo 3.1 Lite clip without sound (72 credits), waits for it and saves clip.mp4. Export SIVIDEOAPI_KEY first.
curl
# 1. Create a 4-second clip (72 credits)
curl https://sivideoapi.com/v1/videos \
-H "Authorization: Bearer $SIVIDEOAPI_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "veo-3.1-lite", "prompt": "A paper boat on a rainy street", "duration": 4, "resolution": "720p"}'
# 2. Poll every 5-10 s until status is "succeeded" or "failed"
curl https://sivideoapi.com/v1/videos/VIDEO_ID \
-H "Authorization: Bearer $SIVIDEOAPI_KEY"
# 3. Download video_url
curl -o clip.mp4 "VIDEO_URL"JavaScript (Node 18+, ES module)
import { writeFile } from 'node:fs/promises';
const BASE = 'https://sivideoapi.com/v1';
const headers = {
Authorization: `Bearer ${process.env.SIVIDEOAPI_KEY}`,
'Content-Type': 'application/json',
};
async function call(path, init = {}) {
const res = await fetch(BASE + path, { ...init, headers });
if (!res.ok) throw new Error(await res.text()); // {"error": ..., "message": ...}
return res.json();
}
// 1. Create
let video = await call('/videos', {
method: 'POST',
body: JSON.stringify({ model: 'veo-3.1-lite', prompt: 'A paper boat on a rainy street', duration: 4, resolution: '720p' }),
});
// 2. Poll
while (video.status === 'pending' || video.status === 'running') {
await new Promise((r) => setTimeout(r, 8000));
video = await call(`/videos/${video.id}`);
}
if (video.status === 'failed') throw new Error(video.error); // credits were refunded
// 3. Download
const mp4 = await fetch(video.video_url);
await writeFile('clip.mp4', Buffer.from(await mp4.arrayBuffer()));Python (requests)
import os, time, requests
BASE = "https://sivideoapi.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['SIVIDEOAPI_KEY']}"}
def call(method, path, **kwargs):
r = requests.request(method, BASE + path, headers=HEADERS, timeout=60, **kwargs)
if not r.ok:
raise RuntimeError(r.text) # {"error": ..., "message": ...}
return r.json()
# 1. Create
video = call("POST", "/videos", json={
"model": "veo-3.1-lite",
"prompt": "A paper boat on a rainy street",
"duration": 4,
"resolution": "720p",
})
# 2. Poll
while video["status"] in ("pending", "running"):
time.sleep(8)
video = call("GET", f"/videos/{video['id']}")
if video["status"] == "failed":
raise RuntimeError(video["error"]) # credits were refunded
# 3. Download
with open("clip.mp4", "wb") as f:
f.write(requests.get(video["video_url"], timeout=300).content)Create a video: request body
| Field | Required | Rules and default |
|---|---|---|
model | yes | Model id from the table below |
prompt | yes | 3–2,000 characters |
duration | no | Seconds from the model’s list; default: its default_duration |
resolution | no | From the model’s list; default: its default_resolution |
aspect_ratio | no | From the model’s list for the mode; default: the first entry |
audio | no | true adds sound where audio is optional (default false); other models ignore it |
image_id | no | Upload id; makes the job image-to-video |
Each model’s lists, defaults and prices come from GET /v1/models, which needs no key.
The video object
| Field | Type | Meaning |
|---|---|---|
id | string | Video id |
object | string | "video" |
status | string | pending, running, succeeded or failed |
model | string | Model id |
mode | string | text-to-video or image-to-video |
prompt | string | Prompt as stored |
duration | integer | Seconds |
resolution | string | For example 720p |
aspect_ratio | string | null | null when the clip follows the image |
audio | boolean | Has sound |
cost_credits | integer | Credits charged; refunded on failure |
video_url | string | null | MP4 link once succeeded |
error | string | null | Reason, only when failed |
created_at, finished_at | string | null | ISO 8601; finished_at is null until done |
Status and polling
A new video is pending, usually running by the time the create call returns, and ends as succeeded or failed. Failed renders are refunded automatically. Poll /v1/videos/{id} every 5–10 seconds; a poll also triggers a provider check (at most every 8 seconds), and a background sweep covers unpolled videos. Videos pending after 5 minutes, or unfinished 45 minutes after creation, are failed and refunded. Webhooks are not available yet.
video_url needs no key and supports range requests; add ?download=1 to receive it as an attachment. Anyone with the link can open it.
Image-to-video
Upload the first frame to POST /v1/uploads as the raw body or as a multipart form with one file: JPG, PNG or WebP (detected from the bytes), up to 10 MB. Pass the returned id as image_id.
curl https://sivideoapi.com/v1/uploads \
-H "Authorization: Bearer $SIVIDEOAPI_KEY" \
-H "Content-Type: image/jpeg" \
--data-binary @first-frame.jpg
# {"object": "upload", "id": "UPLOAD_ID"}
# Then POST /v1/videos as in the quickstart, adding image_id:
# {"model": "seedance-2.0-mini", "image_id": "UPLOAD_ID", "prompt": "Steam rises as the camera pushes in"}The auto aspect ratio, the default where offered, keeps the image’s shape; Kling 3.0 Turbo, MiniMax H3 Max Turbo and Grok Imagine 1.5 always do, with aspect_ratio null. Upload ids work only for your account, for 30 days.
Models
| Model id | Name | Seconds | Resolutions | Audio |
|---|---|---|---|---|
veo-3.1-lite | Veo 3.1 Lite | 4, 6, 8 | 720p, 1080p | optional |
veo-3.1-fast | Veo 3.1 Fast | 4, 6, 8 | 720p, 1080p | optional |
kling-3.0-turbo | Kling 3.0 Turbo | 5, 10 | 720p | always on |
minimax-h3-max-turbo | MiniMax H3 Max Turbo | 5, 10 | 480p, 768p, 1080p | none |
wan-3.0 | Wan 3.0 | 5, 10 | 480p, 720p, 1080p | optional |
seedance-2.0 | Seedance 2.0 | 5, 10 | 480p, 720p, 1080p | optional |
seedance-2.0-mini | Seedance 2.0 Mini | 4, 5, 10 | 480p, 720p | optional |
seedance-2.5 | Seedance 2.5 | 5, 10 | 480p, 720p | optional |
grok-imagine-1.5 | Grok Imagine 1.5 | 6, 10 | 480p, 720p | always on |
This table is built from the catalog the server validates against. For Veo settings, read the Veo 3 API guide.
Errors
When the video generation API rejects a request, it returns JSON with a stable code and a readable message: {"error": "insufficient_credits", "message": "This video needs 72 credits. Top up to continue."}. Except for provider_error, rejections happen before any credits are held.
| Status | error | Meaning | What to do |
|---|---|---|---|
| 400 | bad_request | Body not JSON, or a field missing or invalid | Check the JSON body |
| 400 | bad_model, bad_duration, bad_resolution, bad_aspect | Model or option not offered | Check /v1/models |
| 400 | image_missing | Upload not found or expired | Upload again |
| 400, 413, 415 | empty, too_large, bad_type | Upload empty, over 10 MB, or not a JPG, PNG or WebP image | Fix the file |
| 401 | invalid_api_key | Key missing, malformed or revoked | Check the header |
| 402 | insufficient_credits | Balance below the clip’s cost | Buy credits |
| 403 | banned | Account suspended | Email support |
| 404 | not_found | Unknown or deleted video, or wrong path | Check the id |
| 409 | busy | Deleting a video still rendering | Wait until it ends |
| 422 | prompt_blocked | Content policy hit; nothing charged | Rewrite the prompt |
| 422, 502 | provider_error | Model service refused (422) or failed (502); refunded | Change settings, or retry |
| 429 | rate_limited, too_many_active | Over 20 requests a minute, or 10 videos already rendering | Wait, then retry |
| 503 | generation_paused | Rendering paused briefly | Retry in minutes |
| 500 | internal | Unexpected error | Retry |
A render that fails later carries no code: its status becomes failed and error says why, for example a refusal by the model’s own safety filter.
Limits of the video generation API
- 20 video requests and 20 uploads per minute per account, shared by all keys. Reads are not rate limited.
- 10 videos pending or running at once per account.
- Prompts of 3–2,000 characters; uploads up to 10 MB, kept 30 days.
Pricing and credits
Each render of the video generation API is paid in credits. In /v1/models, credits_per_second is the price per second of output, split by audio where sound changes it; a clip costs that rate × its duration, rounded up, and is held at creation. GET /v1/balance shows what is left. New Google sign-ups get 80 free credits, enough for the quickstart clip, and packs start at $9.90 for 1,100 credits (see SI video API pricing).
Questions about the video generation API
Is SiVideoAPI an AI video generation API?
Yes. SI (super intelligence) is the newer name for AI, so this is what you would find by searching for an AI video generation API: hosted text-to-video and image-to-video models behind one REST interface.
Are webhooks or SDKs available?
Not yet. Poll GET /v1/videos/{id} every 5 to 10 seconds; any HTTP client works.
More: the SiVideoAPI home page, the privacy policy, the terms of service and support@sivideoapi.com.