Skip to main content

Wan 3.0 Pro Prime reference-to-video locks a face, garment, set, movement or voice using up to 10 image, 5 video and 5 audio references. It renders 2 to 30 seconds at 1080p, 2K or 4K, enlarged from 1080p above that.

From $0.234/s10% below the reference list price

Workbench

Send a request

Quickstart

Examples use the selected endpoint’s public parameter definitions. Replace the API key and example media, then send the request from your server.

SDKs & integrations
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

API authentication

Keep the API key in the server environment variable SPICY_API_KEY. Use Bearer authentication and Content-Type: application/json for JSON requests.

Authorization: Bearer $SPICY_API_KEY
Sample outputUse this example
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "alibaba/wan-3.0-pro-prime/reference-to-video",
  "input": {
    "aspect_ratio": "adaptive",
    "duration_seconds": 5,
    "reference_image_urls": [
      "https://example.com/reference.png"
    ],
    "resolution": "1080p"
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Generated from this model’s input schema — the same one the API validates every request against.

Input parameters

Place these fields inside the request body’s input object. Names and types match the API. Do not assume a default when none is specified.

This model has dependencies between fields. Fields marked conditionally required depend on other inputs; see the complete JSON Schema below for the rules.

seedintegerOptional

0 to 2147483647. Fix it while you tune resolution or duration, otherwise every rerun changes two things at once.

Default
Not specified
Constraints
minimum:0
maximum:2147483647
enable_prompt_expansionbooleanOptional

On by default on this family. It fills out thin briefs and rewrites detailed ones, so turn it off once your prompt is a precise shot description. A reference file or web link needs it on: leave it unset or true when you attach reference_file_url or reference_link_url, because the document or page is read in this step. An explicit false together with a file or link is rejected.

Default
true
generate_audiobooleanOptional

On by default. Sound is generated with the picture and arrives inside the same file. Set false when a composer is scoring the spot.

Default
true
duration_secondsintegerOptionalAffects price

Any whole number from 2 to 30, default 5, or -1 for smart duration, which reserves the maximum and settles on the length actually delivered. With reference videos, their total plus the output must stay within 30 seconds and both are billed. Find the shot at 5 seconds and 1080p before a long 4K render.

Default
5
Allowed values
-123456789101112131415161718192021222324252627282930
aspect_ratiostringOptional

16:9, 4:3, 1:1, 3:4, 9:16 or adaptive. Defaults to adaptive, which lets the model choose; name a ratio when the delivery format is fixed.

Default
"adaptive"
Allowed values
"16:9""4:3""1:1""3:4""9:16""adaptive"
resolutionstringOptionalAffects price

1080p, 2k or 4k, default 1080p. A native Wan 3.0 Prime render tops out at 1080p, so the tiers above it — 2k and 4k — are delivered by enlarging that render instead of rendering natively at those sizes: the extra pixels come from the enlargement, and they are only as good as the render underneath. There is no 480p or 720p tier here; for those sizes, use Wan 3.0 or Wan 3.0 Prime.

Default
"1080p"
Allowed values
"1080p""2k""4k"
reference_link_urlstringConditionally required

One public web page the model reads for reference, such as an article, a product page or a character profile. It must open without a login. Some sites refuse automated readers, and a page with too little text cannot be used; in both cases the task fails with a message saying the URL could not be read, and failed tasks are not charged. Not together with reference_file_url; if enable_prompt_expansion is left unset, attaching a link also switches it on. Links are not billed.

Default
Not specified
Constraints
format:"uri"
reference_file_urlstringConditionally required

One document the model reads before it directs the shot: a character sheet, a script, a shot list or a product brief. PDF, DOCX, DOC, TXT, MD, PPTX, PPT, XLSX, XLS, KEY, PAGES or NUMBERS, up to 100 MB and 50 pages. It works on its own or next to reference images, video and audio, but not together with reference_link_url. If enable_prompt_expansion is left unset, attaching a file switches it on for that request, because the document is read through that step. Files are not billed.

Default
Not specified
Constraints
format:"uri"
contentMediaType:["application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.apple.keynote","application/vnd.apple.pages","application/vnd.apple.numbers","text/plain","text/markdown"]
reference_audio_urlsarray<string>Conditionally required

Up to 5 clips, each 1 to 15 seconds and 15 seconds in total — a voice, a line reading or room tone the shot has to match. Reference audio is not billed. WAV or MP3, 15 MB per clip. Like the video limits, these are enforced during generation rather than when the task is accepted.

Default
Not specified
Constraints
minItems:1
maxItems:5
reference_video_urlsarray<string>Conditionally requiredAffects price

Up to 5 clips, each 1 to 15 seconds and 15 seconds in total. Use them for movement and camera style rather than for a face. Their length is billed together with the output, and reference video plus output must stay within 30 seconds. MP4 or MOV, at least 16 fps, 240 to 4096 px per side, aspect ratio no wider than 8:1, 100 MB per clip. These limits are enforced during generation rather than when the task is accepted, so check clip lengths before you submit.

Default
Not specified
Constraints
minItems:1
maxItems:5
reference_image_urlsarray<string>Conditionally required

1 to 10 images for identity, wardrobe and set plates. Name each one in the prompt — character, garment, set — or they are averaged together. Reference images are not billed. JPEG, PNG without transparency, BMP or WEBP; 240 to 8000 px per side, aspect ratio no wider than 8:1, 20 MB each.

Default
Not specified
Constraints
minItems:1
maxItems:10
promptstringOptional

Optional, but this is where the references are separated from one another — which plate is which character, what the video and the audio are for — and the action is stated.

Default
Not specified
Constraints
minLength:1
maxLength:20000

Track the task

HTTP 202 means the task was accepted, not completed. Save the returned taskId and query that task. Do not create another task while waiting for its result.

Accepted response
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

The accepted response includes the estimate so your app can show the same amount in task history and billing.

Read the job
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Start polling at about 2 seconds and gradually increase the interval. Stop at a terminal state. After a connection failure, query the original taskId. Retry creation only with the original idempotency key and body.

Or let the callback find you
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

Pass callBackUrl when you create the task and the finished record is POSTed to you — no polling loop at all. Every delivery carries X-Webhook-Timestamp, X-Webhook-Signature and X-Webhook-Payload-Version. The signature is a base64 HMAC-SHA256 over taskId.timestamp.sha256(body), so it must be checked against the raw bytes: parsing the JSON and re-serialising it changes them and the check will fail. Failed deliveries are retried, so the same taskId can arrive twice — make the handler idempotent. Answer 2xx first and do the work afterwards; a slow handler is treated as a failed delivery.

Read the result

Consume output only when state is succeeded. On failure, use errorCode, errorMessage and request_id to investigate. Example costs and states do not represent an actual bill.

Completed response example
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "alibaba/wan-3.0-pro-prime/reference-to-video",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.mp4",
          "mime": "video/mp4",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp4?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

For each available asset, open or download assets[].url directly without an API Authorization header. The signed URL expires at expiresAt; poll the task again to refresh it while the asset remains within its retention period. A pending or unavailable asset has no URL. Treat signed URLs as private.

SDKs & integrations

Use SpicyAPI in your app, terminal, AI assistant or visual workflow. Choose a setup guide below.

Use it in ComfyUI

Install the SpicyAPI nodes from ComfyUI Manager or with the command below, then search for Wan 3.0 Pro Prime · Reference To Video on the canvas. The node has the same options as this page and shows its price before it runs.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi