Wan 3.0 reference-to-video body: images, videos and audio in one job
A Wan 3.0 reference job on Sume takes up to 10 images, 5 videos and 5 audio files. Request body, the audio rule, and the frame-versus-reference conflict.

On Sume, a wan-3.0 reference-to-video job accepts up to 10 reference_image_urls, 5 reference_video_urls, and 5 reference_audio_urls, for clips of 2-30 seconds. Audio references need at least one image or video reference beside them.
Alibaba's launch post describes Wan3.0 as taking text, images, audio, video, and documents as inputs and making up to 30 seconds in one pass. It does not give reference counts, so the counts here come from the Sume API schema.
Pick one input mode
There are two ways to feed images. Frame images (image_url, optionally end_image_url) start and end the clip. Reference fields guide the look without fixing frames. The API rejects a request that mixes the two with the message Use either first/end frame fields or reference_*_urls, not both.
On /v1/videos the same idea shows up as frame_images and input_references. If you send both there, the frame images win and the request runs as image-to-video, so a stray frame can silently switch your mode.
| Field | Limit on Sume | Rule |
|---|---|---|
| reference_image_urls | 10 | Public HTTPS URLs |
| reference_video_urls | 5 | Public HTTPS URLs |
| reference_audio_urls | 5 | Needs an image or video reference too |
| duration | 2-30 seconds | Integer seconds |
| image_url with reference_*_urls | Not allowed | Choose one mode |
A request
This TypeScript snippet sends one image and one video reference and prints the job id. Run it on Node 18 or later as an ES module.
const res = await fetch("https://api.sume.com/v1/video-router/generate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SUME_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "wan-ref-demo-001",
},
body: JSON.stringify({
model: "wan-3.0",
prompt: "The dancer from the video reference, wearing the jacket in the photo",
reference_image_urls: ["https://example.com/jacket.png"],
reference_video_urls: ["https://example.com/dance.mp4"],
duration: 15,
resolution: "720p",
mode: "async",
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const { data } = await res.json();
console.log(data.request_id, data.status_url);Where it fails
A 400 with a path like reference_audio_urls points at the rule above. A job that fails after it was accepted usually means a media URL could not be fetched, so use files that stay online until the job ends.
Sources
Related posts
More in Developers
- Hackathon app on the Sume Free plan: 1 seat, 6 accepted jobs
A weekend demo on Free can have one job processing and five queued. How to design the UI, the retries and the demo script around that, with the real limits.
- GPT Image 1 to GPT Image 2.5 on Sume: what changes in the output
Moving from GPT Image 1 to ChatGPT Image 2.5 on Sume changes the response (URL, not base64), default quality, size grid and failures.
- What is a partial transcript in streaming speech to text?
A partial is a provisional transcript a streaming model revises as audio arrives. Why subtitles for a finished clip only need final text and word times.
- What to show a viewer while an avatar video job is queued
Avatar jobs on Sume are async: queued, processing, then completed, failed or canceled. A status-to-UI map for waiting screens, with polling rules.
Written by Sume