Skip to main content
POST
Generate many videos in one batch

Video Batch

Generate several videos with one request. A batch takes 3 to 20 requests that all run on the same model_id, queues each one as its own video, and returns one batch_id you can poll for all of them together. Each request in a batch is billed at half the price the matching single endpoint (Text to Video Ultra or Image to Video Ultra) would charge. In exchange, a request that has not finished 8 minutes after submission is failed and refunded automatically.
Supported model_id values are wan2.2, ltx-2.3, h3-minimax-t2v, h3-minimax-r2v and h3-minimax-start-end-frame. Requests with an init_image take the image-to-video path; the rest take text-to-video. Both kinds can be mixed in one batch.

Request

Make a POST request to below endpoint and pass the required parameters in the request body.
curl

Body

json
  • requests — 3 to 20 entries. Each entry accepts the same parameters as the single text-to-video / image-to-video endpoint for the chosen model.
  • defaults — optional. Merged under every entry; a value set on an entry wins over the same key in defaults.
  • track_id — an entry’s own track_id is used for its webhook and result; entries without one inherit the top-level value.
  • webhook — called once per request as it finishes, exactly as the single endpoints do, with that request’s id and track_id.

Validation

The batch is validated as a whole before anything is queued. If any entry is invalid, the entire batch is refused, nothing is queued and nothing is charged. The error names the first failing entry and errors lists every one:
json

Billing

Every request in a batch is charged at 50% of its single-request price, at submission. The estimate is computed per entry — so a 10-second request costs twice a 5-second one, then both are halved — and the batch is only accepted if your plan allowance or wallet covers the discounted total:
json
A request still processing 8 minutes after submission is marked failed and its charge is refunded. The refund is the discounted amount that was actually taken, and the result reports refunded: true. A request that finishes later than that is not delivered.

Concurrency

A batch of N counts as N queued requests against your plan’s request queue limit. The whole batch must fit in the slots you have free at submission — a plan with 10 slots and 4 videos already processing can submit a batch of at most 6:
json
It also counts as N requests in the hourly window. The RateLimit-* response headers reflect the full weight.

Response

The response is keyed like a single video response — status, id, output, message, tip — with the batch fields on top. id and batch_id are the same integer, drawn from the same counter as video ids, so a batch id never collides with a video id. Each entry in results is the same body the matching single endpoint would have returned for that request, plus its index and track_id.
json
Poll the whole batch on Fetch Video Batch with batch_id, or any single request on Fetch Video with its own id.

Body

application/json
key
string
required

Your API Key used for request authorization

model_id
enum<string>
default:wan2.2
required

The video model every request in the batch runs on

Available options:
wan2.2,
ltx-2.3,
h3-minimax-t2v,
h3-minimax-r2v,
h3-minimax-start-end-frame
requests
object[]
required

3 to 20 requests. Each takes the same parameters as the single text-to-video / image-to-video endpoint for the chosen model; an entry with init_image takes the image-to-video path

Required array length: 3 - 20 elements
defaults
object

Parameters merged under every entry. A value set on an entry wins over the same key here

webhook
string<uri>

Called once per request as it finishes, with that request's id and track_id

track_id
string

Inherited by every entry that does not set its own

Response

Batch accepted, or refused whole (validation_error, insufficient_balance, rate_limited). Always HTTP 200.

Keyed like a single video response (status, id, output, message, tip) with the batch fields on top

status
enum<string>

processing on submit and while any request is still running; success once all succeeded; failed once all failed

Available options:
processing,
success,
failed
id
integer

The batch id. Same value as batch_id; drawn from the same counter as video ids so the two never collide

batch_id
integer
message
string
tip
string
output
string<uri>[]

Every finished video across the batch in request order; empty on submit

On submit: the URL every request will publish to, in request order

fetch_result
string<uri>

On submit: URL to poll the whole batch

eta
integer

On submit: the largest per-request estimate, in seconds

meta
object

On submit: the envelope inputs (model_id, track_id, webhook)

timeout_minutes
integer

On submit: requests not finished by then are failed and refunded

discount
number

On submit: fraction taken off every request's single-request price

request_counts
object
results
object[]