Wan 3.0
Alibaba video up to 30 seconds: from a description, frames or references — photos, clips and audio. With a soundtrack.
Good for: ads, music clips, story videos, animating photos
With your video — from $0.054/s, without video — from $0.054/s
For developers →How to get a better result
"A ginger cat on a windowsill, rain outside, watercolor".
"Soft sunset", "neon light", "cozy, warm tones".
Refine the description and press "Another version" — every result is new.
Pass this model in the request wan-3.0
1. Create a task POST /api/v1/jobs/createTask
curl -X POST https://mixmedia.tech/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-123" \
-d '{
"model": "wan-3.0",
"callBackUrl": "https://your-app.example/callback",
"input": {
"prompt": "A cat runs across a moonlit rooftop, neon lights of the city flicker in the distance, cinematic",
"image_urls": [],
"resolution": "720p",
"aspect_ratio": "adaptive",
"duration": "5"
}
}'import time, requests
API = "https://mixmedia.tech/api/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
task = requests.post(f"{API}/jobs/createTask", headers=HEADERS, json={
"model": "wan-3.0",
"callBackUrl": "https://your-app.example/callback",
"input": {
"prompt": "A cat runs across a moonlit rooftop, neon lights of the city flicker in the distance, cinematic",
"image_urls": [],
"resolution": "720p",
"aspect_ratio": "adaptive",
"duration": "5"
}
}).json()
task_id = task["data"]["taskId"]
while True:
info = requests.get(f"{API}/jobs/recordInfo", headers=HEADERS, params={"taskId": task_id}).json()["data"]
if info["state"] in ("success", "fail"):
break
time.sleep(4)
print(info["state"], info.get("resultJson") or info.get("failMsg"))const API = "https://mixmedia.tech/api/v1";
const headers = { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" };
const { data } = await fetch(`${API}/jobs/createTask`, {
method: "POST", headers,
body: JSON.stringify({
"model": "wan-3.0",
"callBackUrl": "https://your-app.example/callback",
"input": {
"prompt": "A cat runs across a moonlit rooftop, neon lights of the city flicker in the distance, cinematic",
"image_urls": [],
"resolution": "720p",
"aspect_ratio": "adaptive",
"duration": "5"
}
}),
}).then((r) => r.json());
let info;
do {
await new Promise((r) => setTimeout(r, 4000));
info = (await fetch(`${API}/jobs/recordInfo?taskId=${data.taskId}`, { headers }).then((r) => r.json())).data;
} while (!["success", "fail"].includes(info.state));
console.log(info.state, info.resultJson ?? info.failMsg);Response: data.taskId. callBackUrl and Idempotency-Key are optional.
2. Status and result GET /api/v1/jobs/recordInfo
curl "https://mixmedia.tech/api/v1/jobs/recordInfo?taskId=TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
data.state: waiting, queuing, generating, success, fail. On success data.resultJson is a JSON string with resultUrls.
3. Upload a file POST /api/v1/files/upload
curl -X POST https://mixmedia.tech/api/v1/files/upload \
-H "Authorization: Bearer YOUR_API_KEY" -F "file=@photo.jpg"
The response has data.url. Pass that URL in the file field. Any public https URL works too.
Input fields
| Field | What to send |
|---|---|
prompt * | text, up to 20000 characters |
first_frame_url * | image URL |
last_frame_url | image URL |
image_urls | list of URLs, up to 10 |
video_urls | list of URLs, up to 5 |
audio_urls | list of URLs, up to 5 |
resolution | 480p · 720p · 1080p · default 720p |
aspect_ratio | adaptive · 16:9 · 9:16 · 1:1 · 4:3 · 3:4 · default adaptive |
duration | 2 · 3 · 4 · 5 · 6 · 7 · 8 · 9 · 10 · 11 · 12 · 13 · 14 · 15 · 16 · 17 · 18 · 19 · 20 · 21 · 22 · 23 · 24 · 25 · 26 · 27 · 28 · 29 · 30 · default 5 |
generate_audio | true or false, default true |
watermark | true or false, default false |
nsfw_check | true or false, default false |
seed | number from -1 to 4294967295 |
About the model
Wan 3.0 is an Alibaba video model. 2 to 30 second clips in 480p, 720p and 1080p: from a description, from the first and last frame, or from references (up to 10 photos, 5 clips and 5 audio tracks). You can turn the soundtrack off — the price stays the same.
Pick «Auto» length and the model decides: the maximum is held and the rest comes back after the video is ready. With your own video, input + output seconds stay within 30.


