Wan 3.0 Video Prime
Wan 3.0 Video Prime API — up to 30 seconds from text, frames or reference media, with 480P through 4K output. API-key access only; ordinary keys use the NSFW channel.
The high-speed tier of Alibaba's Wan 3.0 video model. Wan 3.0 Video Prime takes the same inputs as the standard tier — text, first/last frame images, reference images, video, audio, a document, or a public web page — and returns 2 to 30 second clips at 480P through 4K with an audio track by default. See current pricing on the model page.
API access and content filtering
This model is available only through an API key. Playground generation is disabled for all users, including administrators. Session-cookie requests are rejected before a task is created or credits are charged.
Ordinary API keys: content filtering is always disabled (NSFW channel).
content_filter and the legacy nsfw_checker field are ignored, including
true, false, other values, and omission.
Administrator-owned API keys: content_filter: true enables filtering
(non-NSFW channel); false disables it (NSFW channel). This exception depends
on the verified key owner, not a request parameter or an administrator's
website session. At 2K and 4K, filtering must be disabled.
For 2K or 4K, use the same model id. Document and web page references
(reference_file_urls / reference_link_urls) are unavailable at these
resolutions.
Prime vs the standard tier
The two models support similar input families but use different request fields.
Prime uses aspect_ratio, explicit frame fields, and reference_*_urls;
standard Wan 3.0 uses size and its own media fields. Translate the payload
when switching models. Prime is positioned for faster turnaround at a higher
per-second rate, without a fixed latency guarantee or a documented quality
advantage. Choose by how much the wait is worth to you — see
Wan 3.0 for the standard tier.
Quick example
curl https://reapi.ai/api/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan3.0-video-prime",
"prompt": "A lighthouse keeper climbing a spiral staircase at dawn",
"resolution": "720P",
"aspect_ratio": "16:9",
"duration": 10
}'import requests
resp = requests.post(
"https://reapi.ai/api/v1/videos/generations",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"model": "wan3.0-video-prime",
"prompt": "A lighthouse keeper climbing a spiral staircase at dawn",
"resolution": "720P",
"aspect_ratio": "16:9",
"duration": 10,
},
)
task_id = resp.json()["id"]const resp = await fetch('https://reapi.ai/api/v1/videos/generations', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'wan3.0-video-prime',
prompt: 'A lighthouse keeper climbing a spiral staircase at dawn',
resolution: '720P',
aspect_ratio: '16:9',
duration: 10,
}),
});
const { id } = await resp.json();body := strings.NewReader(`{
"model": "wan3.0-video-prime",
"prompt": "A lighthouse keeper climbing a spiral staircase at dawn",
"resolution": "720P",
"aspect_ratio": "16:9",
"duration": 10
}`)
req, _ := http.NewRequest("POST", "https://reapi.ai/api/v1/videos/generations", body)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)Authentication
Every request needs an API key in the Authorization header:
Authorization: Bearer YOUR_API_KEYCreate one in API keys.
Endpoint
POST https://reapi.ai/api/v1/videos/generationsGeneration is asynchronous. The response carries a task id; poll
GET /api/v1/tasks/{id} until status settles.
Modes
There is no mode field — the model picks the mode from which media fields
are present. The two media families are mutually exclusive and a request that
mixes them is rejected.
| Mode | Fields to send |
|---|---|
| Text to video | prompt only |
| First frame | first_frame_url |
| First + last frame | first_frame_url + last_frame_url |
| Omni-reference | any of reference_image_urls / reference_video_urls / reference_audio_urls |
| Document | reference_file_urls |
| Web page | reference_link_urls |
Frame fields (first_frame_url, last_frame_url) cannot be combined with any
reference_*_urls field. reference_file_urls and reference_link_urls are
also mutually exclusive with each other.
In reference mode, address your material from the prompt as Image1,
Video1, Audio1 and so on, numbered by position within each array.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
model | string | yes | wan3.0-video-prime |
prompt | string | no | Up to 20,000 characters. Required in practice for text-to-video. Chinese and English. |
first_frame_url | string | no | One image used as the opening frame. |
last_frame_url | string | no | One image used as the closing frame. |
reference_image_urls | string[] | no | Up to 10 images. |
reference_video_urls | string[] | no | Up to 5 clips, 1–15s each, 15s combined. Input duration + duration must not exceed 30s. |
reference_audio_urls | string[] | no | Up to 5 clips, 1–15s each, 15s combined. |
reference_file_urls | string[] | no | Exactly one document: docx, doc, xlsx, xls, pptx, ppt, pdf, txt, key, pages, numbers, md. |
reference_link_urls | string[] | no | Exactly one public, login-free web page. |
resolution | enum | no | 480P / 720P / 1080P / 2K / 4K. Default 1080P. 2K and 4K do not support document or web page references. |
aspect_ratio | enum | no | adaptive / 16:9 / 4:3 / 1:1 / 3:4 / 9:16. Default adaptive. |
duration | integer | no | 2–30 seconds, or -1 to let the model choose. Default 5. |
audio | boolean | no | Whether the clip carries an audio track. Default true. |
seed | integer | no | 0–2147483647. |
content_filter | boolean for admin keys; ignored otherwise | no | Ordinary keys always use NSFW. Admin keys: true enables filtering; false disables it. See Content filter below. |
All media inputs must be public http(s) URLs. reAPI does not accept base64 or
data: URIs on any endpoint, for any model.
Content filter
Ordinary API keys always use the NSFW channel. Both content_filter and
nsfw_checker are ignored, so sending true does not enable filtering.
Administrator-owned API keys can set content_filter to a boolean:
| Value | Administrator API behavior |
|---|---|
true | Filtering enabled; available at 480P, 720P and 1080P. |
false | Filtering disabled; available at all supported resolutions. |
| Omitted | Defaults to false, preserving this model's existing behavior. |
For administrator keys, the legacy boolean nsfw_checker remains accepted;
content_filter takes precedence when both are present. Invalid non-boolean
values are rejected. 2K and 4K with filtering enabled are rejected before
credits are charged. The effective setting is preserved on every fallback,
and the filter choice does not change the public price.
Administrator key permissions are cached for up to 5 minutes. Role changes may take that long to affect requests.
Playground generation is disabled. Use Authorization: Bearer YOUR_API_KEY;
a website session cookie cannot submit this model, even for administrators.
Response envelope
Submitting returns a task id:
{ "id": "task_01k9s419324drezfbwnsvxyr6h", "status": "processing" }Poll GET /api/v1/tasks/{id}. A completed task looks like:
{
"id": "task_01k9s419324drezfbwnsvxyr6h",
"model": "wan3.0-video-prime",
"status": "completed",
"created_at": 1762853430,
"output": {
"video_urls": [
"https://cdn.reapi.ai/media/tasks/01k9s419324drezfbwnsvxyr6h/0.mp4"
]
},
"usage": { "credits": 1386 },
"error": null
}usage.credits is what the task actually cost once settled — see
Tasks.
Pricing
Billing has two dimensions: billable seconds × resolution.
Neither the mode nor the audio track changes the rate — a document-to-video request costs the same per second as a text-to-video one at the same resolution, with or without sound. Current per-second rates for each resolution are on the model page.
billable_seconds = reference_video_seconds + duration
credits = ceil(public_per_second_usd × billable_seconds × 1000)1 credit = $0.001 USD. Use the public rate at its billing precision;
the model page rounds rates for display. The task estimate and settled
usage.credits provide the charge for a specific request.
Three things to know before you send a request:
- Omitting
resolutionbills at1080Pbecause that is the model's own default. - Reference video is billable on top of
duration. Each clip inreference_video_urlsis processed as well as generated, so its own length is charged too. reAPI measures the clips server-side at submit time, and their combined length withdurationis capped at 30 seconds — a 6-second clip withduration: 8bills 14 seconds. Reference images, audio, documents and web pages carry no billable length. A clip reAPI cannot read is rejected rather than billed as zero. duration: -1reserves the 30-second ceiling. The final length is not knowable at submit time, so the hold is taken at the maximum. Pass an explicitdurationwhen cost matters.
Failed tasks are refunded automatically.
Errors
| Code | Meaning |
|---|---|
20003 | Invalid parameter value — mixed media families, out-of-range duration, unknown enum, or a website request trying to disable the content filter |
20004 | Model not supported on this endpoint |
30001 | Insufficient credits |
80006 | Rejected by content moderation |
80007 | Upstream rejected the input |
Full catalog: Errors.
Tips
- Iterate at
480Pand switch to1080Ponly for the final render — the rate scales with the tier and the framing does not change. - Reference images hold characters and wardrobe across a long take. Name them
positionally in the prompt (
Image1,Image2) rather than describing them again in prose. - With reference video, remember input seconds count against the 30-second budget: a 10-second reference leaves 20 seconds of output.
- Write prompts as a shot list with explicit time ranges. The model follows timed beats more reliably than a single paragraph of description.
- Pick the standard Wan 3.0 tier when turnaround is not the constraint. It has a lower rate but different request fields; adapt the payload using the standard model documentation.