Skip to main content
wan-video avatar

Wan 2.2 Animate Move API

wan-video/wan-animate/move

Animate a still character image with the motion and facial expressions of a driving video — no text prompt needed, just a character photo and a reference clip.

0.15 per second of output video

Model Input

Input

URL of the driving video. Its body motion and facial expressions are transferred onto the character image.

URL of the character image to animate. It is resized and center-cropped to the driving video's aspect ratio.

Output resolution. 480p (default) is the cheapest tier, 580p mid, 720p the highest quality.

Additional Settings

Customize your input with more control.

Min: 1 - Max: 10

Classifier-free guidance strength. Higher values follow the conditioning more strictly; the default of 1 suits most driving videos.

Min: 2 - Max: 40

Number of denoising steps. More steps can add detail at the cost of runtime.

Min: 1 - Max: 10

Flow-matching timestep shift. Leave at the default unless tuning motion fidelity.

Encoding quality of the returned mp4.

Trade-off used when writing the mp4: 'fast' writes quickest, 'small' produces the smallest file, 'balanced' sits between them.

Whether to also produce a ZIP archive of the generated frames.

Run the accelerated variant: faster generation with a slight reduction in fidelity.

Random seed. Leave unset for a random result; reuse a value to reproduce a previous run.

You need to be logged in to run this model and view results.
Log in

Model Output

Output

Loading
Generated in 260.734 seconds
Logs (1 lines)

Model Example Requests

Examples

Example output 1Example output 2

Wan 2.2 Animate Move API

Wan 2.2 Animate Move is a video-to-video AI model by wan-video. On ModelRunner it runs through a REST API or via MCP from any AI assistant, at $0.15 per second of video.

POST https://queue.modelrunner.run/wan-video/wan-animate/move

cURL

# Submit a request to the queue. Input fields go at the top level of the
# body. The optional reserved "metadata" object holds your own flat string
# tags — stored on the request, never sent to the model; filter later with
# GET https://queue.modelrunner.run/requests?metadata=<url-encoded JSON>.
curl -X POST https://queue.modelrunner.run/wan-video/wan-animate/move \
  -H "Authorization: Key $MRUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "shift": 5,
    "image_url": "https://media.modelrunner.ai/qf7LUwPh7gD0iVj0lMoCF.jpeg",
    "use_turbo": false,
    "video_url": "https://media.modelrunner.ai/m7GgVU46xQgWaPJGl3kD7.mp4",
    "resolution": "480p",
    "video_quality": "high",
    "guidance_scale": 1,
    "video_write_mode": "balanced",
    "return_frames_zip": false,
    "num_inference_steps": 20,
    "metadata": {
      "project": "my-project"
    }
  }'
# → { "request_id": "...", "status_url": "...", "response_url": "..." }

# Poll status_url until "COMPLETED", then fetch the result
curl "https://queue.modelrunner.run/wan-video/wan-animate/move/requests/$REQUEST_ID/status" \
  -H "Authorization: Key $MRUN_API_KEY"
curl "https://queue.modelrunner.run/wan-video/wan-animate/move/requests/$REQUEST_ID" \
  -H "Authorization: Key $MRUN_API_KEY"

JavaScript

import { modelrunner } from "@modelrunner/client";

const result = await modelrunner.subscribe("wan-video/wan-animate/move", {
  input: {
    "shift": 5,
    "image_url": "https://media.modelrunner.ai/qf7LUwPh7gD0iVj0lMoCF.jpeg",
    "use_turbo": false,
    "video_url": "https://media.modelrunner.ai/m7GgVU46xQgWaPJGl3kD7.mp4",
    "resolution": "480p",
    "video_quality": "high",
    "guidance_scale": 1,
    "video_write_mode": "balanced",
    "return_frames_zip": false,
    "num_inference_steps": 20
  },
});
console.log(result);

Python

import os
import requests

headers = {"Authorization": f"Key {os.environ['MRUN_API_KEY']}"}

submitted = requests.post(
    "https://queue.modelrunner.run/wan-video/wan-animate/move",
    headers=headers,
    json={
      "shift": 5,
      "image_url": "https://media.modelrunner.ai/qf7LUwPh7gD0iVj0lMoCF.jpeg",
      "use_turbo": false,
      "video_url": "https://media.modelrunner.ai/m7GgVU46xQgWaPJGl3kD7.mp4",
      "resolution": "480p",
      "video_quality": "high",
      "guidance_scale": 1,
      "video_write_mode": "balanced",
      "return_frames_zip": false,
      "num_inference_steps": 20
    },
).json()

# Poll submitted["status_url"] until "COMPLETED", then:
result = requests.get(submitted["response_url"], headers=headers).json()

Input parameters

NameTypeRequiredDescription
video_urlstring (uri)yesURL of the driving video. Its body motion and facial expressions are transferred onto the character image.
image_urlstring (uri)yesURL of the character image to animate. It is resized and center-cropped to the driving video's aspect ratio.
resolutionenumnoOutput resolution. 480p (default) is the cheapest tier, 580p mid, 720p the highest quality. Default: "480p".
guidance_scalenumbernoClassifier-free guidance strength. Higher values follow the conditioning more strictly; the default of 1 suits most driving videos. Default: 1.
num_inference_stepsintegernoNumber of denoising steps. More steps can add detail at the cost of runtime. Default: 20.
shiftnumbernoFlow-matching timestep shift. Leave at the default unless tuning motion fidelity. Default: 5.
video_qualityenumnoEncoding quality of the returned mp4. Default: "high".
video_write_modeenumnoTrade-off used when writing the mp4: 'fast' writes quickest, 'small' produces the smallest file, 'balanced' sits between them. Default: "balanced".
return_frames_zipbooleannoWhether to also produce a ZIP archive of the generated frames. Default: false.
use_turbobooleannoRun the accelerated variant: faster generation with a slight reduction in fidelity. Default: false.
seedintegernoRandom seed. Leave unset for a random result; reuse a value to reproduce a previous run.

Machine-readable: OpenAPI schema · llms.txt

Use Wan 2.2 Animate Move from Claude & Cursor (MCP)

Point Claude Code, Claude Desktop, Cursor, or any MCP client at the ModelRunner MCP server and Wan 2.2 Animate Move becomes a tool your assistant can call directly — it authorizes via OAuth (no API key in config) and runs this model with the run_model tool using the endpoint wan-video/wan-animate/move.

MCP client config (Claude Desktop, Cursor)

{
  "mcpServers": {
    "modelrunner": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.modelrunner.run/mcp"]
    }
  }
}

Claude Code

claude mcp add --transport http modelrunner https://mcp.modelrunner.run/mcp

Then ask your assistant, for example: “Run wan-video/wan-animate/move on ModelRunner to generate video”. MCP setup guide.

Model Details

Model Details

Wan 2.2 Animate Move turns a still character image into video by transferring a performance from a driving video. Supply one character image and one driving clip: the character reproduces the performer's body motion and facial expression, framed to the driving video's aspect ratio, for as long as that clip runs. There is no text prompt — the whole performance comes from the footage you supply. This is the "Move" mode of Wan Animate: the character is animated in its own scene rather than composited into the driving footage.

## Best for - Animating a character illustration, portrait, or brand mascot from a reference performance - Motion transfer — reusing one filmed performance across several different characters - Expression and lip-movement transfer for talking-head clips, driven by video rather than a script - Previsualizing choreography, gestures, or presenter delivery with a stand-in character - Bulk character animation where a written prompt would be too vague to direct the motion

## Choose another model when - You have no driving video and want motion invented from a description — use a text-to-video or image-to-video model - You want to restyle a clip or change its background from a written instruction — use a prompt-driven video editing model - You need mouth movement driven by an audio track instead of by video — use a lip-sync model - You need a still image rather than motion — use an image-editing or text-to-image model

## Tips - Use a clear, unobstructed character image; it is center-cropped, so leave margin around the subject - Keep the driving clip short — cost scales with output duration - `resolution` sets both quality and price: `480p` (the default) is cheapest, then `580p`, then `720p` - `use_turbo` runs an accelerated variant — faster, with a small fidelity trade-off; leave it off for best quality - Framing mismatch between the image and the driving performer is the main cause of weak results

## Advanced Configuration - `video_quality` (`low`, `medium`, `high`, `maximum`; default `high`) and `video_write_mode` (`fast`, `balanced`, `small`; default `balanced`) set how the mp4 is encoded — use `small` for a lighter file and `maximum` for downstream re-encoding.

## Limitations - Large differences in body proportion, camera distance, or framing between the character image and the driving performer can cause warping - Fast motion, heavy occlusion, and hands are the weakest cases - Duration and frame rate follow the driving clip and cannot be set directly

To run via the ModelRunner JavaScript client: ```js import { modelrunner } from "@modelrunner/client";

const result = await modelrunner.subscribe("wan-video/wan-animate/move", { input: { image_url: "https://media.modelrunner.ai/qf7LUwPh7gD0iVj0lMoCF.jpeg", video_url: "https://media.modelrunner.ai/m7GgVU46xQgWaPJGl3kD7.mp4", resolution: "480p", }, }); ```