Skip to content

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

EndpointMethodPurpose
/open/CreateAssetGroupPOSTCreate an asset group
/open/ListAssetGroupsPOSTList visible asset groups
/open/GetAssetGroupPOSTQuery one asset group
/open/UpdateAssetGroupPOSTUpdate asset group metadata
/open/CreateAssetPOSTCreate an asset from a public URL
/open/ListAssetsPOSTList assets
/open/GetAssetPOSTQuery one asset
/open/UpdateAssetPOSTRename an asset
/open/DeleteAssetPOSTDelete one asset

Defaults

FieldDefault
GroupTypeAIGC
AssetTypeImage
model for asset creation routingseedance-2.0
PageNumber1
PageSize20
PageSize max100

Shared response format

Success response

json
{
  "ResponseMetadata": {
    "RequestId": "req-...",
    "Action": "CreateAsset",
    "Version": "2024-01-01",
    "Service": "ark",
    "Region": "ap-southeast-1"
  },
  "Result": {
    "Id": "asset-20260414171639-5vbmg"
  }
}

Error response

json
{
  "error": {
    "type": "invalid_request",
    "message": "resource not found"
  }
}

AssetGroup operations

OperationRequired fieldsPurpose
CreateAssetGroupNameCreate a logical media group. Optional model routes the group to a compatible asset pool.
ListAssetGroupsNoneQuery visible asset groups
GetAssetGroupIdQuery one group
UpdateAssetGroupIdRename or describe one group

Asset operations

OperationRequired fieldsPurpose
CreateAssetGroupId, URLCreate one media asset from a public URL. Optional model routes the asset to a compatible asset pool.
ListAssetsNoneQuery assets with filters
GetAssetIdQuery one asset
UpdateAssetIdRename one asset
DeleteAssetIdDelete one asset
  1. Call CreateAssetGroup
  2. Call CreateAsset
  3. Poll GetAsset until Result.Status = "Active"
  4. Use asset://<ASSET_ID> with a compatible model in the Seedance Video API
  5. Call DeleteAsset when 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 valueRecommended use
doubao-seedance-2-0-260128Route asset creation to a domestic Seedance 2.0 compatible asset pool
seedance-2.0Route asset creation to an international Seedance 2.0 compatible asset pool
seedance-2.0-fastRoute 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:

  • CreateAsset is not a multipart upload endpoint; pass the media URL in the URL field
  • URL must be a stable public HTTPS URL reachable by upstream services
  • In video requests, use the Result.Id returned by CreateAsset, not a provider-specific asset ID
  • Only use the asset after GetAsset returns Result.Status = "Active"
  • After DeleteAsset succeeds, 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:

json
{
  "type": "image_url",
  "image_url": {
    "url": "asset://<ASSET_ID>"
  },
  "role": "first_frame"
}

The domestic 2.0 video request usually uses:

json
{
  "model": "doubao-seedance-2-0-260128"
}

Example requests

Before running the examples below:

bash
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

bash
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

bash
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

bash
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
done

Delete an asset

bash
curl -sS "$ET_BASE/open/DeleteAsset" \
  -H "Authorization: Bearer $ET_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"Id\":\"$ASSET_ID\"
  }"

Successful response:

json
{
  "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:

  • GetAsset for the same Id returns 404
  • ListAssets no 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 statuserror.typeTypical meaning
400invalid_requestInvalid parameters
401unauthorizedMissing or invalid API key
403forbiddenPermission denied
404invalid_requestResource not found
429rate_limitedRequest rate exceeded
502upstream_errorUpstream fetch or processing failed
503no_channelAsset channel unavailable

Integration notes

  • CreateAsset.URL must be a stable public HTTPS URL reachable by upstream services
  • ASSET_ID is the stable Exchange Token asset ID returned by this API. Use it as asset://<ASSET_ID> in video requests instead of relying on provider-specific asset IDs.
  • GetAsset and ListAssets may 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 as asset://<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.
  • DeleteAsset only deletes an asset. DeleteAssetGroup is not supported.
  • Deleted assets are no longer returned by normal asset queries and cannot be used in new video tasks.