Video generation
POST/api/v1/videos starts a video generation job. Jobs are asynchronous: submit, poll until the job completes, then download the video.
kling/kling-3.0 through AI Hub, with a Seedream first frame and generated audio.Cover prompt and settings
Animate the supplied first frame into a five-second cinematic BELIVE TOKENHUB brand ident. Keep the exact BELIVE TOKENHUB sign completely legible, stationary and correctly spelled throughout. Slowly push the camera forward while the cyan and magenta light ribbons flow gently around it. Generate original wordless electronic music: warm synth chords, a subtle rhythmic pulse and a clean resolved ending. No speech, singing, extra text, flashing or logos.
Model: kling/kling-3.0. Request: one 5-second, 720P, 16:9 video with generated audio and an original Seedream image as its first frame. The title is present throughout the generated video.
Models and features
Every video model is a job on POST /api/v1/videos. The tables show what each model accepts in a request with no provider, which goes to the first route that admits it; a provider.only entry pins one route and applies that route's own limits. Jump to text to video, first and last frame, references, audio, motion control, saved characters or provider notes. Amounts are in each model's tokenhub_price_table and on the Models page; the tables name the basis.
Limits and prices
| Model | Seconds | Prompt characters | Resolutions | Ratios | Price basis |
|---|---|---|---|---|---|
| Seedance | |||||
bytedance/seedance-2.5 | 4 to 30 | 2,000 | 720P, 1080P | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9; adaptive with a first frame | Output tokens, by resolution; a reference video uses its own rows |
bytedance/seedance-2.0 | 4 to 15 | 2,000 | 480P, 720P, 1080P | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9 | Output tokens, by resolution; a reference video uses its own rows |
bytedance/seedance-2.0-fast | 4 to 15 | 2,000 | 480P, 720P | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9 | Output tokens, by resolution |
bytedance/seedance-2.0-mini | 4 to 15 | 2,000 | 480P, 720P | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9 | Output tokens, by resolution |
| Kling | |||||
kling/kling-4.0 | 3 to 30 | 2,500 | 720P, 1080P | 16:9, 9:16, 1:1, 21:9; none with a first frame, the output follows it | Output tokens, by resolution |
kling/kling-3.0 | 3 to 15 | 2,500 | 720P, 1080P, 2K, 4K | 16:9, 9:16, 1:1 | Per output second, by resolution and audio |
kling/kling-3.0-omni | 3 to 15 | 2,500 | 720P, 1080P, 2K, 4K | 16:9, 9:16, 1:1 | Per output second, by resolution and audio |
kling/kling-3.0-turbo | 3 to 15 | 2,500 | 720P, 1080P | 16:9, 9:16, 1:1 | Per output second, by resolution |
kling/kling-o1 | 5, 10; 5 with a first frame | 2,500 | 720P, 1080P, 2K, 4K | 16:9, 9:16, 1:1 | Per output second, by resolution |
kling/kling-2.5 | 5 | 2,500 | 720P, 1080P, 2K, 4K | 16:9, 9:16 | Per output second, by resolution |
kling/kling-motion-control-3.0 | Follows the reference video, 3 to 30 | 2,500 | 720P, 1080P | Follows the character image | Output tokens, by resolution |
| MiniMax | |||||
minimax/minimax-h3 | 4 to 15 | 7,000 | 768P, 2K | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9; adaptive with frames or references | Per output second, by resolution; reference-video seconds are added, and each image after the fifth |
minimax/minimax-h3-max | 5 to 15 | 7,000 | 480P, 768P | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9; adaptive with frames | Per output second, by resolution |
| Wan and HappyHorse | |||||
alibaba/wan3.0-video | 2 to 30 | 20,000 | 480P, 720P, 1080P | 16:9, 9:16, 1:1, 4:3, 3:4 | Per output second, by resolution |
alibaba/wan3.0-video-prime | 2 to 30 | 20,000 | 480P, 720P, 1080P | 16:9, 9:16, 1:1, 4:3, 3:4 | Per output second, by resolution |
alibaba/happyhorse-1.1-t2v | 3 to 15 | 2,500 | 480P, 720P, 1080P | 16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9 | Per output second, by resolution |
alibaba/happyhorse-1.1-i2v | 3 to 15 | 2,500 | 480P, 720P, 1080P | Follows the first frame | Per output second, by resolution |
alibaba/happyhorse-1.1-r2v | 3 to 15 | 2,500 | 480P, 720P, 1080P | 16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9 | Per output second, by resolution |
| Vidu | |||||
vidu/vidu-q4-preview | 3 to 16 | 2,000 | 540P, 720P, 1080P, 2K, 4K | 16:9, 9:16, 1:1, 4:3, 3:4 with references; follows a first frame | Output tokens, by resolution |
| PixVerse | |||||
pixverse/pixverse-c1 | 1 to 15 | 5,000 | 360P, 540P, 720P, 1080P | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, 2:3, 3:2 | Output tokens, by resolution and audio |
Inputs and options
| Model | Text to video | First frame | First and last frame | Reference images | Reference videos | Reference audio | generate_audio | Other options |
|---|---|---|---|---|---|---|---|---|
| Seedance | ||||||||
bytedance/seedance-2.5 | Yes | Yes | Yes | Up to 30 | Up to 10 | Up to 10 | Switch, default off | No |
bytedance/seedance-2.0 | Yes | Yes | Yes | Up to 9 | Up to 3 | Up to 3, with an image or video | Switch, default off | No |
bytedance/seedance-2.0-fast | Yes | No | No | No | No | No | Switch, default off | No |
bytedance/seedance-2.0-mini | Yes | No | No | No | No | No | Switch, default off | No |
| Kling | ||||||||
kling/kling-4.0 | Yes | Yes | No | No | No | No | Always on | No |
kling/kling-3.0 | Yes | Yes | No | No | No | No | Switch, default off | No |
kling/kling-3.0-omni | Yes | Yes | No | No | No | No | Switch, default off | No |
kling/kling-3.0-turbo | Yes | Yes | No | No | No | No | Always on | No |
kling/kling-o1 | Yes | Yes | No | No | No | No | Silent | No |
kling/kling-2.5 | Yes | Yes | No | No | No | No | Silent | No |
kling/kling-motion-control-3.0 | No | No | No | 1 character image | 1 motion video (reference_video) | No | Switch, default on (keeps the video's sound) | No |
| MiniMax | ||||||||
minimax/minimax-h3 | Yes | Yes | Yes | Up to 9 | 1 | 1 | Always on | watermark |
minimax/minimax-h3-max | Yes | Yes | Yes | No | No | No | Always on | watermark |
| Wan and HappyHorse | ||||||||
alibaba/wan3.0-video | Yes | No | No | No | No | No | No switch | seed |
alibaba/wan3.0-video-prime | Yes | No | No | No | No | No | No switch | seed |
alibaba/happyhorse-1.1-t2v | Yes | No | No | No | No | No | No switch | seed |
alibaba/happyhorse-1.1-i2v | No | Required; the prompt is optional | No | No | No | No | No switch | seed |
alibaba/happyhorse-1.1-r2v | No | No | No | 1 to 9, required | No | No | No switch | seed |
| Vidu | ||||||||
vidu/vidu-q4-preview | No | Yes, instead of references | No | 1 to 9, instead of a first frame | No | No | Switch, default off | seed |
| PixVerse | ||||||||
pixverse/pixverse-c1 | Yes | Yes | Yes | Up to 7, instead of frames | No | No | Switch, default off | seed |
1. Submit a job
A new job answers 202 with its id and where to poll it. Sending the same Idempotency-Key again within 24 hours returns the same job with 200 and never starts a second one; the same key with a different body is 409 conflict.
import json import os import urllib.request body = { "model": "kling/kling-3.0", "prompt": "A red paper boat drifting on a calm pond, soft morning light.", "duration": 5, "resolution": "720P" } request = urllib.request.Request( "https://tokenhub-api.belive.sg/api/v1/videos", data=json.dumps(body).encode("utf-8"), headers={ "Authorization": f"Bearer {os.environ['TOKENHUB_API_KEY']}", "Content-Type": "application/json", "Idempotency-Key": os.environ["TOKENHUB_IDEMPOTENCY_KEY"], }, ) with urllib.request.urlopen(request, timeout=30) as response: job = json.load(response) print(job["id"], job["polling_url"])
const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify({ "model": "kling/kling-3.0", "prompt": "A red paper boat drifting on a calm pond, soft morning light.", "duration": 5, "resolution": "720P" }), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "kling/kling-3.0", "prompt": "A red paper boat drifting on a calm pond, soft morning light.", "duration": 5, "resolution": "720P" }'
{ "id": "job_…", "generation_id": "req_…", "polling_url": "https://tokenhub-api.belive.sg/api/v1/videos/job_…", "status": "pending" }
Always send an Idempotency-Key. If a submission times out or fails with a 5xx, the job may still have started; resend with the same key rather than a new one, or two videos may be generated and costed.
Request
| Field | Notes |
|---|---|
model | Required. A model from GET /v1/videos/models |
prompt, duration, resolution, aspect_ratio, seed, negative_prompt, watermark, generate_audio | Accepted where the model supports them, within the limits in the tables above. A value the model does not take is 400 before anything is started |
aspect_ratio on kling/… | Set it for text-to-video. When it is omitted, the default depends on the provider that serves the job: one route returns 9:16 (portrait, 720 × 1280 at 720P) and the other Kling route returns 16:9 (1280 × 720). With frame_images the output follows the frame instead |
frame_images | Image-to-video: [{"type": "image_url", "image_url": {"url": "…"}, "frame_type": "first_frame"}], with an optional last_frame item. See First frame, and first and last frame |
input_references | Reference-to-video: items of image_url, video_url or audio_url, each {"url": "…"}. See Reference images, video and audio |
reference_video, character_orientation | Motion control (kling/kling-motion-control-3.0): {"type": "video_url", "video_url": {"url": "…"}}, an mp4 or mov of 3 to 30 seconds (10 with the default image orientation). generate_audio keeps (true) or drops the video's audio |
characters | A saved character, [{"id": "char_…"}], at most one; see Saved characters below |
Input media URLs must be public https URLs, or base64 PNG, JPEG or WebP data: URIs. size is not a video field; use resolution and aspect_ratio.
2. Poll the job
Set TOKENHUB_VIDEO_JOB_ID to the ID returned by the submit request. The Python and TypeScript examples stop locally after 120 polls, about six minutes. This does not fail or cancel the job: a queued job may still be waiting. Run the GET-only polling example again with the same ID, never the submit example. The Shell example checks once, so repeat it while the job is pending or running.
import json import os import time import urllib.request job_id = os.environ["TOKENHUB_VIDEO_JOB_ID"] url = "https://tokenhub-api.belive.sg/api/v1/videos/" + job_id headers = {"Authorization": f"Bearer {os.environ['TOKENHUB_API_KEY']}"} for attempt in range(120): request = urllib.request.Request(url, headers=headers) with urllib.request.urlopen(request, timeout=30) as response: job = json.load(response) print(job["status"]) if job["status"] not in ("pending", "in_progress"): break time.sleep(3) else: raise TimeoutError("Job is still running; poll it again later") print(json.dumps(job, indent=2))
const jobId = process.env.TOKENHUB_VIDEO_JOB_ID; let job; for (let attempt = 0; attempt < 120; attempt++) { const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos/" + encodeURIComponent(jobId), { headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY }, }); if (!response.ok) throw new Error("Video poll failed: " + response.status); job = await response.json(); console.log(job.status); if (job.status !== "pending" && job.status !== "in_progress") break; if (attempt === 119) throw new Error("Job is still running; poll it again later"); await new Promise((resolve) => setTimeout(resolve, 3000)); } console.log(job);
curl --fail-with-body -sS "https://tokenhub-api.belive.sg/api/v1/videos/$TOKENHUB_VIDEO_JOB_ID" \ -H "Authorization: Bearer $TOKENHUB_API_KEY"
status moves from pending and in_progress to one of completed, failed, cancelled or expired. A completed job carries unsigned_urls, usage and content_expires_at; a failed one carries error. A finished job reads in_progress until its charge is settled, so the first completed answer already carries its cost. Poll every few seconds; a job is visible only to keys in the workspace that submitted it.
An accepted video can return status: pending with queued: true. It is waiting to start, not a failed submission. Keep polling the existing GET /api/v1/videos/{id} or its returned polling_url; do not POST the generation again. The console and Activity label this state Queued.
queue_expires_at is the waiting deadline, ten minutes after acceptance. reservation_ceiling_usd is the reserved USD ceiling, not a charge or the final cost. If the job has not been dispatched by the deadline, it ends with status: failed, queue_expired: true and error.code: upstream_timeout. Its usage cost is zero and the full reservation is released. The console calls this Expired in queue. This differs from status: expired on an upstream job or an expired download.
3. Download the video
These are server-side examples. A browser hides cross-origin redirects; the Python and Node.js examples read the 302 response and fetch its URL separately without the AI Hub key.
import os import shutil import urllib.error import urllib.request job_id = os.environ["TOKENHUB_VIDEO_JOB_ID"] request = urllib.request.Request( "https://tokenhub-api.belive.sg/api/v1/videos/" + job_id + "/content", headers={"Authorization": f"Bearer {os.environ['TOKENHUB_API_KEY']}"}, ) class NoRedirect(urllib.request.HTTPRedirectHandler): def redirect_request(self, req, fp, code, msg, headers, newurl): return None opener = urllib.request.build_opener(NoRedirect()) try: response = opener.open(request, timeout=60) except urllib.error.HTTPError as response: if response.code != 302: raise download_url = response.headers.get("Location") if not download_url: raise RuntimeError("Missing redirect Location") response.close() # This request goes to the CDN without the AI Hub Authorization header. response = urllib.request.urlopen(download_url, timeout=120) with response, open("video.mp4", "wb") as output: shutil.copyfileobj(response, output)
import { writeFile } from "node:fs/promises"; const jobId = process.env.TOKENHUB_VIDEO_JOB_ID; const response = await fetch( "https://tokenhub-api.belive.sg/api/v1/videos/" + encodeURIComponent(jobId) + "/content", { headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY }, redirect: "manual", }, ); let video = response; if (response.status === 302) { const location = response.headers.get("location"); if (!location) throw new Error("Missing redirect Location"); // Fetch the CDN URL without the AI Hub Authorization header. video = await fetch(location); } if (!video.ok) throw new Error("Video download failed: " + video.status); await writeFile("video.mp4", Buffer.from(await video.arrayBuffer()));
curl --fail-with-body -sS -L --proto-redir '=https' \ "https://tokenhub-api.belive.sg/api/v1/videos/$TOKENHUB_VIDEO_JOB_ID/content" \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -o video.mp4
The AI Hub content endpoint needs your API key. For the white-label Kling and MiniMax H3 / H3 Max routes, the content endpoint either streams the MP4 from AI Hub with 200 (or a byte range with 206) or answers 302 with a time-limited download URL. Follow redirects; curl -L does so without forwarding Authorization to another host. Other models, including Kling Motion Control and the routes listed below, stream MP4 from AI Hub. Download before content_expires_at; if a download URL expires while the job is retained, request the content endpoint again for a fresh one.
When following this redirect in your own HTTP client, do not forward your AI Hub Authorization header to the provider CDN. Send it to AI Hub, read the redirect, then fetch the returned URL without that header.
To intentionally create a new request after an eligible failure, use media offers and manual reruns. Confirm the selected provider's current estimate, preserve the original settings, replace provider with one only entry, send tokenhub_quote, and allocate a fresh Idempotency-Key. This is different from reconciling an uncertain submission with its original key.
Cancel, prices and availability
POST /api/v1/videos/{id}/cancelreturns the job once the cancellation is confirmed. Cancelling a job while it is still queued prevents dispatch, releases the full reservation and costs nothing. Once execution has started, cancellation is provider-specific; poll the job for the confirmed outcome.- Video is priced per second of output. The price per second is the
video_secondmeter in the model'stokenhub_price_table, in the row matching the request's resolution (and audio, where the model prices it). - Kling image-to-video is the exception: a
kling/…job with aframe_imagesfirst frame is priced at the tier of the output's short side. The output keeps the frame's shape at the requested tier's pixel count, so a square frame requested at720Pcomes back 960×960 and is priced at1080P. A square frame at1080Pis priced at2K, and at2Kor4Kat4K. A 9:16 or 16:9 frame is priced at the requested tier. The job still reports the requestedresolution; the Selected price row on the Activity page shows the tier it was priced at. - A completed job's
usagecarries the job's cost in USD:costas a number andtokenhub_costas a decimal string. - Queueing does not bypass admission controls. An organisation at its video job total can receive
429 rate_limit_exceeded; honourRetry-Afterwhen present. After a timeout or 5xx a job may have been accepted. Reconcile the existing job or idempotency key before any new submission.
Text to video
Send model and prompt, with duration, resolution and aspect_ratio from the tables above. Every model takes a prompt alone except the image-led ones: alibaba/happyhorse-1.1-i2v (a first frame), alibaba/happyhorse-1.1-r2v (reference images), vidu/vidu-q4-preview (a first frame or reference images) and the two Kling Motion Control models. A value outside a model's limits answers 400 with the field named, before anything is started.
PixVerse C1, text to video
pixverse/pixverse-c1Eight ratios: 16:9, 4:3, 1:1, 3:4, 9:16, 2:3, 3:2 and 21:9. seed is 0 to 2147483647.
const body = { "model": "pixverse/pixverse-c1", "duration": 5, "resolution": "720P", "aspect_ratio": "16:9", "generate_audio": true, "seed": 7, "prompt": "A red sports car drifts through a neon-lit rainy city street at night, low tracking camera, roaring engine and rain sounds" }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "pixverse/pixverse-c1", "duration": 5, "resolution": "720P", "aspect_ratio": "16:9", "generate_audio": true, "seed": 7, "prompt": "A red sports car drifts through a neon-lit rainy city street at night, low tracking camera, roaring engine and rain sounds" }'
MiniMax H3 Max, text to video
minimax/minimax-h3-max480P or 768P. watermark is a boolean and defaults to false. The output always has audio.
const body = { "model": "minimax/minimax-h3-max", "duration": 5, "resolution": "480P", "aspect_ratio": "16:9", "watermark": false, "prompt": "A red paper boat drifting on a calm pond, soft morning light" }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "minimax/minimax-h3-max", "duration": 5, "resolution": "480P", "aspect_ratio": "16:9", "watermark": false, "prompt": "A red paper boat drifting on a calm pond, soft morning light" }'
First frame, and first and last frame
frame_images holds one item with frame_type: "first_frame", or that item and one with "last_frame". A last_frame needs a first_frame. Frames are public https URLs or base64 PNG, JPEG or WebP data: images. Frames are not sent together with input_references.
- First frame: Seedance 2.5 and 2.0; Kling 4.0, 3.0, 3.0 Omni, 3.0 Turbo, O1 and 2.5; MiniMax H3 and H3 Max; HappyHorse 1.1 I2V (required); Vidu Q4 Preview; PixVerse C1.
- First and last frame: Seedance 2.5 and 2.0; MiniMax H3 and H3 Max; PixVerse C1.
- With a first frame the output follows the frame. Seedance 2.5, Kling, MiniMax, HappyHorse I2V, Vidu and PixVerse answer
400to anaspect_ratiosent with a frame, so leave it out (Seedance 2.5 and MiniMax also takeadaptive). Seedance 2.0 takes anaspect_ratiowith a frame.
Vidu Q4 Preview, first frame with a seed
vidu/vidu-q4-previewSend one first frame, or 1 to 9 references, not both. With a first frame the output follows it, so aspect_ratio is not sent.
const body = { "model": "vidu/vidu-q4-preview", "duration": 5, "resolution": "720P", "generate_audio": true, "seed": 12345, "prompt": "Slow cinematic push-in over the lantern market canal at dusk, paper lanterns swaying and glowing brighter, a wooden boat gliding over rippling turquoise water, gentle ambient music and water sounds", "frame_images": [ { "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo…" }, "frame_type": "first_frame" } ] }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "vidu/vidu-q4-preview", "duration": 5, "resolution": "720P", "generate_audio": true, "seed": 12345, "prompt": "Slow cinematic push-in over the lantern market canal at dusk, paper lanterns swaying and glowing brighter, a wooden boat gliding over rippling turquoise water, gentle ambient music and water sounds", "frame_images": [ { "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo…" }, "frame_type": "first_frame" } ] }'
Seedance 2.5, first and last frame
bytedance/seedance-2.5Both frames are public https URLs or base64 data: images. last_frame needs a first_frame. Send ratio adaptive, or leave aspect_ratio out, so the output follows the frames.
const body = { "model": "bytedance/seedance-2.5", "duration": 5, "resolution": "1080P", "generate_audio": false, "prompt": "The red paper boat drifts across the pond as the morning light turns from silver to gold", "frame_images": [ { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-paper-boat.jpg" }, "frame_type": "first_frame" }, { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-omni-paper-boat.jpg" }, "frame_type": "last_frame" } ] }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "bytedance/seedance-2.5", "duration": 5, "resolution": "1080P", "generate_audio": false, "prompt": "The red paper boat drifts across the pond as the morning light turns from silver to gold", "frame_images": [ { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-paper-boat.jpg" }, "frame_type": "first_frame" }, { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-omni-paper-boat.jpg" }, "frame_type": "last_frame" } ] }'
Kling 3.0, first frame
kling/kling-3.0The output keeps the shape of the frame, so aspect_ratio is not sent with it.
const body = { "model": "kling/kling-3.0", "duration": 5, "resolution": "1080P", "generate_audio": false, "prompt": "The red paper boat drifts across the pond as the morning light turns from silver to gold", "frame_images": [ { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-paper-boat.jpg" }, "frame_type": "first_frame" } ] }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "kling/kling-3.0", "duration": 5, "resolution": "1080P", "generate_audio": false, "prompt": "The red paper boat drifts across the pond as the morning light turns from silver to gold", "frame_images": [ { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-paper-boat.jpg" }, "frame_type": "first_frame" } ] }'
PixVerse C1, first and last frame as data: images
pixverse/pixverse-c1Frames and references accept https URLs and base64 data: URIs. There is no negative_prompt.
const body = { "model": "pixverse/pixverse-c1", "duration": 5, "resolution": "720P", "generate_audio": false, "prompt": "The oil-painted lantern market gently dissolves into a hand-painted watercolour illustration, smooth magical transition", "frame_images": [ { "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo…" }, "frame_type": "first_frame" }, { "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo…" }, "frame_type": "last_frame" } ] }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "pixverse/pixverse-c1", "duration": 5, "resolution": "720P", "generate_audio": false, "prompt": "The oil-painted lantern market gently dissolves into a hand-painted watercolour illustration, smooth magical transition", "frame_images": [ { "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo…" }, "frame_type": "first_frame" }, { "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo…" }, "frame_type": "last_frame" } ] }'
MiniMax H3, first and last frame with a watermark
minimax/minimax-h3watermark is a boolean and defaults to false. With a first and last frame the ratio is adaptive.
const body = { "model": "minimax/minimax-h3", "duration": 5, "resolution": "768P", "watermark": true, "prompt": "A red paper boat drifts across a calm pond as the morning light turns golden", "frame_images": [ { "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo…" }, "frame_type": "first_frame" }, { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-paper-boat.jpg" }, "frame_type": "last_frame" } ] }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "minimax/minimax-h3", "duration": 5, "resolution": "768P", "watermark": true, "prompt": "A red paper boat drifts across a calm pond as the morning light turns golden", "frame_images": [ { "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo…" }, "frame_type": "first_frame" }, { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-paper-boat.jpg" }, "frame_type": "last_frame" } ] }'
Sample videos
Retained model previews from 2026-10-18, generated directly with the models. The request examples show how to use these models through BeLive AI Hub.
Vidu Q4 Preview: lantern market
vidu/vidu-q4-previewPrompt
Slow cinematic push-in over the lantern market canal at dusk, paper lanterns swaying and glowing brighter, hot-air balloons drifting across the orange and teal sky, a wooden boat gliding over rippling turquoise water, warm golden light, gentle ambient music and water sounds
PixVerse C1: scene transition
pixverse/pixverse-c1Prompt
The vivid oil-painted lantern market gently dissolves into a hand-painted watercolour illustration, lanterns glowing and balloons drifting, smooth magical transition, camera slowly drifting forward
Reference images, video and audio
input_references holds items of image_url, video_url or audio_url, each {"type": "image_url", "image_url": {"url": "…"}} with the matching key. The limits per type are in the table above. References are not sent together with frame_images.
- Seedance 2.5 takes up to 30 images, 10 videos and 10 audio clips; Seedance 2.0, up to 9 images, 3 videos and 3 audio clips. A reference video is a public https URL, and on Seedance 2.0 an audio clip needs an image or a video beside it.
- MiniMax H3 and H3 Max take up to 9 images, one video (mp4 or mov, 2 to 15 s) and one audio clip (WAV or MP3), with ratio
adaptiveor no ratio. - Vidu Q4 Preview takes 1 to 9 images instead of a first frame; PixVerse C1, up to 7; HappyHorse 1.1 R2V, 1 to 9.
Seedance 2.5, images, a video and an audio clip
bytedance/seedance-2.5Up to 30 images, 10 videos and 10 audio clips. A video is a public https URL. Frames and references are not sent together.
const body = { "model": "bytedance/seedance-2.5", "duration": 8, "resolution": "720P", "aspect_ratio": "16:9", "generate_audio": true, "prompt": "The character from the first image dances like the person in the video, singing along to the audio clip", "input_references": [ { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/motion-character.png" } }, { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-paper-boat.jpg" } }, { "type": "video_url", "video_url": { "url": "https://aihub.belive.sg/docs/examples/video/motion-reference-dance.mp4" } }, { "type": "audio_url", "audio_url": { "url": "https://example.com/voice.mp3" } } ] }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "bytedance/seedance-2.5", "duration": 8, "resolution": "720P", "aspect_ratio": "16:9", "generate_audio": true, "prompt": "The character from the first image dances like the person in the video, singing along to the audio clip", "input_references": [ { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/motion-character.png" } }, { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-paper-boat.jpg" } }, { "type": "video_url", "video_url": { "url": "https://aihub.belive.sg/docs/examples/video/motion-reference-dance.mp4" } }, { "type": "audio_url", "audio_url": { "url": "https://example.com/voice.mp3" } } ] }'
MiniMax H3, reference image, video and audio
minimax/minimax-h3Up to 9 reference images, one reference video and one reference audio in input_references, with ratio adaptive. Not together with frame_images. The reference video's seconds are billed with the output seconds.
const body = { "model": "minimax/minimax-h3", "duration": 5, "resolution": "768P", "aspect_ratio": "adaptive", "prompt": "The character from the reference image dances like the person in the reference video, singing along to the reference audio", "input_references": [ { "type": "image_url", "image_url": { "url": "https://example.com/character.png" } }, { "type": "video_url", "video_url": { "url": "https://example.com/dance.mp4" } }, { "type": "audio_url", "audio_url": { "url": "https://example.com/voice.mp3" } } ] }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "minimax/minimax-h3", "duration": 5, "resolution": "768P", "aspect_ratio": "adaptive", "prompt": "The character from the reference image dances like the person in the reference video, singing along to the reference audio", "input_references": [ { "type": "image_url", "image_url": { "url": "https://example.com/character.png" } }, { "type": "video_url", "video_url": { "url": "https://example.com/dance.mp4" } }, { "type": "audio_url", "audio_url": { "url": "https://example.com/voice.mp3" } } ] }'
Vidu Q4 Preview, reference to video
vidu/vidu-q4-preview1 to 9 reference images, as https URLs or base64 data: URIs. aspect_ratio is 16:9, 9:16, 3:4, 4:3 or 1:1.
const body = { "model": "vidu/vidu-q4-preview", "duration": 5, "resolution": "720P", "aspect_ratio": "16:9", "generate_audio": false, "prompt": "The robot from the reference image breaks into an energetic disco dance on a glowing dance floor, camera orbiting around it", "input_references": [ { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-motion-control.jpg" } } ] }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "vidu/vidu-q4-preview", "duration": 5, "resolution": "720P", "aspect_ratio": "16:9", "generate_audio": false, "prompt": "The robot from the reference image breaks into an energetic disco dance on a glowing dance floor, camera orbiting around it", "input_references": [ { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-motion-control.jpg" } } ] }'
HappyHorse 1.1 R2V, two reference images
alibaba/happyhorse-1.1-r2v1 to 9 reference images, and the prompt is required.
const body = { "model": "alibaba/happyhorse-1.1-r2v", "duration": 5, "resolution": "720P", "aspect_ratio": "16:9", "seed": 7, "prompt": "The character from the first image walks through the scene in the second image at dusk", "input_references": [ { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/motion-character.png" } }, { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-paper-boat.jpg" } } ] }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "alibaba/happyhorse-1.1-r2v", "duration": 5, "resolution": "720P", "aspect_ratio": "16:9", "seed": 7, "prompt": "The character from the first image walks through the scene in the second image at dusk", "input_references": [ { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/motion-character.png" } }, { "type": "image_url", "image_url": { "url": "https://aihub.belive.sg/docs/examples/video/kling-3-paper-boat.jpg" } } ] }'
Sample videos
Vidu Q4 Preview: robot dance
vidu/vidu-q4-previewPrompt
The glossy brass-and-red robot dancer from the reference image breaks into an energetic disco dance on a glowing magenta and cyan dance floor, arms pumping, spins and a jump, colourful spotlights sweeping, confetti, camera orbiting around the robot, vivid saturated colours
Audio
generate_audio is a boolean on the models marked as a switch in the table. The output of the models marked always on has audio and the request does not send the field; sending it to a model that has no switch is 400 unsupported_parameter. Kling Motion Control keeps the reference video's own sound by default and drops it with false.
Seedance 2.5, with audio
bytedance/seedance-2.5generate_audio is a switch on Seedance 2.5 and is off by default; true makes a clip with sound.
const body = { "model": "bytedance/seedance-2.5", "duration": 5, "resolution": "720P", "aspect_ratio": "16:9", "generate_audio": true, "prompt": "A slow cinematic dolly shot across a sunlit Singapore hawker centre at golden hour" }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "bytedance/seedance-2.5", "duration": 5, "resolution": "720P", "aspect_ratio": "16:9", "generate_audio": true, "prompt": "A slow cinematic dolly shot across a sunlit Singapore hawker centre at golden hour" }'
Seed, watermark and negative prompt
seed, an integer from 0 to 2147483647: Wan 3.0, HappyHorse 1.1, Vidu Q4 Preview and PixVerse C1.watermark, a boolean that defaults tofalse: MiniMax H3 and H3 Max.negative_prompt: no model in the tables above takes it.
On every other model these fields are 400 unsupported_parameter. size is not a video field; use resolution and aspect_ratio.
Kling Motion Control
kling/kling-motion-control-3.0 drives a character image with the movement in a reference video. The output shows the character from the image performing the motion from the video. Send it to the same POST /api/v1/videos route and poll and download the job as above.
| Input | Notes |
|---|---|
input_references | Required. Exactly one character image: [{"type": "image_url", "image_url": {"url": "…"}}], a public https URL or a base64 data: image (PNG, JPEG or WebP). The output keeps the image's shape. |
reference_video | Required. The motion to copy: {"type": "video_url", "video_url": {"url": "…"}}, an mp4 or mov of 3 seconds or longer and at most 100 MB, given as a public https URL. |
character_orientation | image (the default) keeps the character facing as in the image, with a reference video of 3 to 10 seconds. video follows the facing in the video, with 3 to 30 seconds. The output is as long as the reference video, up to that limit. |
resolution | 720P (the default) or 1080P. |
prompt | Optional, up to 2,500 characters. Describes the motion and style. |
generate_audio | Defaults to true, which keeps the reference video's audio. Send false for a silent result. |
characters | Optional, at most one saved character; needs character_orientation video. See Saved characters below. |
duration, size, seed and negative_prompt are not accepted for this model and return 400.
Character image + reference motion → result
The result was generated through BeLive AI Hub on 2026-10-19 with the request below. The character image and synthetic dancer reference are retained inputs from 2026-10-18. Display copies are compressed for this page.

Request
const body = { "model": "kling/kling-motion-control-3.0", "prompt": "The character dances with full energy, vivid colours, smooth natural motion", "resolution": "720P", "generate_audio": false, "character_orientation": "video", "input_references": [ { "type": "image_url", "image_url": { "url": "https://belivesdk-clients.belive.sg/tokenhub/qa/samples/tencent-wave1-2026-10-18/hy-image-3.5-preview-1.png" } } ], "reference_video": { "type": "video_url", "video_url": { "url": "https://belivesdk-clients.belive.sg/tokenhub/qa/samples/tencent-wave1-2026-10-18/motion-reference-dance2.mp4" } } }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "kling/kling-motion-control-3.0", "prompt": "The character dances with full energy, vivid colours, smooth natural motion", "resolution": "720P", "generate_audio": false, "character_orientation": "video", "input_references": [ { "type": "image_url", "image_url": { "url": "https://belivesdk-clients.belive.sg/tokenhub/qa/samples/tencent-wave1-2026-10-18/hy-image-3.5-preview-1.png" } } ], "reference_video": { "type": "video_url", "video_url": { "url": "https://belivesdk-clients.belive.sg/tokenhub/qa/samples/tencent-wave1-2026-10-18/motion-reference-dance2.mp4" } } }'
Saved characters
Save a person, animal, prop, clothing item, scene or effect once, then reuse it in video requests with characters. A character belongs to the workspace of the key that created it; another workspace's id answers 404.
POST /api/v1/videos/characterstakesname(1 to 20 characters),description(1 to 100), exactly one ofimagesorvideo, optionaltagsandconsent, which must be{"confirmed": true}. It answers202with the character inprocessing.imagesis onefrontimage and one to threeothers(other angles): JPG or PNG, at most 10 MB, at least 300 px on each side.videois onevideo_urlitem: mp4 or mov, 3 to 8 seconds, 1080p, 16:9 or 9:16.GET /api/v1/videos/characterslists the workspace's characters, newest first, as{"items": […], "next_cursor": …}(limit,cursor).GET /api/v1/videos/characters/{id}reads one; poll it untilstatusisreadyorfailed.DELETEon the same path answers204.- A workspace holds about 20 characters; past that,
409 conflictwithmetadata.reasoncharacter_limit. Using a character that is notreadyin a video request is409withcharacter_not_ready. Creation counts against your rate limits and may be charged at the provider's cost. - Uploaded media is kept only until the provider has accepted it. You attest with
consentthat you have the right to use the people and material shown.
Errors and reference billing
- The model's limits are applied before anything is started. A field the model does not take is
400 unsupported_parameter; a value outside a limit is400 invalid_requestwith the field and the range in the message, for example`duration` must be an integer from 4 through 15. These answers start no job and cost nothing. See Errors and recovery. frame_imagesandinput_referencestogether, a count above a limit, and an input that is not a public https URL or a base64 image are each400 invalid_request.- Output seconds are priced as in the model's
tokenhub_price_table. On Seedance, a request with a reference video is priced on the model's reference-video rows, which are listed beside the others. On MiniMax H3, the seconds of a reference video are billed with the output seconds, and each reference image after the fifth adds USD 0.0286 at list. Reference images and audio on Seedance add no charge of their own.
Provider notes
Seedance
bytedance/seedance-2.5runs 4 to 30 seconds at 720P or 1080P;bytedance/seedance-2.0, 4 to 15 seconds from 480P to 1080P. Fast and Mini are text to video at 480P and 720P.- Ratio
adaptiveis accepted on Seedance 2.5 with a first frame, where the output follows the frame. - Prompts are accepted up to 2,000 characters.
Kling
- With no
aspect_ratio, the output ratio depends on the route that serves the job, so set it for text to video. Withframe_imagesthe output follows the frame. - Kling 3.0 Turbo has audio on and takes a first frame only. Kling O1 and 2.5 are silent. Kling 2.5 takes 5 seconds.
- Kling takes no last frame and no references, except Motion Control, which has its own section below. Prompts are accepted up to 2,500 characters.
- For the white-label Kling and MiniMax routes, the content endpoint either streams the MP4 from AI Hub with
200or206or answers302with a time-limited download URL; see Download the video above.
MiniMax
- H3 runs 4 to 15 seconds at 768P or 2K; H3 Max, 5 to 15 seconds at 480P or 768P. The output always has audio, so
generate_audiois not sent. Prompts are accepted up to 7,000 characters. - With a frame or reference the ratio is
adaptiveor left out.watermarkis for H3 and H3 Max.
Wan and HappyHorse
- Wan 3.0 Video and Prime run 2 to 30 seconds from 480P to 1080P. Prompts are accepted up to 20,000 characters.
- HappyHorse 1.1 runs 3 to 15 seconds in three forms: text to video, image to video (a first frame, no
aspect_ratio, and the prompt is optional) and reference to video (1 to 9 images). Prompts are accepted up to 2,500 characters.
Vidu and PixVerse
- Vidu Q4 Preview runs 3 to 16 seconds up to 4K. It has no text to video: send one first frame or 1 to 9 reference images, not both. Prompts are accepted up to 2,000 characters.
- PixVerse C1 runs 1 to 15 seconds from 360P to 1080P, with a first frame, a first and last frame, or up to 7 references. Prompts are accepted up to 5,000 characters.
- The Vidu, PixVerse and MiniMax routes through Tencent have no negative prompt; the field is refused with
400.
Concurrency and retention
- Video capacity is shared. An accepted job can wait for an eligible provider slot: keep its job ID and poll it rather than submitting it again. See the queue details above and Rate limits & caps for the separate organisation-wide video total.
- For the routes that stream video directly through AI Hub, a finished video is kept for 24 hours after the job completes:
content_expires_atis the completion time plus 24 hours. Download it before then. - These routes stream the MP4 from AI Hub with
200or206; there is no redirect to an external link. MiniMax H3 and H3 Max also have another route, which may answer302.
Differences from calling the provider directly
- Dropped, and returned as
400if sent:negative_prompton every model, andseedon MiniMax and Kling. PixVerse camera movement and multi-clip are not sent. Vidu has no first-and-last-frame and no text-to-video. Kling Motion Control takes noduration. - MiniMax has no audio switch (
generate_audiois refused; the output includes audio). MiniMax H3 and H3 Max take reference images, one video and one audio. Callbacks are not available. - These routes do not accept provider callback parameters. Poll the AI Hub job. A waiting queued job can be cancelled before dispatch; cancellation after dispatch depends on the provider.
- You get a AI Hub job id and AI Hub content URL, instead of an external task id or link.
Example videos
Text-to-video results, each with its prompt. The request that makes one is the Submit a job request above with that model and the settings shown; the feature sections above show the requests for frames, references and audio.
Seedance 2.5
These three clips were generated through AI Hub on 2026-10-15 with bytedance/seedance-2.5, each with the prompt shown. Every request asked for 1080P, 5 seconds, 16:9 and generate_audio: false. The videos are compressed display copies; each new generation produces a different result.
Barista latte art
bytedance/seedance-2.5Requested: 1080P · 5s · 16:9 · generate_audio: false
Prompt: A smiling young barista in a sunlit Singapore cafe pours latte art into a white cup, steam rising, warm morning light through the window, shallow depth of field, cinematic handheld camera.
Runner on the waterfront
bytedance/seedance-2.5Requested: 1080P · 5s · 16:9 · generate_audio: false
Prompt: A woman in bright running gear jogs along the waterfront at golden hour, city skyline behind her, she glances at the camera and smiles, slow tracking shot, cinematic colour grade.
Grandfather and granddaughter with a kite
bytedance/seedance-2.5Requested: 1080P · 5s · 16:9 · generate_audio: false
Prompt: A grandfather and his granddaughter fly a red kite together on a grassy hill, both laughing, wind in their hair, soft afternoon sun, wide shot moving in slowly, cinematic.
This 30-second clip was generated through AI Hub production on 2026-10-25 with bytedance/seedance-2.5 and one prompt describing five shots. The video is a compressed display copy; each new generation produces a different result.
Rooftop fashion show, 30 seconds
bytedance/seedance-2.5Requested: 1080P · 30s · 16:9
Prompt: A 30-second cinematic night fashion show on a glowing rooftop runway above Singapore's Marina Bay. Shot 1: wide aerial push-in over the skyline as the city lights sparkle and the runway lights up in neon pink and gold. Shot 2: a confident Gen Z model in a holographic silver jacket with bling chain accessories struts toward camera, slow-motion hair flip, sequins catching the light. Shot 3: quick cuts of diverse models in bold streetwear and couture, camera tracking alongside, crowd phones flashing. Shot 4: the lead model stops at the end of the runway, strikes a pose, and fireworks burst over the bay behind her. Shot 5: low-angle hero shot of all models together as gold confetti falls, ending on a dramatic freeze frame. High-energy, glossy, premium commercial look, vivid colours, smooth camera motion, sharp detail.
Kling and MiniMax
These six clips were generated through AI Hub on 2026-10-11 with the same prompt. The videos are compressed display copies; each new generation produces a different result.
Prompt: A red paper boat drifting on a calm pond, soft morning light.
Kling 3.0
kling/kling-3.0Requested: 720P · 5s
Kling 3.0 Omni
kling/kling-3.0-omniRequested: 720P · 5s
Kling O1
kling/kling-o1Requested: 720P · 5s
Kling 3.0 Turbo
kling/kling-3.0-turboRequested: 720P · 3s
MiniMax H3
minimax/minimax-h3Requested: 768P · 4s
Request
const body = { "model": "minimax/minimax-h3", "prompt": "A red paper boat drifting on a calm pond, soft morning light.", "duration": 4, "resolution": "768P" }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "minimax/minimax-h3", "prompt": "A red paper boat drifting on a calm pond, soft morning light.", "duration": 4, "resolution": "768P" }'
MiniMax H3 Max
minimax/minimax-h3-maxRequested: 480P · 5s
Request
const body = { "model": "minimax/minimax-h3-max", "prompt": "A red paper boat drifting on a calm pond, soft morning light.", "duration": 5, "resolution": "480P" }; const response = await fetch("https://tokenhub-api.belive.sg/api/v1/videos", { method: "POST", headers: { Authorization: "Bearer " + process.env.TOKENHUB_API_KEY, "Content-Type": "application/json", "Idempotency-Key": process.env.TOKENHUB_IDEMPOTENCY_KEY, }, body: JSON.stringify(body), }); if (!response.ok) throw new Error("Video submit failed: " + response.status); const job = await response.json(); console.log(job.id, job.polling_url);
curl --fail-with-body -sS 'https://tokenhub-api.belive.sg/api/v1/videos' \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $TOKENHUB_IDEMPOTENCY_KEY" \ -d '{ "model": "minimax/minimax-h3-max", "prompt": "A red paper boat drifting on a calm pond, soft morning light.", "duration": 5, "resolution": "480P" }'
Wan and HappyHorse previews
These two clips were generated directly with the models on 2026-09-18, before their AI Hub integration. They are retained model previews; the other examples on this page were generated through BeLive AI Hub.
Prompt: A time-lapse of clouds moving over a modern city skyline at dusk.
Wan3.0 Video Prime
alibaba/wan3.0-video-primeRequested: 720P · 2s · 4:3
HappyHorse-1.1 Text to Video
alibaba/happyhorse-1.1-t2vRequested: 720P · 3s · 9:16
Support and limits
Submit a model with its prompt, references or character inputs, keep the job ID, poll the job, and download before content_expires_at. POST /api/v1/videos/{id}/cancel cancels a job; see Cancel, prices and availability above.
Gateway validation, defaults and response forms are in the operation index and the OpenAPI schemas.
Error codes and recovery are in Errors and recovery. Keep the request or job ID from each response: it identifies the call in Activity and for support.