# Wan 3.0 Pro (https://funnyai.io/docs/wan-3-0-pro)





Wan 3.0 Pro accepts text, images and reference media and outputs at 1080p, 2K or 4K. Use the Pro endpoint for these resolution choices; 480p and 720p are not supported. [Model details and Playground](/models/wan-3-0-pro).

## Connect to Funny AI [#connect-to-wan-api]

Use `https://api.wanapi.app` as the API base URL. Create a key in [API key settings](/settings/apikeys) and send it as `Authorization: Bearer YOUR_API_KEY`. Keep keys on your server. Playground uses your website session and charges the same account balance; it does not require pasting a key into the browser.

Access requires an enabled account with sufficient balance. See [pricing](/pricing) for current rates. Each model has its own endpoint and [model page](/models).

`GET /v1/models` lists the models available to your key. Choosing a higher resolution does not automatically change your model.

| Setting      | Wan 3.0 Pro                                                           |
| ------------ | --------------------------------------------------------------------- |
| Model ID     | `w3.0-video-pro`                                                      |
| `resolution` | `1080p`, `2k`, `4k`; default: `1080p`.                                |
| `duration`   | 2–30 output seconds, or `-1` for automatic duration; default: `5`.    |
| `ratio`      | `adaptive`, `16:9`, `4:3`, `1:1`, `3:4`, `9:16`; default: `adaptive`. |
| `audio`      | `true` by default. `false` does not reduce the rate.                  |

The [shared request fields](#request-fields) describe all 14 native fields, media limits and input combinations. This model uses `w3.0-video-pro` in the URL for native requests and as the `model` value in [Responses requests](#synchronous-and-background-responses).

## Submit a Wan 3.0 Pro task [#submit-a-wan-30-pro-task]

This is a two-second text-to-video request at this model's lowest resolution. Set `WAN_API_KEY` to your key on the server. The model is selected by the URL; do not add a `model` field to this native JSON body.

```bash
curl https://api.wanapi.app/wan/v1/w3.0-video-pro/generation \
  -H "Authorization: Bearer $WAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A camera moves slowly along a quiet waterfront at sunrise.",
    "duration": 2,
    "resolution": "1080p",
    "ratio": "16:9",
    "audio": false,
    "prompt_extend": false
  }'
```

## Query a Wan 3.0 Pro task [#query-a-wan-30-pro-task]

Save the returned `task_info.id` as `TASK_ID`, then query the same model endpoint. The submit response is a task receipt, not a completed video. Begin polling every five seconds; see [task statuses and downloads](#poll-and-download-the-video).

```bash
curl "https://api.wanapi.app/wan/v1/w3.0-video-pro/generation/$TASK_ID" \
  -H "Authorization: Bearer $WAN_API_KEY"
```

## Wan 3.0 Pro pricing [#wan-30-pro-pricing]

The table shows current USD rates per billable second. Reference video input seconds and generated output seconds both count. The five-second example assumes no reference video. See [billing and failure handling](#billing-and-failure-handling) for reservations and settlement.

<WanModelPricing model="findWanModel('wan-3-0-pro')" />

[View Wan 3.0 Pro pricing](/models/wan-3-0-pro#pricing).

## Request fields [#request-fields]

All four models share these 14 native fields. Provide a prompt or at least one media input. Frames cannot be combined with reference inputs, `file` or `link`; `file` and `link` are mutually exclusive.

| Field              | Type      | Contract                                                                                      |
| ------------------ | --------- | --------------------------------------------------------------------------------------------- |
| `prompt`           | string    | Up to 20,000 characters.                                                                      |
| `first_frame`      | string    | Image HTTP(S) URL, image data URI or Base64.                                                  |
| `last_frame`       | string    | Image HTTP(S) URL, image data URI or Base64.                                                  |
| `reference_images` | string\[] | Up to 10 images, using the same forms as a frame.                                             |
| `reference_videos` | string\[] | Up to 5 public MP4/MOV URLs; 1–15 seconds per clip and at most 15 reference seconds in total. |
| `reference_audios` | string\[] | Up to 5 audio HTTP(S) URLs.                                                                   |
| `file`             | string    | Public document URL.                                                                          |
| `link`             | string    | Public web page URL.                                                                          |
| `resolution`       | string    | See the model table. Default: `1080p`.                                                        |
| `ratio`            | string    | `adaptive`, `16:9`, `4:3`, `1:1`, `3:4`, `9:16`. Default: `adaptive`.                         |
| `duration`         | integer   | 2–30 output seconds, or `-1` for automatic duration. Default: `5`.                            |
| `audio`            | boolean   | Generate audio. Default: `true`. Disabling it does not reduce the rate.                       |
| `seed`             | integer   | 0–2147483647. Omit for random generation.                                                     |
| `prompt_extend`    | boolean   | Expand the prompt. Default: `true`.                                                           |

Use stable, directly accessible media URLs that stay available until the task finishes. Video duration checks use bounded HTTP range reads; video servers must support those reads and expose readable MP4/MOV duration metadata. Redirects are not followed by duration checks. Private network URLs are not supported. The combined reference and output duration must not exceed 30 seconds. Playground accepts a JSON request body up to 32 MiB; use URLs for larger inputs.

## Poll and download the video [#poll-and-download-the-video]

Every model's submit endpoint returns a public task ID. Save it before doing anything else.

```json
{
  "task_info": {
    "id": "task_EXAMPLE",
    "status": "pending"
  }
}
```

Use the query example in the matching model chapter. Start with a five-second interval and increase the delay after temporary errors. Keep each task's model ID together with its task ID; do not query it through a different model endpoint.

The native statuses are `pending`, `processing`, `completed` and `failed`. A completed response includes `videos`, an array containing a complete signed Bunny CDN URL.

```json
{
  "task_info": { "id": "task_EXAMPLE", "status": "completed" },
  "videos": ["https://reapiflexible.b-cdn.net/flexible/v1/expires/2026-11/20261113T06/wanapi-task_EXAMPLE/video.mp4?token=HS256_SIGNATURE&expires=1794550071"]
}
```

Use the returned URL directly for playback or download; no API key or Authorization header is required for that URL. Files follow the existing storage retention policy. Querying a task does not generate another video, charge again or extend file availability. Save files you want to keep to your own storage. Task queries require your API key and only return tasks owned by your account.

## Synchronous and background Responses [#synchronous-and-background-responses]

For clients using the Responses API, `POST /v1/responses` accepts a model ID, a string `input` and the same native generation fields. Use `input` instead of `prompt`. Native media fields such as `reference_images` remain top-level fields.

```json
{
  "model": "w3.0-video-pro",
  "input": "A blue ball rolls across a white table.",
  "resolution": "1080p",
  "duration": 2,
  "background": true
}
```

With `background: true`, save the response ID and poll `GET /v1/responses/{response_id}`. Without `background`, the HTTP request waits for completion. `stream: true` uses server-sent events while waiting. The final assistant output contains a signed video URL; treat it as a private capability link and do not publish it accidentally. Native task submission and background Responses are recommended for long generations and restrictive proxy timeouts.

A disconnected or timed-out synchronous request does not cancel generation. The task remains on the server. Do not automatically submit the same generation again.

## Billing and failure handling [#billing-and-failure-handling]

The price is the model's resolution rate multiplied by billable seconds. Reference video seconds and output seconds both count; text, images and audio inputs do not add video seconds. Fixed-duration requests without reference video reserve the requested output duration. Automatic duration and reference-video requests reserve up to 30 billable seconds, then settle to measured usage and return the unused reservation. Generation failures release the reservation. Polling does not create another generation or charge again.

* **Invalid parameters:** correct the request before resubmitting. Unknown native fields are rejected.
* **Insufficient balance:** add funds before a new paid request. A key's limit does not grant account credit.
* **Rate limits or temporary polling failures:** retry only the query, with backoff and a maximum waiting period.
* **Submission timeout, network interruption or missing task ID:** the outcome may be unknown. Do not automatically repeat the POST; it could create a second paid task.
* **Task failure:** show the failed state separately from an unavailable status query.
* **Download failure:** retry downloading the existing completed task before starting another generation.

Generation submissions are not automatically retried or switched to another model. There is no advertised cancellation, webhook or idempotency-key contract. Keep the task ID and contact [support](/contact) when an uncertain submission needs investigation.
