Seedance 2.5 Now Live | Try in Video Generator →

wavespeed-ai/

Wan 2.2 Animate 2 is the next-generation Wan character animation model: an end-to-end DiT that makes the character in a reference image perform the motion of a driving video, with no pose extraction, prompt-controlled background, and strong identity preservation; generates 480p/720p videos up to 120s. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

motion-control
Input

Idle

$0.2per run·~50 / $10

ExamplesView all

Related Models

README

Wan 2.2 Animate 2

What is Wan 2.2 Animate 2?

Wan 2.2 Animate 2 (Wan2.2-Animate-2, the successor to Wan 2.2 Animate) is the next generation of the Wan character-animation family. It is an end-to-end model: the raw driving video conditions the generation directly inside a redesigned Diffusion Transformer, with no pose or keypoint extraction step. You provide one character image and one driving video, and the character performs the video's full-body motion, hand gestures, and facial expressions.

Compared with Wan 2.2 Animate (v1):

  • End-to-end motion transfer — no skeleton/pose preprocessing, which makes complex motion, fast dancing, and partially occluded performers noticeably more robust.
  • Prompt-controlled background — the output background is generated from your prompt and is fully decoupled from both the reference image and the driving video. The background of your inputs does not matter.
  • Strong identity preservation — the output character stays faithful to the reference image across the whole clip, including long videos.
  • Long videos — driving videos up to 120 seconds are supported; segments are generated and chained natively by the model for seamless transitions.

The output video runs at 30 fps and follows the driving video's duration and aspect ratio.

Note: Wan 2.2 Animate 2 focuses on character animation and does not include a replace mode. To swap a character into an existing shot while keeping the original scene and camera, use Wan 2.2 Animate (v1) in replace mode.

Pricing

Pricing depends on output length and resolution.

ResolutionPrice per 5 sMax billed length
480p0.20 USD120 s
720p0.40 USD120 s

Billing rules

  • Billed duration is clamped to the range 5–120 seconds

  • If the video is shorter than 5 s → billed as 5 s

  • If the video is longer than 120 s → billed as 120 s

  • 480p: 0.20 USD per 5 s → 0.04 USD per second

  • 720p: double 480p → 0.40 USD per 5 s → 0.08 USD per second

For example:

  • 30 s at 480p → 30 × 0.04 = 1.20 USD
  • 30 s at 720p → 30 × 0.08 = 2.40 USD
  • 150 s at 720p (over the cap) → billed as 120 s → 120 × 0.08 = 9.60 USD

How to use Wan 2.2 Animate 2

  1. image (required) Upload a clear character image. The character's identity comes from here; the image background is ignored.

  2. video (required) Upload the driving video whose motion and expressions you want to transfer. Up to 120 seconds.

  3. prompt (optional) Describe how the character and the output background should look. The recommended format is:

Character appearance description: A young woman with shoulder-length pink hair, wearing a black leather jacket...
Background description: Plain light gray studio background, soft even lighting.

Describe looks only — put motion wording in motion_prompt.

  1. motion_prompt (optional) A short description of the motion in the driving video, e.g. "A person doing energetic street dance with rhythmic steps".

  2. resolution Choose 480p for faster, cheaper previews or 720p for higher-quality output.

  3. seed (optional) Leave default for a fresh variation each run, or set a fixed integer to reproduce a result.

Practical tips

  • Match the framing — keep the reference image and the driving video similar in camera distance and crop (full-body to full-body, half-body to half-body). Framing mismatch is the most common cause of weak results.
  • Describe the background in the prompt — since the background follows the prompt, an explicit background description gives you full control of the scene.
  • Keep the performer clear — avoid heavy occlusion and strong motion blur in the driving video.
  • Prototype at 480p — find good inputs with 480p and short clips first, then switch to 720p and longer durations.
Note:This website uses AI models provided by third parties. Documentation prices are for reference and may be outdated. The Generate button shows an estimate; the final task charge prevails.

Wan 2.2 Animate 2 API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/wavespeed-ai/wan-2.2/animate-2 with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Wan 2.2 Animate 2 below.

HTTP example
set -euo pipefail

: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"

REQUEST_BODY=$(cat <<'JSON'
{
    "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
    "resolution": "480p",
    "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/animate-2" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $WAVESPEED_API_KEY" \
  -d "$REQUEST_BODY")

TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; 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 has("data") then .data else . end')
  STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
  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
done
Node.js example
const submitUrl = "https://api.wavespeed.ai/api/v3/wavespeed-ai/wan-2.2/animate-2";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');

async function requestJson(url, options = {}) {
  const response = await fetch(url, options);
  if (!response.ok) throw new Error(await response.text());
  return response.json();
}

// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
        "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
        "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
        "resolution": "480p",
        "seed": -1
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
  `https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;

// 2. Poll until the prediction finishes.
while (true) {
  const resultBody = await requestJson(resultUrl, {
    headers: { "Authorization": `Bearer ${apiKey}` },
  });
  const result = resultBody.data ?? resultBody;
  if (result.status === "completed") {
    console.log(result.outputs);
    break;
  }
  if (["failed", "cancelled", "timeout"].includes(result.status)) throw new Error(JSON.stringify(result));
  if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
  await new Promise(resolve => setTimeout(resolve, 2000));
}
Python example
import json
import os
import time
from urllib.request import Request, urlopen

api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
    "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
    "resolution": "480p",
    "seed": -1
}

def request_json(url, data=None):
    request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
    with urlopen(request) as response:
        return json.load(response)

# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/wavespeed-ai/wan-2.2/animate-2", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
    raise RuntimeError("Submission response did not contain a prediction id")
result_url = task.get("urls", {}).get("get") or f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"

# 2. Poll until the prediction finishes.
while True:
    result_body = request_json(result_url)
    result = result_body.get("data", result_body)
    status = result.get("status")
    if status == "completed":
        print(result.get("outputs", []))
        break
    if status in {"failed", "cancelled", "timeout"}:
        raise RuntimeError(result)
    if status not in {"created", "processing"}:
        raise RuntimeError(f"Unexpected status: {status}")
    time.sleep(2)

Wan 2.2 Animate 2 API — Frequently asked questions

What is the Wan 2.2 Animate 2 API?

Wan 2.2 Animate 2 is a WaveSpeedAI model for pose / motion driven video, exposed as a REST API on WaveSpeedAI. Wan 2.2 Animate 2 is the next-generation Wan character animation model: an end-to-end DiT that makes the character in a reference image perform the motion of a driving video, with no pose extraction, prompt-controlled background, and strong identity preservation; generates 480p/720p videos up to 120s. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.

How do I call the Wan 2.2 Animate 2 API?

POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/wavespeed-ai/wan-2.2-animate-2.

How much does Wan 2.2 Animate 2 cost per run?

Wan 2.2 Animate 2 starts at $0.20 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.

What inputs does Wan 2.2 Animate 2 accept?

Key inputs: `prompt`, `image`, `video`, `resolution`, `seed`, `motion_prompt`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/wavespeed-ai/wan-2.2-animate-2.

How do I get started with the Wan 2.2 Animate 2 API?

Sign up for a free WaveSpeedAI account to claim starter credits, copy your API key from /accesskey, then call the endpoint shown in the API tab of the playground. The playground also auto-generates a code sample in Python, JavaScript, or cURL for the parameters you've set.

Can I use Wan 2.2 Animate 2 outputs commercially?

Commercial usage rights depend on the model's license, set by its provider (WaveSpeedAI). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.

Wan 2.2 Animate | AI Motion Control Video API on WaveSpeedAI