# Wan VACE 14B · Reframe API

> Reenquadramento VACE 14B de um vídeo para uma nova proporção, com zoom e corte de margens; prompt opcional

Aceita um `video_url` e recompõe-o para uma `aspect_ratio` diferente (auto, 16:9, 1:1 ou 9:16). O `prompt` é opcional. `zoom_factor` (0 a 0.9) aplica um recorte ao fotograma e `trim_borders` remove as margens. A contagem e a taxa de fotogramas correspondem à entrada por predefinição, e `resolution` vai de 240p a 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/pt-PT/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 | `` |  | Instruções de texto que orientam a geração de vídeo; opcionais ao alterar o enquadramento. |
| `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` |  | Prompt negativo aplicado ao gerar um vídeo. |
| `match_input_num_frames` |  | boolean | no | `true` |  | Origem do número de frames do vídeo gerado: false utiliza `num_frames`, enquanto true copia o número de frames do vídeo de entrada. |
| `num_frames` |  | integer | no | `81` | 17 – 241 | Número de frames da saída, com um intervalo inclusivo de 81–241. |
| `match_input_frames_per_second` |  | boolean | no | `true` |  | Origem da taxa de frames do vídeo gerado: false utiliza `frames_per_second`, enquanto true copia a taxa de frames do vídeo de entrada. |
| `frames_per_second` |  | integer \| null | no | `16` | 5 – 30 | Taxa de frames do vídeo gerado, aplicada apenas quando `match_input_frames_per_second` não é true; os valores aceites são 5–30 frames por segundo. |
| `seed` |  | integer \| null | no |  |  | Seed que torna a geração reproduzível. Defini-la como None seleciona uma seed aleatoriamente. |
| `resolution` |  | enum (string) | no | `auto` | `auto`, `240p`, `360p`, `480p`, `580p`, `720p` | Resolução do vídeo de saída. |
| `aspect_ratio` |  | enum (string) | no | `auto` | `auto`, `16:9`, `1:1`, `9:16` | Proporção do vídeo resultante. |
| `num_inference_steps` |  | integer | no | `30` | 2 – 50 | Número de passos de amostragem, trocando um tempo de processamento mais longo por melhor qualidade à medida que o número aumenta. |
| `guidance_scale` |  | number | no | `5` | 1 – 10 | Intensidade do alinhamento do prompt, controlada através de orientação sem classificador; aumentar a escala incentiva as imagens geradas a seguir mais de perto o texto. |
| `sampler` |  | enum (string) | no | `unipc` | `unipc`, `dpm++`, `euler` | Sampler utilizado ao gerar o vídeo. |
| `shift` |  | number | no | `5` | 1 – 15 | Definição de deslocamento aplicada ao gerar o vídeo. |
| `video_url` | `video` | string (video URL) | yes |  |  | Referência para alterar o enquadramento, fornecida como URL que aponta para o ficheiro de vídeo de origem. |
| `first_frame_url` | `image` | string \| null | no |  |  | Referência opcional do primeiro frame, fornecida por URL, para o modelo utilizar ao processar o vídeo. |
| `last_frame_url` | `end_image` | string \| null | no |  |  | Referência opcional do último frame, fornecida por URL, para o modelo utilizar ao processar o vídeo. |
| `enable_safety_checker` |  | boolean | no | `false` |  | Interruptor de verificação de segurança cuja desativação exige autorização da conta. Sem essa autorização, todos os pedidos são verificados independentemente da definição; true ativa o verificador. |
| `enable_prompt_expansion` |  | boolean | no | `false` |  | Controla se a expansão do prompt está ativada. |
| `acceleration` |  | enum (string) \| null | no | `regular` | `none`, `low`, `regular` | Definição de aceleração da inferência, com a opção 'none' ou 'regular': o processamento acelerado oferece uma melhoria substancial da velocidade, à custa de uma alteração muito pequena na saída. |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | Nível de qualidade do vídeo resultante. |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | Modo de escrita do vídeo resultante. |
| `num_interpolated_frames` |  | integer | no | `0` | 0 – 5 | Número de interpolações: 0 deixa os frames originais sem interpolação; os outros valores especificam quantos frames intermédios gerar entre eles. |
| `temporal_downsample_factor` |  | integer | no | `0` | 0 – 5 | Fator de omissão de frames do vídeo, expresso como um número inteiro, com sobreamostragem automática aplicada uma vez por cada fator de subamostragem. Utilize 0 para manter a subamostragem temporal desativada. |
| `enable_auto_downsample` |  | boolean | no | `false` |  | Adaptação automática do número de frames: ativá-la permite ao modelo processar um vídeo subamostrado temporalmente com uma duração adequada, restaurando depois o número original de frames através de interpolação. |
| `auto_downsample_min_fps` |  | number | no | `15` | 1 – 60 | Taxa mínima de frames, em frames por segundo, permitida após a redução da amostragem. Para filmagens com pouco movimento, reduzir este valor permite uma maior redução da amostragem e sequências mais longas; movimentos muito rápidos podem exigir um valor superior, embora a predefinição seja adequada para a maioria dos vídeos. A redução automática da amostragem utiliza este limiar para procurar o fator mais baixo que preserve os detalhes. |
| `interpolator_model` |  | enum (string) | no | `film` | `rife`, `film` | Seleção do modelo de interpolação de frames: 'rife' ou 'film'. |
| `transparency_mode` |  | enum (string) | no | `content_aware` | `content_aware`, `white`, `black` | Tratamento da transparência dos frames inicial e final, determinando como são preenchidas as respetivas regiões transparentes. |
| `return_frames_zip` |  | boolean | no | `false` |  | Controla se também é devolvido um arquivo ZIP que contém todos os frames gerados; ativado quando true. |
| `zoom_factor` |  | number | no | `0` | 0 – 0.9 | Defina o zoom do vídeo como 0 para o deixar inalterado. Um fator positivo amplia o vídeo relativamente à tela nessa quantidade, recortando as extremidades exteriores. |
| `trim_borders` |  | boolean | no | `true` |  | Controla se as margens do vídeo são cortadas. |

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} | Ficheiro de vídeo com o enquadramento alterado, produzido pelo modelo. |
| `prompt` | string | Prompt utilizado para gerar a saída. |
| `seed` | integer | Valor da seed aplicado durante a geração. |
| `frames_zip` | object {url, content_type, file_name, file_size} \| null | Arquivo ZIP que contém todos os frames do vídeo, devolvido quando solicitado. |

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