{
"message": "The selected model does not support Text To Image.",
"errors": {
"model": [
"This model is not available on your plan. Please upgrade to access it."
]
}
}
{
"message": "The selected model does not support Text To Image.",
"errors": {
"model": [
"This model is not available on your plan. Please upgrade to access it."
]
}
}
{
"message": "Too Many Attempts."
}
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.
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.
Send reference files as ordered multipart arrays. Explicit indices must start at 0 with no gaps, for example ref_images[0], ref_images[1].
Input
Prompt label
ref_images[0], ref_images[1]
<Picture 1>, <Picture 2>
ref_videos[0]
<Video 1>
ref_audios[0]
<Audio 1>, unless the reference video has an audio track
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.
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.
Up to 3 clips; 15 MB each; default duration range 1–10 seconds. WAV, MP3, FLAC, OGG, M4A.
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.
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.
curl -X POST "https://api.deapi.ai/api/v2/videos/animations" \ -H "Authorization: Bearer $DEAPI_API_KEY" \ -H "Accept: application/json" \ -F "model=MiniMaxH3_33B_Turbo_INT8" \ -F "width=512" \ -F "height=512" \ -F "frames=56" \ -F "fps=24" \ -F "seed=987" \ -F "prompt=Use the red robot appearance from <Picture 1> and the rolling motion from <Video 1>. Use <Audio 1> as the soundtrack. One continuous shot, static camera." \ -F "ref_images[0]=@robot.png" \ -F "ref_videos[0]=@motion-silent.mp4" \ -F "ref_audios[0]=@speech.mp3"
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).
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"deAPI","colors":{"primary":"#FD9A00","light":"#FFAD33","dark":"#E58A00"},"logo":{"light":"https://mintcdn.com/deapi-f9ba3abb/gSOvhf4F2Dm8oAad/logo/deapi-light.svg?fit=max\u0026auto=format\u0026n=gSOvhf4F2Dm8oAad\u0026q=85\u0026s=e44c94d9c161aa9264f717cd49f375e5","dark":"https://mintcdn.com/deapi-f9ba3abb/gSOvhf4F2Dm8oAad/logo/deapi-dark.svg?fit=max\u0026auto=format\u0026n=gSOvhf4F2Dm8oAad\u0026q=85\u0026s=4f204c43a4a41d8f476b76d91ac5ee7c"},"favicon":"https://mintcdn.com/deapi-f9ba3abb/-BqpLinCKwOHWbhI/favicon.png?fit=max\u0026auto=format\u0026n=-BqpLinCKwOHWbhI\u0026q=85\u0026s=295488219f7cfd2b9a7007447e093121","api":{"openapi":["openapi.json","openapi-v2.json"]},"navbar":{"links":[{"href":"https://app.deapi.ai/dashboard","label":"Dashboard"},{"href":"https://status.deapi.ai/","label":"Status"},{"href":"https://github.com/deapi-ai","label":"GitHub"}],"primary":{"type":"button","label":"Get API Key","href":"https://app.deapi.ai/dashboard"}},"footer":{"socials":{"github":"https://github.com/deapi-ai","twitter":"https://x.com/deAPI_","discord":"https://discord.com/invite/UFfK5YRBsr","x":"https://x.com/deAPI_"}},"search":{"prompt":"Search deAPI docs..."},"seo":{"indexing":"all"},"contextual":{"options":["copy","view","chatgpt","claude","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"deapi-f9ba3abb","hasAudioNarration":false,"actualSubdomain":"deapi-f9ba3abb","customDomains":["docs.deapi.ai"],"gitSource":{"type":"github","owner":"deapi-ai","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad9fda4f7b413b0bdc2fd82","collectionId":"a0ac662e-4b69-4e6b-9f36-6f740d5d6d6e","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad9fda4f7b413b0bdc2fd82"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6ad9fda4f7b413b0bdc2fd82","clientVersion":"0.0.3965","searchFilterCounts":[{"language":"default","tag":"API v2 (Latest)","count":49},{"language":"default","tag":"API v1 (Deprecated)","count":42},{"language":"default","tag":"Guides","count":18},{"language":"default","tag":"Generation","count":14},{"language":"default","tag":"Analysis","count":12},{"language":"default","tag":"Videos","count":12},{"language":"default","tag":"Transformation","count":10},{"language":"default","tag":"Images","count":10},{"language":"default","tag":"Get started","count":8},{"language":"default","tag":"API Keys","count":8}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api/v2/videos/animations","slug":"/api/v2/videos/animations","pageMetadata":{"title":"Video Animation (Image-to-Video)","openapi":"openapi-v2.json POST /api/v2/videos/animations","description":"Animate a still image into a video.","href":"/api/v2/videos/animations"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Animate a still image into a video.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Table,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Animate a still image or generate a video from reference images, videos, and audio on supported models. Returns a `,_jsx(_components.code,{children:`request_id`}),` for status polling.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Prerequisite:`}),` Consult the `,_jsx(_components.a,{href:`/api/v2/utilities/models`,children:`Model Selection`}),` endpoint to identify a valid model `,_jsx(_components.code,{children:`slug`}),` and check specific `,_jsx(_components.strong,{children:`limits`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`input-modes`,children:`Input modes`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Keyframes:`}),` Upload `,_jsx(_components.code,{children:`first_frame_image`}),` and, if the model supports it, `,_jsx(_components.code,{children:`last_frame_image`}),`. Images are fitted to the generation canvas and may have any aspect ratio.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Full-reference mode:`}),` Upload `,_jsx(_components.code,{children:`ref_images`}),` and/or `,_jsx(_components.code,{children:`ref_videos`}),`, with optional `,_jsx(_components.code,{children:`ref_audios`}),`. Do not combine references with `,_jsx(_components.code,{children:`first_frame_image`}),` or `,_jsx(_components.code,{children:`last_frame_image`}),`. Audio cannot be the only reference.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Check `,_jsx(_components.code,{children:`info.features.supports_image_refs`}),`, `,_jsx(_components.code,{children:`supports_video_refs`}),`, and `,_jsx(_components.code,{children:`supports_audio_refs`}),` separately. Support for one reference type does not imply support for the others.`]}),`\n`,_jsx(Heading,{level:`2`,id:`reference-order-\u0026-prompt-labels`,children:`Reference order \u0026 prompt labels`}),`\n`,_jsxs(_components.p,{children:[`Send reference files as ordered multipart arrays. Explicit indices must start at `,_jsx(_components.code,{children:`0`}),` with no gaps, for example `,_jsx(_components.code,{children:`ref_images[0]`}),`, `,_jsx(_components.code,{children:`ref_images[1]`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Input`}),_jsx(_components.th,{children:`Prompt label`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ref_images[0]`}),`, `,_jsx(_components.code,{children:`ref_images[1]`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`\u003cPicture 1>`}),`, `,_jsx(_components.code,{children:`\u003cPicture 2>`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ref_videos[0]`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`\u003cVideo 1>`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ref_audios[0]`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`\u003cAudio 1>`}),`, unless the reference video has an audio track`]})]})]})]}),`\n`,_jsx(_components.p,{children:`Image numbering is independent of video and audio numbering. Reordering files changes which reference each prompt label addresses.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The reference-input specification assigns a video’s audio track to `,_jsx(_components.code,{children:`\u003cAudio 1>`}),` and shifts uploaded audio labels by one: `,_jsx(_components.code,{children:`ref_audios[0]`}),` becomes `,_jsx(_components.code,{children:`\u003cAudio 2>`}),`. However, the current API responses tested for MiniMax do not include `,_jsx(_components.code,{children:`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.`]})}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`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.`})}),`\n`,_jsx(Heading,{level:`2`,id:`reference-limits`,children:`Reference limits`}),`\n`,_jsxs(_components.p,{children:[`Read the selected model’s `,_jsx(_components.code,{children:`info.limits`}),` from `,_jsx(_components.a,{href:`/api/v2/utilities/models`,children:`Model Selection`}),`. These are the effective limits; the ceilings below do not mean every model accepts that many files.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Input`}),_jsx(_components.th,{children:`Model limits`}),_jsx(_components.th,{children:`Outer ceiling / file constraints`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ref_images`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`max_ref_images`}),`, `,_jsx(_components.code,{children:`min_ref_image_ratio`}),`, `,_jsx(_components.code,{children:`max_ref_image_ratio`})]}),_jsx(_components.td,{children:`Up to 9 images; 10 MB each; 64–5000 px per side; aspect ratio within 1:4–4:1. JPG, JPEG, PNG, GIF, BMP, WebP.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ref_videos`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`max_ref_videos`}),`, `,_jsx(_components.code,{children:`min_ref_video_duration`}),`, `,_jsx(_components.code,{children:`max_ref_video_duration`})]}),_jsx(_components.td,{children:`Up to 1 video; default duration range 2–5 seconds.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ref_audios`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`max_ref_audios`}),`, `,_jsx(_components.code,{children:`min_ref_audio_duration`}),`, `,_jsx(_components.code,{children:`max_ref_audio_duration`})]}),_jsx(_components.td,{children:`Up to 3 clips; 15 MB each; default duration range 1–10 seconds. WAV, MP3, FLAC, OGG, M4A.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`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 `,_jsx(_components.code,{children:`0`}),`; models without reference support may omit these fields entirely. Keyframe and reference images must be at least `,_jsx(_components.strong,{children:`1 KB`}),`, at most `,_jsx(_components.strong,{children:`10 MB`}),`, and 64–5000 px per side. The reference-image aspect ratio constraint does not apply to keyframes.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`For example, `,_jsx(_components.code,{children:`MiniMaxH3_33B_Turbo_INT8`}),` currently publishes `,_jsx(_components.code,{children:`max_ref_images: 3`}),`, `,_jsx(_components.code,{children:`max_ref_videos: 1`}),`, `,_jsx(_components.code,{children:`max_ref_audios: 3`}),`, and `,_jsx(_components.code,{children:`max_ref_files: 3`}),`. This permits at most `,_jsx(_components.strong,{children:`3 reference files in total`}),`, not 3 of each type. Read the live model response before submitting a request.`]})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Estimate the job with `,_jsx(_components.a,{href:`/api/v2/videos/animations-price`,children:`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.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`example-image-video-and-audio-references`,children:`Example: image, video, and audio references`}),`\n`,_jsxs(_components.p,{children:[`The following request uses three reference files, matching the current MiniMax combined limit. Use a `,_jsx(_components.strong,{children:`silent video`}),` so the separate audio clip is addressed as `,_jsx(_components.code,{children:`\u003cAudio 1>`}),`. Check the model’s live limits before reusing these generation parameters.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://api.deapi.ai/api/v2/videos/animations\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$DEAPI_API_KEY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Accept: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"model=MiniMaxH3_33B_Turbo_INT8\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"width=512\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"height=512\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"frames=56\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"fps=24\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"seed=987\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"prompt=Use the red robot appearance from \u003cPicture 1> and the rolling motion from \u003cVideo 1>. Use \u003cAudio 1> as the soundtrack. One continuous shot, static camera.\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"ref_images[0]=@robot.png\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"ref_videos[0]=@motion-silent.mp4\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -F`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"ref_audios[0]=@speech.mp3\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The acceptance response contains `,_jsx(_components.code,{children:`data.request_id`}),`. Poll `,_jsx(_components.a,{href:`/api/v2/utilities/jobs`,children:`Get Job Results`}),` until `,_jsx(_components.code,{children:`data.status`}),` is `,_jsx(_components.code,{children:`done`}),` or `,_jsx(_components.code,{children:`error`}),`; `,_jsx(_components.code,{children:`progress: 100`}),` alone does not mean the result is ready. Download `,_jsx(_components.code,{children:`data.result_url`}),` after completion and read the settled `,_jsx(_components.code,{children:`data.price`}),` (`,_jsx(_components.code,{children:`is_estimated: false`}),`).`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Video Animation (Image-to-Video)","openapi":"openapi-v2.json POST /api/v2/videos/animations","description":"Animate a still image into a video.","href":"/api/v2/videos/animations"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Input modes","slug":"input-modes","depth":2,"children":[]},{"title":"Reference order \u0026 prompt labels","slug":"reference-order-\u0026-prompt-labels","depth":2,"children":[]},{"title":"Reference limits","slug":"reference-limits","depth":2,"children":[]},{"title":"Example: image, video, and audio references","slug":"example-image-video-and-audio-references","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Client API v2"],"summary":"Animate a still image into a video","description":"Animate a still image into a video.","operationId":"animateImage","parameters":["84a6307e-e3e9-49ec-a6d6-9ed0f2dc39fd"],"requestBody":"8be62180-dd8a-4aa4-b47f-17fdffec57d4","responses":{"200":"6771d992-17a5-4e23-8813-370f6aecb5d3","401":"9939d43a-b090-4568-a770-abbcdc530099","403":"4f50aaed-2432-4e25-8035-bcda47a5559a","404":"832e1d92-743d-47a9-b76f-be5e05dc7796","422":"9ca337e6-7300-45e5-99ad-2a11ee731e12","429":"a9b32038-7f8a-4bd6-ac6a-5df159bd7038"},"security":["cd8ea642-86ad-460a-ad1b-3fecda5b5819"],"method":"post","type":"path","servers":["e0e49a8e-d368-42c9-8377-07c35e662b8c"],"path":"/api/v2/videos/animations","baseUrlOptions":["https://api.deapi.ai"],"title":"Animate a still image into a video","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"84a6307e-e3e9-49ec-a6d6-9ed0f2dc39fd":{"name":"Accept","in":"header","required":true,"schema":{"type":"string","default":"application/json","enum":["application/json"],"isRequired":true,"uniqueKey":"","typeLabel":"enum\u003cstring>"}}},"requestBody":{"description":"Image to video generation parameters","required":true,"content":{"multipart/form-data":{"schema":{"oneOf":[{"type":"object","description":"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.","required":["prompt","model","width","height","seed","frames","fps","first_frame_image"],"properties":{"prompt":{"description":"The main prompt for video generation","type":"string","example":"A beautiful sunset over mountains","isRequired":true,"uniqueKey":"oneOf.0.prompt","typeLabel":"string"},"first_frame_image":{"description":"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.","type":"string","format":"binary","isRequired":true,"uniqueKey":"oneOf.0.first_frame_image","typeLabel":"file"},"width":{"description":"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.","type":"integer","example":512,"isRequired":true,"uniqueKey":"oneOf.0.width","typeLabel":"integer"},"height":{"description":"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.","type":"integer","example":512,"isRequired":true,"uniqueKey":"oneOf.0.height","typeLabel":"integer"},"frames":{"description":"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.","type":"integer","example":120,"isRequired":true,"uniqueKey":"oneOf.0.frames","typeLabel":"integer"},"fps":{"description":"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.","type":"integer","example":30,"isRequired":true,"uniqueKey":"oneOf.0.fps","typeLabel":"integer"},"seed":{"description":"Random seed for generation","type":"integer","example":42,"isRequired":true,"uniqueKey":"oneOf.0.seed","typeLabel":"integer"},"model":{"description":"The model to use for video generation. Available models can be retrieved via the GET /api/v2/models endpoint.","type":"string","example":"Ltxv_13B_0_9_8_Distilled_FP8","isRequired":true,"uniqueKey":"oneOf.0.model","typeLabel":"string"},"negative_prompt":{"oneOf":[{"description":"Elements to avoid in the generated video. Dropped (not forwarded to the worker) when the model declares `info.features.supports_negative_prompt: false`.","type":"string","example":"blur, darkness, noise","uniqueKey":"oneOf.0.negative_prompt.oneOf.0","typeLabel":"string"},{"description":"Elements to avoid in the generated video. Dropped (not forwarded to the worker) when the model declares `info.features.supports_negative_prompt: false`.","type":"null","example":"blur, darkness, noise","uniqueKey":"oneOf.0.negative_prompt.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.negative_prompt","typeLabel":"string | null"},"ref_images":{"oneOf":[{"description":"Ordered reference images (full-reference mode). **Order is binding**: `ref_images[0]` is\naddressed in the prompt as `\u003cPicture 1>`, `ref_images[1]` as `\u003cPicture 2>`, and so on —\nnumbering is 1-based and counted within images only. Send the parts in index order, or\nindex them explicitly (`ref_images[0]`, `ref_images[1]`, …); the list must start at 0 and\nhave no gaps. Reordering the list rebinds every label in your prompt and produces a\ndifferent video with no error. Mutually exclusive with `first_frame_image`/`last_frame_image`.\nRequires a model whose specs advertise image-reference support; video and audio\nreferences are advertised separately, so a model may accept one type and not another.\nSupported formats: JPG, JPEG, PNG, GIF, BMP, WebP. File size: at least 1 KB, maximum 10 MB, 64–5000 px\nper side. Each image must be within a 1:4–4:1 aspect ratio (`info.limits.min_ref_image_ratio`\n/ `max_ref_image_ratio`) — a reference keeps its own aspect, unlike a keyframe, which is\nfitted to the canvas. **The number of entries is model-specific — read\n`info.limits.max_ref_images` for your `model` from `GET /api/v2/models`.** Never more than 9.","type":"array","items":{"type":"string","format":"binary","uniqueKey":"oneOf.0.ref_images.oneOf.0.items.[INDEX]","typeLabel":"file"},"uniqueKey":"oneOf.0.ref_images.oneOf.0","typeLabel":"file[]"},{"description":"Ordered reference images (full-reference mode). **Order is binding**: `ref_images[0]` is\naddressed in the prompt as `\u003cPicture 1>`, `ref_images[1]` as `\u003cPicture 2>`, and so on —\nnumbering is 1-based and counted within images only. Send the parts in index order, or\nindex them explicitly (`ref_images[0]`, `ref_images[1]`, …); the list must start at 0 and\nhave no gaps. Reordering the list rebinds every label in your prompt and produces a\ndifferent video with no error. Mutually exclusive with `first_frame_image`/`last_frame_image`.\nRequires a model whose specs advertise image-reference support; video and audio\nreferences are advertised separately, so a model may accept one type and not another.\nSupported formats: JPG, JPEG, PNG, GIF, BMP, WebP. File size: at least 1 KB, maximum 10 MB, 64–5000 px\nper side. Each image must be within a 1:4–4:1 aspect ratio (`info.limits.min_ref_image_ratio`\n/ `max_ref_image_ratio`) — a reference keeps its own aspect, unlike a keyframe, which is\nfitted to the canvas. **The number of entries is model-specific — read\n`info.limits.max_ref_images` for your `model` from `GET /api/v2/models`.** Never more than 9.","type":"null","items":{"type":"string","format":"binary"},"uniqueKey":"oneOf.0.ref_images.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.ref_images","typeLabel":"file[] | null"},"ref_videos":{"oneOf":[{"description":"Ordered reference videos (full-reference mode). `ref_videos[0]` is addressed as `\u003cVideo 1>`.\nMutually exclusive with `first_frame_image`/`last_frame_image`. **Count and duration are\nmodel-specific — read `info.limits.max_ref_videos` and `min_ref_video_duration` /\n`max_ref_video_duration` for your `model`.** A model publishing `max_ref_videos: 0` takes no\nvideo references. Defaults are 2–5 seconds.\n\n⚠️ If a reference video carries an audio track, that track occupies `\u003cAudio 1>` and shifts\nevery `ref_audios` entry by one — so with a sounded video, `ref_audios[0]` is `\u003cAudio 2>`,\nnot `\u003cAudio 1>`. The current MiniMax acceptance and completed-job responses tested do not include\n`reference_labels`. Track the presence of a video audio track in your client rather than\ndepending on a returned label map; the soundtrack shift described here comes from the\nreference-input specification and is not exposed in those responses. Never more than 1.","type":"array","items":{"type":"string","format":"binary","uniqueKey":"oneOf.0.ref_videos.oneOf.0.items.[INDEX]","typeLabel":"file"},"uniqueKey":"oneOf.0.ref_videos.oneOf.0","typeLabel":"file[]"},{"description":"Ordered reference videos (full-reference mode). `ref_videos[0]` is addressed as `\u003cVideo 1>`.\nMutually exclusive with `first_frame_image`/`last_frame_image`. **Count and duration are\nmodel-specific — read `info.limits.max_ref_videos` and `min_ref_video_duration` /\n`max_ref_video_duration` for your `model`.** A model publishing `max_ref_videos: 0` takes no\nvideo references. Defaults are 2–5 seconds.\n\n⚠️ If a reference video carries an audio track, that track occupies `\u003cAudio 1>` and shifts\nevery `ref_audios` entry by one — so with a sounded video, `ref_audios[0]` is `\u003cAudio 2>`,\nnot `\u003cAudio 1>`. The current MiniMax acceptance and completed-job responses tested do not include\n`reference_labels`. Track the presence of a video audio track in your client rather than\ndepending on a returned label map; the soundtrack shift described here comes from the\nreference-input specification and is not exposed in those responses. Never more than 1.","type":"null","items":{"type":"string","format":"binary"},"uniqueKey":"oneOf.0.ref_videos.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.ref_videos","typeLabel":"file[] | null"},"ref_audios":{"oneOf":[{"description":"Ordered reference audio clips (full-reference mode). `ref_audios[0]` is addressed as\n`\u003cAudio 1>` — unless a reference video contributed its own soundtrack first, see\n`ref_videos`. Audio may never be the only reference: at least one `ref_images` or\n`ref_videos` entry is required alongside it. **Count and duration are model-specific — read\n`info.limits.max_ref_audios` and `min_ref_audio_duration` / `max_ref_audio_duration` for your\n`model`.** Defaults are 1–10 seconds. Supported formats: WAV, MP3, FLAC, OGG, M4A. Maximum\nfile size: 15 MB. Never more than 3. Audio references condition generation;\nacceptance does not guarantee verbatim speech or exact replay of the reference recording.","type":"array","items":{"type":"string","format":"binary","uniqueKey":"oneOf.0.ref_audios.oneOf.0.items.[INDEX]","typeLabel":"file"},"uniqueKey":"oneOf.0.ref_audios.oneOf.0","typeLabel":"file[]"},{"description":"Ordered reference audio clips (full-reference mode). `ref_audios[0]` is addressed as\n`\u003cAudio 1>` — unless a reference video contributed its own soundtrack first, see\n`ref_videos`. Audio may never be the only reference: at least one `ref_images` or\n`ref_videos` entry is required alongside it. **Count and duration are model-specific — read\n`info.limits.max_ref_audios` and `min_ref_audio_duration` / `max_ref_audio_duration` for your\n`model`.** Defaults are 1–10 seconds. Supported formats: WAV, MP3, FLAC, OGG, M4A. Maximum\nfile size: 15 MB. Never more than 3. Audio references condition generation;\nacceptance does not guarantee verbatim speech or exact replay of the reference recording.","type":"null","items":{"type":"string","format":"binary"},"uniqueKey":"oneOf.0.ref_audios.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.ref_audios","typeLabel":"file[] | null"},"last_frame_image":{"oneOf":[{"description":"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.","type":"string","format":"binary","uniqueKey":"oneOf.0.last_frame_image.oneOf.0","typeLabel":"file"},{"description":"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.","type":"null","format":"binary","uniqueKey":"oneOf.0.last_frame_image.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.last_frame_image","typeLabel":"file | null"},"guidance":{"description":"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.","type":"number","example":7.5,"uniqueKey":"oneOf.0.guidance","typeLabel":"number"},"steps":{"description":"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.","type":"integer","example":1,"uniqueKey":"oneOf.0.steps","typeLabel":"integer"},"enhance_prompt":{"description":"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.","type":"boolean","example":false,"default":false,"uniqueKey":"oneOf.0.enhance_prompt","typeLabel":"boolean"},"webhook_url":{"oneOf":[{"description":"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.","type":"string","format":"uri","example":"https://your-server.com/webhooks/deapi","maxLength":2048,"uniqueKey":"oneOf.0.webhook_url.oneOf.0","typeLabel":"string\u003curi>"},{"description":"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.","type":"null","format":"uri","example":"https://your-server.com/webhooks/deapi","maxLength":2048,"uniqueKey":"oneOf.0.webhook_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.webhook_url","typeLabel":"string\u003curi> | null"},"webhook_secret":{"oneOf":[{"description":"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.","type":"string","example":"a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5","maxLength":255,"minLength":32,"uniqueKey":"oneOf.0.webhook_secret.oneOf.0","typeLabel":"string"},{"description":"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.","type":"null","example":"a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5","maxLength":255,"minLength":32,"uniqueKey":"oneOf.0.webhook_secret.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.webhook_secret","typeLabel":"string | null"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","description":"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.","required":["prompt","model","width","height","seed","frames","fps","ref_images"],"properties":{"ref_images":{"type":"array","items":{"type":"string","format":"binary","uniqueKey":"oneOf.1.ref_images.items.[INDEX]","typeLabel":"file"},"description":"Ordered reference images (full-reference mode). **Order is binding**: `ref_images[0]` is\naddressed in the prompt as `\u003cPicture 1>`, `ref_images[1]` as `\u003cPicture 2>`, and so on —\nnumbering is 1-based and counted within images only. Send the parts in index order, or\nindex them explicitly (`ref_images[0]`, `ref_images[1]`, …); the list must start at 0 and\nhave no gaps. Reordering the list rebinds every label in your prompt and produces a\ndifferent video with no error. Mutually exclusive with `first_frame_image`/`last_frame_image`.\nRequires a model whose specs advertise image-reference support; video and audio\nreferences are advertised separately, so a model may accept one type and not another.\nSupported formats: JPG, JPEG, PNG, GIF, BMP, WebP. File size: at least 1 KB, maximum 10 MB, 64–5000 px\nper side. Each image must be within a 1:4–4:1 aspect ratio (`info.limits.min_ref_image_ratio`\n/ `max_ref_image_ratio`) — a reference keeps its own aspect, unlike a keyframe, which is\nfitted to the canvas. **The number of entries is model-specific — read\n`info.limits.max_ref_images` for your `model` from `GET /api/v2/models`.** Never more than 9.","minItems":1,"isRequired":true,"uniqueKey":"oneOf.1.ref_images","typeLabel":"file[]"},"prompt":{"description":"The main prompt for video generation","type":"string","example":"A beautiful sunset over mountains","isRequired":true,"uniqueKey":"oneOf.1.prompt","typeLabel":"string"},"width":{"description":"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.","type":"integer","example":512,"isRequired":true,"uniqueKey":"oneOf.1.width","typeLabel":"integer"},"height":{"description":"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.","type":"integer","example":512,"isRequired":true,"uniqueKey":"oneOf.1.height","typeLabel":"integer"},"frames":{"description":"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.","type":"integer","example":120,"isRequired":true,"uniqueKey":"oneOf.1.frames","typeLabel":"integer"},"fps":{"description":"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.","type":"integer","example":30,"isRequired":true,"uniqueKey":"oneOf.1.fps","typeLabel":"integer"},"seed":{"description":"Random seed for generation","type":"integer","example":42,"isRequired":true,"uniqueKey":"oneOf.1.seed","typeLabel":"integer"},"model":{"description":"The model to use for video generation. Available models can be retrieved via the GET /api/v2/models endpoint.","type":"string","example":"Ltxv_13B_0_9_8_Distilled_FP8","isRequired":true,"uniqueKey":"oneOf.1.model","typeLabel":"string"},"negative_prompt":{"oneOf":[{"description":"Elements to avoid in the generated video. Dropped (not forwarded to the worker) when the model declares `info.features.supports_negative_prompt: false`.","type":"string","example":"blur, darkness, noise","uniqueKey":"oneOf.1.negative_prompt.oneOf.0","typeLabel":"string"},{"description":"Elements to avoid in the generated video. Dropped (not forwarded to the worker) when the model declares `info.features.supports_negative_prompt: false`.","type":"null","example":"blur, darkness, noise","uniqueKey":"oneOf.1.negative_prompt.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.negative_prompt","typeLabel":"string | null"},"first_frame_image":{"description":"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.","type":"string","format":"binary","uniqueKey":"oneOf.1.first_frame_image","typeLabel":"file"},"ref_videos":{"oneOf":[{"description":"Ordered reference videos (full-reference mode). `ref_videos[0]` is addressed as `\u003cVideo 1>`.\nMutually exclusive with `first_frame_image`/`last_frame_image`. **Count and duration are\nmodel-specific — read `info.limits.max_ref_videos` and `min_ref_video_duration` /\n`max_ref_video_duration` for your `model`.** A model publishing `max_ref_videos: 0` takes no\nvideo references. Defaults are 2–5 seconds.\n\n⚠️ If a reference video carries an audio track, that track occupies `\u003cAudio 1>` and shifts\nevery `ref_audios` entry by one — so with a sounded video, `ref_audios[0]` is `\u003cAudio 2>`,\nnot `\u003cAudio 1>`. The current MiniMax acceptance and completed-job responses tested do not include\n`reference_labels`. Track the presence of a video audio track in your client rather than\ndepending on a returned label map; the soundtrack shift described here comes from the\nreference-input specification and is not exposed in those responses. Never more than 1.","type":"array","items":{"type":"string","format":"binary","uniqueKey":"oneOf.1.ref_videos.oneOf.0.items.[INDEX]","typeLabel":"file"},"uniqueKey":"oneOf.1.ref_videos.oneOf.0","typeLabel":"file[]"},{"description":"Ordered reference videos (full-reference mode). `ref_videos[0]` is addressed as `\u003cVideo 1>`.\nMutually exclusive with `first_frame_image`/`last_frame_image`. **Count and duration are\nmodel-specific — read `info.limits.max_ref_videos` and `min_ref_video_duration` /\n`max_ref_video_duration` for your `model`.** A model publishing `max_ref_videos: 0` takes no\nvideo references. Defaults are 2–5 seconds.\n\n⚠️ If a reference video carries an audio track, that track occupies `\u003cAudio 1>` and shifts\nevery `ref_audios` entry by one — so with a sounded video, `ref_audios[0]` is `\u003cAudio 2>`,\nnot `\u003cAudio 1>`. The current MiniMax acceptance and completed-job responses tested do not include\n`reference_labels`. Track the presence of a video audio track in your client rather than\ndepending on a returned label map; the soundtrack shift described here comes from the\nreference-input specification and is not exposed in those responses. Never more than 1.","type":"null","items":{"type":"string","format":"binary"},"uniqueKey":"oneOf.1.ref_videos.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.ref_videos","typeLabel":"file[] | null"},"ref_audios":{"oneOf":[{"description":"Ordered reference audio clips (full-reference mode). `ref_audios[0]` is addressed as\n`\u003cAudio 1>` — unless a reference video contributed its own soundtrack first, see\n`ref_videos`. Audio may never be the only reference: at least one `ref_images` or\n`ref_videos` entry is required alongside it. **Count and duration are model-specific — read\n`info.limits.max_ref_audios` and `min_ref_audio_duration` / `max_ref_audio_duration` for your\n`model`.** Defaults are 1–10 seconds. Supported formats: WAV, MP3, FLAC, OGG, M4A. Maximum\nfile size: 15 MB. Never more than 3. Audio references condition generation;\nacceptance does not guarantee verbatim speech or exact replay of the reference recording.","type":"array","items":{"type":"string","format":"binary","uniqueKey":"oneOf.1.ref_audios.oneOf.0.items.[INDEX]","typeLabel":"file"},"uniqueKey":"oneOf.1.ref_audios.oneOf.0","typeLabel":"file[]"},{"description":"Ordered reference audio clips (full-reference mode). `ref_audios[0]` is addressed as\n`\u003cAudio 1>` — unless a reference video contributed its own soundtrack first, see\n`ref_videos`. Audio may never be the only reference: at least one `ref_images` or\n`ref_videos` entry is required alongside it. **Count and duration are model-specific — read\n`info.limits.max_ref_audios` and `min_ref_audio_duration` / `max_ref_audio_duration` for your\n`model`.** Defaults are 1–10 seconds. Supported formats: WAV, MP3, FLAC, OGG, M4A. Maximum\nfile size: 15 MB. Never more than 3. Audio references condition generation;\nacceptance does not guarantee verbatim speech or exact replay of the reference recording.","type":"null","items":{"type":"string","format":"binary"},"uniqueKey":"oneOf.1.ref_audios.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.ref_audios","typeLabel":"file[] | null"},"last_frame_image":{"oneOf":[{"description":"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.","type":"string","format":"binary","uniqueKey":"oneOf.1.last_frame_image.oneOf.0","typeLabel":"file"},{"description":"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.","type":"null","format":"binary","uniqueKey":"oneOf.1.last_frame_image.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.last_frame_image","typeLabel":"file | null"},"guidance":{"description":"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.","type":"number","example":7.5,"uniqueKey":"oneOf.1.guidance","typeLabel":"number"},"steps":{"description":"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.","type":"integer","example":1,"uniqueKey":"oneOf.1.steps","typeLabel":"integer"},"enhance_prompt":{"description":"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.","type":"boolean","example":false,"default":false,"uniqueKey":"oneOf.1.enhance_prompt","typeLabel":"boolean"},"webhook_url":{"oneOf":[{"description":"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.","type":"string","format":"uri","example":"https://your-server.com/webhooks/deapi","maxLength":2048,"uniqueKey":"oneOf.1.webhook_url.oneOf.0","typeLabel":"string\u003curi>"},{"description":"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.","type":"null","format":"uri","example":"https://your-server.com/webhooks/deapi","maxLength":2048,"uniqueKey":"oneOf.1.webhook_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.webhook_url","typeLabel":"string\u003curi> | null"},"webhook_secret":{"oneOf":[{"description":"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.","type":"string","example":"a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5","maxLength":255,"minLength":32,"uniqueKey":"oneOf.1.webhook_secret.oneOf.0","typeLabel":"string"},{"description":"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.","type":"null","example":"a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5","maxLength":255,"minLength":32,"uniqueKey":"oneOf.1.webhook_secret.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.webhook_secret","typeLabel":"string | null"}},"uniqueKey":"oneOf.1","typeLabel":"object"},{"type":"object","description":"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.","required":["prompt","model","width","height","seed","frames","fps","ref_videos"],"properties":{"ref_videos":{"type":"array","items":{"type":"string","format":"binary","uniqueKey":"oneOf.2.ref_videos.items.[INDEX]","typeLabel":"file"},"description":"Ordered reference videos (full-reference mode). `ref_videos[0]` is addressed as `\u003cVideo 1>`.\nMutually exclusive with `first_frame_image`/`last_frame_image`. **Count and duration are\nmodel-specific — read `info.limits.max_ref_videos` and `min_ref_video_duration` /\n`max_ref_video_duration` for your `model`.** A model publishing `max_ref_videos: 0` takes no\nvideo references. Defaults are 2–5 seconds.\n\n⚠️ If a reference video carries an audio track, that track occupies `\u003cAudio 1>` and shifts\nevery `ref_audios` entry by one — so with a sounded video, `ref_audios[0]` is `\u003cAudio 2>`,\nnot `\u003cAudio 1>`. The current MiniMax acceptance and completed-job responses tested do not include\n`reference_labels`. Track the presence of a video audio track in your client rather than\ndepending on a returned label map; the soundtrack shift described here comes from the\nreference-input specification and is not exposed in those responses. Never more than 1.","minItems":1,"isRequired":true,"uniqueKey":"oneOf.2.ref_videos","typeLabel":"file[]"},"prompt":{"description":"The main prompt for video generation","type":"string","example":"A beautiful sunset over mountains","isRequired":true,"uniqueKey":"oneOf.2.prompt","typeLabel":"string"},"width":{"description":"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.","type":"integer","example":512,"isRequired":true,"uniqueKey":"oneOf.2.width","typeLabel":"integer"},"height":{"description":"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.","type":"integer","example":512,"isRequired":true,"uniqueKey":"oneOf.2.height","typeLabel":"integer"},"frames":{"description":"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.","type":"integer","example":120,"isRequired":true,"uniqueKey":"oneOf.2.frames","typeLabel":"integer"},"fps":{"description":"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.","type":"integer","example":30,"isRequired":true,"uniqueKey":"oneOf.2.fps","typeLabel":"integer"},"seed":{"description":"Random seed for generation","type":"integer","example":42,"isRequired":true,"uniqueKey":"oneOf.2.seed","typeLabel":"integer"},"model":{"description":"The model to use for video generation. Available models can be retrieved via the GET /api/v2/models endpoint.","type":"string","example":"Ltxv_13B_0_9_8_Distilled_FP8","isRequired":true,"uniqueKey":"oneOf.2.model","typeLabel":"string"},"negative_prompt":{"oneOf":[{"description":"Elements to avoid in the generated video. Dropped (not forwarded to the worker) when the model declares `info.features.supports_negative_prompt: false`.","type":"string","example":"blur, darkness, noise","uniqueKey":"oneOf.2.negative_prompt.oneOf.0","typeLabel":"string"},{"description":"Elements to avoid in the generated video. Dropped (not forwarded to the worker) when the model declares `info.features.supports_negative_prompt: false`.","type":"null","example":"blur, darkness, noise","uniqueKey":"oneOf.2.negative_prompt.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.2.negative_prompt","typeLabel":"string | null"},"first_frame_image":{"description":"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.","type":"string","format":"binary","uniqueKey":"oneOf.2.first_frame_image","typeLabel":"file"},"ref_images":{"oneOf":[{"description":"Ordered reference images (full-reference mode). **Order is binding**: `ref_images[0]` is\naddressed in the prompt as `\u003cPicture 1>`, `ref_images[1]` as `\u003cPicture 2>`, and so on —\nnumbering is 1-based and counted within images only. Send the parts in index order, or\nindex them explicitly (`ref_images[0]`, `ref_images[1]`, …); the list must start at 0 and\nhave no gaps. Reordering the list rebinds every label in your prompt and produces a\ndifferent video with no error. Mutually exclusive with `first_frame_image`/`last_frame_image`.\nRequires a model whose specs advertise image-reference support; video and audio\nreferences are advertised separately, so a model may accept one type and not another.\nSupported formats: JPG, JPEG, PNG, GIF, BMP, WebP. File size: at least 1 KB, maximum 10 MB, 64–5000 px\nper side. Each image must be within a 1:4–4:1 aspect ratio (`info.limits.min_ref_image_ratio`\n/ `max_ref_image_ratio`) — a reference keeps its own aspect, unlike a keyframe, which is\nfitted to the canvas. **The number of entries is model-specific — read\n`info.limits.max_ref_images` for your `model` from `GET /api/v2/models`.** Never more than 9.","type":"array","items":{"type":"string","format":"binary","uniqueKey":"oneOf.2.ref_images.oneOf.0.items.[INDEX]","typeLabel":"file"},"uniqueKey":"oneOf.2.ref_images.oneOf.0","typeLabel":"file[]"},{"description":"Ordered reference images (full-reference mode). **Order is binding**: `ref_images[0]` is\naddressed in the prompt as `\u003cPicture 1>`, `ref_images[1]` as `\u003cPicture 2>`, and so on —\nnumbering is 1-based and counted within images only. Send the parts in index order, or\nindex them explicitly (`ref_images[0]`, `ref_images[1]`, …); the list must start at 0 and\nhave no gaps. Reordering the list rebinds every label in your prompt and produces a\ndifferent video with no error. Mutually exclusive with `first_frame_image`/`last_frame_image`.\nRequires a model whose specs advertise image-reference support; video and audio\nreferences are advertised separately, so a model may accept one type and not another.\nSupported formats: JPG, JPEG, PNG, GIF, BMP, WebP. File size: at least 1 KB, maximum 10 MB, 64–5000 px\nper side. Each image must be within a 1:4–4:1 aspect ratio (`info.limits.min_ref_image_ratio`\n/ `max_ref_image_ratio`) — a reference keeps its own aspect, unlike a keyframe, which is\nfitted to the canvas. **The number of entries is model-specific — read\n`info.limits.max_ref_images` for your `model` from `GET /api/v2/models`.** Never more than 9.","type":"null","items":{"type":"string","format":"binary"},"uniqueKey":"oneOf.2.ref_images.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.2.ref_images","typeLabel":"file[] | null"},"ref_audios":{"oneOf":[{"description":"Ordered reference audio clips (full-reference mode). `ref_audios[0]` is addressed as\n`\u003cAudio 1>` — unless a reference video contributed its own soundtrack first, see\n`ref_videos`. Audio may never be the only reference: at least one `ref_images` or\n`ref_videos` entry is required alongside it. **Count and duration are model-specific — read\n`info.limits.max_ref_audios` and `min_ref_audio_duration` / `max_ref_audio_duration` for your\n`model`.** Defaults are 1–10 seconds. Supported formats: WAV, MP3, FLAC, OGG, M4A. Maximum\nfile size: 15 MB. Never more than 3. Audio references condition generation;\nacceptance does not guarantee verbatim speech or exact replay of the reference recording.","type":"array","items":{"type":"string","format":"binary","uniqueKey":"oneOf.2.ref_audios.oneOf.0.items.[INDEX]","typeLabel":"file"},"uniqueKey":"oneOf.2.ref_audios.oneOf.0","typeLabel":"file[]"},{"description":"Ordered reference audio clips (full-reference mode). `ref_audios[0]` is addressed as\n`\u003cAudio 1>` — unless a reference video contributed its own soundtrack first, see\n`ref_videos`. Audio may never be the only reference: at least one `ref_images` or\n`ref_videos` entry is required alongside it. **Count and duration are model-specific — read\n`info.limits.max_ref_audios` and `min_ref_audio_duration` / `max_ref_audio_duration` for your\n`model`.** Defaults are 1–10 seconds. Supported formats: WAV, MP3, FLAC, OGG, M4A. Maximum\nfile size: 15 MB. Never more than 3. Audio references condition generation;\nacceptance does not guarantee verbatim speech or exact replay of the reference recording.","type":"null","items":{"type":"string","format":"binary"},"uniqueKey":"oneOf.2.ref_audios.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.2.ref_audios","typeLabel":"file[] | null"},"last_frame_image":{"oneOf":[{"description":"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.","type":"string","format":"binary","uniqueKey":"oneOf.2.last_frame_image.oneOf.0","typeLabel":"file"},{"description":"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.","type":"null","format":"binary","uniqueKey":"oneOf.2.last_frame_image.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.2.last_frame_image","typeLabel":"file | null"},"guidance":{"description":"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.","type":"number","example":7.5,"uniqueKey":"oneOf.2.guidance","typeLabel":"number"},"steps":{"description":"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.","type":"integer","example":1,"uniqueKey":"oneOf.2.steps","typeLabel":"integer"},"enhance_prompt":{"description":"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.","type":"boolean","example":false,"default":false,"uniqueKey":"oneOf.2.enhance_prompt","typeLabel":"boolean"},"webhook_url":{"oneOf":[{"description":"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.","type":"string","format":"uri","example":"https://your-server.com/webhooks/deapi","maxLength":2048,"uniqueKey":"oneOf.2.webhook_url.oneOf.0","typeLabel":"string\u003curi>"},{"description":"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.","type":"null","format":"uri","example":"https://your-server.com/webhooks/deapi","maxLength":2048,"uniqueKey":"oneOf.2.webhook_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.2.webhook_url","typeLabel":"string\u003curi> | null"},"webhook_secret":{"oneOf":[{"description":"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.","type":"string","example":"a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5","maxLength":255,"minLength":32,"uniqueKey":"oneOf.2.webhook_secret.oneOf.0","typeLabel":"string"},{"description":"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.","type":"null","example":"a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5","maxLength":255,"minLength":32,"uniqueKey":"oneOf.2.webhook_secret.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.2.webhook_secret","typeLabel":"string | null"}},"uniqueKey":"oneOf.2","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"prompt":"A beautiful sunset over mountains","first_frame_image":"\u003cstring>","width":512,"height":512,"frames":120,"fps":30,"seed":42,"model":"Ltxv_13B_0_9_8_Distilled_FP8","negative_prompt":"blur, darkness, noise","ref_images":["\u003cstring>"],"ref_videos":["\u003cstring>"],"ref_audios":["\u003cstring>"],"last_frame_image":"\u003cstring>","guidance":7.5,"steps":1,"enhance_prompt":false,"webhook_url":"https://your-server.com/webhooks/deapi","webhook_secret":"a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"6771d992-17a5-4e23-8813-370f6aecb5d3":{"description":"ID of the inference request.","headers":{"X-RateLimit-Policy":{"description":"Every window that applies, as `\u003climit>;w=\u003cseconds>` elements. Always present on a throttled response, so a single element means there is no daily limit — do not infer that from the absence of the Daily-* headers. `300;w=60` is minute-only; `3;w=60, 100;w=86400` is both.","schema":{"type":"string","example":"3;w=60, 100;w=86400"}},"X-RateLimit-Source":{"description":"Where the limit came from, so you know what would change it:\n`tier` — your account tier's rate for this endpoint;\n`fallback` — no rate configured for this tier and endpoint, degraded default in force;\n`model` — a per-model override for the model in the request, unaffected by your tier\n(only when the request carried a recognised `model`, otherwise the tier pool applies);\n`static` — a flat limit outside the tier system, identical for every account.\n\nIf you ever see `fallback`, tell us: it means no rate is configured for that tier and endpoint.","schema":{"type":"string","example":"tier","enum":["tier","fallback","model","static"]}},"X-RateLimit-Limit":{"description":"Maximum requests allowed per minute (RPM)","schema":{"type":"integer","example":3}},"X-RateLimit-Remaining":{"description":"Remaining requests in current minute window","schema":{"type":"integer","example":2}},"X-RateLimit-Reset":{"description":"Epoch second at which the minute (RPM) window refills. Fixed window — the value does not drift as you spend the quota. Describes the same window as X-RateLimit-Limit, including on a daily rejection.","schema":{"type":"integer","example":1755800460}},"X-RateLimit-Daily-Limit":{"description":"Maximum requests allowed per day (RPD)","schema":{"type":"integer","example":100}},"X-RateLimit-Daily-Remaining":{"description":"Remaining requests in current day window","schema":{"type":"integer","example":95}},"X-RateLimit-Daily-Reset":{"description":"Epoch second at which the daily (RPD) window refills — 86400 s after the first request that opened this bucket's window, not a calendar midnight. Present only when a daily limit applies.","schema":{"type":"integer","example":1755846000}}},"content":{"application/json":{"schema":{"required":["data"],"properties":{"data":{"description":"Information from success endpoint","required":["request_id"],"properties":{"request_id":{"description":"UUID identifying the created inference request. Pass it to `GET /api/v2/jobs/{job_request}` to poll status and collect the result.","type":"string","format":"uuid","example":"c08a339c-73e5-4d67-a4d5-231302fbff9a","isRequired":true,"uniqueKey":"data.request_id","typeLabel":"string\u003cuuid>"}},"type":"object","isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"request_id":"c08a339c-73e5-4d67-a4d5-231302fbff9a"}}}},"exampleType":"generated"}},"exampleType":"generated"},"9939d43a-b090-4568-a770-abbcdc530099":{"description":"Unauthorized user.","content":{"application/json":{"schema":{"properties":{"data":{"description":"Information from success endpoint","type":"object","uniqueKey":"data","typeLabel":"object"},"message":{"description":"Error general message","type":"string","uniqueKey":"message","typeLabel":"string"},"errors":{"description":"Information about errors","type":"array","items":{"oneOf":[{}],"uniqueKey":"errors.items.[INDEX]","typeLabel":"any"},"uniqueKey":"errors","typeLabel":"any[]"},"statusCode":{"description":"Status code","type":"integer","uniqueKey":"statusCode","typeLabel":"integer"},"code":{"description":"A stable, machine-readable reason, on the responses that publish one. Refused credentials (401): `missing_key` — no Bearer credentials arrived at all; `invalid_key` — a key was presented but is unknown, carries the wrong secret, or is malformed; `key_expired` — past its expiry date; `key_revoked` — deactivated. Refused requests: `insufficient_permissions` (403), `ip_not_allowed` (403), `active_key_limit_reached` (422), `insufficient_balance` (422), `key_limit_exceeded` (402), `rate_limited` (429). Absent wherever a response publishes no code, so treat an unknown value as the status code alone — the list grows.","type":"string","enum":["missing_key","invalid_key","key_expired","key_revoked","insufficient_permissions","ip_not_allowed","active_key_limit_reached","insufficient_balance","key_limit_exceeded","rate_limited"],"uniqueKey":"code","typeLabel":"enum\u003cstring>"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{},"message":"\u003cstring>","errors":["\u003cunknown>"],"statusCode":123,"code":"missing_key"}}},"exampleType":"generated"}},"exampleType":"generated"},"4f50aaed-2432-4e25-8035-bcda47a5559a":{"description":"The account is suspended. Applies to every endpoint that spends credits — generation, transcription and prompt enhancement — and is returned before any validation runs, so a suspended account sees this rather than a 422 about the body. Price-estimate endpoints are not gated and keep working.","content":{"application/json":{"schema":{"properties":{"message":{"description":"Human-readable explanation. No `errors` object accompanies this response.","type":"string","example":"Client account is suspended. If you believe this is a mistake, contact us.","uniqueKey":"message","typeLabel":"string"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"Client account is suspended. If you believe this is a mistake, contact us."}}},"exampleType":"generated"}},"exampleType":"generated"},"832e1d92-743d-47a9-b76f-be5e05dc7796":{"description":"Not found.","content":{"application/json":{"schema":{"properties":{"data":{"description":"Information from success endpoint","type":"object","uniqueKey":"data","typeLabel":"object"},"message":{"description":"Error general message","type":"string","uniqueKey":"message","typeLabel":"string"},"errors":{"description":"Information about errors","type":"array","items":{"oneOf":[{}],"uniqueKey":"errors.items.[INDEX]","typeLabel":"any"},"uniqueKey":"errors","typeLabel":"any[]"},"statusCode":{"description":"Status code","type":"integer","uniqueKey":"statusCode","typeLabel":"integer"},"code":{"description":"A stable, machine-readable reason, on the responses that publish one. Refused credentials (401): `missing_key` — no Bearer credentials arrived at all; `invalid_key` — a key was presented but is unknown, carries the wrong secret, or is malformed; `key_expired` — past its expiry date; `key_revoked` — deactivated. Refused requests: `insufficient_permissions` (403), `ip_not_allowed` (403), `active_key_limit_reached` (422), `insufficient_balance` (422), `key_limit_exceeded` (402), `rate_limited` (429). Absent wherever a response publishes no code, so treat an unknown value as the status code alone — the list grows.","type":"string","enum":["missing_key","invalid_key","key_expired","key_revoked","insufficient_permissions","ip_not_allowed","active_key_limit_reached","insufficient_balance","key_limit_exceeded","rate_limited"],"uniqueKey":"code","typeLabel":"enum\u003cstring>"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{},"message":"\u003cstring>","errors":["\u003cunknown>"],"statusCode":123,"code":"missing_key"}}},"exampleType":"generated"}},"exampleType":"generated"},"9ca337e6-7300-45e5-99ad-2a11ee731e12":{"description":"Validation failed. Common errors include: model does not exist, model does not support the inference type for this endpoint, the model is not available on your plan (it requires a higher tier than your account has — upgrade to use it), or invalid request parameters.","content":{"application/json":{"schema":{"properties":{"message":{"description":"General error message","type":"string","example":"The selected model does not support Text To Image.","uniqueKey":"message","typeLabel":"string"},"errors":{"description":"Detailed validation errors by field. A model your plan does not cover is reported on the \"model\" field with the message \"This model is not available on your plan. Please upgrade to access it.\" Such a model is also omitted from GET /models.","type":"object","example":{"model":["This model is not available on your plan. Please upgrade to access it."]},"uniqueKey":"errors","typeLabel":"object"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"The selected model does not support Text To Image.","errors":{"model":["This model is not available on your plan. Please upgrade to access it."]}}}},"exampleType":"generated"}},"exampleType":"generated"},"a9b32038-7f8a-4bd6-ac6a-5df159bd7038":{"description":"Rate limit exceeded. Check X-RateLimit-Type header to determine if minute (RPM) or daily (RPD) limit was hit.","headers":{"X-RateLimit-Limit":{"description":"Maximum requests allowed per minute (RPM)","schema":{"type":"integer","example":3}},"X-RateLimit-Remaining":{"description":"Remaining requests in current minute window","schema":{"type":"integer","example":2}},"X-RateLimit-Daily-Limit":{"description":"Maximum requests allowed per day (RPD)","schema":{"type":"integer","example":100}},"X-RateLimit-Daily-Remaining":{"description":"Remaining requests in current day window","schema":{"type":"integer","example":95}},"X-RateLimit-Type":{"description":"Which limit rejected the request. Sent only on 429. Read it before anything else on the response: it decides what the other `X-RateLimit-*` headers are counting.\n\n`minute` — the per-request RPM window. `daily` — the per-request RPD window; the Daily-* pair is the one at 0.\n\n`key-creation` — the hourly cap on keys created over the API (`POST /api/v2/keys`), per account and shared by its ADMIN keys. The whole `X-RateLimit-*` set describes that bucket and there are no Daily-* headers.\n\n`ip-not-allowed` — too many calls from an address your key's IP whitelist refuses. Counted against that address, never against your account.","schema":{"type":"string","example":"minute","enum":["minute","daily","key-creation","ip-not-allowed"]}},"Retry-After":{"description":"Seconds until the window that rejected you frees up (60 for minute, up to 86400 for daily). Counted from when that window opened, not to a calendar boundary. Sent only on 429.","schema":{"type":"integer","example":60}},"X-RateLimit-Reset":{"description":"Epoch second at which the minute (RPM) window refills. Fixed window — the value does not drift as you spend the quota. Describes the same window as X-RateLimit-Limit, including on a daily rejection.","schema":{"type":"integer","example":1755800460}},"X-RateLimit-Daily-Reset":{"description":"Epoch second at which the daily (RPD) window refills — 86400 s after the first request that opened this bucket's window, not a calendar midnight. Present only when a daily limit applies.","schema":{"type":"integer","example":1755846000}},"X-RateLimit-Source":{"description":"Where the limit came from, so you know what would change it:\n`tier` — your account tier's rate for this endpoint;\n`fallback` — no rate configured for this tier and endpoint, degraded default in force;\n`model` — a per-model override for the model in the request, unaffected by your tier\n(only when the request carried a recognised `model`, otherwise the tier pool applies);\n`static` — a flat limit outside the tier system, identical for every account.\n\nIf you ever see `fallback`, tell us: it means no rate is configured for that tier and endpoint.","schema":{"type":"string","example":"tier","enum":["tier","fallback","model","static"]}},"X-RateLimit-Policy":{"description":"Every window that applies, as `\u003climit>;w=\u003cseconds>` elements. Always present on a throttled response, so a single element means there is no daily limit — do not infer that from the absence of the Daily-* headers. `300;w=60` is minute-only; `3;w=60, 100;w=86400` is both.","schema":{"type":"string","example":"3;w=60, 100;w=86400"}}},"content":{"application/json":{"schema":{"description":"Rate limit exceeded response","properties":{"message":{"description":"Error message","type":"string","example":"Too Many Attempts.","uniqueKey":"message","typeLabel":"string"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"Too Many Attempts."}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"cd8ea642-86ad-460a-ad1b-3fecda5b5819":{"bearerAuth":{"type":"http","description":"Sanctum personal access token, sent as `Authorization: Bearer \u003ctoken>`. 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.","scheme":"bearer","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"e0e49a8e-d368-42c9-8377-07c35e662b8c":{"url":"https://api.deapi.ai","description":"Production API Server base URL"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","description":"Sanctum personal access token, sent as `Authorization: Bearer \u003ctoken>`. 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.","scheme":"bearer","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Sanctum personal access token, sent as `Authorization: Bearer \u003ctoken>`. 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.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"openapi-v2.json"},"subdomain":"deapi-f9ba3abb","siteName":"deAPI","title":"Video Animation (Image-to-Video) - deAPI","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-15T14:08:37.215Z","originalFileLocation":"api/v2/videos/animations.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Animate a still image into a video.\">\u003cmeta data-mint-head name=\"application-name\" content=\"deAPI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/deapi-f9ba3abb/33g1Y_LWZKSlqOOT/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/deapi-f9ba3abb/33g1Y_LWZKSlqOOT/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/deapi-f9ba3abb/33g1Y_LWZKSlqOOT/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/deapi-f9ba3abb/33g1Y_LWZKSlqOOT/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/deapi-f9ba3abb/33g1Y_LWZKSlqOOT/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/deapi-f9ba3abb/33g1Y_LWZKSlqOOT/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/deapi-f9ba3abb/33g1Y_LWZKSlqOOT/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/deapi-f9ba3abb/33g1Y_LWZKSlqOOT/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/deapi-f9ba3abb/33g1Y_LWZKSlqOOT/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Video Animation (Image-to-Video) - deAPI\">\u003cmeta data-mint-head property=\"og:description\" content=\"Animate a still image into a video.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"deAPI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.deapi.ai/api/v2/videos/animations\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://deapi-f9ba3abb.mintlify.app/_mintlify/api/og/v2?division=Videos\u0026amp;title=Video+Animation+%28Image-to-Video%29\u0026amp;description=Animate+a+still+image+into+a+video.\u0026amp;theme=4c928ee8ac6977ca60ea2061\u0026amp;signature=464030af6a6e300ee62e8ae5b32821d0088ee38460f1a710d53d48638c6ccdc9\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Video Animation (Image-to-Video) - deAPI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Animate a still image into a video.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://deapi-f9ba3abb.mintlify.app/_mintlify/api/og/v2?division=Videos\u0026amp;title=Video+Animation+%28Image-to-Video%29\u0026amp;description=Animate+a+still+image+into+a+video.\u0026amp;theme=4c928ee8ac6977ca60ea2061\u0026amp;signature=464030af6a6e300ee62e8ae5b32821d0088ee38460f1a710d53d48638c6ccdc9\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/deapi-f9ba3abb/33g1Y_LWZKSlqOOT/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"deAPI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FD9A00\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.deapi.ai/api/v2/videos/animations\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/v2/videos/animations.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.deapi.ai/#organization\",\"name\":\"deAPI\",\"url\":\"https://docs.deapi.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/deapi-f9ba3abb/gSOvhf4F2Dm8oAad/logo/deapi-light.svg?fit=max\u0026auto=format\u0026n=gSOvhf4F2Dm8oAad\u0026q=85\u0026s=e44c94d9c161aa9264f717cd49f375e5\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.deapi.ai#website\",\"name\":\"deAPI\",\"url\":\"https://docs.deapi.ai\",\"publisher\":{\"@id\":\"https://docs.deapi.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.deapi.ai/api/v2/videos/animations#webpage\",\"url\":\"https://docs.deapi.ai/api/v2/videos/animations\",\"name\":\"Video Animation (Image-to-Video)\",\"description\":\"Animate a still image into a video.\",\"dateModified\":\"2026-09-15T14:08:37.215Z\",\"isPartOf\":{\"@id\":\"https://docs.deapi.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.deapi.ai/api/v2/videos/animations#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.deapi.ai/api/v2/videos/animations#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Videos\",\"item\":\"https://docs.deapi.ai/api/v2/videos/generations\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Video Animation (Image-to-Video)\",\"item\":\"https://docs.deapi.ai/api/v2/videos/animations\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.deapi.ai/api/v2/videos/animations#apireference\",\"headline\":\"Video Animation (Image-to-Video)\",\"name\":\"Video Animation (Image-to-Video)\",\"description\":\"Animate a still image into a video.\",\"url\":\"https://docs.deapi.ai/api/v2/videos/animations\",\"mainEntityOfPage\":{\"@id\":\"https://docs.deapi.ai/api/v2/videos/animations#webpage\"},\"dateModified\":\"2026-09-15T14:08:37.215Z\",\"publisher\":{\"@id\":\"https://docs.deapi.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.deapi.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"deAPI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"deAPI","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/introduction"}]},{"tab":"API v2 (Latest)","groups":[{"group":"Overview","pages":[{"title":"API Overview","href":"/api/v2/overview"},{"title":"Errors","href":"/api/v2/errors"}]},{"group":"Images","pages":[{"title":"Image Generation","openapi":"openapi-v2.json POST /api/v2/images/generations","href":"/api/v2/images/generations"},{"title":"Image Generation Price Calculation","openapi":"openapi-v2.json POST /api/v2/images/generations/price","href":"/api/v2/images/generations-price"},{"title":"Image Edit","openapi":"openapi-v2.json POST /api/v2/images/edits","href":"/api/v2/images/edits"},{"title":"Image Edit Price Calculation","openapi":"openapi-v2.json POST /api/v2/images/edits/price","href":"/api/v2/images/edits-price"},{"title":"Image OCR","openapi":"openapi-v2.json POST /api/v2/images/ocr","href":"/api/v2/images/ocr"},{"title":"Image OCR Price Calculation","openapi":"openapi-v2.json POST /api/v2/images/ocr/price","href":"/api/v2/images/ocr-price"},{"title":"Image Background Removal","openapi":"openapi-v2.json POST /api/v2/images/background-removals","href":"/api/v2/images/background-removals"},{"title":"Image Background Removal Price Calculation","openapi":"openapi-v2.json POST /api/v2/images/background-removals/price","href":"/api/v2/images/background-removals-price"},{"title":"Image Upscale","openapi":"openapi-v2.json POST /api/v2/images/upscales","href":"/api/v2/images/upscales"},{"title":"Image Upscale Price Calculation","openapi":"openapi-v2.json POST /api/v2/images/upscales/price","href":"/api/v2/images/upscales-price"}]},{"group":"Videos","pages":[{"title":"Video Generation","openapi":"openapi-v2.json POST /api/v2/videos/generations","href":"/api/v2/videos/generations"},{"title":"Video Generation Price Calculation","openapi":"openapi-v2.json POST /api/v2/videos/generations/price","description":"Estimate the price of a text-to-video generation request.","href":"/api/v2/videos/generations-price"},{"title":"Video Animation (Image-to-Video)","openapi":"openapi-v2.json POST /api/v2/videos/animations","href":"/api/v2/videos/animations"},{"title":"Video Animation Price Calculation","openapi":"openapi-v2.json POST /api/v2/videos/animations/price","description":"Estimate the price of an image-to-video animation request.","href":"/api/v2/videos/animations-price"},{"title":"Video Audio Sync (Audio-to-Video)","openapi":"openapi-v2.json POST /api/v2/videos/audio-syncs","href":"/api/v2/videos/audio-syncs"},{"title":"Video Audio Sync Price Calculation","openapi":"openapi-v2.json POST /api/v2/videos/audio-syncs/price","href":"/api/v2/videos/audio-syncs-price"},{"title":"Video Replacement","openapi":"openapi-v2.json POST /api/v2/videos/replacements","href":"/api/v2/videos/replacements"},{"title":"Video Replacement Price Calculation","openapi":"openapi-v2.json POST /api/v2/videos/replacements/price","href":"/api/v2/videos/replacements-price"},{"title":"Video Upscale","openapi":"openapi-v2.json POST /api/v2/videos/upscales","href":"/api/v2/videos/upscales"},{"title":"Video Upscale Price Calculation","openapi":"openapi-v2.json POST /api/v2/videos/upscales/price","href":"/api/v2/videos/upscales-price"},{"title":"Video Description","openapi":"openapi-v2.json POST /api/v2/videos/descriptions","href":"/api/v2/videos/descriptions"},{"title":"Video Description Price Calculation","openapi":"openapi-v2.json POST /api/v2/videos/descriptions/price","href":"/api/v2/videos/descriptions-price"}]},{"group":"Audio","pages":[{"title":"Text-to-Speech","openapi":"openapi-v2.json POST /api/v2/audio/speech","href":"/api/v2/audio/speech"},{"title":"Text-to-Speech Price Calculation","openapi":"openapi-v2.json POST /api/v2/audio/speech/price","href":"/api/v2/audio/speech-price"},{"title":"Text-to-Music","openapi":"openapi-v2.json POST /api/v2/audio/music","href":"/api/v2/audio/music"},{"title":"Text-to-Music Price Calculation","openapi":"openapi-v2.json POST /api/v2/audio/music/price","href":"/api/v2/audio/music-price"},{"title":"Audio/Video Transcription","openapi":"openapi-v2.json POST /api/v2/audio/transcriptions","href":"/api/v2/audio/transcriptions"},{"title":"Transcription Price Calculation","openapi":"openapi-v2.json POST /api/v2/audio/transcriptions/price","href":"/api/v2/audio/transcriptions-price"}]},{"group":"Embeddings","pages":[{"title":"Embeddings","openapi":"openapi-v2.json POST /api/v2/embeddings","href":"/api/v2/embeddings/embeddings"},{"title":"Embeddings Price Calculation","openapi":"openapi-v2.json POST /api/v2/embeddings/price","href":"/api/v2/embeddings/embeddings-price"}]},{"group":"Prompt Enhancement","pages":[{"title":"Prompt Enhancement - Overview","href":"/api/v2/prompt-enhancement/overview"},{"title":"Prompt Booster","openapi":"openapi-v2.json POST /api/v2/prompts/enhancements","href":"/api/v2/prompt-enhancement/prompt-booster"},{"title":"Prompt Booster Price","openapi":"openapi-v2.json POST /api/v2/prompts/enhancements/price","href":"/api/v2/prompt-enhancement/prompt-booster-price"}]},{"group":"Utilities","pages":[{"title":"Check Balance","openapi":"openapi-v2.json GET /api/v2/account/balance","href":"/api/v2/utilities/balance"},{"title":"Get Job Results","openapi":"openapi-v2.json GET /api/v2/jobs/{job_request}","href":"/api/v2/utilities/jobs"},{"title":"Model Selection","openapi":"openapi-v2.json GET /api/v2/models","href":"/api/v2/utilities/models"}]},{"group":"API Keys","pages":[{"title":"Get Current Key","openapi":"openapi-v2.json GET /api/v2/key","href":"/api/v2/keys/get-current-key"},{"title":"Get Current Key Usage","openapi":"openapi-v2.json GET /api/v2/key/usage","href":"/api/v2/keys/get-current-key-usage"},{"title":"List Keys","openapi":"openapi-v2.json GET /api/v2/keys","href":"/api/v2/keys/list-keys"},{"title":"Create Key","openapi":"openapi-v2.json POST /api/v2/keys","href":"/api/v2/keys/create-key"},{"title":"Get Key","openapi":"openapi-v2.json GET /api/v2/keys/{id}","href":"/api/v2/keys/get-key"},{"title":"Update Key","openapi":"openapi-v2.json PATCH /api/v2/keys/{id}","href":"/api/v2/keys/update-key"},{"title":"Delete Key","openapi":"openapi-v2.json DELETE /api/v2/keys/{id}","href":"/api/v2/keys/delete-key"},{"title":"Get Key Usage","openapi":"openapi-v2.json GET /api/v2/keys/{id}/usage","href":"/api/v2/keys/get-key-usage"}]},{"group":"Account","pages":[{"title":"Get Account Billing","openapi":"openapi-v2.json GET /api/v2/account","href":"/api/v2/account/get-account"},{"title":"Get Account Usage","openapi":"openapi-v2.json GET /api/v2/account/usage","href":"/api/v2/account/usage"},{"title":"List Payments","openapi":"openapi-v2.json GET /api/v2/account/payments","href":"/api/v2/account/payments"}]}]},{"tab":"API v1 (Deprecated)","pages":[{"title":"API v1 (Deprecated)","href":"/api/v1/overview"}]}]},"title":"Video Animation (Image-to-Video) - deAPI","buildId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","deploymentId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-Bbp7I60D.js","utils-C3RIvJha.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DqD-vLt8.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B31Loprg.js","snippetPresets-DKpk-b8t.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-Cj65AhOR.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BXtn5gcC.js","shallow-RY2b03Cp.js","getApiPlaygroundDisplay-B0jeiPk3.js","CodeSnippet-CYgBjjwn.js","CodeSnippets-DOngDrYB.js","Page-n7I5XbKb.js","getPastedJson-DRQbJx-T.js","icon-CQiQCicY.js","MethodPill-BKTLdNtu.js","DuplicateIcon-B9jpAdat.js","createIcon-DCddRrXv.js","DynamicMarkdown-a8hUKrw6.js","SectionHeading-eECVV2eH.js","axios-vUo_bRtp.js","Markdown--GF7ZIpf.js","clsx-DZLdJUrt.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-2LoAhjKH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Zwc0ZncM.js"]}