Alibaba Wan 2.5 Video Extend
Playground
Try it on WaveSpeedAI!WAN 2.5 Video-Extend turns short clips into longer videos with preserved or generated synchronized audio for continuity. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Video Extender is a specialization built on top of ’s WAN 2.5 model that adds length-extension capabilities. It faithfully inherits all core parameters, behaviors, and quality characteristics of the original WAN 2.5—and operates under the same licensing and copyright terms. Output resolutions remain 480p, 720p, and 1080p.
✨ Why This endpoint is special
- Seamless extension: Extends videos naturally — no abrupt cuts or looping artifacts. The motion flow and scene lighting stay coherent frame to frame.
- Flexible duration control: Choose any target length from 3 s – 10 s (3, 4, 5, 6, 7, 8, 9, 10 s all supported).
- One-pass A/V sync: Automatically aligns audio and mouth movements, ensuring natural speech and rhythm without manual editing.
- Multilingual friendly: Supports prompts in Chinese and English for synchronized video generation with accurate lip-sync.
- Custom audio option: You can upload your own audio (music or voice) or let the model generate one for you — plug-and-play.
- Lightweight and affordable: Built for creators and teams who need fast, consistent, and cost-effective video outputs.
🧩 Designed For
- Content creators & storytellers: Extend scenes smoothly to fit a beat, dialogue, or camera motion.
- Marketing teams: Produce multiple ad variations from a single core clip — faster, cheaper, consistent.
- Corporate training teams: Expand short clips into complete learning segments without reshooting.
- Global enterprises: Generate localized, multilingual video extensions for different audiences.
⚙️ How to Use
- Upload your base video clip.
- (Optional) Upload an audio file (
.wav/.mp3, ≤ 15 MB, 3–30 s). - Enter your prompt or description (supports Chinese / English).
- Select the output duration (3 s – 10 s).
- Choose resolution (480p / 720p / 1080p).
- Submit the job — wait a few moments, preview, and download your extended video.
💡 Audio Handling
- If audio > chosen video length: Only the first segment (3 s, 5 s, 10 s etc.) is used.
- If audio < chosen video length: Remaining video plays silently.
- If no audio: WAN 2.5 can auto-generate one or leave it silent.
💰 Pricing
| Resolution | Price per second | Example (3 s) | Example (5 s) |
|---|---|---|---|
| 480p | $0.05 | $0.15 | $0.25 |
| 720p | $0.10 | $0.30 | $0.50 |
| 1080p | $0.15 | $0.45 | $0.75 |
🧠 Pro Tips
- Start with 5 s for testing — balance between cost and quality.
- Upload high-quality input videos to maximize motion consistency.
- Keep your prompt concise but descriptive: include mood, motion, and scene intent.
- For multilingual videos, specify the desired spoken language in your prompt.
📎 Note
- If you didn’t upload your image or video locally, please ensure that the media URL is publicly accessible. A successfully accessible file will display a preview in the interface.
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",
"video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
"resolution": "720p",
"duration": 5,
"enable_prompt_expansion": false,
"seed": -1
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/alibaba/wan-2.5/video-extend" \
-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. | |
| video | string | Yes | - | The video for generating the output. | |
| audio | string | No | - | - | Audio URL to guide generation (optional). |
| negative_prompt | string | No | - | The negative prompt for the generation. | |
| resolution | string | No | 720p | 480p, 720p, 1080p | The resolution of the generated media. |
| duration | integer | No | 5 | 3, 4, 5, 6, 7, 8, 9, 10 | The duration of the generated media in seconds. |
| enable_prompt_expansion | boolean | No | false | - | If set to true, the prompt optimizer will be enabled. |
| 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 |