Introduction
MiniMax H3 Spicy image-to-video animates an uncensored opening frame, with an optional closing frame and optional movement direction.
MiniMax H3 Spicy is a LoRA-tuned, uncensored build of MiniMax H3, published as image-to-video and video-extend endpoints; this page covers image-to-video. The opening frame you supply sets the subject, an optional closing frame sets the ending, and the prompt directs the 3 to 15 seconds in between at 480p, 540p, 768p or 1080p.
Key features & highlights
Your frame decides the content, not a text filter
Because the only input path is an opening frame, this family does not have the usual gap between what you asked for and what a text prompt is willing to render. Whatever is in the still, including wardrobe, body, pose and framing, is what animates. The prompt handles movement, camera and sound on top of it.
A still on its own is a complete request
The prompt is not required here. Send an image and the model infers a plausible small movement from it, which is often all a loop needs. Add text when you want a specific beat, such as a turn toward camera, a hand moving through the hair or a change of expression, and keep it to what happens rather than re-describing the frame.
Pair it with an uncensored image model
The practical workflow is two calls: generate the still with an uncensored image model, then animate it here. That splits the problem in half: composition and content are settled in a cheap image pass you can re-roll quickly, and the video pass only has to get the motion right.
Request parameters
| Parameter | Required | Description |
|---|---|---|
image_url | Yes | Required. The still that animates - it decides the content, so make it right first. |
last_image_url | No | Optional, and only valid with |
prompt | No | Optional. Describe the beat, the camera and the sound; do not re-describe the frame. |
duration_seconds | No | Whole seconds, 3 to 15. Three is cheap enough to generate variants in bulk. |
resolution | No | 480p, 540p, 768p or 1080p. It defaults to 480p, the cheapest of the four tiers. |
seed | No | Optional, 0 to 2147483647. |
Pricing
| Specification | Price |
|---|---|
| $0.038 / second |
| $0.057 / second |
| $0.084 / second |
| $0.152 / second |
Use cases
Uncensored scenes other APIs reject
Source frames are accepted and animated as supplied, with no content filter. Clips that hosted video APIs refuse at the prompt filter run here, and because the content lives in the frame rather than the text, the result matches what you approved instead of a softened reinterpretation.
Companion and roleplay clips
One character still becomes a library of short reactions: a look up, a smile, a shoulder turn, hair pushed back. Keep the same opening frame and vary only the prompt, and the character stays consistent across every clip in the set.
Animating an existing photo set
A shoot you already own turns into motion without a reshoot. Each frame becomes a 3 to 15 second clip, and a closing frame lets a pair of stills from the same set define the start and the end of one move.
Prompt guide & pro tips
Make the opening frame first
Settle wardrobe, body, pose and framing in an image pass, because that still is what the video will contain. A frame that is already right needs no argument with the prompt afterwards.
Use the closing frame for a known ending
last_image_url may only be sent alongside image_url, and it constrains the ending, not the middle. Add it only when the clip has to land on a known composition, such as a second still from the same set.
Adapt the included example
The published example uses duration_seconds 5 and resolution 768p, with a single still as image_url.
She exhales a slow plume of smoke against the rain-streaked glass, the neon sign outside pulses red across her face, and she turns her head toward camera without changing expression. Blind shadows creep, rain runs down the window, distant traffic.
A single still plus a movement note: the smoke, the neon cycle and the head turn are written, and everything identifying came from the frame.
Draft cheap, finish once
Resolution defaults to 480p, the cheapest of the four tiers. Generate several three-second variants at 480p, choose one, then re-run it at 768p or 1080p with a longer duration, keeping the prompt and the opening frame identical so the comparison stays meaningful.
API quick start
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "minimax/h3-spicy/image-to-video",
"input": {
"duration_seconds": 5,
"image_url": "https://example.com/reference.png",
"resolution": "480p"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
See the API reference for authentication, the complete schema, polling, and error handling.

















