# Wan VACE 14B · Reframe API

> Překompozice videa pomocí VACE 14B na nový poměr stran se zoomem a ořezáním okrajů; prompt je volitelný

Přijímá `video_url` a znovu ho komponuje pro jiný `aspect_ratio` (auto, 16:9, 1:1 nebo 9:16). `prompt` je volitelný. `zoom_factor` (0 až 0.9) přibližuje a ořezává snímek a `trim_borders` odstraňuje okraje. Počet snímků a snímková frekvence ve výchozím nastavení odpovídají vstupu a `resolution` je od 240p do 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/cs/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 | `` |  | Textové pokyny pro generování videa; při změně kompozice jsou volitelné. |
| `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` |  | Negativní prompt použitý při generování videa. |
| `match_input_num_frames` |  | boolean | no | `true` |  | Zdroj počtu snímků vygenerovaného videa: false používá `num_frames`, zatímco true kopíruje počet snímků vstupního videa. |
| `num_frames` |  | integer | no | `81` | 17 – 241 | Počet snímků výstupu včetně obou mezních hodnot, v rozsahu 81–241. |
| `match_input_frames_per_second` |  | boolean | no | `true` |  | Zdroj snímkové frekvence vygenerovaného videa: false používá `frames_per_second`, zatímco true kopíruje snímkovou frekvenci vstupního videa. |
| `frames_per_second` |  | integer \| null | no | `16` | 5 – 30 | Snímková frekvence vygenerovaného videa, použitá pouze tehdy, když `match_input_frames_per_second` není true; přijímané hodnoty jsou 5–30 snímků za sekundu. |
| `seed` |  | integer \| null | no |  |  | Seed zajišťující reprodukovatelné generování. Nastavení na None vybere seed náhodně. |
| `resolution` |  | enum (string) | no | `auto` | `auto`, `240p`, `360p`, `480p`, `580p`, `720p` | Rozlišení výstupního videa. |
| `aspect_ratio` |  | enum (string) | no | `auto` | `auto`, `16:9`, `1:1`, `9:16` | Poměr stran výsledného videa. |
| `num_inference_steps` |  | integer | no | `30` | 2 – 50 | Počet vzorkovacích kroků; vyšší počet znamená delší zpracování, ale lepší kvalitu. |
| `guidance_scale` |  | number | no | `5` | 1 – 10 | Síla zarovnání promptu řízená pomocí classifier-free guidance; zvýšení škály vede vygenerované obrázky k přesnějšímu dodržení textu. |
| `sampler` |  | enum (string) | no | `unipc` | `unipc`, `dpm++`, `euler` | Sampler použitý při generování videa. |
| `shift` |  | number | no | `5` | 1 – 15 | Nastavení posunu použité při generování videa. |
| `video_url` | `video` | string (video URL) | yes |  |  | Reference pro změnu kompozice zadaná jako URL odkazující na soubor zdrojového videa. |
| `first_frame_url` | `image` | string \| null | no |  |  | Volitelná reference prvního snímku zadaná pomocí URL, kterou má model použít při zpracování videa. |
| `last_frame_url` | `end_image` | string \| null | no |  |  | Volitelná reference posledního snímku zadaná pomocí URL, kterou má model použít při zpracování videa. |
| `enable_safety_checker` |  | boolean | no | `false` |  | Přepínač bezpečnostní kontroly, jehož vypnutí vyžaduje autorizaci účtu. Bez této autorizace se kontroluje každý požadavek bez ohledu na nastavení; true kontrolu povolí. |
| `enable_prompt_expansion` |  | boolean | no | `false` |  | Určuje, zda je povoleno rozšíření promptu. |
| `acceleration` |  | enum (string) \| null | no | `regular` | `none`, `low`, `regular` | Nastavení urychlení inference s volbou 'none' nebo 'regular': urychlené zpracování výrazně zvyšuje rychlost za cenu velmi malé změny výstupu. |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | Úroveň kvality výsledného videa. |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | Režim zápisu výsledného videa. |
| `num_interpolated_frames` |  | integer | no | `0` | 0 – 5 | Počet interpolací: 0 ponechá původní snímky bez interpolace; ostatní hodnoty určují počet mezilehlých snímků vytvořených mezi nimi. |
| `temporal_downsample_factor` |  | integer | no | `0` | 0 – 5 | Faktor vynechávání snímků videa vyjádřený celým číslem; pro každý faktor podvzorkování se jednou použije automatické převzorkování. Hodnota 0 ponechá časové podvzorkování vypnuté. |
| `enable_auto_downsample` |  | boolean | no | `false` |  | Automatické přizpůsobení počtu snímků: povolení umožní modelu zpracovat časově podvzorkované video vhodné délky a následná interpolace obnoví původní počet snímků. |
| `auto_downsample_min_fps` |  | number | no | `15` | 1 – 60 | Minimální snímková frekvence ve snímcích za sekundu povolená po podvzorkování. U záběrů s malým pohybem umožní snížení této hodnoty větší podvzorkování a delší sekvence; velmi rychlý pohyb může vyžadovat vyšší hodnotu, výchozí hodnota však vyhovuje většině videí. Automatické podvzorkování používá tento práh k nalezení nejnižšího faktoru, který zachová detaily. |
| `interpolator_model` |  | enum (string) | no | `film` | `rife`, `film` | Volba modelu interpolace snímků: buď 'rife', nebo 'film'. |
| `transparency_mode` |  | enum (string) | no | `content_aware` | `content_aware`, `white`, `black` | Zpracování průhlednosti počátečních a koncových snímků, určující, jak se vyplní jejich průhledné oblasti. |
| `return_frames_zip` |  | boolean | no | `false` |  | Určuje, zda se vrátí také archiv ZIP obsahující každý vygenerovaný snímek; aktivováno při hodnotě true. |
| `zoom_factor` |  | number | no | `0` | 0 – 0.9 | Nastavte zoom videa na 0, aby zůstalo beze změny. Kladný faktor video o danou hodnotu zvětší vzhledem k plátnu a ořízne vnější okraje. |
| `trim_borders` |  | boolean | no | `true` |  | Určuje, zda se oříznou okraje videa. |

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} | Soubor videa po změně kompozice vytvořený modelem. |
| `prompt` | string | Prompt použitý k vygenerování výstupu. |
| `seed` | integer | Hodnota seedu použitá při generování. |
| `frames_zip` | object {url, content_type, file_name, file_size} \| null | Archiv ZIP obsahující každý snímek videa, vrácený na vyžádání. |

## 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
