Wan 2.2 Spicy image-to-video: give it a first frame and a prompt and it returns a 5 or 8 second clip. Add a last frame and it interpolates between the two. Output is 480p or 720p, billed per second. This model is API-only — there is no web playground for it.
Authorization: Bearer YOUR_API_KEY| Resolution | Per second | 5-second clip | 8-second clip | Actual frame |
|---|---|---|---|---|
| 480p | $0.03 | $0.15 | $0.24 | 832x480 |
| 720p | $0.06 | $0.30 | $0.48 | 1280x720 |
Billed on the duration you request (5 or 8 seconds), not on the exact length of the returned file. Adding a last frame costs nothing extra. Failed requests are not charged.
| A first frame is required | This is image-to-video; there is no text-only mode. Omitting image returns a 400. |
| Duration is 5 or 8 seconds only | There are no other values. Passing 6 or 10 returns a 400 stating the legal values — it is never rounded to the nearest legal one and billed anyway. |
| Resolution is 480p or 720p only | The actual frames are 832x480 and 1280x720. There is no 1080p, 2K or 4K — upscale afterwards if you need more. |
| The output has no audio track | The returned MP4 is video only. Add sound in post, or use a video model that generates audio. |
| Generation takes 35-75 seconds | Measured range, rising with resolution and duration: about 35s for 480p/5s and about 72s for 720p/8s. Design your polling around an async task. |
| No watermark | We generated one clip in each of the four tiers and checked all four corners of each: no watermark or corner mark. |
# ─── Image-to-video (first frame + prompt) ────────────────
curl -X POST https://api.apimodels.app/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan-2.2-i2v-spicy",
"image": "https://example.com/first-frame.jpg",
"prompt": "she slowly turns toward the camera, hair moving in the wind",
"duration": 5,
"resolution": "480p"
}'
# Response (async — a task is created):
# { "code": 200, "data": { "taskId": "clxxx", "state": "pending" } }
# ─── First + last frame (the model interpolates between them) ──
curl -X POST https://api.apimodels.app/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan-2.2-i2v-spicy",
"image": "https://example.com/first.jpg",
"last_image": "https://example.com/last.jpg",
"prompt": "smooth camera push-in",
"duration": 8,
"resolution": "720p",
"seed": 42
}'
# ─── Poll for the result ──────────────────────────────────
curl "https://api.apimodels.app/v1/video/generations?task_id=TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# { "code": 200, "data": { "state": "completed", "resultUrls": ["https://r2.apimodels.app/..."] } }| Field | Required | Type | Description |
|---|---|---|---|
| model | Yes | string | wan-2.2-i2v-spicy |
| image | Yes | string | First frame: a public image URL or base64. image_url and first_frame_url are accepted too. |
| prompt | Yes | string | How the shot should move |
| last_image | No | string | End frame; when given the model interpolates from the first to this one. image_tail and last_frame_url are accepted too. |
| duration | No | number | Either 5 or 8, default 5. Anything else is a 400 — it is never silently changed to a legal value. |
| resolution | No | string | Either 480p or 720p, default 480p. There is no 1080p or 4K tier. |
| seed | No | number | Random seed (0 to 2147483647); random when omitted |
| prompt_extend | No | boolean | Automatic prompt rewriting, on by default. See the section below. |
| callback_url | No | string | Webhook URL called when the task completes |
When enabled, your prompt is first sent to a dedicated rewriting service that expands it and fills in detail, and the expanded version is what gets generated. It helps most with one-line prompts: if you write only "she turns her head", the rewrite adds camera, lighting and motion detail that the model responds to. The switch is on by default.
Pass prompt_extend: false to turn it off and have the model follow your text exactly. Turn it off when you have already written a long, precise prompt, or when you need reproducible comparisons alongside seed — otherwise each rewrite differs and a fixed seed still will not line up.
Note: there is no separate endpoint for the rewriting — this parameter is the only way to trigger it. It does not change what you pay: pricing depends only on resolution and duration.
Per second of the duration you request: $0.03 at 480p and $0.06 at 720p. That makes a 5-second clip $0.15 or $0.30 and an 8-second clip $0.24 or $0.48. Adding a last frame costs nothing extra, and failed requests are not charged.
Duration is 5 or 8 seconds and resolution is 480p (832x480) or 720p (1280x720) — those are the only values the model accepts. Anything else returns a 400 stating the legal values rather than being silently adjusted and billed.
No. The returned MP4 has no audio track, so add sound in post or pick a video model that generates audio. It also needs a first frame: there is no text-only mode, and the clips carry no watermark.
It is automatic prompt rewriting, on by default: your prompt is expanded with camera, lighting and motion detail before the clip is generated, which helps most with short one-line prompts. Pass prompt_extend: false to generate from your text verbatim — do that when your prompt is already precise, or when you need reproducible results alongside a fixed seed. There is no separate endpoint for the rewriting, and it does not change the price.