# Wan Motion API

> 구동 동영상의 움직임으로 참조 이미지를 움직이는 캐릭터 애니메이션으로, 포즈 적응 지원

두 입력이 필요합니다. 움직임을 위한 구동 동영상은 `video_url`, 캐릭터 외형을 위한 참조 이미지는 `image_url`로 제공합니다. 선택적 `prompt`로 결과를 안내할 수 있습니다. `adapt_motion`을 켜면 동영상의 포즈를 참조 캐릭터의 신체 비율에 맞추므로 체형이 다를 때 유용합니다. `enhance_identity`는 캐릭터의 정체성을 더 일관되게 유지하도록 참조 이미지를 전처리할 수 있습니다.

- Model id: `wan-motion`
- Made by: Alibaba
- Category: Video to Video
- Output: video
- Price per second of your input video: $0.06 / second of input video (cheapest run $0.06 (60 API credits))
- Run: `POST https://api.doitong.ru/v1/run/wan-motion`
- Quote: `POST https://api.doitong.ru/v1/quote/wan-motion`
- Docs page: https://doitong.com/ko/developers/models/wan-motion

## Pricing

Price: **$0.06 / second of input video**. Price per second of your input 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.75 = 750 API credits (12.5 s input video × $0.06).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.ru/v1/quote/wan-motion` 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 |
|---|---|---|---|---|---|---|
| `video_url` | `video` | string (video URL) | yes |  |  | 움직임 소스로 사용하는 구동 동영상 URL입니다. |
| `image_url` | `image` | string (image URL) | yes |  |  | 캐릭터의 외형을 정의하는 참조 이미지 URL입니다. |
| `prompt` |  | string | no | `` |  | 생성을 지시하는 선택적 텍스트 지침입니다. |
| `seed` |  | integer \| null | no |  |  | 재현 가능한 결과를 위해 무작위성을 제어하는 시드입니다. |
| `acceleration` |  | enum (string) | no | `regular` | `none`, `regular` | 캐싱 기반 생성 가속입니다. 캐싱을 비활성화하려면 'none', 활성화해 더 빠르게 생성하려면 'regular'를 선택합니다. |
| `adapt_motion` |  | boolean | no | `true` |  | 참조 이미지와 구동 동영상의 대상 간 신체 비율 차이에 맞게 움직임을 조정합니다. 활성화하면 구동 동작을 참조 비율에 맞추며, 신체 형태나 크기가 다를 때 권장됩니다. |
| `enhance_identity` |  | boolean | no | `false` |  | 애니메이션 전에 Flux Kontext Edit로 수행하는 참조 이미지 전처리입니다. 인물의 동일성 보존을 개선합니다. |
| `enable_safety_checker` |  | boolean | no | `true` |  | 입력과 출력의 안전성 검사입니다. 승인된 계정만 비활성화할 수 있습니다. true이면 검사를 활성화하며, 권한이 없는 요청은 설정과 관계없이 검사됩니다. |

File parameters (`video`, `image`) 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",
  "image": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
}
```

A fuller example:

```json
{
  "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
  "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
}
```

## 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.ru/v1/run/wan-motion?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",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.ru/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.ru/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-motion?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  }),
});
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.ru/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/wan-motion", 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.ru/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-motion",
      "input": {
        "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
        "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
      },
      "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-motion",
  "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": 750,
    "usd": "0.75",
    "charged": 750,
    "refunded": 0
  },
  "input": {
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  },
  "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
    },
    "prompt": "woman dancing",
    "seed": 42
  },
  "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.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `video` | object {url, content_type, file_name, file_size} | 생성으로 만들어진 동영상 파일입니다. |
| `prompt` | string | 출력 생성에 사용된 프롬프트입니다. |
| `seed` | integer | 생성 중 적용되는 시드 값입니다. |

## Related models

- [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
- [Wan 2.2 VACE Fun A14B · Inpainting](https://doitong.com/developers/models/wan-22-vace-fun-a14b/inpainting.md) (`wan-22-vace-fun-a14b/inpainting`): from $0.05 / second of output video
- [Wan 2.2 VACE Fun A14B · Outpainting](https://doitong.com/developers/models/wan-22-vace-fun-a14b/outpainting.md) (`wan-22-vace-fun-a14b/outpainting`): from $0.05 / second of output video
- [Wan 2.2 VACE Fun A14B · Reframe](https://doitong.com/developers/models/wan-22-vace-fun-a14b/reframe.md) (`wan-22-vace-fun-a14b/reframe`): from $0.05 / second of output video
- [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

## Links

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