# Wan VACE 14B API

> 通用 VACE 14B 视频模型：选择深度、姿态、局部重绘、扩图或重构任务，并提供多种可选输入

通过 `task` 选择的多用途视频生成和编辑模型：深度图、姿态、局部重绘、扩图 或 reframe。输入包括源 `video_url`、蒙版视频或图像、`ref_image_urls` 以及首帧和末帧 URL。`num_frames` 范围为 17 到 241，`resolution` 范围为 240p 到 720p。可选择 unipc、dpm++ 和 euler 采样器。

- Model id: `wan-vace-14b`
- Made by: Alibaba
- Category: Video to Video
- Output: video
- Price per second of your output video: from $0.04 / second of output video (cheapest run $0.04 (40 API credits))
- Run: `POST https://api.doitong.ru/v1/run/wan-vace-14b`
- Quote: `POST https://api.doitong.ru/v1/quote/wan-vace-14b`
- Docs page: https://doitong.com/zh/developers/models/wan-vace-14b

## Pricing

Price: **from $0.04 / second of output video** (the lowest tier; the quote prices your exact input). Price per second of your output video: the input files are measured before the run (length, resolution, frame rate). The quote measures the same files and is exactly what the run charges.

Price by tier:

- 240p: $0.04 / second of output video
- 360p: $0.04 / second of output video
- 480p: $0.04 / second of output video
- 580p: $0.06 / second of output video
- auto: $0.08 / second of output video
- 720p: $0.08 / second of output video

The full example input below costs $0.405 = 405 API credits (5.0625 s output video × $0.08 (auto)).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.ru/v1/quote/wan-vace-14b` 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

Send either the canonical name or the native field name (not both). Canonical names are the same across models.

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `prompt` |  | string | yes |  |  | 指导视频生成的文本指令。 |
| `negative_prompt` |  | string | no | `letterboxing, borders, black bars, bright colors, overexposed, static, blurred details, subtitles, style, artwork, painting, picture, still, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, malformed limbs, fused fingers, still picture, cluttered background, three legs, many people in the background, walking backwards` |  | 生成视频时应用的负面提示词。 |
| `match_input_num_frames` |  | boolean | no | `false` |  | 生成视频帧数的来源：false 使用 `num_frames`，true 复制输入视频的帧数。 |
| `num_frames` |  | integer | no | `81` | 17 – 241 | 输出帧数，包含范围 81–241。 |
| `match_input_frames_per_second` |  | boolean | no | `false` |  | 生成视频帧率的来源：false 使用 `frames_per_second`，true 复制输入视频的帧率。 |
| `frames_per_second` |  | integer \| null | no | `16` | 5 – 30 | 生成视频的帧率；仅当 `match_input_frames_per_second` 不为 true 时应用；可接受值为每秒 5–30 帧。 |
| `task` |  | enum (string) | no | `depth` | `depth`, `pose`, `inpainting`, `outpainting`, `reframe` | 模型执行的任务类型。 |
| `seed` |  | integer \| null | no |  |  | 使生成结果可复现的种子。设置为 None 时会随机选择种子。 |
| `resolution` |  | enum (string) | no | `auto` | `auto`, `240p`, `360p`, `480p`, `580p`, `720p` | 输出视频的分辨率。 |
| `aspect_ratio` |  | enum (string) | no | `auto` | `auto`, `16:9`, `1:1`, `9:16` | 结果视频的宽高比。 |
| `num_inference_steps` |  | integer | no | `30` | 2 – 50 | 采样步数；步数越多，处理时间越长，质量越高。 |
| `guidance_scale` |  | number | no | `5` | 1 – 10 | 通过无分类器引导控制的提示词对齐强度；提高该比例会使生成的图像更贴合文本。 |
| `sampler` |  | enum (string) | no | `unipc` | `unipc`, `dpm++`, `euler` | 生成视频时使用的采样器。 |
| `shift` |  | number | no | `5` | 1 – 15 | 生成视频时应用的偏移设置。 |
| `video_url` | `video` | string (video URL) \| null | no |  |  | 模型的视频参考，在提供时通过指向源文件的 URL 传入。 |
| `mask_video_url` |  | string (video URL) \| null | no |  |  | 模型的蒙版参考，在提供时通过指向源文件的 URL 传入。 |
| `mask_image_url` |  | string (image URL) \| null | no |  |  | 通过文件 URL 提供的引导蒙版；存在时优先于蒙版视频 URL。模型使用此蒙版指导蒙版视频的创建。 |
| `ref_image_urls` |  | array of image URL | no |  |  | 可选的源图像 URL，为模型提供要使用的参考图像。 |
| `first_frame_url` | `image` | string \| null | no |  |  | 通过 URL 提供的可选首帧参考，供模型处理视频时使用。 |
| `last_frame_url` | `end_image` | string \| null | no |  |  | 通过 URL 提供的可选尾帧参考，供模型处理视频时使用。 |
| `enable_safety_checker` |  | boolean | no | `false` |  | 安全检查开关，关闭此设置需要账户授权。没有该授权时，无论设置如何，每个请求都会经过检查；true 启用检查器。 |
| `enable_prompt_expansion` |  | boolean | no | `false` |  | 控制是否启用提示词扩展。 |
| `preprocess` |  | boolean | no | `false` |  | 控制输入视频的预处理。 |
| `acceleration` |  | enum (string) \| null | no | `regular` | `none`, `low`, `regular` | 推理加速设置，可选择 'none' 或 'regular'：加速处理可显著提升速度，但会导致输出产生非常轻微的变化。 |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | 结果视频的质量级别。 |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | 结果视频的写入模式。 |
| `num_interpolated_frames` |  | integer | no | `0` | 0 – 5 | 插帧数量：0 表示不对原始帧进行插帧；其他值指定在相邻帧之间生成的中间帧数。 |
| `temporal_downsample_factor` |  | integer | no | `0` | 0 – 5 | 视频跳帧因子，以整数表示；每个降采样因子会自动执行一次升采样。使用 0 可禁用时间降采样。 |
| `enable_auto_downsample` |  | boolean | no | `false` |  | 自动调整帧数：启用后，模型会处理时长合适的时间降采样视频，随后通过插帧恢复原始帧数。 |
| `auto_downsample_min_fps` |  | number | no | `15` | 1 – 60 | 下采样后允许的最低帧率，单位为帧/秒。对于低运动量素材，降低此值可以进行更大幅度的下采样并生成更长序列；非常快的运动可能需要更高的值，但默认值适用于大多数视频。自动下采样会使用此阈值来寻找能够保留细节的最低比例。 |
| `interpolator_model` |  | enum (string) | no | `film` | `rife`, `film` | 帧插值模型选择：'rife' 或 'film'。 |
| `transparency_mode` |  | enum (string) | no | `content_aware` | `content_aware`, `white`, `black` | 首帧和尾帧的透明度处理，决定如何填充其中的透明区域。 |
| `return_frames_zip` |  | boolean | no | `false` |  | 控制是否同时返回包含每个生成帧的 ZIP 压缩包；为 true 时启用。 |

File parameters (`video`, `mask_video_url`, `mask_image_url`, `ref_image_urls`) take a public `https://` URL, a `data:` URI up to 10 MB, or the `file_url` of an upload from `POST /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.ru/v1/run/wan-vace-14b?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.ru/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.ru/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-vace-14b?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.ru/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-vace-14b", 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.ru/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-vace-14b",
      "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-vace-14b",
  "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": 405,
    "usd": "0.405",
    "charged": 405,
    "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,
      "width": 1024,
      "height": 768,
      "fps": 1.0,
      "duration": 5,
      "num_frames": 1
    },
    "prompt": "string",
    "seed": 42,
    "frames_zip": {
      "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
    }
  },
  "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.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `video` | object {url, content_type, file_name, file_size, width, height, fps, duration, num_frames} | 生成得到的视频文件。 |
| `prompt` | string | 用于生成输出的提示词。 |
| `seed` | integer | 生成期间应用的种子值。 |
| `frames_zip` | object {url, content_type, file_name, file_size} \| null | 包含每个视频帧的 ZIP 压缩包，在请求时返回。 |

## Related models

- [Wan VACE 14B · Depth](https://doitong.com/developers/models/wan-vace-14b/depth.md) (`wan-vace-14b/depth`): from $0.04 / second of output video
- [Wan VACE 14B · Inpainting](https://doitong.com/developers/models/wan-vace-14b/inpainting.md) (`wan-vace-14b/inpainting`): from $0.04 / second of output video
- [Wan VACE 14B · Outpainting](https://doitong.com/developers/models/wan-vace-14b/outpainting.md) (`wan-vace-14b/outpainting`): from $0.04 / second of output video
- [Wan VACE 14B · Pose](https://doitong.com/developers/models/wan-vace-14b/pose.md) (`wan-vace-14b/pose`): from $0.04 / second of output video
- [Wan VACE 14B · Reframe](https://doitong.com/developers/models/wan-vace-14b/reframe.md) (`wan-vace-14b/reframe`): from $0.04 / second of output video
- [Happy Horse Video Edit](https://doitong.com/developers/models/alibaba/happy-horse/video-edit.md) (`alibaba/happy-horse/video-edit`): from $0.28 / second of input video
- [Wan 2.1 VACE Long Reframe](https://doitong.com/developers/models/wan-vace-apps/long-reframe.md) (`wan-vace-apps/long-reframe`): from $0.04 / 2 seconds of input video
- [Wan 2.2 VACE Fun A14B · Depth](https://doitong.com/developers/models/wan-22-vace-fun-a14b/depth.md) (`wan-22-vace-fun-a14b/depth`): from $0.05 / second of output video

## Links

- HTML page: https://doitong.com/developers/models/wan-vace-14b
- 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-vace-14b
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.ru/v1/models/wan-vace-14b
