Capabilities

Video generation

POST/api/v1/videos starts a video generation job. Jobs are asynchronous: submit, poll until the job completes, then download the video.

Original 5-second video from 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

ModelSecondsPrompt charactersResolutionsRatiosPrice basis
Seedance
bytedance/seedance-2.54 to 302,000720P, 1080P16:9, 9:16, 1:1, 4:3, 3:4, 21:9; adaptive with a first frameOutput tokens, by resolution; a reference video uses its own rows
bytedance/seedance-2.04 to 152,000480P, 720P, 1080P16:9, 9:16, 1:1, 4:3, 3:4, 21:9Output tokens, by resolution; a reference video uses its own rows
bytedance/seedance-2.0-fast4 to 152,000480P, 720P16:9, 9:16, 1:1, 4:3, 3:4, 21:9Output tokens, by resolution
bytedance/seedance-2.0-mini4 to 152,000480P, 720P16:9, 9:16, 1:1, 4:3, 3:4, 21:9Output tokens, by resolution
Kling
kling/kling-4.03 to 302,500720P, 1080P16:9, 9:16, 1:1, 21:9; none with a first frame, the output follows itOutput tokens, by resolution
kling/kling-3.03 to 152,500720P, 1080P, 2K, 4K16:9, 9:16, 1:1Per output second, by resolution and audio
kling/kling-3.0-omni3 to 152,500720P, 1080P, 2K, 4K16:9, 9:16, 1:1Per output second, by resolution and audio
kling/kling-3.0-turbo3 to 152,500720P, 1080P16:9, 9:16, 1:1Per output second, by resolution
kling/kling-o15, 10; 5 with a first frame2,500720P, 1080P, 2K, 4K16:9, 9:16, 1:1Per output second, by resolution
kling/kling-2.552,500720P, 1080P, 2K, 4K16:9, 9:16Per output second, by resolution
kling/kling-motion-control-3.0Follows the reference video, 3 to 302,500720P, 1080PFollows the character imageOutput tokens, by resolution
MiniMax
minimax/minimax-h34 to 157,000768P, 2K16:9, 9:16, 1:1, 4:3, 3:4, 21:9; adaptive with frames or referencesPer output second, by resolution; reference-video seconds are added, and each image after the fifth
minimax/minimax-h3-max5 to 157,000480P, 768P16:9, 9:16, 1:1, 4:3, 3:4, 21:9; adaptive with framesPer output second, by resolution
Wan and HappyHorse
alibaba/wan3.0-video2 to 3020,000480P, 720P, 1080P16:9, 9:16, 1:1, 4:3, 3:4Per output second, by resolution
alibaba/wan3.0-video-prime2 to 3020,000480P, 720P, 1080P16:9, 9:16, 1:1, 4:3, 3:4Per output second, by resolution
alibaba/happyhorse-1.1-t2v3 to 152,500480P, 720P, 1080P16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9Per output second, by resolution
alibaba/happyhorse-1.1-i2v3 to 152,500480P, 720P, 1080PFollows the first framePer output second, by resolution
alibaba/happyhorse-1.1-r2v3 to 152,500480P, 720P, 1080P16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9Per output second, by resolution
Vidu
vidu/vidu-q4-preview3 to 162,000540P, 720P, 1080P, 2K, 4K16:9, 9:16, 1:1, 4:3, 3:4 with references; follows a first frameOutput tokens, by resolution
PixVerse
pixverse/pixverse-c11 to 155,000360P, 540P, 720P, 1080P16:9, 9:16, 1:1, 4:3, 3:4, 21:9, 2:3, 3:2Output tokens, by resolution and audio

Inputs and options

ModelText to videoFirst frameFirst and last frameReference imagesReference videosReference audiogenerate_audioOther options
Seedance
bytedance/seedance-2.5YesYesYesUp to 30Up to 10Up to 10Switch, default offNo
bytedance/seedance-2.0YesYesYesUp to 9Up to 3Up to 3, with an image or videoSwitch, default offNo
bytedance/seedance-2.0-fastYesNoNoNoNoNoSwitch, default offNo
bytedance/seedance-2.0-miniYesNoNoNoNoNoSwitch, default offNo
Kling
kling/kling-4.0YesYesNoNoNoNoAlways onNo
kling/kling-3.0YesYesNoNoNoNoSwitch, default offNo
kling/kling-3.0-omniYesYesNoNoNoNoSwitch, default offNo
kling/kling-3.0-turboYesYesNoNoNoNoAlways onNo
kling/kling-o1YesYesNoNoNoNoSilentNo
kling/kling-2.5YesYesNoNoNoNoSilentNo
kling/kling-motion-control-3.0NoNoNo1 character image1 motion video (reference_video)NoSwitch, default on (keeps the video's sound)No
MiniMax
minimax/minimax-h3YesYesYesUp to 911Always onwatermark
minimax/minimax-h3-maxYesYesYesNoNoNoAlways onwatermark
Wan and HappyHorse
alibaba/wan3.0-videoYesNoNoNoNoNoNo switchseed
alibaba/wan3.0-video-primeYesNoNoNoNoNoNo switchseed
alibaba/happyhorse-1.1-t2vYesNoNoNoNoNoNo switchseed
alibaba/happyhorse-1.1-i2vNoRequired; the prompt is optionalNoNoNoNoNo switchseed
alibaba/happyhorse-1.1-r2vNoNoNo1 to 9, requiredNoNoNo switchseed
Vidu
vidu/vidu-q4-previewNoYes, instead of referencesNo1 to 9, instead of a first frameNoNoSwitch, default offseed
PixVerse
pixverse/pixverse-c1YesYesYesUp to 7, instead of framesNoNoSwitch, default offseed

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"])
json
{
  "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

FieldNotes
modelRequired. A model from GET /v1/videos/models
prompt, duration, resolution, aspect_ratio, seed, negative_prompt, watermark, generate_audioAccepted 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_imagesImage-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_referencesReference-to-video: items of image_url, video_url or audio_url, each {"url": "…"}. See Reference images, video and audio
reference_video, character_orientationMotion 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
charactersA 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))

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)

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}/cancel returns 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_second meter in the model's tokenhub_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 a frame_images first 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 at 720P comes back 960×960 and is priced at 1080P. A square frame at 1080P is priced at 2K, and at 2K or 4K at 4K. A 9:16 or 16:9 frame is priced at the requested tier. The job still reports the requested resolution; the Selected price row on the Activity page shows the tier it was priced at.
  • A completed job's usage carries the job's cost in USD: cost as a number and tokenhub_cost as a decimal string.
  • Queueing does not bypass admission controls. An organisation at its video job total can receive 429 rate_limit_exceeded; honour Retry-After when 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-c1

Eight 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);

MiniMax H3 Max, text to video

minimax/minimax-h3-max

480P 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);

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 400 to an aspect_ratio sent with a frame, so leave it out (Seedance 2.5 and MiniMax also take adaptive). Seedance 2.0 takes an aspect_ratio with a frame.

Vidu Q4 Preview, first frame with a seed

vidu/vidu-q4-preview

Send 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);

Seedance 2.5, first and last frame

bytedance/seedance-2.5

Both 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);

Kling 3.0, first frame

kling/kling-3.0

The 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);

PixVerse C1, first and last frame as data: images

pixverse/pixverse-c1

Frames 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);

MiniMax H3, first and last frame with a watermark

minimax/minimax-h3

watermark 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);

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-preview
5 s, 720p, audio on. Compressed display copy.
Prompt

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-c1
5 s, 720p, silent. Compressed display copy.
Prompt

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 adaptive or 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.5

Up 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);

MiniMax H3, reference image, video and audio

minimax/minimax-h3

Up 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);

Vidu Q4 Preview, reference to video

vidu/vidu-q4-preview

1 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);

HappyHorse 1.1 R2V, two reference images

alibaba/happyhorse-1.1-r2v

1 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);

Sample videos

Vidu Q4 Preview: robot dance

vidu/vidu-q4-preview
5 s, 720p, silent. Compressed display copy.
Prompt

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.5

generate_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);

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 to false: 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.

InputNotes
input_referencesRequired. 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_videoRequired. 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_orientationimage (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.
resolution720P (the default) or 1080P.
promptOptional, up to 2,500 characters. Describes the motion and style.
generate_audioDefaults to true, which keeps the reference video's audio. Send false for a silent result.
charactersOptional, 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.

An original brass and red robot character in a colourful disco jacket.
1. Character image
2. Reference motion
3. AI Hub result · 720P requested · silent
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);

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/characters takes name (1 to 20 characters), description (1 to 100), exactly one of images or video, optional tags and consent, which must be {"confirmed": true}. It answers 202 with the character in processing.
  • images is one front image and one to three others (other angles): JPG or PNG, at most 10 MB, at least 300 px on each side. video is one video_url item: mp4 or mov, 3 to 8 seconds, 1080p, 16:9 or 9:16.
  • GET /api/v1/videos/characters lists the workspace's characters, newest first, as {"items": […], "next_cursor": …} (limit, cursor). GET /api/v1/videos/characters/{id} reads one; poll it until status is ready or failed. DELETE on the same path answers 204.
  • A workspace holds about 20 characters; past that, 409 conflict with metadata.reason character_limit. Using a character that is not ready in a video request is 409 with character_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 consent that 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 is 400 invalid_request with 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_images and input_references together, a count above a limit, and an input that is not a public https URL or a base64 image are each 400 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.5 runs 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 adaptive is 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. With frame_images the 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 200 or 206 or answers 302 with 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_audio is not sent. Prompts are accepted up to 7,000 characters.
  • With a frame or reference the ratio is adaptive or left out. watermark is 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_at is the completion time plus 24 hours. Download it before then.
  • These routes stream the MP4 from AI Hub with 200 or 206; there is no redirect to an external link. MiniMax H3 and H3 Max also have another route, which may answer 302.

Differences from calling the provider directly

  • Dropped, and returned as 400 if sent: negative_prompt on every model, and seed on 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 no duration.
  • MiniMax has no audio switch (generate_audio is 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.5

Requested: 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.

AI Hub 2026-10-15. Original output 1920 × 1080, about 5 seconds, without audio. Preview 1280 × 720, compressed for the docs page.

Runner on the waterfront

bytedance/seedance-2.5

Requested: 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.

AI Hub 2026-10-15. Original output 1920 × 1080, about 5 seconds, without audio. Preview 1280 × 720, compressed for the docs page.

Grandfather and granddaughter with a kite

bytedance/seedance-2.5

Requested: 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.

AI Hub 2026-10-15. Original output 1920 × 1080, about 5 seconds, without audio. Preview 1280 × 720, compressed for the docs page.

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.5

Requested: 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.

AI Hub production 2026-10-25. Original output 1920 × 1080, 30 seconds, without audio. Preview 1280 × 720, compressed for the docs page.

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.0

Requested: 720P · 5s

AI Hub 2026-10-11. Original output 1280 × 720, about 5 seconds, without audio. Preview compressed for the docs page.

Kling 3.0 Omni

kling/kling-3.0-omni

Requested: 720P · 5s

AI Hub 2026-10-11. Original output 1280 × 720, about 5 seconds, without audio. Preview compressed for the docs page.

Kling O1

kling/kling-o1

Requested: 720P · 5s

AI Hub 2026-10-11. Original output 1280 × 720, about 5 seconds, without audio. Preview compressed for the docs page.

Kling 3.0 Turbo

kling/kling-3.0-turbo

Requested: 720P · 3s

AI Hub 2026-10-11. Original output 1280 × 720, about 3 seconds, with audio. Preview compressed for the docs page.

MiniMax H3

minimax/minimax-h3

Requested: 768P · 4s

AI Hub 2026-10-11. Original output 1344 × 768, about 4 seconds, with audio. Preview compressed for the docs page.
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);

MiniMax H3 Max

minimax/minimax-h3-max

Requested: 480P · 5s

AI Hub 2026-10-11. Original output 832 × 480, about 5 seconds, with audio. Preview compressed for the docs page.
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);

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-prime

Requested: 720P · 2s · 4:3

Direct model preview 2026-09-18. Result 640 × 480, 2 seconds. Preview compressed for the docs page.

HappyHorse-1.1 Text to Video

alibaba/happyhorse-1.1-t2v

Requested: 720P · 3s · 9:16

Direct model preview 2026-09-18. Result 270 × 480, 3 seconds. Preview compressed for the docs page.

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.