Skip to main content
Video generation runs as a job. You submit a prompt and get a job ID back straight away, then poll until the clip is ready. The finished clip arrives in the poll response as a base64-encoded MP4. The serverless video model is MiniMax-H3. It renders 5-second clips at 24 fps with synchronized audio, so the sound you describe is part of the output.

Example

A clip usually takes one to a few minutes, longer when other jobs are queued ahead of it. Polling every 10 seconds or so is plenty.

Submit a job

POST /v1/videos/generations The response is 202 Accepted:

Poll for the result

GET /v1/videos/generations/{id} status moves from queued to processing, then to completed or failed. A completed response carries the clip:
A failed job carries error instead, with a code and a message.

Save the clip on the first read

The response that first reports completed is the download. Each clip is served once: a second GET returns 410 with "error": "job_already_retrieved". Decode and save the clip from the response you stopped polling on. A clip you never collect stays available for one hour after it completes, and it is billed either way. After that hour, or for an ID that isn’t yours, the GET returns 410 with "error": "job_expired". If your balance runs out before you collect, the GET returns 402; top up within the hour to collect the clip.

Prompt screening

Prompts are screened before a job is accepted. A refused prompt returns 400 with "error": "content_policy_violation", and no job is created or billed. If screening is briefly unavailable, you get 503 with "error": "safety_check_unavailable", and retrying shortly is safe. To screen prompts with your own policy as well, call moderation on the exact prompt you are about to submit. If a model wrote or expanded the prompt, screen the expanded version too.

Errors

Errors from the video handlers use a flat shape, { "error": "<code>", "message": "..." }: These use the OpenAI error envelope, { "error": { "message", "type", "code", "param" } }, instead: See errors for the full reference.

Billing

Video bills per second of output, at the model’s clip length. Every MiniMax-H3 clip is 5 seconds, so each completed clip bills 5 seconds at the per-second rate. A clip is billed when it completes, whether or not you collect it, so save it on the first read. On GET /v1/models the rate is in media_pricing with billing_unit: "second_video". It is also on the model page, quoted per minute of video.

See also

  • Regions — how long prompts and clips stay in the EU stack.
  • Model discovery — video models have category: "video".