# MiniMax H3 Max (video) > MiniMax H3 Max makes video with sound from text, from one first frame, or from reference media. It renders at 480p, 768p or 1080p, in any whole length from 5 to 15 seconds. It follows the prompt closely and it is one of the most affordable premium lanes. Status: roasOS API v1.1. Catalog `model-catalog@2026-10-06.v5`, pricing `customer-pricing@2026-11-05.v15`. The endpoint `POST /v1/video/h3-max` is live. `POST /v1/generations` stays for one minor version as a deprecated alias (see "Today"). ## Endpoint POST https://api.roasos.com/v1/video/h3-max Auth: Authorization: Bearer roasos_sk_… (scope api:write). Idempotency-Key required. quote_only / quote_id / webhook_url as in https://docs.roasos.com/llms.txt. ## Good at The model follows the prompt closely. Name the subject, the action and the camera move plainly, and it renders them. A single take can run 15 seconds. Every output has a generated soundtrack. To use your own voiceover or music, send `audio_url` on text-to-video or image-to-video. The audio replaces the generated sound. It is trimmed to the clip, or padded with silence when it is shorter. The reference lane takes up to 9 images, 3 video clips and 3 audio clips, and 12 files at most. Send `references`, `video_urls` and `audio_urls`. Add `product_id` to attach the product's kit shots, and `avatar_id` to attach a saved person. Each reference clip must be 2 to 15 seconds long, and the clips of one kind must total 15 seconds or less. The prompt names the media by type and position: Image 1, Video 1, Audio 1. The platform names the product and avatar shots for you at the end of the prompt. Text-to-video takes six aspect ratios (21:9 to 9:16). The reference lane also takes `auto` (adaptive framing). Image-to-video takes its framing from the first frame, and `end_image_url` pins the last frame. A `seed` makes a result repeatable. ## Pricing Unit: clip. Pricing key: `h3-max`. | request | credits | |---|---| | `5s_768p` | 5 | | `10s_768p` | 10 | | `15s_768p` | 15 | Credits come from the roasOS pricing table (`MODEL_COSTS`) through the catalog. No other field changes the price. ## Modes - `text-to-video` - `image-to-video` - `reference-to-video` The worker derives the mode from the media fields of the request. Provider endpoints: `minimax/h3-max/image-to-video` · `minimax/h3-max/reference-to-video` · `minimax/h3-max/text-to-video`. ## Request fields | field | type | required | default | rule | |---|---|---|---|---| | `aspect_ratio` | enum | no | `16:9` | `21:9`, `16:9`, `4:3`, `1:1`, `3:4`, `9:16`, `auto`; only in `text-to-video`, `reference-to-video` | | `audio_url` | string | no | — | https URL; ≤ 4,096 characters | | `audio_urls` | string[] | no | — | ≤ 3 items; only in `reference-to-video` | | `avatar_id` | string | no | — | UUID | | `avatar_outfit` | string | no | — | ≤ 500 characters | | `duration_seconds` | integer enum | no | `5` | `5`, `6`, `7`, `8`, `9`, `10`, `11`, `12`, `13`, `14`, `15` | | `end_image_url` | string | no | — | https URL; ≤ 4,096 characters; only in `image-to-video` | | `extend_of_generation_id` | string | no | — | UUID | | `image_url` | string | no | — | https URL; ≤ 4,096 characters; only in `image-to-video` | | `mode` | enum | no | — | `text-to-video`, `image-to-video`, `reference-to-video` | | `product_id` | string | no | — | UUID | | `prompt` | string | yes | — | ≥ 1 character; ≤ 10,000 characters | | `quote_id` | string | no | — | UUID | | `quote_only` | boolean | no | `false` | — | | `references` | string[] | no | — | ≤ 9 items; only in `reference-to-video` | | `resolution` | enum | no | `768p` | `480p`, `768p`, `1080p` | | `scene_id` | string | no | — | UUID | | `seed` | integer | no | — | 0–2147483647 | | `video_urls` | string[] | no | — | ≤ 3 items; only in `reference-to-video` | | `wait_timeout_seconds` | integer | no | `0` | 0–60 | | `webhook_url` | string | no | — | https URL; ≤ 4,096 characters | The schema is strict: a field that is not in this table returns `400 unsupported_option`. Field names are the roasOS role names, one name per role across every family. ## Media - `avatar_id` — identity; the saved character reference sheet, with a derived portrait only where the model requires a single face or source frame - `product_id` — product; resolves to the product image list - `references` — style and appearance references - `image_url` — first frame (or the single source image) - `end_image_url` — last frame - `scene_id` — first frame — a scene this workspace owns - `video_urls` — reference videos - `audio_urls` — reference or driving audio - `audio_url` — the driving audio track | role | items | max size | content types | duration | |---|---|---|---|---| | `audio_urls` | ≤ 3 | 15 MB | `audio/mp3`, `audio/mpeg`, `audio/wav`, `audio/wave`, `audio/x-wav` | — | | `end_image_url` | ≤ 1 | 10 MB | `image/jpeg`, `image/png`, `image/webp` | — | | `image_url` | ≤ 1 | 10 MB | `image/jpeg`, `image/png`, `image/webp` | — | | `references` | ≤ 9 | 10 MB | `image/jpeg`, `image/png`, `image/webp` | — | | `video_urls` | ≤ 3 | 100 MB | `video/mp4`, `video/quicktime` | — | - Refused: `elements`, `product_images`, `reference_images`, `scene_image`, `video_url`, `voice_id`. A refused role returns `400 unsupported_option`. - Every URL must be an immutable object on `https://cdn.roasos.com/…` that your workspace owns; any other URL is `400 reference_media_not_workspace_owned`. Upload with `POST /v1/uploads` (direct POST of the bytes to `put_url`, or a `source_url` import), then use the returned CDN URL. ## Prompt Limit 10,000 characters. The provider expands the prompt lightly before generation ("balanced" mode, pinned). - Name the subject, one action and one camera move. The model adds the atmosphere. - For a 10-15 second take, describe the action as one continuous progression. - In image-to-video, describe the motion, not the scene. The first frame owns the scene. - On the reference lane, say what each input controls: "the product in Image 1", "the motion of Video 1". - Direct the sound (room tone, music mood, a spoken line in quotes), or the model makes its own. - End with "No on-screen text, no captions, no subtitles." Add text in post-production. ## Not exposed - `prompt_expansion_mode`: pinned to `pinned to "balanced"; "disabled" and "quality" are not served`. - `enable_safety_checker`: pinned to `provider default (on); never sent`. - `sync_mode`: not accepted by this public endpoint. - `negative_prompt`: not accepted by this public endpoint. - `generate_audio`: pinned to `every output carries a generated soundtrack; there is no on/off field`. - `cfg_scale`: not accepted by this public endpoint. - `shot_type`: not accepted by this public endpoint. - `multi_prompt`: not accepted by this public endpoint. ## Result Result kind `video`. Always present: `url`. ```json { "data": { "id": "gen_…", "kind": "video", "model": "h3-max", "status": "completed", "result": {"url":"https://cdn.roasos.com/workspaces/ws_01/result"} } } ``` Files live on `https://cdn.roasos.com` and are immutable; a result URL can be a media input to the next call. Poll `GET /v1/jobs/{id}/status` → `{ id, status, updated_at }`, then `GET /v1/jobs/{id}/result` (`409 run_not_completed` until the job is `completed`, `failed` or `canceled`). Statuses: `queued → processing → completed | failed | canceled`. ## Example ```bash # 1. quote — nothing is spent curl -X POST https://api.roasos.com/v1/video/h3-max \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-h3-max-0001" \ -H "Content-Type: application/json" \ -d '{"quote_only":true,"prompt":"A woman holds the bottle at eye level in a bright kitchen, morning light, static camera."}' # → 200 { "data": { "kind": "quote", "quote_id": "q_7Hk…", "credits": 5, "expires_at": "…", "confirmation": { "model": "h3-max", "example": "5s_768p" } } } # 2. run — the same body and the same Idempotency-Key, quote_id instead of quote_only curl -X POST https://api.roasos.com/v1/video/h3-max \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-h3-max-0001" \ -H "Content-Type: application/json" \ -d '{"quote_id":"q_7Hk…","prompt":"A woman holds the bottle at eye level in a bright kitchen, morning light, static camera."}' # → 201 { "data": { "id": "gen_…", "kind": "video", "model": "h3-max", "status": "queued", "credits_reserved": 5, "links": { "status": "/v1/jobs/gen_…/status", "result": "/v1/jobs/gen_…/result" } } } # 3. poll curl https://api.roasos.com/v1/jobs/gen_…/status -H "Authorization: Bearer roasos_sk_live_…" curl https://api.roasos.com/v1/jobs/gen_…/result -H "Authorization: Bearer roasos_sk_live_…" ``` ## Today `POST /v1/video/h3-max` with `prompt`, and `image_url` or `scene_id` (image-to-video), `end_image_url`, `references`, `product_id`, `avatar_id`, `video_urls`, `audio_urls`, `audio_url`, `duration_seconds` (5-15), `aspect_ratio`, `resolution` (480p|768p|1080p) and `seed`. ## See also https://docs.roasos.com/models/video/h3-max · https://api.roasos.com/v1/catalog/video/h3-max · minimax/h3-max/image-to-video · minimax/h3-max/reference-to-video · minimax/h3-max/text-to-video