asset:// asset ID, and reference that in the generation request. The request body drops from megabytes to a few dozen bytes, the create-task endpoint returns immediately, and the content check on your media happens at ingest time instead.This page is about submission speed and reliability. For endpoint-by-endpoint documentation of the asset library see the Asset Library; for end-to-end runnable code see the Asset Reference Guide.First: is submission slow, or is generation slow?
Seedance is an async, task-based API. One clip involves two separate phases, and their latency comes from completely different places:Three ways to pass media, compared
For the same image, the three options behave very differently at submission time:asset:// reference moves that cost once, up front, to the ingest step; every generation after that sends only a short string.
Asset-first is not only faster
Submission time decoupled from file size
Retries cost almost nothing
Content checks happen earlier
Active, so anything non-compliant surfaces right there instead of failing a generation task halfway through.Assets are reusable
asset://. See the Asset Library.
Migrating in three steps
Ingest the media and get an asset ID
Active (about 13 seconds for a single image) and the asset is ready to use.The asset library is free with the Seedance API — no annual fee.Swap the inline data for asset:// in the generation request
content structure, the role values, and every other parameter stay the same. Only the value of image_url.url changes, from a data URL to asset://<Id>. Refer to media in the prompt as “image 1”, “image 2” in the order you passed them — do not write the asset ID into the prompt text.Store the asset ID in your own database
What about first/last frame jobs?
First/last frame (role: "first_frame" / "last_frame") and multi-modal reference (role: "reference_image") are mutually exclusive input modes with different semantics, so do not swap one for the other blindly:
- If you genuinely need exact start and end frames — for example to butt-join seamlessly against a previous clip — stay in first/last frame mode and replace the inline data URL with a public URL. The request body drops from megabytes to a few hundred bytes immediately, and the remaining fetch cost moves upstream. Host the images somewhere fast, unauthenticated, and well-provisioned.
- If what you actually need is a consistent character or scene and the boundary frames do not have to match pixel for pixel, switch to multi-modal reference generation with an
asset://asset ID. That is the most reliable path and the one this page recommends.
Reference video and audio
A reference video (role: "reference_video") is an order of magnitude larger than an image, which makes inline Base64 the single most likely cause of a submission timeout. Avoid it:
- Prefer a public URL, hosted somewhere fast, unauthenticated, and well-provisioned.
- Verified-person asset groups accept video and audio ingest (video: mp4 / mov, 2–15 seconds, under 50MB; audio: mp3 / wav, 2–15 seconds, under 15MB) through the identity-verification flow in the Asset Library.
- Worth noting: tasks with a reference video hit the lower price tier — $7.56 per million tokens with video input versus $12.60 without. See Model pricing in the overview.
What to do after a timeout
When the create-task POST times out, the client cannot tell whether the task was created: no response headers arrived, so there is no task ID to query. Work through it in this order:Check for a record before resending anything
Change the read timeout and the media method together
asset://, a 30–60 second timeout on the create request is plenty — the async endpoint itself is fast, and the real work happens on the task side. If you must keep inlining large media, set the connect timeout and the read timeout separately, and size the read timeout from your file sizes and uplink bandwidth.Reduce concurrency before investigating further
Check your Base URL
FAQ
Does text-to-video need the asset library too?
Does text-to-video need the asset library too?
How long does ingest itself take? Isn't this just moving the cost around?
How long does ingest itself take? Isn't this just moving the cost around?
Active — fully automatic, with no manual review.The point is that it happens once. The same asset can then be referenced indefinitely, whereas inline upload repeats the whole transfer on every generation. The more clips you produce, the wider the gap.Do asset IDs expire?
Do asset IDs expire?
Does the asset library cost extra?
Does the asset library cost extra?
How long does the generated video URL stay valid?
How long does the generated video URL stay valid?
content.video_url is a signed direct link valid for 24 hours. Copy the file into your own storage as soon as the task succeeds, and do not hand that URL out as a permanent address.Is the asset library KEY the same as the Seedance token?
Is the asset library KEY the same as the Seedance token?
SeeDance2 group selected, and is only for the video generation API.