The asset library uses the native Volcengine Ark Action protocol: every operation is a POST to the root path with Action and Version query parameters, a JSON body with PascalCase field names, and Bearer authentication with your MaiToken API Key — the platform signs upstream requests on your behalf.
This API group lets you:
- Create asset groups to organize assets of the same character
- Submit image / video / audio assets (by public URL, not file upload)
- Poll asset status and reference assets in generation requests
Before you start, prepare:
- Publicly accessible asset URLs
- Your MaiToken API Key
Authorizations
All requests use Bearer Token authentication; no upstream signing needed on your side. Get an API Key at the API Key console
Authorization: Bearer YOUR_API_KEYEndpoint shape
All asset operations share a single entry point:
POST /?Action={ActionName}&Version=2024-01-01Content-Type: application/jsonVirtual-avatar Action set:
| Action | Purpose |
|---|---|
CreateAssetGroup |
Create an asset group |
CreateAsset |
Submit one asset into a group (async processing) |
GetAsset |
Query a single asset's status |
GetAssetGroup |
Query group info |
ListAssetGroups |
List groups |
ListAssets |
List assets |
UpdateAsset / UpdateAssetGroup |
Update name / description |
DeleteAsset / DeleteAssetGroup |
Delete asset / group |
Actions outside the whitelist return 404 unsupported_endpoint.
Flow
sequenceDiagram participant Client participant MaiToken Client->>MaiToken: 1. CreateAssetGroup MaiToken-->>Client: Result.Id (group-*) Client->>MaiToken: 2. CreateAsset (GroupId + asset URL) MaiToken-->>Client: Result.Id (asset-*) loop until usable Client->>MaiToken: 3. GetAsset (Id) MaiToken-->>Client: Result.Status (Processing / Active / Failed) endStep 1: Create an asset group
Keep all assets of the same virtual character in one group.
Body fields:
Name(optional): group nameDescription(optional): group descriptionGroupType(optional): group type; officially onlyAIGC(virtual avatar) is supported
Step 2: Submit an asset
One asset per request; assets are passed as public URLs (no file upload / Base64).
Body fields:
GroupId(required)URL(required): publicly accessible asset URLAssetType(required):Image/Video/AudioName(optional): only used for fuzzy search viaListAssets
Step 3: Poll asset status
Assets are processed asynchronously. Poll GetAsset until Status becomes Active. The query is also a POST, with the asset Id in the body.
Status values
- Processing — submitted, under review/processing; not usable yet.
- Active — ready to reference in video generation.
- Failed — processing failed; check content quality and URL accessibility, then resubmit.
Asset requirements & best practices
- Images: jpeg / png / webp / bmp / tiff / gif / heic, < 30MB each, aspect ratio (0.4, 2.5), side length (300, 6000) px
- Videos: mp4 / mov, 2–15s, ≤ 200MB
- Audio: wav / mp3, 2–15s, ≤ 15MB
- Use stable public URLs; keep one character per group; prefer portrait full-body and face close-up shots
Data isolation & project name
- Assets belong to your account: you can only access assets created through this platform. Accessing others' assets returns 404
asset_not_found;ListAssets/ListAssetGroupsonly return your own groups. ProjectNamein the body is optional; if the platform has a project name configured for the channel, your value will be overridden — normally you should omit it.
Using assets in video generation
Once Status=Active, reference the asset in the content array of Seedance video generation via asset://<ASSET_ID>:
{ "model": "doubao-seedance-2-0", "content": [ { "type": "text", "text": "The character from image 1 slowly turns around in a city night scene" }, { "type": "image_url", "image_url": { "url": "asset://asset-20260716071009-*****" }, "role": "reference_image" } ]}Notes
- Submission success ≠ immediately usable; wait for
Status=Active - Keep asset URLs accessible during processing
- Real-person assets require identity verification first — see Real-Person Avatar Assets
