# 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.com/v1/run/wan-vace-14b/reframe`
- Quote: `POST https://api.doitong.com/v1/quote/wan-vace-14b/reframe`
- Docs page: https://doitong.com/ja/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.com/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 | classifier-free guidanceで制御するプロンプト整合性の強度。スケールを上げると、生成画像がテキストにより忠実になります。 |
| `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 | 動画のフレームスキップ係数。整数で指定し、ダウンサンプリング係数ごとに1回、自動アップサンプリングが適用されます。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.com/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.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-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.com/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.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-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.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, 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.com/v1/models/wan-vace-14b/reframe
