# Wan VACE 14B · Reframe API

> VACE 14B 视频重构为新宽高比，支持缩放和裁剪边框；提示词可选

接收 `video_url`，并根据不同的 `aspect_ratio`（auto、16:9、1:1 或 9:16）重新合成视频。`prompt` 可选。`zoom_factor`（0 到 0.9）放大裁剪画面，`trim_borders` 移除边框。默认保持输入的视频帧数和帧率，`resolution` 范围为 240p 到 720p。

- Model id: `wan-vace-14b/reframe`
- 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/reframe`
- Quote: `POST https://api.doitong.ru/v1/quote/wan-vace-14b/reframe`
- Docs page: https://doitong.com/zh/developers/models/wan-vace-14b/reframe

## 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 $1.50 = 1500 API credits (18.75 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/reframe` 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 | no | `` |  | 指导视频生成的文本指令；重新构图时可选。 |
| `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 | `true` |  | 生成视频帧数的来源：false 使用 `num_frames`，true 复制输入视频的帧数。 |
| `num_frames` |  | integer | no | `81` | 17 – 241 | 输出帧数，包含范围 81–241。 |
| `match_input_frames_per_second` |  | boolean | no | `true` |  | 生成视频帧率的来源：false 使用 `frames_per_second`，true 复制输入视频的帧率。 |
| `frames_per_second` |  | integer \| null | no | `16` | 5 – 30 | 生成视频的帧率；仅当 `match_input_frames_per_second` 不为 true 时应用；可接受值为每秒 5–30 帧。 |
| `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) | yes |  |  | 重新构图参考，通过指向源视频文件的 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` |  | 控制是否启用提示词扩展。 |
| `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 时启用。 |
| `zoom_factor` |  | number | no | `0` | 0 – 0.9 | 将视频缩放设为 0 可保持不变。正数倍数会使视频相对于画布按该值放大，并裁剪掉外边缘。 |
| `trim_borders` |  | boolean | no | `true` |  | 控制是否裁剪视频边缘。 |

File parameters (`video`) 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
{
  "video": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
}
```

A fuller example:

```json
{
  "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
}
```

## 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/reframe?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  }'

# 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/reframe?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  }),
});
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 = {
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/wan-vace-14b/reframe", 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/reframe",
      "input": {
        "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
      },
      "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/reframe",
  "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": 1500,
    "usd": "1.50",
    "charged": 1500,
    "refunded": 0
  },
  "input": {
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  },
  "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](https://doitong.com/developers/models/wan-vace-14b.md) (`wan-vace-14b`): from $0.04 / second of output video
- [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
- [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/reframe
- 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/reframe
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.ru/v1/models/wan-vace-14b/reframe
