LLMAPI VIDEO
Video API reference
Explore endpoints, request parameters, task states and usage-based billing.
GETTING STARTED
Check the access method first
Task endpoints currently use a website session for the llmapi.pro studio. Existing API keys cannot authenticate these video endpoints. This page documents the current web interface, not an available third-party server integration.
The model catalog is public. Creating tasks, reading balances and querying tasks require a website login. Creation uses your API-wallet balance rather than subscription quotas.
Read available models for free
curl --fail-with-body 'https://llmapi.pro/api/video/catalog'
Check enabled, models[].enabled and prices. Each cents value is CNY cents per second, with applicable discounts included.
Endpoints
https://llmapi.pro/api/video
| Method / path | Authentication | Behaviour |
|---|---|---|
GET /catalog | Public | Read models, resolutions, rates and availability. Free. |
GET /balance | Website session | Read total, frozen and available API-wallet balances. |
POST /tasks | Website session | Validate, reserve the charge and create an asynchronous task; returns 202. |
GET /tasks/:id | Website session | Read your task; its video URL is returned after success. |
GET /tasks | Website session | Your 30 latest tasks, newest first. |
Create once, then query by task ID
Use a fresh UUID as Idempotency-Key for each new creation. Reusing the key and payload returns the original task without a second charge; changing the payload returns 409. After a submission timeout, retry with the original key and payload.
JavaScript · Same-origin website session
const requestKey = crypto.randomUUID();
const payload = {
"model": "MiniMax-H3",
"prompt": "A quiet forest at dawn. A slow camera push, gentle wind, no cuts.",
"resolution": "768P",
"duration": 5,
"ratio": "16:9"
};
// For a signed-in page on llmapi.pro only. Calling this reserves a charge.
// Reuse the same requestKey and payload when retrying after a network failure.
async function submitVideo() {
const res = await fetch('/api/video/tasks', {
method: 'POST', credentials: 'same-origin',
headers: { 'Content-Type': 'application/json', 'Idempotency-Key': requestKey },
body: JSON.stringify(payload)
});
const task = await res.json();
if (!res.ok) throw new Error(task.error || 'request_failed');
return task;
}
// Call submitVideo() only after reviewing the price. This page does not execute it.Example 202 response
{
"id": "00000000-0000-4000-8000-000000000001",
"model": "MiniMax-H3",
"mode": "text",
"prompt": "A quiet forest at dawn. A slow camera push, gentle wind, no cuts.",
"resolution": "768P",
"duration": 5,
"ratio": "16:9",
"price_cny": 1.5,
"state": "queued",
"error_code": null,
"refunded": false,
"created_at": "2026-10-30T00:00:00.000Z",
"video_url": null
}Read task status and result
async function getVideo(taskId) {
const res = await fetch('/api/video/tasks/' + encodeURIComponent(taskId), {
credentials: 'same-origin', cache: 'no-store'
});
const task = await res.json();
if (!res.ok) throw new Error(task.error || 'request_failed');
return task;
}
// Poll every 10–15 seconds; stop at succeeded or failed.
// Only a succeeded task exposes video_url for playback or download.queued → submitting → pending → succeeded / failed
queued means waiting, submitting means dispatching, and pending means generating. A submission error may still be under review; only failed is a terminal failure. Check refunded for the refund outcome. Download completed videos promptly.
Request parameters
| Field | Type | Required | Rules |
|---|---|---|---|
model | string | Optional | Defaults to MiniMax-H3; check catalog.models for availability. |
prompt | string | Required | 1–5000 characters after trimming. |
resolution | string | Required | Must match a price key for the selected model; case-sensitive. |
duration | integer | Required | 4–15 seconds |
ratio | string | Required | 16:9 · 9:16 · 1:1 · 4:3 · 3:4 · 21:9 · source with a first frame |
first_frame | string | Optional | data:image/(png|jpeg|webp);base64,… |
last_frame | string | Optional | Same format as first_frame; requires first_frame. |
Models and resolution keys
MiniMax-H3 — 768P / 2K
seedance-2.0-mini — 480p / 720p
seedance-2.0 — 480p / 720p / 1080p / 4k
Images must be still PNG, JPEG or WebP Base64 Data URLs, not remote URLs. Each decoded image is limited to 2 MiB, at least 256 pixels per side, at most 16,777,216 pixels, and aspect ratio 0.4–2.5. First and last frames must match. Crop to the selected ratio before upload, within 1% tolerance. The request-body limit is 6 MB.
Unlisted fields are rejected. There is currently no seed, separate camera parameter, reference video, audio upload, priority tier or Context-IR. Express camera and sound intent in prompt.
Billing and common errors
Reserved charge = requested duration × final per-second rate. Failed tasks are refunded to the same API wallet. price_cny, balance_cny, frozen_cny and available_cny are in CNY yuan; cents in catalog.prices is in CNY cents. See rates and multipliers →
Each account can make up to 10 creation requests per minute, with at most two active tasks per billing account.
| HTTP | Common error | Action |
|---|---|---|
| 400 | invalid_* / unsupported_parameter / idempotency_key_required | Check parameters, images and the UUID request key. |
| 401 | login_required | Sign in to the website; an ordinary API key is not a substitute. |
| 402 | insufficient_balance | Top up the API wallet. |
| 403 | invalid_origin | Use a signed-in same-origin page. |
| 404 | task_not_found | Check the task ID and owning account. |
| 409 | idempotency_conflict | Retry with the original payload; use a new key for new creations. |
| 429 | too_many_requests / too_many_active_tasks | Respect Retry-After, or wait for active tasks to finish. |
| 503 | video_unavailable / model_unavailable / tasks_unavailable | Retry later; preserve the request key when retrying creation. |