# Wan VACE 14B · Reframe API

> VACE 14B ändrar bildutsnittet i en video till ett nytt bildförhållande, med zoom och beskärning av kanter; prompt valfri

Tar en `video_url` och komponerar om den för ett annat `aspect_ratio` (auto, 16:9, 1:1 eller 9:16). `prompt` är valfri. `zoom_factor` (0 till 0.9) beskär inåt och `trim_borders` tar bort kanter. Antal bildrutor och bildfrekvens matchar som standard indata, och `resolution` går från 240p till 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/sv/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 | `` |  | Textinstruktioner som styr videogenereringen; valfria vid omramning. |
| `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` |  | Negativ prompt som används vid videogenerering. |
| `match_input_num_frames` |  | boolean | no | `true` |  | Källa för den genererade videons antal bildrutor: false använder `num_frames`, medan true kopierar indatavideons antal bildrutor. |
| `num_frames` |  | integer | no | `81` | 17 – 241 | Antal bildrutor i utdata, med ett inkluderande intervall på 81–241. |
| `match_input_frames_per_second` |  | boolean | no | `true` |  | Källa för den genererade videons bildfrekvens: false använder `frames_per_second`, medan true kopierar indatavideons bildfrekvens. |
| `frames_per_second` |  | integer \| null | no | `16` | 5 – 30 | Bildfrekvens för den genererade videon, används endast när `match_input_frames_per_second` inte är true; tillåtna värden är 5–30 bildrutor per sekund. |
| `seed` |  | integer \| null | no |  |  | Seed som gör genereringen reproducerbar. Om det ställs in på None väljs ett seed slumpmässigt. |
| `resolution` |  | enum (string) | no | `auto` | `auto`, `240p`, `360p`, `480p`, `580p`, `720p` | Upplösning för utdatafilens video. |
| `aspect_ratio` |  | enum (string) | no | `auto` | `auto`, `16:9`, `1:1`, `9:16` | Bildförhållande för den resulterande videon. |
| `num_inference_steps` |  | integer | no | `30` | 2 – 50 | Antal samplingssteg; längre bearbetningstid ger bättre kvalitet när antalet ökar. |
| `guidance_scale` |  | number | no | `5` | 1 – 10 | Styrka för promptanpassning via classifier-free guidance; en ökad skala får genererade bilder att följa texten närmare. |
| `sampler` |  | enum (string) | no | `unipc` | `unipc`, `dpm++`, `euler` | Samplare som används vid videogenerering. |
| `shift` |  | number | no | `5` | 1 – 15 | Skiftinställning som används vid videogenerering. |
| `video_url` | `video` | string (video URL) | yes |  |  | Referens för omramning som tillhandahålls som en URL som pekar på källvideofilen. |
| `first_frame_url` | `image` | string \| null | no |  |  | Valfri referens för den första bildrutan som tillhandahålls via URL för modellen att använda vid bearbetning av videon. |
| `last_frame_url` | `end_image` | string \| null | no |  |  | Valfri referens för den sista bildrutan som tillhandahålls via URL för modellen att använda vid bearbetning av videon. |
| `enable_safety_checker` |  | boolean | no | `false` |  | Säkerhetskontroll med en avstängd inställning som kräver kontoauktorisering. Utan sådan auktorisering kontrolleras varje begäran oavsett inställningen; true aktiverar kontrollen. |
| `enable_prompt_expansion` |  | boolean | no | `false` |  | Styr om promptutökning är aktiverad. |
| `acceleration` |  | enum (string) \| null | no | `regular` | `none`, `low`, `regular` | Inställning för inferensacceleration, med valet 'none' eller 'regular': accelererad bearbetning ger en betydande hastighetsökning på bekostnad av en mycket liten förändring av utdata. |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | Kvalitetsnivå för den resulterande videon. |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | Skrivläge för den resulterande videon. |
| `num_interpolated_frames` |  | integer | no | `0` | 0 – 5 | Interpoleringsantal: 0 lämnar originalbildrutorna ointerpolerade; andra värden anger hur många mellanliggande bildrutor som ska genereras mellan dem. |
| `temporal_downsample_factor` |  | integer | no | `0` | 0 – 5 | Faktor för överhoppning av videobildrutor, uttryckt som ett heltal, med automatisk uppsampling en gång per nedsamplingsfaktor. Använd 0 för att lämna temporal nedsampling inaktiverad. |
| `enable_auto_downsample` |  | boolean | no | `false` |  | Automatisk anpassning av bildruteantal: när detta aktiveras kan modellen bearbeta en temporalt nedsamplad video med lämplig längd, varefter interpolering återställer det ursprungliga bildruteantalet. |
| `auto_downsample_min_fps` |  | number | no | `15` | 1 – 60 | Minsta bildfrekvens, i bildrutor per sekund, som tillåts efter nedsampling. För material med liten rörelse tillåter ett lägre värde större nedsampling och längre sekvenser; mycket snabba rörelser kan kräva ett högre värde, även om standardvärdet passar de flesta videor. Automatisk nedsampling använder denna tröskel för att hitta den lägsta faktor som bevarar detaljer. |
| `interpolator_model` |  | enum (string) | no | `film` | `rife`, `film` | Val av modell för bildruteinterpolering: antingen 'rife' eller 'film'. |
| `transparency_mode` |  | enum (string) | no | `content_aware` | `content_aware`, `white`, `black` | Transparenshantering för start- och slutbildrutorna, som avgör hur deras transparenta områden fylls. |
| `return_frames_zip` |  | boolean | no | `false` |  | Styr om ett ZIP-arkiv som innehåller varje genererad bildruta också ska returneras; aktiveras när true. |
| `zoom_factor` |  | number | no | `0` | 0 – 0.9 | Ställ in videons zoom till 0 för att lämna den oförändrad. En positiv faktor förstorar videon i förhållande till arbetsytan med den mängden och beskär de yttre kanterna. |
| `trim_borders` |  | boolean | no | `true` |  | Styr om videokanter ska beskäras. |

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} | Omramad videofil som producerats av modellen. |
| `prompt` | string | Prompten som användes för att generera utdata. |
| `seed` | integer | Seed-värde som tillämpas under genereringen. |
| `frames_zip` | object {url, content_type, file_name, file_size} \| null | ZIP-arkiv som innehåller varje videobildruta och returneras när det begärs. |

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