Skip to main content
POST
Animate a still image into a video
Animate a still image or generate a video from reference images, videos, and audio on supported models. Returns a request_id for status polling.
Prerequisite: Consult the Model Selection endpoint to identify a valid model slug and check specific limits.

Input modes

  • Keyframes: Upload first_frame_image and, if the model supports it, last_frame_image. Images are fitted to the generation canvas and may have any aspect ratio.
  • Full-reference mode: Upload ref_images and/or ref_videos, with optional ref_audios. Do not combine references with first_frame_image or last_frame_image. Audio cannot be the only reference.
Check info.features.supports_image_refs, supports_video_refs, and supports_audio_refs separately. Support for one reference type does not imply support for the others.

Reference order & prompt labels

Send reference files as ordered multipart arrays. Explicit indices must start at 0 with no gaps, for example ref_images[0], ref_images[1]. Image numbering is independent of video and audio numbering. Reordering files changes which reference each prompt label addresses.
The reference-input specification assigns a video’s audio track to <Audio 1> and shifts uploaded audio labels by one: ref_audios[0] becomes <Audio 2>. However, the current API responses tested for MiniMax do not include reference_labels, either when accepting the request or when returning the completed job. Keep track of whether the uploaded video contains an audio track; do not depend on a returned label map.
Audio references condition generation; they should not be treated as a guarantee that the output will replay the uploaded recording or preserve its exact words. Completed MiniMax tests accepted reference audio and produced an audio track, but automated transcription did not match the supplied speech. Review the generated result when exact spoken content matters.

Reference limits

Read the selected model’s info.limits from Model Selection. These are the effective limits; the ceilings below do not mean every model accepts that many files. max_ref_files caps the combined number of reference files, with an outer ceiling of 12. For models advertising reference support, an unsupported reference type has a limit of 0; models without reference support may omit these fields entirely. Keyframe and reference images must be at least 1 KB, at most 10 MB, and 64–5000 px per side. The reference-image aspect ratio constraint does not apply to keyframes.
For example, MiniMaxH3_33B_Turbo_INT8 currently publishes max_ref_images: 3, max_ref_videos: 1, max_ref_audios: 3, and max_ref_files: 3. This permits at most 3 reference files in total, not 3 of each type. Read the live model response before submitting a request.
Estimate the job with Video Animation Price Calculation. Send reference counts instead of files: more than 2 reference images applies a ×2 multiplier, and any reference video applies ×3. Only the highest multiplier applies; reference audio adds no surcharge.

Example: image, video, and audio references

The following request uses three reference files, matching the current MiniMax combined limit. Use a silent video so the separate audio clip is addressed as <Audio 1>. Check the model’s live limits before reusing these generation parameters.
The acceptance response contains data.request_id. Poll Get Job Results until data.status is done or error; progress: 100 alone does not mean the result is ready. Download data.result_url after completion and read the settled data.price (is_estimated: false).

Authorizations

Authorization
string
header
required

Sanctum personal access token, sent as Authorization: Bearer <token>. The token is opaque — it carries no claims and no embedded expiry, so do not attempt to decode it. Issue and revoke tokens from your account dashboard.

Headers

Accept
enum<string>
default:application/json
required
Available options:
application/json

Body

multipart/form-data

Image to video generation parameters

Every example in this schema is a working set for the model example shown — they are not defaults and not portable. Sizes, step counts, frame counts and frame rates are all per-model: read info.limits and info.defaults for the model you actually intend to use from GET /api/v2/models. Substituting a different model while keeping these values is the most common source of a 422. Reference inputs (ref_images/ref_videos/ref_audios) are bounded per model too: a model that advertises supports_image_refs/supports_video_refs/supports_audio_refs always publishes the effective info.limits.max_ref_images, max_ref_videos, max_ref_audios, max_ref_files (the cap across all three types), min/max_ref_video_duration, min/max_ref_audio_duration and min/max_ref_image_ratio — read them rather than the ceilings quoted on each field, which are only the outer envelope (never more than 9 / 1 / 3 files and 12 in total). An unsupported type publishes 0. Every uploaded image, keyframe or reference, must be 64–5000 px per side.

prompt
string
required

The main prompt for video generation

Example:

"A beautiful sunset over mountains"

first_frame_image
file
required

Image for the first frame of video. Required unless reference inputs (ref_images/ref_videos) are supplied — the two modes are mutually exclusive. Supported formats: JPG, JPEG, PNG, GIF, BMP, WebP. File size: at least 1 KB, maximum 10 MB, 64–5000 px per side. Any aspect ratio: a keyframe is fitted to the generation canvas, so the 1:4–4:1 rule that applies to ref_images does not apply here.

width
integer
required

Width of the generated video in pixels. The accepted range is model-specific — read info.limits.min_width/max_width and min_height/max_height for your model from GET /api/v2/models. Some models also publish dimension_multiple or resolution_step: values are snapped DOWN to that grid before validation, so an off-grid size is silently reduced rather than rejected. max_pixels and max_ratio, where present, cap total area and aspect ratio on top of the per-side bounds.

Example:

512

height
integer
required

Height of the generated video in pixels. The accepted range is model-specific — read info.limits.min_width/max_width and min_height/max_height for your model from GET /api/v2/models. Some models also publish dimension_multiple or resolution_step: values are snapped DOWN to that grid before validation, so an off-grid size is silently reduced rather than rejected. max_pixels and max_ratio, where present, cap total area and aspect ratio on top of the per-side bounds.

Example:

512

frames
integer
required

Number of video frames to generate. The accepted range is model-specific — read info.limits.min_frames/max_frames for your model from GET /api/v2/models; a value outside it is rejected with 422.

Example:

120

fps
integer
required

FPS of the generated video. The model dictates the value: read info.defaults.fps for your model from GET /api/v2/models. Where min_fps equals max_fps that is the only accepted value; anything outside the range is rejected with 422.

Example:

30

seed
integer
required

Random seed for generation

Example:

42

model
string
required

The model to use for video generation. Available models can be retrieved via the GET /api/v2/models endpoint.

Example:

"Ltxv_13B_0_9_8_Distilled_FP8"

negative_prompt
string | null

Elements to avoid in the generated video. Dropped (not forwarded to the worker) when the model declares info.features.supports_negative_prompt: false.

Example:

"blur, darkness, noise"

ref_images
file[] | null

Ordered reference images (full-reference mode). Order is binding: ref_images[0] is addressed in the prompt as <Picture 1>, ref_images[1] as <Picture 2>, and so on — numbering is 1-based and counted within images only. Send the parts in index order, or index them explicitly (ref_images[0], ref_images[1], …); the list must start at 0 and have no gaps. Reordering the list rebinds every label in your prompt and produces a different video with no error. Mutually exclusive with first_frame_image/last_frame_image. Requires a model whose specs advertise image-reference support; video and audio references are advertised separately, so a model may accept one type and not another. Supported formats: JPG, JPEG, PNG, GIF, BMP, WebP. File size: at least 1 KB, maximum 10 MB, 64–5000 px per side. Each image must be within a 1:4–4:1 aspect ratio (info.limits.min_ref_image_ratio / max_ref_image_ratio) — a reference keeps its own aspect, unlike a keyframe, which is fitted to the canvas. The number of entries is model-specific — read info.limits.max_ref_images for your model from GET /api/v2/models. Never more than 9.

ref_videos
file[] | null

Ordered reference videos (full-reference mode). ref_videos[0] is addressed as <Video 1>. Mutually exclusive with first_frame_image/last_frame_image. Count and duration are model-specific — read info.limits.max_ref_videos and min_ref_video_duration / max_ref_video_duration for your model. A model publishing max_ref_videos: 0 takes no video references. Defaults are 2–5 seconds.

⚠️ If a reference video carries an audio track, that track occupies <Audio 1> and shifts every ref_audios entry by one — so with a sounded video, ref_audios[0] is <Audio 2>, not <Audio 1>. The current MiniMax acceptance and completed-job responses tested do not include reference_labels. Track the presence of a video audio track in your client rather than depending on a returned label map; the soundtrack shift described here comes from the reference-input specification and is not exposed in those responses. Never more than 1.

ref_audios
file[] | null

Ordered reference audio clips (full-reference mode). ref_audios[0] is addressed as <Audio 1> — unless a reference video contributed its own soundtrack first, see ref_videos. Audio may never be the only reference: at least one ref_images or ref_videos entry is required alongside it. Count and duration are model-specific — read info.limits.max_ref_audios and min_ref_audio_duration / max_ref_audio_duration for your model. Defaults are 1–10 seconds. Supported formats: WAV, MP3, FLAC, OGG, M4A. Maximum file size: 15 MB. Never more than 3. Audio references condition generation; acceptance does not guarantee verbatim speech or exact replay of the reference recording.

last_frame_image
file | null

Image for the last frame of video (optional). Supported formats: JPG, JPEG, PNG, GIF, BMP, WebP. File size: at least 1 KB, maximum 10 MB, 64–5000 px per side, any aspect ratio.

guidance
number

Guidance scale. Bounded by info.limits.min_guidance / max_guidance from GET /api/v2/models (0–30 when the model declares none). Required when the model declares info.features.supports_guidance: true; optional when the flag is absent. When the model declares supports_guidance: false the value is accepted and dropped — it is neither forwarded to the worker nor priced.

Example:

7.5

steps
integer

Number of inference steps. Bounded by info.limits.min_steps / max_steps from GET /api/v2/models (1–100 when the model declares none). Required when the model declares info.features.supports_steps: true; optional when the flag is absent. When the model declares supports_steps: false the value is accepted and dropped — it is neither forwarded to the worker nor priced.

Example:

1

enhance_prompt
boolean
default:false

When true, the prompt is boosted by the inline prompt booster before generation (async pre-step). Requires a prompt-booster guide configured for the model; the boost fee is billed on the job. Rejected with 422 if no guide exists for the model or the account balance cannot cover the boost fee.

Example:

false

webhook_url
string<uri> | null

Optional HTTPS URL to receive webhook notifications for job status changes (processing, completed, failed). Must be HTTPS. Max 2048 characters. A per-request URL is self-contained: it is delivered even when the account has no webhook configuration, or the account webhook is disabled. See the webhooks block at the top level of this document for the event payloads and the headers each delivery carries.

Maximum string length: 2048
Example:

"https://your-server.com/webhooks/deapi"

webhook_secret
string | null

Optional per-request HMAC secret (min. 32 chars) used to sign the webhook callback. Overrides the account-default secret for this job only. If omitted, the account-default secret signs the callback; if no secret exists at all, the callback is still delivered but UNSIGNED (empty X-DeAPI-Signature header). Requires webhook_url to also be set.

Required string length: 32 - 255
Example:

"a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5"

Response

ID of the inference request.

data
object
required

Information from success endpoint