# Wan VACE 14B · Reframe API

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

Recebe um `video_url` e o recompõe para uma `aspect_ratio` diferente (auto, 16:9, 1:1 ou 9:16). O `prompt` é opcional. `zoom_factor` (0 a 0.9) amplia o recorte do quadro e `trim_borders` remove as bordas. Por padrão, a quantidade e a taxa de quadros correspondem à entrada, 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-BR/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 do vídeo; opcionais ao reenquadrar. |
| `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 da quantidade de quadros do vídeo gerado: false usa `num_frames`, enquanto true copia a quantidade de quadros do vídeo de entrada. |
| `num_frames` |  | integer | no | `81` | 17 – 241 | Quantidade de quadros da saída, com intervalo inclusivo de 81–241. |
| `match_input_frames_per_second` |  | boolean | no | `true` |  | Origem da taxa de quadros do vídeo gerado: false usa `frames_per_second`, enquanto true copia a taxa de quadros do vídeo de entrada. |
| `frames_per_second` |  | integer \| null | no | `16` | 5 – 30 | Taxa de quadros do vídeo gerado, aplicada somente quando `match_input_frames_per_second` não é true; os valores aceitos são de 5–30 quadros por segundo. |
| `seed` |  | integer \| null | no |  |  | Seed que torna a geração reproduzível. Defini-lo 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 | Quantidade de etapas de amostragem, trocando um tempo de processamento maior por melhor qualidade à medida que a quantidade aumenta. |
| `guidance_scale` |  | number | no | `5` | 1 – 10 | Intensidade do alinhamento do prompt controlada por orientação sem classificador; aumentar a escala faz com que as imagens geradas sigam o texto mais de perto. |
| `sampler` |  | enum (string) | no | `unipc` | `unipc`, `dpm++`, `euler` | Sampler usado ao gerar o vídeo. |
| `shift` |  | number | no | `5` | 1 – 15 | Configuração de deslocamento aplicada ao gerar o vídeo. |
| `video_url` | `video` | string (video URL) | yes |  |  | Referência de reenquadramento fornecida como URL que aponta para o arquivo de vídeo de origem. |
| `first_frame_url` | `image` | string \| null | no |  |  | Referência opcional do primeiro quadro fornecida por URL para o modelo usar ao processar o vídeo. |
| `last_frame_url` | `end_image` | string \| null | no |  |  | Referência opcional do último quadro fornecida por URL para o modelo usar ao processar o vídeo. |
| `enable_safety_checker` |  | boolean | no | `false` |  | Chave de verificação de segurança cuja configuração desativada exige autorização da conta. Sem essa autorização, toda requisição é verificada independentemente da configuraçã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` | Configuração de aceleração da inferência, com escolha entre 'none' e 'regular': o processamento acelerado oferece uma melhoria substancial de velocidade ao custo 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 gravação do vídeo resultante. |
| `num_interpolated_frames` |  | integer | no | `0` | 0 – 5 | Quantidade de interpolação: 0 deixa os quadros originais sem interpolação; outros valores especificam quantos quadros intermediários gerar entre eles. |
| `temporal_downsample_factor` |  | integer | no | `0` | 0 – 5 | Fator de salto de quadros do vídeo, expresso como um número inteiro, com superamostragem automática aplicada uma vez para cada fator de subamostragem. Use 0 para manter a subamostragem temporal desativada. |
| `enable_auto_downsample` |  | boolean | no | `false` |  | Adaptação automática da quantidade de quadros: ativá-la permite que o modelo processe um vídeo subamostrado temporalmente de duração adequada, com interpolação posterior restaurando a quantidade original de quadros. |
| `auto_downsample_min_fps` |  | number | no | `15` | 1 – 60 | Taxa de quadros mínima, em quadros por segundo, permitida após a redução da amostragem. Para filmagens com pouco movimento, reduzir esse valor permite maior redução da amostragem e sequências mais longas; movimentos muito rápidos podem exigir um valor maior, embora o padrão seja adequado para a maioria dos vídeos. A redução automática da amostragem usa esse limite para buscar o menor fator que preserve os detalhes. |
| `interpolator_model` |  | enum (string) | no | `film` | `rife`, `film` | Seleção do modelo de interpolação de quadros: 'rife' ou 'film'. |
| `transparency_mode` |  | enum (string) | no | `content_aware` | `content_aware`, `white`, `black` | Tratamento da transparência dos quadros inicial e final, determinando como suas regiões transparentes são preenchidas. |
| `return_frames_zip` |  | boolean | no | `false` |  | Controla se um arquivo ZIP contendo todos os quadros gerados também é retornado; ativado quando true. |
| `zoom_factor` |  | number | no | `0` | 0 – 0.9 | Defina o zoom do vídeo como 0 para mantê-lo inalterado. Um fator positivo amplia o vídeo em relação à tela nessa quantidade, recortando as bordas externas. |
| `trim_borders` |  | boolean | no | `true` |  | Controla se as bordas do vídeo são aparadas. |

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} | Arquivo de vídeo reenquadrado produzido pelo modelo. |
| `prompt` | string | Prompt usado para gerar a saída. |
| `seed` | integer | Valor de seed aplicado durante a geração. |
| `frames_zip` | object {url, content_type, file_name, file_size} \| null | Arquivo ZIP contendo todos os quadros do vídeo, retornado 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
