Wan 2.2 I2V 720p Ultra Fast
Playground
Try it on WaveSpeedAI!Generate unlimited ultra-fast 720p AI videos from images with Wan 2.2 A14B image-to-video model. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Generate dynamic 720p videos from images at blazing speed with Wan 2.2 Ultra Fast. This optimized model supports both single-image animation and start-to-end frame interpolation — perfect for action sequences, POV content, and rapid creative iteration.
Why It Looks Great
- Ultra-fast generation: Optimized for speed without sacrificing quality.
- Start-to-end interpolation: Optionally provide a last frame for smooth transitions between two images.
- 720p HD output: Sharp, clean video quality for most digital platforms.
- Action-ready: Excels at dynamic motion, POV shots, and fast-paced content.
- Negative prompt support: Exclude unwanted elements for precise control.
- Prompt Enhancer: Built-in tool to refine your motion descriptions automatically.
- Reproducible results: Use the seed parameter to recreate exact outputs.
Parameters
| Parameter | Required | Description |
|---|---|---|
| image | Yes | Source/starting image to animate (upload or public URL). |
| prompt | Yes | Text description of the motion and action you want. |
| negative_prompt | No | Elements to avoid in the generated video. |
| last_image | No | Optional ending frame for start-to-end interpolation (upload or URL). |
| duration | No | Video length: 5 or 8 seconds. Default: 5. |
| seed | No | Random seed for reproducibility. Use -1 for random. |
How to Use
- Upload your starting image — drag and drop or paste a public URL.
- Write your prompt — describe the motion, camera work, and action in detail.
- Use Prompt Enhancer (optional) — click to enrich your motion description.
- Add negative prompt (optional) — specify elements to exclude.
- Upload last image (optional) — add an ending frame for interpolation effects.
- Set duration — choose 5 or 8 seconds.
- Set seed (optional) — for reproducible results.
- Run — click the button to generate.
- Download — preview and save your video.
Pricing
Per 5-second billing based on duration.
| Duration | Calculation | Cost |
|---|---|---|
| 5 seconds | 5 ÷ 5 × $0.10 | $0.10 |
| 8 seconds | 8 ÷ 5 × $0.10 | $0.16 |
Volume Examples
| Videos | Duration | Total Cost |
|---|---|---|
| 10 | 5s | $1.00 |
| 10 | 8s | $1.60 |
| 50 | 5s | $5.00 |
| 50 | 8s | $8.00 |
Best Use Cases
- POV Action Content — Create immersive first-person perspective videos like biking, driving, or sports.
- Rapid Prototyping — Test concepts quickly before committing to higher-quality generation.
- Motion Transitions — Use start and end frames to create smooth morphing or scene transitions.
- Social Media Content — Generate engaging videos optimized for fast turnaround.
- Dynamic Scenes — Animate images with fast-paced motion, camera shake, and action effects.
Example Prompts
- “GoPro-style POV mountain biking downhill through a dense forest at extreme speed. Leaves and branches whip past the camera, quick motion blur streaking across the frame. The handlebar vibrates violently during sharp turns, the fisheye lens adding a dynamic warp.”
- “Cinematic drone shot flying through canyon walls, dynamic camera movement, epic scale”
- “First-person running through city streets at night, neon lights blurring past, urgent pace”
- “Slow zoom out revealing the full landscape, clouds drifting across the sky”
- “Camera tracking alongside a speeding car, motion blur on background, action movie style”
Start-to-End Interpolation
When you provide both an image and a last_image, the model creates a smooth video transition between the two frames:
| Use Case | How to Use |
|---|---|
| Scene transitions | Start with day scene, end with night scene |
| Morphing effects | Start with one expression, end with another |
| Movement sequences | Start position to end position |
| Zoom effects | Wide shot to close-up (or vice versa) |
Pro Tips for Best Results
- For POV content, describe camera characteristics: “GoPro-style”, “fisheye lens”, “motion blur”.
- Include action words: “whip past”, “vibrate”, “streak”, “blur” for dynamic motion.
- Use last_image when you want controlled start-to-end transitions.
- Negative prompts like “static”, “frozen”, “still” can encourage more motion.
- Ultra Fast is ideal for testing — iterate quickly, then use higher-quality models for finals.
- Match the energy of your prompt to the content: fast words for action, gentle words for calm scenes.
Notes
- If using URLs for images, ensure they are publicly accessible. Preview thumbnails confirm successful loading.
- Ultra Fast prioritizes speed — for maximum quality, consider standard Wan 2.2 variants.
- Processing is optimized for rapid turnaround, perfect for high-volume workflows.
- The last_image feature enables creative interpolation effects not possible with single-image input.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic ocean wave at sunrise, highly detailed",
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
"duration": 5,
"seed": -1
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/wan-2.2/i2v-720p-ultra-fast" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}")
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL=$(printf '%s' "${TASK}" | jq -r '.urls.get // empty')
if [ -z "${RESULT_URL}" ]; then RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"; fi
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}")
RESULT=$(printf '%s' "${RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
created|processing) sleep 2 ;;
*) printf 'Unexpected status: %s
' "${STATUS}" >&2; exit 1 ;;
esac
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | The positive prompt for the generation. | |
| image | string | Yes | - | The image for generating the output. | |
| negative_prompt | string | No | - | The negative prompt for the generation. | |
| last_image | string | No | - | - | The last image for generating the output. |
| duration | integer | No | 5 | 5, 8 | The duration of the generated media in seconds. |
| seed | integer | No | -1 | - | The random seed to use for the generation. -1 means a random seed will be used. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to poll for the prediction result |
| data.status | string | Status: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |