Introduction
Wan 3.0 Spicy Video extend continues a clip you already have. Send it as video_url; a prompt for what happens next steers the continuation, and without one the model carries the scene on by itself. The final frame of your clip becomes the opening frame of a new Wan 3.0 Spicy image-to-video shot of 2 to 30 seconds, and the two are joined into one MP4: your original first, then the continuation, with the repeated seam frame removed. The new segment also comes back as its own file, so you can keep extending or edit the pieces separately.
Key features & highlights
Continuity comes from the last frame. Wardrobe, set, light and where everyone stands carry over because the new segment literally starts on your final frame. Motion does not carry over the same way: the model sees one still, not the whole clip, so describe the movement you want to continue instead of assuming it will keep its speed or direction. This model can also change the outfit on its own partway through a clip, even when the prompt asks otherwise, so watch the whole new segment before you build on it.
Optionally, choose where it lands. Pass last_image_url and the new segment ends exactly on that image, so a shot can return to its hero angle or arrive at a set composition. Without it the model decides how the segment ends. The start is always the final frame of your clip.
One file back, plus the new piece on its own. The joined MP4 keeps your clip’s frame rate and its framing, with no black bars. To line the seam up, the picture may be trimmed or adjusted by a few percent at the edges. If the model returns a noticeably different shape, the new segment is scaled to fill your frame and centered, cropping what spills over. It is encoded as H.264 MP4 with AAC sound. Sound from your source stays; sound generated for the new segment follows it; a silent side is padded with silence so picture and sound stay in step at the seam. The second asset in the output is the new segment alone, with the role segment, ready for another extend.
Everything else is Wan 3.0 Spicy image-to-video. The new segment runs on the same routes, with the same content range and the same per-second price as the image-to-video endpoint, including the audio, prompt expansion and seed controls, and a failed generation is refunded the same way. Add last_image_url to make the new segment end on a frame you choose. If the generation succeeds but the join itself cannot be built, the task fails and the charge is refunded.
Request parameters
| Parameter | Required | Description |
|---|---|---|
prompt | No | Optional but worth writing: what happens next, the camera move and the sound. The last frame already fixes the subject and the set, so spend the words on motion. at least 1 characters |
video_url | Yes | The clip to continue: MP4, MOV or WebM, up to 60 seconds. Its final frame becomes the opening frame of the new segment, so cut it on a clean, sharp frame. at least 1 characters |
last_image_url | No | Optional target last frame: the new segment ends on this image, cropped to the segment's aspect ratio. Leave it out to let the model decide how the segment ends. |
resolution | No | Resolution the new segment is generated at: 480p, 720p or 1080p, default 720p. Match your source’s resolution so the seam shows no step in sharpness. |
duration_seconds | No | Length of the new segment: any whole number from 2 to 30, default 5. Your source is added on top and is not billed. |
generate_audio | No | On by default, so the new segment comes with generated sound. Your source keeps its own sound either way; when one side is silent, the joined file is padded with silence. Default: |
enable_prompt_expansion | No | Off by default. When on, the prompt is rewritten before generation, which helps thin briefs and fights you on detailed ones. Default: |
seed | No | 0 to 2147483647. Hold it steady to compare one changed field at a time; drop it for variety. |
Pricing
Billed per second of the new segment at the resolution you choose; the source clip you send is not billed.
| Specification | Price |
|---|---|
| $0.057 / second |
| $0.114 / second |
| $0.228 / second |
Use cases
Lengthen a shot that ended too early: a product turntable that stops before the label faces camera, or a walk that cuts before the subject reaches the door. Extend it by a few seconds and describe only the remaining motion.
Build a longer sequence step by step. Generate a first shot, extend it, then extend the joined result again; each step bills only the seconds it adds. Because every step starts from a single frame, watch each seam before stacking the next one.
Prompt guide & pro tips
Describe the next beat, not the whole scene. The frame already fixes who and where, so spend the prompt on the action that follows, the camera move and the sound. Repeat the camera language your clip ended on, such as a slow push in or a locked shot, so the seam reads as one take. The prompt is optional; with none, the model simply carries on from the frame, which is enough for ambient or loosely staged shots.
Trim before you extend. The last frame is the only thing the model sees, so a blurred, mid-cut or heavily compressed ending carries straight into the continuation. Cut your source on a clean, sharp frame first. Sources of up to 60 seconds are accepted as MP4, MOV or WebM.
Keep the resolution consistent. Extending a 1080p clip at 480p looks soft next to the original. Match the resolution of your source, and set duration_seconds to the length you actually need: the charge follows the new segment only.
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-3.0-spicy/video-extend",
"input": {
"duration_seconds": 5,
"resolution": "720p",
"video_url": "https://example.com/reference.mp4"
}
}'
# 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.





















