# Wan 2.7 Reference to Video API

> Membuat video yang mempertahankan subjek dari gambar atau klip referensi, dengan opsi multi-subjek dan multi-shot

Menghasilkan video dari prompt teks wajib serta gambar referensi (`reference_image_urls`) dan video referensi (`reference_video_urls`) yang membawa tampilan karakter atau objek. Beberapa referensi dapat digabungkan untuk adegan multi-subjek. Pilih dari lima rasio aspek, 720p atau 1080p, dan durasi 2 hingga 10 detik. Atur `multi_shots` ke true untuk membagi hasil menjadi beberapa shot, bukan satu pengambilan kontinu.

- Model id: `wan/v2.7/reference-to-video`
- Made by: Alibaba
- Category: Reference to Video
- Output: video
- Price per second of your output video: $0.10 / second of output video (cheapest run $0.10 (100 API credits))
- Run: `POST https://api.doitong.com/v1/run/wan/v2.7/reference-to-video`
- Quote: `POST https://api.doitong.com/v1/quote/wan/v2.7/reference-to-video`
- Docs page: https://doitong.com/id/developers/models/wan/v2.7/reference-to-video

## Pricing

Price: **$0.10 / second of output video**. 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.

The full example input below costs $0.50 = 500 API credits (5 s output video × $0.10).

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/v2.7/reference-to-video` 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 | yes |  | ≥ 1 characters | Deskripsi video yang akan dibuat, maksimal 5000 karakter. |
| `reference_image_urls` | `images` | array of image URL \| null | no |  |  | URL gambar yang menentukan tampilan karakter atau objek, dengan setiap file dibatasi hingga 20 MB. Untuk membuat beberapa subjek, berikan beberapa gambar referensi. |
| `reference_video_urls` |  | array of video URL \| null | no |  |  | URL video yang menentukan tampilan dan gerakan karakter atau objek; memberikan beberapa video memungkinkan pembuatan dengan beberapa subjek. Setiap file harus berukuran maksimal 100 MB dan berdurasi maksimal 30 detik. |
| `negative_prompt` |  | string \| null | no |  |  | Konten yang harus dikecualikan dari video, dibatasi hingga 500 karakter. |
| `aspect_ratio` |  | enum (string) | no | `16:9` | `16:9`, `9:16`, `1:1`, `4:3`, `3:4` | Rasio aspek video hasil. |
| `resolution` |  | enum (string) | no | `1080p` | `720p`, `1080p` | Tingkat resolusi untuk video hasil. |
| `duration` |  | enum (integer) | no | `5` | `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `10` | Durasi video yang dibuat, dalam detik, dari 2 hingga 10. |
| `multi_shots` |  | boolean | no | `false` |  | Kontrol segmentasi bidikan: bawaan false menghasilkan satu bidikan kontinu, sedangkan true mengaktifkan segmentasi cerdas menjadi beberapa bidikan. |
| `seed` |  | integer \| null | no |  |  | Seed acak untuk memungkinkan hasil yang dapat direproduksi, dari 0 hingga 2147483647. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Moderasi input dan output, diberlakukan pada setiap permintaan kecuali akun berwenang menonaktifkannya dan opsi ini dimatikan. |

File parameters (`images`, `reference_video_urls`) 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
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
}
```

A fuller example:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
}
```

## 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/v2.7/reference-to-video?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  }'

# 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/v2.7/reference-to-video?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  }),
});
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 = {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/wan/v2.7/reference-to-video", 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/v2.7/reference-to-video",
      "input": {
        "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
      },
      "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/v2.7/reference-to-video",
  "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": 500,
    "usd": "0.50",
    "charged": 500,
    "refunded": 0
  },
  "input": {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  },
  "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
    },
    "seed": 42,
    "actual_prompt": "string"
  },
  "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} | File video yang dihasilkan oleh pembuatan. |
| `seed` | integer | Nilai seed yang diterapkan selama pembuatan. |
| `actual_prompt` | string \| null | Prompt yang benar-benar diterapkan saat penulisan ulang prompt diaktifkan. |

## Related models

- [Wan Text to Video](https://doitong.com/developers/models/wan/v2.7/text-to-video.md) (`wan/v2.7/text-to-video`): from $0.10 / second
- [Wan · v2.7 · Image to Video](https://doitong.com/developers/models/wan/v2.7/image-to-video.md) (`wan/v2.7/image-to-video`): from $0.10 / second
- [Wan · v2.7 · Edit Video](https://doitong.com/developers/models/wan/v2.7/edit-video.md) (`wan/v2.7/edit-video`): from $0.10 / second of output video
- [Wan 3.0 Reference to Video](https://doitong.com/developers/models/alibaba/wan-3.0/reference-to-video.md) (`alibaba/wan-3.0/reference-to-video`): from $0.05 / second
- [Seedance 2.0 Fast Reference to Video](https://doitong.com/developers/models/bytedance/seedance-2.0/fast/reference-to-video.md) (`bytedance/seedance-2.0/fast/reference-to-video`): from $0.113 / second
- [Seedance 2.0 Reference to Video](https://doitong.com/developers/models/bytedance/seedance-2.0/reference-to-video.md) (`bytedance/seedance-2.0/reference-to-video`): from $0.141 / second
- [Alibaba V2.6 · Reference to Video · Flash](https://doitong.com/developers/models/wan/v2.6/reference-to-video/flash.md) (`wan/v2.6/reference-to-video/flash`): from $0.05 / second of output video
- [Happy Horse 1.1 Reference to Video](https://doitong.com/developers/models/alibaba/happy-horse/v1.1/reference-to-video.md) (`alibaba/happy-horse/v1.1/reference-to-video`): from $0.14 / second

## Links

- HTML page: https://doitong.com/developers/models/wan/v2.7/reference-to-video
- 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/v2.7/reference-to-video
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/wan/v2.7/reference-to-video
