Introduction
Wan 2.2 Spicy image-to-video turns an opening frame into exactly five or eight seconds. The frame carries wardrobe, body, set, light and shape; the prompt carries motion.
Wan 2.2 Spicy is an uncensored image-to-video family from Alibaba's Wan 2.2 line. It runs at 480p or 720p with no content declaration anywhere in the request, and an optional closing frame pins the ending or closes a loop.
Key features & highlights
There is no content flag to set
There is no flag to set, no per-request declaration and no review step on our side. The clip continues whatever the opening frame shows and whatever the prompt asks for.
The opening frame carries the body and the light
The published example starts from a still of a woman stretching on a bench in an empty gym at dawn. Because the plate already holds the wardrobe, the sweat and the shaft of window light, the prompt only had to describe her straightening up and catching her breath.
Exactly five or eight seconds
duration_seconds accepts 5 or 8 and nothing else; any other value is a validation error rather than a rounded clip. last_image_url is optional and pins the final frame, which is what makes a seamless loop or a planned landing possible.
Request parameters
| Parameter | Required | Description |
|---|---|---|
image_url | Yes | The opening frame, and the single biggest lever. Wardrobe, body, set, light direction and the clip's aspect ratio all come from it. at least 1 characters |
prompt | Yes | Required. Describe motion and camera only; restating the outfit that is already visible invites the model to redraw it. at least 1 characters |
duration_seconds | No | Exactly 5 or 8. Anything else is a validation error rather than a rounded clip. |
resolution | No | 480p or 720p, default 480p. It moves both the price and how long the task takes to return. |
seed | No | 0 to 2147483647. Hold it while you compare five seconds against eight, or 480p against 720p, from the same plate. |
last_image_url | No | Optional closing frame. Point it at the opening still to close a loop, or at a different composition when the shot has to land somewhere specific. at least 1 characters |
enable_prompt_expansion | No | Off by default. When on, the prompt is rewritten before generation — useful for a one-line brief, unhelpful once the motion description is precise. Default: |
Pricing
| Specification | Price |
|---|---|
| $0.019 / second |
| $0.038 / second |
Use cases
Uncensored clips refused by other video APIs
Prompts that competing models reject at the content filter run here as written: send the plate, describe the motion, get the clip, with no filter and no declaration to fill in.
Companion characters, beat by beat
Use the same character plate as the opening frame for every beat, so the person, the wardrobe and the room carry over from clip to clip. Each beat is approved at 480p before the 720p pass is paid for, so a long scene never turns into one expensive, unusable render.
Loops for feeds and previews
Five seconds at 480p from a 9:16 plate is a loop that autoplays cleanly and stays small. Point last_image_url at the opening still and the loop closes back on itself without a visible cut.
Prompt guide & pro tips
Crop the opening frame to the delivery shape
There is no aspect ratio field, so the clip takes the still's proportions. The plate also fixes the person, the wardrobe, the set and the light direction: everything the prompt does not have to say.
Describe only what moves
Write one action, one camera behaviour and one note on light or sound. Restating the outfit that is already visible invites the model to redraw it. enable_prompt_expansion is off by default; turn it on only for a one-line brief, because it rewrites the prompt before generation.
Adapt the included example
The published example uses duration_seconds 5 and resolution 480p, with the gym still as image_url.
She lowers her leg off the bench, rolls her shoulders back and straightens up, wiping sweat from her collarbone with the back of her wrist, chest rising as she catches her breath. Dawn light shifts across the concrete, dust drifting in the beam.
The prompt covers one movement, one gesture and the light; the wardrobe and the setting come from the frame.
Approve at 480p, then render at 720p
Both image_url and prompt are required. Find the take at 480p first; once it is right, hold seed and re-render at 720p. Approving a cheap draft before paying for the sharper pass is the point of splitting the work this way.
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": "alibaba/wan-2.2-spicy/image-to-video",
"input": {
"duration_seconds": 5,
"enable_prompt_expansion": false,
"image_url": "https://example.com/reference.png",
"prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
"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.




























