PixMind Docs
API ReferenceVideo ModelsWan 3.0 Video

Wan 3.0 Video API

Wan 3.0 Video API reference

Wan 3.0 video generation with 480p, 720p, or 1080p output and synchronized audio.

Provider

Alibaba

Model ID

wan3.0-video

Endpoint

POST /api-platform/v1/generations

Authentication

Base URL: https://aihub-admin.aimix.pro. Send Authorization: Bearer <PIXMIND_API_KEY> on both creation and polling requests, and Content-Type: application/json when submitting JSON. Keep your key in a server environment variable.

Request parameters

ParameterTypeRequiredDescription
modelstringYes

Stable PixMind model ID. Use `wan3.0-video`.

Allowed values: wan3.0-video

promptstringYes

Natural-language generation or editing instructions.

resolutionstringNo

Output video resolution.

Allowed values: 480p, 720p, 1080p

Default: 480p

durationintegerNo

Requested clip duration in seconds.

Allowed values: 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: 2

aspectRatiostringNo

Requested output aspect ratio.

Allowed values: 16:9, 9:16, 1:1, 4:3, 3:4

Default: 16:9

imageUrlstring (URI)No

Starting image for image-to-video generation.

generateAudiobooleanNo

Generate synchronized audio when supported by the selected mode.

Allowed values: true, false

Default: true

Request example

cURL
curl --request POST 'https://aihub-admin.aimix.pro/api-platform/v1/generations' \
  -H "Authorization: Bearer $PIXMIND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "wan3.0-video",
  "prompt": "A cinematic product reveal with a smooth orbiting camera and synchronized ambient sound",
  "duration": 5,
  "resolution": "720p",
  "aspectRatio": "16:9",
  "generateAudio": true
}'
JavaScript
// Node.js 20+. Keep the API key on your server.
const apiKey = process.env.PIXMIND_API_KEY;
if (!apiKey) throw new Error("PIXMIND_API_KEY is required");

const response = await fetch("https://aihub-admin.aimix.pro/api-platform/v1/generations", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiKey}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
  "model": "wan3.0-video",
  "prompt": "A cinematic product reveal with a smooth orbiting camera and synchronized ambient sound",
  "duration": 5,
  "resolution": "720p",
  "aspectRatio": "16:9",
  "generateAudio": true
}),
  signal: AbortSignal.timeout(30_000)
});

const task = await response.json();
if (!response.ok || task.code !== 1000) {
  throw new Error(task.message ?? task.error?.message ?? `HTTP ${response.status}`);
}
console.log(task);

Accepted task response

Generation is asynchronous. Save taskId and poll GET /api-platform/v1/tasks/{taskId} until status is ready or failed.

200 OK
{
  "code": 1000,
  "data": {
    "id": "vid_44160",
    "taskId": 44160,
    "type": "video",
    "model": "wan3.0-video",
    "status": "processing"
  }
}

Query the task and retrieve results

Replace 44160 with data.taskId from the accepted response, using a key belonging to the same user. pending and processing are non-terminal; ready and failed are terminal. On ready, read images (images) or videoUrl (videos); on failed, read errorMessage. The example stops after 60 queries. If it times out, save taskId and query again later instead of creating a duplicate task. Example result URLs are placeholders.

cURL
curl 'https://aihub-admin.aimix.pro/api-platform/v1/tasks/44160' \
  -H "Authorization: Bearer $PIXMIND_API_KEY"
JavaScript
// Continue after the request example above.
const taskId = task.data?.taskId;
if (!Number.isInteger(taskId)) throw new Error("Missing numeric taskId");

async function waitForTask(taskId) {
  for (let attempt = 0; attempt < 60; attempt++) {
    await new Promise(resolve => setTimeout(resolve, Math.min(2000 * 1.5 ** attempt, 10000)));
    const response = await fetch(`https://aihub-admin.aimix.pro/api-platform/v1/tasks/${taskId}`, {
      headers: { Authorization: `Bearer ${apiKey}` },
      signal: AbortSignal.timeout(30_000)
    });
    const result = await response.json();
    if (!response.ok || result.code !== 1000) {
      throw new Error(result.message ?? `HTTP ${response.status}`);
    }
    const data = result.data;
    if (data.status === "ready") return data;
    if (data.status === "failed") {
      throw new Error(data.errorMessage ?? "Generation failed");
    }
    if (!["pending", "processing"].includes(data.status)) {
      throw new Error(`Unexpected task status: ${data.status}`);
    }
  }
  throw new Error(`Polling timed out; save taskId ${taskId} to query again later`);
}

const result = await waitForTask(taskId);
console.log(result.videoUrl);
200 OK · ready
{
  "code": 1000,
  "data": {
    "taskId": 44160,
    "type": "video",
    "model": "wan3.0-video",
    "status": "ready",
    "progress": 100,
    "videoUrl": "https://example.com/result.mp4"
  }
}

On this page