Skip to main content
wan-video avatar

Wan 3.0 Text to Video API

wan-video/wan/v3.0/text-to-video

Generate a video from a text prompt at 480P, 720P or 1080P, with a matching soundtrack included and clips running up to 30 seconds in one generation.

Priced by resolution

Model Input

Input

Text description of the video to generate. Chinese and English are supported, up to 20,000 characters, so there is room to describe a long scene beat by beat.

Output video resolution. 480P bills at $0.05 per second of finished video, 720P at $0.10, and 1080P (the default) at $0.20, so draft at 480P and re-run the keeper higher.

Min: 2 - Max: 30

Length of the generated video in whole seconds (2-30). Cost scales directly with this value.

Frame shape of the generated video. Pick a fixed ratio when the delivery slot is known; the default `adaptive` leaves the choice to the model rather than pinning one.

Additional Settings

Customize your input with more control.

Whether the delivered clip carries an audio track. On by default; set it to false for a silent video. The price is the same either way.

Min: 0 - Max: 2147483647

Random seed for reproducible results. Omit for a different clip each run.

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

Model Output

Output

Loading
Generated in 735.374 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.

480P
$0.05
per second of output video
or around 20 seconds for $1
720P
$0.1
per second of output video
or around 10 seconds for $1
1080P
$0.2
per second of output video
or around 5 seconds for $1

Wan 3.0 Text to Video API

Wan 3.0 Text to Video is a text-to-video AI model by wan-video. On ModelRunner it runs through a REST API or via MCP from any AI assistant, at $0.2 per second of video.

POST https://queue.modelrunner.run/wan-video/wan/v3.0/text-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/v3.0/text-to-video \
  -H "Authorization: Key $MRUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "audio": true,
    "prompt": "A woman\u0027s face lights up with surprise and delight as she unwraps a gift, natural unscripted expression, warm window …",
    "duration": 8,
    "resolution": "1080P",
    "aspect_ratio": "9:16",
    "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/v3.0/text-to-video/requests/$REQUEST_ID/status" \
  -H "Authorization: Key $MRUN_API_KEY"
curl "https://queue.modelrunner.run/wan-video/wan/v3.0/text-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/v3.0/text-to-video", {
  input: {
    "audio": true,
    "prompt": "A woman's face lights up with surprise and delight as she unwraps a gift, natural unscripted expression, warm window …",
    "duration": 8,
    "resolution": "1080P",
    "aspect_ratio": "9:16"
  },
});
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/v3.0/text-to-video",
    headers=headers,
    json={
      "audio": true,
      "prompt": "A woman's face lights up with surprise and delight as she unwraps a gift, natural unscripted expression, warm window …",
      "duration": 8,
      "resolution": "1080P",
      "aspect_ratio": "9:16"
    },
).json()

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

Input parameters

Input parameters of Wan 3.0 Text to Video
NameTypeRequiredDescription
promptstringyesText description of the video to generate. Chinese and English are supported, up to 20,000 characters, so there is room to describe a long scene beat by beat.
resolutionenumnoOutput video resolution. 480P bills at $0.05 per second of finished video, 720P at $0.10, and 1080P (the default) at $0.20, so draft at 480P and re-run the keeper higher. One of: 480P, 720P, 1080P. Default: "1080P".
durationintegernoLength of the generated video in whole seconds (2-30). Cost scales directly with this value. Default: 5.
aspect_ratioenumnoFrame shape of the generated video. Pick a fixed ratio when the delivery slot is known; the default adaptive leaves the choice to the model rather than pinning one. One of: 16:9, 9:16, 1:1, 4:3, 3:4, adaptive. Default: "adaptive".
audiobooleannoWhether the delivered clip carries an audio track. On by default; set it to false for a silent video. The price is the same either way. Default: true.
seedintegernoRandom seed for reproducible results. Omit for a different clip each run.

Machine-readable: OpenAPI schema · llms.txt

Use Wan 3.0 Text to Video from Claude & Cursor (MCP)

Point Claude Code, Claude Desktop, Cursor, or any MCP client at the ModelRunner MCP server and Wan 3.0 Text 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/v3.0/text-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/v3.0/text-to-video on ModelRunner to generate video”. MCP setup guide.

Model Details

Model Details

Wan 3.0 turns a written prompt into a video clip of 2 to 30 seconds at 480P, 720P or 1080P, and the clip arrives with a soundtrack rather than silent. Its headline capability is length: one call generates up to 30 seconds of video in a single pass, double the Wan 2.7 generation's 15-second ceiling, so a whole scene can be produced in one request instead of stitched from shorter takes. Prompts run to 20,000 characters in Chinese or English, which leaves room to describe a long scene beat by beat.

## Best for - Long-form clips: a single 20 to 30 second generation instead of several short ones joined together - Scenes that need sound as well as picture, delivered as one MP4 with a matching soundtrack - Cheap iteration: draft at 480P, then re-run the prompt you like at 1080P - Shots with people in them, where individual faces and expressions have to read - Vertical 9:16 reels, square 1:1 social posts or 16:9 landscape b-roll, generated from text alone

## Choose another model when - You want to animate an existing photo, clip or document. This variant takes text only, with no media input at all, so use an image-to-video model - Your clips are 15 seconds or shorter at 1080P and price matters most: `wan-video/wan/v2.7/text-to-video` bills $0.15 per second there against $0.20 here, and is generally available rather than in preview - You need a negative prompt to exclude content. There is no such field here, so describe what you do want instead - You need lip-sync to a voice track you supply. This model accepts no audio input, so use an audio-driven image-to-video model

## Tips - Cost scales with both `duration` and `resolution`: 480P bills $0.05 per second of finished video, 720P $0.10 and 1080P $0.20, so a 30-second 1080P clip costs $6.00 while the same clip at 480P costs $1.50 - Set `aspect_ratio` explicitly when the delivery slot is fixed; the default `adaptive` leaves the frame shape to the model rather than pinning one - No prompt-rewriting step runs here, so wording is used exactly as written. Be specific about subject, action and setting - `audio` is on by default and costs nothing extra; set it to `false` when you only want the picture

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

const result = await modelrunner.subscribe("wan-video/wan/v3.0/text-to-video", { input: { prompt: "A potter shapes a bowl on a wheel, clay rising under wet hands, warm workshop light, the wheel humming", resolution: "720P", duration: 12, aspect_ratio: "16:9", }, }); ```