Short Answer
Seedance only reads therole of each item in the request. It does not see which switches you ticked in your tool, and it does not read your prompt for this. An image without a role is treated as a first frame (image-to-video). Add a reference video to that, and the request becomes “first frame + reference media”, which the provider rejects.
The typical error comes back as a 400 at submission time. No task is created and nothing is billed:
POST /seedance/api/v3/contents/generations/tasks, set "role": "reference_image" on images and "role": "reference_video" on videos, and pass the video as a public URL the provider can download directly, or register it in the asset library and reference it as asset://.
A Real Case
A customer was using a local creative tool they had built. They passed one character image and one video, ticked “omni reference”, left “first/last frame” unticked, and even wrote “image 1 is not the first frame, do not use first/last frame mode” in the prompt. Every run still failed with the error above. We captured the raw request on the gateway side (image Base64 truncated):
The customer’s browser console also showed
415 Unsupported Media Type for the same mp4, coming from the tool’s own local preview endpoint (/api/media-preview/... on localhost). The tool had failed to turn the video into a usable address and put the local path into the request as-is.
Do Not Submit Seedance Through the Generic Video Endpoints
/v2/videos/generations (and /v1/videos, /v1/video/generations) are the gateway’s generic video endpoints. Their fields are the common subset shared by several video models, and they cannot express Seedance’s input modes:
- No
role: they cannot tell first frame, first/last frame and multimodal reference apart, so one image plus one video always ends up as “first frame + reference” - Resolution is not fully passed through: in our tests, 2.5 requested at 480p came out at 720p, and the 2.0 series requested at 1080p came out at 720p, while billing follows the resolution actually generated
- Parameters unique to 2.5 (
omni_reference_task_type,output_format, and so on) have no matching field
If you use a third-party tool, check whether its Seedance channel offers a “native” or “Volcengine Ark” format. A tool that only speaks the generic video API cannot run tasks with a reference video.
The Right Way: Set role on Every Item
- The three input modes are mutually exclusive: first/last frame (2 images,
first_frame/last_frame), first frame (1 image), and multimodal reference (reference_image/reference_video/reference_audio). As soon as there is a reference video or reference audio, every image must bereference_image - No
rolemeans first frame: a single image withoutroleis the same asfirst_frame - In the prompt, refer to items by the order they were passed in, for example
@image1and@video1 - Reference limits: up to 9 images + 3 videos + 3 audio clips for the 2.0 series, and up to 30 images + 10 videos + 10 audio clips for 2.5
How to Pass a Reference Video
The provider downloads your media on its own servers, so the video must be at an address the provider can reach directly.
Before submitting, you can check the link from any machine with internet access (replace
<URL> with your video link):
code=200, a type of video/mp4 or video/quicktime, and a size that matches the original file. An HTML page, a JSON body or any 4xx means the provider cannot use that link. For the full link check on images, see Image Link Opens but Fails.
Related Docs
Video Generation API
The native endpoint, plus the content layout and role values for each input mode
Asset-First Workflow
Why reference videos should not be sent as Base64, and how to register assets