Seedance Asset API
Use this page when you want to upload reusable media, group assets, and wait until assets become usable in Seedance video requests.
Core endpoints and defaults
Endpoints
| Endpoint | Method | Purpose |
|---|---|---|
/open/CreateAssetGroup | POST | Create an asset group |
/open/ListAssetGroups | POST | List visible asset groups |
/open/GetAssetGroup | POST | Query one asset group |
/open/UpdateAssetGroup | POST | Update asset group metadata |
/open/CreateAsset | POST | Create an asset from a public URL |
/open/ListAssets | POST | List assets |
/open/GetAsset | POST | Query one asset |
/open/UpdateAsset | POST | Rename an asset |
/open/DeleteAsset | POST | Delete one asset |
Defaults
| Field | Default |
|---|---|
GroupType | AIGC |
AssetType | Image |
model for asset creation routing | seedance-2.0 |
PageNumber | 1 |
PageSize | 20 |
PageSize max | 100 |
Shared response format
Success response
{
"ResponseMetadata": {
"RequestId": "req-...",
"Action": "CreateAsset",
"Version": "2024-01-01",
"Service": "ark",
"Region": "ap-southeast-1"
},
"Result": {
"Id": "asset-20260414171639-5vbmg"
}
}Error response
{
"error": {
"type": "invalid_request",
"message": "resource not found"
}
}AssetGroup operations
| Operation | Required fields | Purpose |
|---|---|---|
CreateAssetGroup | Name | Create a logical media group. Optional model routes the group to a compatible asset pool. |
ListAssetGroups | None | Query visible asset groups |
GetAssetGroup | Id | Query one group |
UpdateAssetGroup | Id | Rename or describe one group |
Asset operations
| Operation | Required fields | Purpose |
|---|---|---|
CreateAsset | GroupId, URL | Create one media asset from a public URL. Optional model routes the asset to a compatible asset pool. |
ListAssets | None | Query assets with filters |
GetAsset | Id | Query one asset |
UpdateAsset | Id | Rename one asset |
DeleteAsset | Id | Delete one asset |
Recommended workflow
- Call
CreateAssetGroup - Call
CreateAsset - Poll
GetAssetuntilResult.Status = "Active" - Use
asset://<ASSET_ID>with a compatible model in the Seedance Video API - Call
DeleteAssetwhen the asset should no longer be visible or usable
Model routing for asset creation
CreateAssetGroup and CreateAsset accept an optional model field. Use the same public model name that you plan to use in the later Seedance video request.
model value | Recommended use |
|---|---|
doubao-seedance-2-0-260128 | Route asset creation to a domestic Seedance 2.0 compatible asset pool |
seedance-2.0 | Route asset creation to an international Seedance 2.0 compatible asset pool |
seedance-2.0-fast | Route asset creation to an international Seedance 2.0 Fast compatible asset pool |
If model is omitted, Exchange Token uses seedance-2.0 for asset creation routing. Passing the same model family during asset creation and video generation reduces cross-pool asset preparation. If a later video request routes to another compatible asset pool, Exchange Token can still prepare an asset replica when needed.
Use with domestic 2.0 models
/open/CreateAssetGroup and /open/CreateAsset are Exchange Token Seedance asset gateway endpoints. They register your public media URL as a reusable asset, which can then be referenced by the domestic Seedance 2.0 compatible model doubao-seedance-2-0-260128.
Notes:
CreateAssetis not a multipart upload endpoint; pass the media URL in theURLfieldURLmust be a stable public HTTPS URL reachable by upstream services- In video requests, use the
Result.Idreturned byCreateAsset, not a provider-specific asset ID - Only use the asset after
GetAssetreturnsResult.Status = "Active" - After
DeleteAssetsucceeds, stop using the asset ID.GetAsset,ListAssets, and new video tasks will treat it as unavailable.
Reference the asset in a video task like this:
{
"type": "image_url",
"image_url": {
"url": "asset://<ASSET_ID>"
},
"role": "first_frame"
}The domestic 2.0 video request usually uses:
{
"model": "doubao-seedance-2-0-260128"
}Example requests
Before running the examples below:
export ET_BASE='https://api.exchangetoken.ai'
export ET_TOKEN='sk-xxxxxx'
export GROUP_ID='group-xxxxxxxx'
export ASSET_ID='asset-xxxxxxxx'
export IMAGE_URL='https://example.com/demo-image.jpg'
export SEEDANCE_MODEL='doubao-seedance-2-0-260128'Create an asset group
curl -sS "$ET_BASE/open/CreateAssetGroup" \
-H "Authorization: Bearer $ET_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"model":"doubao-seedance-2-0-260128",
"Name":"demo-group",
"Description":"seedance asset demo group",
"GroupType":"AIGC"
}'Create an asset
curl -sS "$ET_BASE/open/CreateAsset" \
-H "Authorization: Bearer $ET_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"model\":\"$SEEDANCE_MODEL\",
\"GroupId\":\"$GROUP_ID\",
\"URL\":\"$IMAGE_URL\",
\"Name\":\"demo-asset-1\",
\"AssetType\":\"Image\"
}"Poll until the asset becomes active
while true; do
resp="$(curl -sS "$ET_BASE/open/GetAsset" \
-H "Authorization: Bearer $ET_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"Id\":\"$ASSET_ID\"}")"
status="$(printf '%s' "$resp" | jq -r '.Result.Status // empty')"
echo "$resp"
if [ "$status" = "Active" ]; then
break
fi
if [ "$status" = "Failed" ]; then
echo "asset preprocess failed"
break
fi
sleep 5
doneDelete an asset
curl -sS "$ET_BASE/open/DeleteAsset" \
-H "Authorization: Bearer $ET_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"Id\":\"$ASSET_ID\"
}"Successful response:
{
"ResponseMetadata": {
"RequestId": "req-...",
"Action": "DeleteAsset",
"Version": "2024-01-01",
"Service": "ark",
"Region": "ap-southeast-1"
},
"Result": {}
}DeleteAsset makes the asset unavailable immediately in Exchange Token. After a successful call:
GetAssetfor the sameIdreturns404ListAssetsno longer returns the asset- New video requests that reference
asset://<ASSET_ID>will be rejected - Background cleanup may continue after the response
The 200 response means the delete request has been accepted and the asset is no longer usable. There is no delete progress query. Repeating DeleteAsset for the same asset may return 200 or 404; in both cases the asset remains unavailable.
Error reference
| HTTP status | error.type | Typical meaning |
|---|---|---|
400 | invalid_request | Invalid parameters |
401 | unauthorized | Missing or invalid API key |
403 | forbidden | Permission denied |
404 | invalid_request | Resource not found |
429 | rate_limited | Request rate exceeded |
502 | upstream_error | Upstream fetch or processing failed |
503 | no_channel | Asset channel unavailable |
Integration notes
CreateAsset.URLmust be a stable public HTTPS URL reachable by upstream servicesASSET_IDis the stable Exchange Token asset ID returned by this API. Use it asasset://<ASSET_ID>in video requests instead of relying on provider-specific asset IDs.GetAssetandListAssetsmay return temporary signed URLs; store stable IDs instead of using full URLs as cache keys- If source media is rate-limited or blocked, preprocessing may fail
- Once the asset becomes
Active, you can reference it asasset://<ASSET_ID>in compatible Seedance video tasks - When a compatible Seedance pool needs provider-side asset preparation, Exchange Token handles it during task submission. Keep using the same Exchange Token asset ID.
DeleteAssetonly deletes an asset.DeleteAssetGroupis not supported.- Deleted assets are no longer returned by normal asset queries and cannot be used in new video tasks.
