asset_id, and then reference it as asset://<asset_id> in your Seedance video-generation tasks. Once an asset reaches the Active state, every subsequent generation that references it benefits from stable character consistency across shots and skips re-processing of that asset on every request.Processing → Active (usable) or Failed (fetch failed / asset rejected / multi-face violation)list / get / Seedance references refresh last_used_atX-API-Key HTTP header. Asset endpoints additionally require an account plan ≥ hobbyist.| Plan | Max Assets | TTL (auto-purged when idle) |
|---|---|---|
| hobbyist | 50 | 3 days |
| developer | 200 | 7 days |
| premium | 500 | 15 days |
| enterprise | 1000 | 15 days |
Failed state do not count toward your quota.| Field | Required | Description |
|---|---|---|
url | ✅ | Publicly reachable URL. Must remain reachable for at least 24 hours so the service can fetch it asynchronously. |
asset_type | optional | Image / Video / Audio. Inferred from the URL suffix when omitted. |
name | optional | Display name for the asset. Defaults to the last path segment (e.g. example1.png). |
| Type | Extensions | Size limit | Other |
|---|---|---|---|
| Image | jpeg / jpg / png / webp / bmp / tiff / gif / heic / heif | < 30 MB | Aspect ratio (0.4, 2.5); width/height (300, 6000) px |
| Video | mp4 / mov | ≤ 50 MB | 480p / 720p / 1080p; 2–15 s; 24–60 FPS |
| Audio | mp3 / wav | ≤ 15 MB | 2–15 s |
{
"asset_id": "asset-20260607154123-6nxk8",
"status": "Processing",
"upload_at": "2026-06-07T15:41:23Z",
"expires_at": "2026-06-22T15:41:23Z"
}{
"total": 4,
"success": 4,
"failed": 0,
"results": [
{"asset_id": "asset-20260607154123-aaaa1", "status": "Processing"},
{"asset_id": "asset-20260607154124-bbbb2", "status": "Processing"},
{"asset_id": "asset-20260607154124-cccc3", "status": "Processing"},
{"asset_id": "asset-20260607154125-dddd4", "status": "Processing"}
]
}error field describing the cause.Processing. Poll until they reach Active before referencing them in a generation request.| Param | Default | Description |
|---|---|---|
page | 1 | Page number |
size | 20 | Page size (≤ 100) |
status | all | Comma-separated subset, e.g. active,processing,failed |
order | -last_used_at | Sort key; - prefix for descending order |
{
"items": [
{
"asset_id": "asset-20260607154123-aaaa1",
"name": "char-female",
"asset_type": "Image",
"status": "Active",
"url": "https://your-cdn.com/example1.png",
"last_used_at": "2026-06-07T15:41:23Z",
"expires_at": "2026-06-22T15:41:23Z",
"created_at": "2026-06-07T15:41:23Z"
}
],
"total": 4,
"page": 1,
"size": 20,
"quota": {
"used": 4,
"limit": 500,
"ttl_days": 15
}
}url field echoes back the original URL you uploaded with — keep it persistent if you want it as a thumbnail preview source.last_used_at (preventing LRU purge).{
"asset_id": "asset-20260607154123-aaaa1",
"name": "char-female",
"asset_type": "Image",
"status": "Active",
"url": "https://your-cdn.com/example1.png",
"last_used_at": "2026-06-07T15:50:00Z",
"expires_at": "2026-06-22T15:50:00Z",
"created_at": "2026-06-07T15:41:23Z"
}status=Failed, the response carries an error object with details:{
"asset_id": "asset-...",
"status": "Failed",
"error": {
"code": "ImageFormatNotSupported",
"message": "Image format heif is not supported by current version"
}
}{
"deleted": 4,
"failed": 0,
"results": [
{"asset_id": "asset-...aaaa1", "status": "deleted"},
{"asset_id": "asset-...bbbb2", "status": "deleted"},
{"asset_id": "asset-...cccc3", "status": "deleted"},
{"asset_id": "asset-...dddd4", "status": "deleted"}
]
}asset://<asset_id> instead of a regular URL.seedance-2-less-restriction (std) and seedance-2-fast-less-restriction (fast)seedance-2 / seedance-2-fast); requests carrying asset:// references will fast-fail. Use the corresponding -less-restriction variant instead.Image 1 / Image 2 / Video 1 / Audio 1 notation. The index matches the position inside image_urls / video_urls / audio_urls.@image1 / @video2 / @audio1 reference syntax is also accepted; the service rewrites it to the canonical form automatically.{
"code": 200,
"data": {
"task_id": "3f5ab17a-0b2e-44a3-b31d-3e6075e2b974",
"status": "pending"
},
"message": "success"
}asset:// reference belongs to the calling accountstatus=Activetask_type is one of the -less-restriction variants{
"code": 200,
"data": {
"task_id": "3f5ab17a-...",
"status": "processing"
}
}{
"code": 200,
"data": {
"task_id": "3f5ab17a-...",
"status": "completed",
"input": {
"prompt": "Cinematic. Photo realistic. A cyber female Image 1 stands in courtyard Image 3. Cyber warrior Image 2 next to her. Cyber boss Image 4 emerges. 5s scene.",
"image_urls": ["asset://asset-...aaaa1", "asset://asset-...bbbb2", "asset://asset-...cccc3", "asset://asset-...dddd4"],
"aspect_ratio": "16:9",
"duration": 5,
"resolution": "720p"
},
"output": {
"video": "https://img.theapi.app/ephemeral/026610ac-5b23-4105-ac06-30f2044f304d.mp4"
},
"meta": {
"usage": {
"type": "point",
"consume": 10000000
}
}
}
}The video URL is valid for 24 hours — download or consume it within that window.
| status | Meaning |
|---|---|
pending | Accepted, queued for scheduling |
processing | Generation in progress |
completed | Success; output.video is ready |
failed | Failure; inspect error.message |
| HTTP | Message | Meaning / Resolution |
|---|---|---|
| 400 | invalid request: 'url' is required | Missing url field on upload |
| 400 | unsupported asset_type: xxx | The file extension is not in the whitelist |
| 400 | quota exceeded: plan hobbyist allows 50 assets, currently 50 | Quota full — delete old assets or upgrade plan |
| 403 | asset not owned by this account | The referenced asset_id belongs to another account |
| 404 | asset not found | Wrong asset_id or already deleted |
| 409 | asset still processing | Wait a few seconds and retry |
| 422 | asset:// references are only allowed on -less-restriction task types | Switch task_type to seedance-2-(fast-)less-restriction |
| 422 | asset xxx status=Failed | The referenced asset failed processing; GET its details to see why |
status=Active the original URL is no longer required, but keeping it alive for at least 24 hours is the safe default.last_used_at, so frequently-used assets never hit the LRU TTL.Image 1 maps to image_urls[0], Image 2 to image_urls[1], etc. Indexes beyond the array length are ignored by the model.image_urls, video_urls, and audio_urls can all appear in the same request, with the prompt referencing each via Image N / Video N / Audio N.list response contains quota.{used, limit, ttl_days}. Surface this on your dashboard so users know when they are close to the limit.Failed assets do not count toward quota, but they still clutter the list. Delete them explicitly to keep the view clean.