Skip to main content
wan-video avatar

Wan 2.7 Image to Video API

wan-video/wan/v2.7/image-to-video

Animate a still photo into a 2-15 second video at 720P or 1080P, optionally pinning a closing frame, with background music or sound effects generated alongside the picture.

Priced by resolution

Model Input

Input

The opening frame the video animates from. JPEG, JPG, PNG (alpha channel not supported), BMP or WEBP; width and height each between 240 and 8000 px, aspect ratio between 1:8 and 8:1, up to 20 MB. The finished clip takes its frame shape from this image.

Optional description of the motion and camera movement to animate. The scene is already fixed by the start image, so describe what moves rather than re-describing the picture. Chinese and English are supported.

Optional closing frame. Supply it to generate the transition from the start frame to this one; it cannot be used on its own, without a start frame. Same formats and size limits as the start frame, and it should share the start frame's aspect ratio.

Output video resolution. 720P bills at $0.10 per second of finished video; 1080P (default) bills at $0.15 per second.

Min: 2 - Max: 15

Length of the generated video in seconds (2-15).

Additional Settings

Customize your input with more control.

Describe content to avoid in the generated video.

When enabled, an LLM rewrites and enriches your prompt before generation. Disable to follow your exact wording.

Min: 0 - Max: 2147483647

Random seed for reproducible results. Omit for a random seed each run.

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

Model Output

Output

Loading
Generated in 31.984 seconds
Logs (1 lines)

Model Example Requests

Examples

Example output 1Example output 2Example output 3

Model Pricing

Pricing

Model pricing varies by the target resolution of your output video.

720P
$0.1
per second of output video
or around 10 seconds for $1
1080P
$0.15
per second of output video
or around 7 seconds for $1

Wan 2.7 Image to Video API

Wan 2.7 Image to Video is a image-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/v2.7/image-to-video

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/v2.7/image-to-video \
  -H "Authorization: Key $MRUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "The camera pushes slowly forward along the cliff road as sunlight glitters on the ocean below and the roadside wildfl…",
    "duration": 5,
    "resolution": "1080P",
    "start_image_url": "https://media.modelrunner.ai/vOKz3EpxyzC5VawMFbMOl.png",
    "enable_prompt_expansion": true,
    "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/v2.7/image-to-video/requests/$REQUEST_ID/status" \
  -H "Authorization: Key $MRUN_API_KEY"
curl "https://queue.modelrunner.run/wan-video/wan/v2.7/image-to-video/requests/$REQUEST_ID" \
  -H "Authorization: Key $MRUN_API_KEY"

JavaScript

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

const result = await modelrunner.subscribe("wan-video/wan/v2.7/image-to-video", {
  input: {
    "prompt": "The camera pushes slowly forward along the cliff road as sunlight glitters on the ocean below and the roadside wildfl…",
    "duration": 5,
    "resolution": "1080P",
    "start_image_url": "https://media.modelrunner.ai/vOKz3EpxyzC5VawMFbMOl.png",
    "enable_prompt_expansion": true
  },
});
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/v2.7/image-to-video",
    headers=headers,
    json={
      "prompt": "The camera pushes slowly forward along the cliff road as sunlight glitters on the ocean below and the roadside wildfl…",
      "duration": 5,
      "resolution": "1080P",
      "start_image_url": "https://media.modelrunner.ai/vOKz3EpxyzC5VawMFbMOl.png",
      "enable_prompt_expansion": true
    },
).json()

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

Input parameters

NameTypeRequiredDescription
start_image_urlstring (uri)yesThe opening frame the video animates from. JPEG, JPG, PNG (alpha channel not supported), BMP or WEBP; width and height each between 240 and 8000 px, aspect ratio between 1:8 and 8:1, up to 20 MB. The finished clip takes its frame shape from this image.
promptstringnoOptional description of the motion and camera movement to animate. The scene is already fixed by the start image, so describe what moves rather than re-describing the picture. Chinese and English are supported.
end_image_urlstring (uri)noOptional closing frame. Supply it to generate the transition from the start frame to this one; it cannot be used on its own, without a start frame. Same formats and size limits as the start frame, and it should share the start frame's aspect ratio.
resolutionenumnoOutput video resolution. 720P bills at $0.10 per second of finished video; 1080P (default) bills at $0.15 per second. Default: "1080P".
durationintegernoLength of the generated video in seconds (2-15). Default: 5.
negative_promptstringnoDescribe content to avoid in the generated video.
enable_prompt_expansionbooleannoWhen enabled, an LLM rewrites and enriches your prompt before generation. Disable to follow your exact wording. Default: true.
seedintegernoRandom seed for reproducible results. Omit for a random seed each run.

Machine-readable: OpenAPI schema · llms.txt

Use Wan 2.7 Image to Video from Claude & Cursor (MCP)

Point Claude Code, Claude Desktop, Cursor, or any MCP client at the ModelRunner MCP server and Wan 2.7 Image to Video 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/v2.7/image-to-video.

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/v2.7/image-to-video on ModelRunner to generate video”. MCP setup guide.

Model Details

Model Details

Wan 2.7 Image to Video animates a still photo into a 2-15 second clip that arrives with its own soundtrack — background music or sound effects generated to match what is happening on screen, in the same pass as the picture. Supply one image as the opening frame and, optionally, a short prompt describing the motion; add a second image as the closing frame and the model generates the transition between the two. The clip inherits its frame shape from the source image — a vertical photo gives a vertical video — so there is no aspect-ratio control. Pick 720P for drafts or 1080P for delivery, and set any clip length from 2 to 15 seconds.

## Best for - Animating a single photo, packshot or illustration into a short clip that already has sound - First-and-last-frame shots: pin the opening and closing images and let the model generate the motion between them - Vertical, square or landscape social video that keeps the framing of your source photo - Single takes up to 15 seconds long, without stitching shorter clips together

## Choose another model when - You want a frame shape your source image does not have — the output follows the input material, so crop first or use a text-to-video model with an aspect-ratio control - You have no starting image and want the shot built from text alone — use a text-to-video model - You need a silent clip — audio is always generated and there is no documented way to switch it off - You need clips longer than 15 seconds, or frame-accurate timeline control

## Tips - `prompt` is optional — you can animate a frame with no text — but it is your only control over motion and camera once the image fixes the scene - Give `end_image_url` the same aspect ratio as the start frame — the clip's shape comes from the input material - `resolution` affects cost: 720P bills at $0.10 per second of finished video and 1080P (the default) at $0.15, so iterate at 720P - `enable_prompt_expansion` is on by default and rewrites your prompt for richer detail; disable it to follow your exact wording

## Limitations - The output frame shape follows your source image but is not guaranteed to match it exactly - A closing frame cannot be used on its own — `end_image_url` only takes effect alongside a start frame

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

const result = await modelrunner.subscribe("wan-video/wan/v2.7/image-to-video", { input: { start_image_url: "https://media.modelrunner.ai/7HYD7QtzL6Up3PuTVw55V.png", prompt: "The balloon drifts slowly across the valley as the mist thins and sunrise light spreads over the ridges", resolution: "1080P", duration: 5, }, }); ```