# Wan v2.2 5B · Text to Video API

> Text-to-video with the 5B model: 580p or 720p, 16:9, 9:16 or 1:1, optional frame interpolation

Creates a video clip from a text `prompt`. Length is set by `num_frames` (17 to 161) and `frames_per_second` (4 to 60), with `resolution` of 580p or 720p and aspect ratios 16:9, 9:16 or 1:1. Frame interpolation with film or rife can be enabled, and output quality and file write mode are adjustable. This is the standard-guidance variant with up to 50 inference steps.

- Model id: `wan/v2.2-5b/text-to-video`
- Made by: Alibaba
- Category: Text to Video
- Output: video
- Price: $0.15 / video (cheapest run $0.15 (150 API credits))
- Run: `POST https://api.doitong.com/v1/run/wan/v2.2-5b/text-to-video`
- Quote: `POST https://api.doitong.com/v1/quote/wan/v2.2-5b/text-to-video`
- Docs page: https://doitong.com/developers/models/wan/v2.2-5b/text-to-video

## Pricing

Price: **$0.15 / video**. Billed once per generated video.

The full example input below costs $0.15 = 150 API credits (1 video × 150 API credits).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.com/v1/quote/wan/v2.2-5b/text-to-video` with the same JSON body returns the exact price for that input; the quote is exactly what a run charges. Invalid input is never charged and failed or canceled requests are refunded automatically.

## Input parameters

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `prompt` |  | string | yes |  |  | Text instructions that guide video generation. |
| `negative_prompt` |  | string | no | `` |  | Negative prompt applied when generating a video. |
| `num_frames` |  | integer | no | `81` | 17 – 161 | Frame count for generation, with an inclusive range of 17–161. |
| `frames_per_second` |  | integer \| null | no | `24` | 4 – 60 | Generated video frame rate, accepting values from 4 to 60; setting `adjust_fps_for_interpolation` to false preserves this rate unchanged. With interpolation in use and `adjust_fps_for_interpolation` true (its default), multiply this rate by one plus the interpolated frame count to obtain the final FPS. For example, 16 FPS with 1 interpolated frame becomes 32 FPS. |
| `seed` |  | integer \| null | no |  |  | Seed that makes generation reproducible. Setting it to None selects a seed randomly. |
| `resolution` |  | enum (string) | no | `720p` | `580p`, `720p` | Output video resolution, either 580p or 720p. |
| `aspect_ratio` |  | enum (string) | no | `16:9` | `16:9`, `9:16`, `1:1` | Output video's aspect ratio, either 16:9 or 9:16. |
| `num_inference_steps` |  | integer | no | `40` | 2 – 50 | Sampling step count, trading longer processing time for better quality as the count increases. |
| `enable_safety_checker` |  | boolean | no | `false` |  | Input safety screening before processing, which only authorized accounts may turn off. Requests lacking authorization are always screened; otherwise, true enables screening. |
| `enable_output_safety_checker` |  | boolean | no | `false` |  | Controls safety screening of the generated video; setting true enables a check after generation. |
| `enable_prompt_expansion` |  | boolean | no | `false` |  | Allow a large language model to enrich the prompt with details. Enabling this expansion leaves the prompt's meaning unchanged. |
| `guidance_scale` |  | number | no | `3.5` | 1 – 10 | Classifier-free guidance strength, trading possible quality loss for closer prompt matching as the scale increases. |
| `shift` |  | number | no | `5` | 1 – 10 | Video shift setting, with an allowed range of 1.0–10.0. |
| `interpolator_model` |  | enum (string) | no | `film` | `none`, `film`, `rife` | Frame interpolation setting: choose None to skip interpolation, or specify the model to perform it. |
| `num_interpolated_frames` |  | integer | no | `0` | 0 – 4 | Insert 0–4 interpolated frames into every gap between two generated frames. |
| `adjust_fps_for_interpolation` |  | boolean | no | `true` |  | Frame-rate adjustment toggle: false preserves the supplied FPS, whereas true scales it by one plus the interpolated frame count. Thus, 16 FPS becomes 32 FPS when 1 frame is interpolated and adjustment is enabled. |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | Output video quality setting that trades larger files for improved visuals as the setting increases. |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | Video writing mode, with balanced offering a compromise between speed and quality. Choose small for the smallest files and slowest writing; faster writing returns results sooner but creates larger files. |

## Example input

Required parameters only:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
}
```

A fuller example:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
}
```

## Run it

Set `DOITONG_API_KEY` to a key from https://doitong.com/developers/dashboard#keys. `?wait=20` returns the finished request in the same call when it is ready within 20 seconds; otherwise poll `GET /requests/{id}` (it also accepts `?wait=`), or pass `webhook_url`.

### curl

```bash
# Run the model; wait up to 20 s for the finished result in the same call
curl -X POST "https://api.doitong.com/v1/run/wan/v2.2-5b/text-to-video?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.com/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.com/v1";
const headers = {
  "Authorization": "Bearer " + process.env.DOITONG_API_KEY,
  "Content-Type": "application/json",
};

// Run the model; wait up to 20 s for the finished result in the same call
let res = await fetch(API + "/run/wan/v2.2-5b/text-to-video?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  }),
});
let request = await res.json();
if (!res.ok) throw new Error(request.error.code + ": " + request.error.message);

// Not finished yet: long-poll until it is
while (request.status === "queued" || request.status === "running") {
  res = await fetch(API + "/requests/" + request.id + "?wait=20", { headers });
  request = await res.json();
}
if (request.status !== "succeeded") throw new Error(JSON.stringify(request.error));
console.log(request.outputs.map((o) => o.url), request.cost.credits + " API credits ($" + request.cost.usd + ")");
```

### Python

```python
import os
import requests

API = "https://api.doitong.com/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/wan/v2.2-5b/text-to-video", params={"wait": 20}, json=payload, headers=headers)
request = r.json()
if not r.ok:
    raise RuntimeError(request["error"]["code"] + ": " + request["error"]["message"])

# Not finished yet: long-poll until it is
while request["status"] in ("queued", "running"):
    request = requests.get(API + "/requests/" + request["id"], params={"wait": 20}, headers=headers).json()
if request["status"] != "succeeded":
    raise RuntimeError(request["error"])
print([o["url"] for o in request["outputs"]], request["cost"]["credits"], "API credits", "$" + request["cost"]["usd"])
```

### MCP

The MCP server at `https://api.doitong.com/v1/mcp` exposes the tools `search_models`, `get_model`, `quote`, `run`, `get_request`, `cancel_request`, `list_requests`, `create_upload` and `get_account`. A `run` call for this model:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run",
    "arguments": {
      "model_id": "wan/v2.2-5b/text-to-video",
      "input": {
        "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
      },
      "wait_seconds": 20
    }
  }
}
```

## Response

Every call returns a request object. `status` is one of `queued`, `running`, `succeeded`, `failed`, `canceled`. `outputs` lists the generated files with URLs on our storage (kept forever, or 7 days with `?storage=temporary`; `storage` says which); `output` is the model's own result object with the same URLs.

```json
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "wan/v2.2-5b/text-to-video",
  "status": "succeeded",
  "created_at": "2026-10-20T12:00:00Z",
  "started_at": "2026-10-20T12:00:02Z",
  "completed_at": "2026-10-20T12:00:09Z",
  "queue_position": null,
  "cost": {
    "credits": 150,
    "usd": "0.15",
    "charged": 150,
    "refunded": 0
  },
  "input": {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  },
  "output": {
    "video": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_name": "0-output.mp4",
      "file_size": 1843200
    },
    "prompt": "A medium shot establishes a modern, minimalist office setting: clean lines, muted grey walls, and polished wood surfaces. The focus shifts to a close-up on a woman in sharp, navy blue business attire. Her crisp white blouse contrasts with the deep blue of her tailored suit jacket. The subtle texture of the fabric is visible—a fine weave with a slight sheen. Her expression is serious, yet engaging, as she speaks to someone unseen just beyond the frame. Close-up on her eyes, showing the intensity of her gaze and the fine lines around them that hint at experience and focus. Her lips are slightly parted, as if mid-sentence. The light catches the subtle highlights in her auburn hair, meticulously styled. Note the slight catch of light on the silver band of her watch. High resolution 4k",
    "seed": 42
  },
  "outputs": [
    {
      "type": "video",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_size": 1843200,
      "width": 1280,
      "height": 720,
      "duration": 5,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `video` | object {url, content_type, file_name, file_size} | Video file produced by generation. |
| `prompt` | string | Text prompt used to generate the video. |
| `seed` | integer | Seed value applied during generation. |

## Related models

- [Wan · v2.2 5b · Text to Image](https://doitong.com/developers/models/wan/v2.2-5b/text-to-image.md) (`wan/v2.2-5b/text-to-image`): $0.016 / image
- [Wan · v2.2 5b · Text to Video · Distill](https://doitong.com/developers/models/wan/v2.2-5b/text-to-video/distill.md) (`wan/v2.2-5b/text-to-video/distill`): $0.08 / video
- [Wan v2.2 5B · Image to Video](https://doitong.com/developers/models/wan/v2.2-5b/image-to-video.md) (`wan/v2.2-5b/image-to-video`): $0.15 / video
- [Wan 3.0 Text to Video](https://doitong.com/developers/models/alibaba/wan-3.0/text-to-video.md) (`alibaba/wan-3.0/text-to-video`): from $0.05 / second
- [FLUX 3 Max Text to Video](https://doitong.com/developers/models/blackforestlabs/flux-3-max/text-to-video.md) (`blackforestlabs/flux-3-max/text-to-video`): from $0.0425 / second of output video
- [Grok Imagine Video 1.5 Text to Video](https://doitong.com/developers/models/xai/grok-imagine-video/v1.5/text-to-video.md) (`xai/grok-imagine-video/v1.5/text-to-video`): from $0.08 / second
- [Kling 3.0 Pro Text to Video](https://doitong.com/developers/models/kling-video/v3/pro/text-to-video.md) (`kling-video/v3/pro/text-to-video`): from $0.112 / second
- [LTX 2.5 Pro Text to Video](https://doitong.com/developers/models/lightricks/ltx-2.5/text-to-video/pro.md) (`lightricks/ltx-2.5/text-to-video/pro`): from $0.12 / second

## Links

- HTML page: https://doitong.com/developers/models/wan/v2.2-5b/text-to-video
- All models and guides for AI agents: https://doitong.com/developers/llms.txt
- OpenAPI 3.1 with this model's typed request body: https://doitong.com/developers/openapi.json?model=wan/v2.2-5b/text-to-video
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/wan/v2.2-5b/text-to-video
