Reference to Video
Generate a new video from reference images, videos and audio (Seedance 2.5 reference_to_video).
Seedance 2.5 puts the people or objects in your reference images into a new video, follows the moves or camera work in reference videos, or sets it to reference audio. Send at least one of the three; reference audio alone is fine.
Create a task
https://api.nanoapi.ai/v1/tasksUse the shared create endpoint with model: "seedance-2.5". It usually responds in under 1 second and the cost is frozen within a few seconds; the video usually takes several minutes. Get the result once the task has finished.
Headers
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <API key>, see Authentication. |
Content-Type | Yes | application/json |
Idempotency-Key | No | A unique string for every new task, ideally a UUID (1–255 characters). See Preventing duplicate tasks. |
Body
| Parameter | Type | Required | Description |
|---|---|---|---|
model | string | Yes | seedance-2.5. |
mode | string | Yes | reference_to_video. |
image_urls | string[] | At least one of the three | Up to 30 reference images. Each is an http(s) link of at most 4096 characters that can be downloaded directly, not a private address. |
video_urls | string[] | At least one of the three | Up to 3 reference videos, links as for image_urls. Each at most 30 seconds, together at most 30 seconds, see Media. |
audio_urls | string[] | At least one of the three | Up to 9 reference audio files (mp3, wav, m4a and other common formats), links as for image_urls. Each at most 30 seconds, together at most 30 seconds. |
prompt | string | No | What the video shows, at most 8000 characters. Refer to the files as @Image1, @Video1, @Audio1 and so on, see Referring to files. |
resolution | string | Yes | 480p, 720p or 1080p. Sets the price. |
aspect_ratio | string | Yes | auto, 21:9, 16:9, 4:3, 1:1, 3:4 or 9:16. auto follows the reference images and videos; with reference audio only, it gives 16:9. |
duration | integer | Yes | Output length in seconds, 4–30. It's what you pay for, see Pricing. |
generate_audio | boolean | No | Whether the output has sound, default true. Same price either way. |
webhook_url | string | No | Notified when the task succeeds or fails: https, up to 2048 characters, not a private, loopback or reserved address. See Webhooks. |
Send at least one of image_urls, video_urls and audio_urls; with none, the request returns 400 invalid_request with param set to image_urls. video_url isn't accepted: sending it returns 400 invalid_request with param set to video_url.
A reference image, a reference video and background music, portrait, 720p, 5 seconds:
curl https://api.nanoapi.ai/v1/tasks \
-H "Authorization: Bearer $NANOAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"mode": "reference_to_video",
"image_urls": ["https://example.com/cat.jpg"],
"video_urls": ["https://example.com/walk.mp4"],
"audio_urls": ["https://example.com/music.mp3"],
"prompt": "The cat from @Image1 walks down the street like the woman in @Video1, with @Audio1 as background music",
"aspect_ratio": "9:16",
"resolution": "720p",
"duration": 5
}'Response: 200 OK. data is the newly created task, with only these fields; each one is described in Create a task: Response. Keep data.id to get the result: once the task succeeds, the video is at data.outputs[0].url of the retrieved task or the webhook. The task can still fail after it's created (for example a file can't be downloaded), so go by what retrieving the task or the webhook tells you.
{
"code": 200,
"message": "success",
"data": {
"object": "task",
"id": "tk_01jbd2s8x4c6v9b3n5m7q1w4e8",
"model": "seedance-2.5",
"status": "queued",
"error": null,
"created_at": "2026-10-31T08:30:00Z"
}
}Pricing
cost = duration × price per second of the resolutionLoading the current prices…
Example: the request above (720p, 5 seconds) costs 5 × the 720p price per second. Reference videos and reference audio cost nothing extra.
Billed seconds are the duration you ask for, however many images, videos or audio files you send and however long they are. Prices change, so read the current ones from GET /v1/products (the prices rows whose mode is this mode) instead of hard-coding them; billing.frozen on the retrieved task is what counts. All Seedance 2.5 prices: Seedance 2.5 → Pricing.
Errors
Create request errors: the request fails with an HTTP error and no task is created. Specific to this mode:
| Status | error.type | When | What to do |
|---|---|---|---|
400 | invalid_request | None of image_urls, video_urls and audio_urls was sent (param is image_urls, message is image_urls, video_urls or audio_urls is required for mode reference_to_video), image_urls has more than 30 images, video_urls more than 3 videos or audio_urls more than 9 files (audio_urls takes at most 9 audio files for mode reference_to_video), video_url was sent, or resolution, aspect_ratio or duration isn't one of the values above. param names the parameter. | Fix the parameter param names and send the request again. |
Other errors of the create endpoint (401, 402, 429 and so on): Create a task → Errors.
Task failures: the create request succeeded (200) and the task later turned failed. There's no HTTP status: the reason is the task's error.type, from retrieving the task or the webhook.
error.type | When | What to do |
|---|---|---|
invalid_media | A reference image, video or audio file can't be downloaded or read (corrupt or an unsupported format), or a reference audio file is longer than 30 seconds (The audio duration must be at most 30 seconds.) or they add up to more (The total duration of the audio files must be at most 30 seconds.). Found when the files are downloaded, a few seconds after the task is submitted. The frozen amount is returned in full. | Replace the file error.message points to, or trim the audio, and create the task again. |
video_too_long | A reference video is longer than 30 seconds (The video duration must be at most 30 seconds.), or they add up to more (The total duration of the videos must be at most 30 seconds.). Found when the videos are downloaded, a few seconds after the task is submitted (started_at may be null). The frozen amount is returned in full. | Trim the videos (or send fewer) and create the task again. |
Failure reasons shared by every mode (such as a balance too low for the task): Seedance 2.5 → Errors; all of them: Failure reasons.