MaasUnionMaasUnion
API Reference
AI Model APIVideoDoubao Video

Asset Library Guide

Manage trusted assets for Seedance 2.0 video generation via console or API Key dedicated routes (/doubao/v1/assets|asset-groups|visual-validate)

Purpose: Manage trusted assets for Seedance 2.0 video generation. After upload and preprocessing, reference them in video tasks with the asset:// protocol.
API prefix: https://maasunion.com/doubao/v1/...


Overview

The system provides two asset libraries under the parent “Asset Library” menu:

LibraryPurposeHow to create
Real-person libraryReal human likeness assets; requires face liveness verificationCreate group → scan QR to authenticate
Virtual portrait libraryVirtual portrait assets; no verification requiredCreate by name directly

Each library is organized by asset groups. A group can hold multiple assets (Image / Video / Audio).

Asset status

Status (UI)API fieldMeaningUsable
ProcessingProcessingPreprocessing in progressNo
ActiveActivePreprocessing completeYes
FailedFailedPreprocessing failedNo

Only Active assets can be used in video generation.


Format requirements

Image

  • Formats: jpeg, png, webp, bmp, tiff, gif, heic/heif
  • Size: < 30 MB per image
  • Aspect ratio: 0.4 ~ 2.5
  • Resolution: width and height each 300 ~ 6000 px

Video

  • Formats: mp4, mov
  • Size: ≤ 50 MB
  • Duration: 2 ~ 15 seconds
  • Resolution: 480p / 720p / 1080p
  • Frame rate: 24 ~ 60 FPS

Audio

  • Formats: wav, mp3
  • Size: ≤ 15 MB
  • Duration: 2 ~ 15 seconds

Console entry

Click Asset Library in the left nav. The sidebar switches to asset-library navigation:

  • Real-person library
  • Virtual portrait library
  • Back to console returns to the main nav

Page layout:

  • Top — overview stats (groups, assets, active count, project name)
  • Left — group list with search/filter
  • Right — assets in the selected group (search, filter, upload)

Real-person library

Create a group

  1. Click Create group above the group list
  2. Enter a name, then Generate auth QR code
  3. Scan the QR / open the H5 link and complete face liveness
  4. On success the group becomes Active

QR codes expire in 120 seconds. Regenerate if expired.

Auth status

StatusDescription
PendingWaiting for scan / liveness
SucceededGroup created; ready for uploads
FailedAuth rejected; group unavailable
ExpiredQR timed out; regenerate

Virtual portrait library

  1. Click Create group
  2. Enter name (required) and description (optional)
  3. Click Create — the group is usable immediately

Upload assets

Select an Active group, then upload.

MethodDescription
File uploadLocal file
URLPublicly accessible URL

Steps: select group → Upload → choose method & type (Image / Video / Audio) → name (required) → submit.

New assets start as Processing. Poll or click Refresh status. Video preprocessing can take longer.


Manage assets

  • View — name, ID, type, status, source/upstream URL, failure reason, project, upload time. Upstream URLs expire in ~12 hours; reopen details to refresh.
  • Edit — name and description
  • Delete — irreversible
  • Refresh status — re-sync processing assets in the group
  • Group details — IDs, status, stats
  • Delete group — deletes all assets in the group (irreversible)

API Key endpoints (Doubao dedicated)

Besides the console, manage the Doubao asset library with an API Token. The API prefix is /doubao/v1/....

Dedicated route summary

ItemDescription
Assetshttps://maasunion.com/doubao/v1/assets/...
Groupshttps://maasunion.com/doubao/v1/asset-groups/...
Real-person authhttps://maasunion.com/doubao/v1/visual-validate/sessions/...
Auth headerAuthorization: Bearer {API Token}
Field styleVolcEngine Ark PascalCase (Id, AssetType, URL, …)
Path paramsUse the Id from API responses

Endpoint list

MethodPathDescription
POST/doubao/v1/assets/uploadUpload (default virtual group)
GET/doubao/v1/assetsList assets
GET/doubao/v1/assets/{asset_id}Get asset
PATCH/doubao/v1/assets/{asset_id}Update name/description
DELETE/doubao/v1/assets/{asset_id}Delete asset
POST/doubao/v1/asset-groupsCreate group
GET/doubao/v1/asset-groupsList groups
GET/doubao/v1/asset-groups/{group_id}Get group
PATCH/doubao/v1/asset-groups/{group_id}Update group
DELETE/doubao/v1/asset-groups/{group_id}Delete group
GET/doubao/v1/asset-groups/{group_id}/assetsList assets in group
POST/doubao/v1/asset-groups/{group_id}/assetsUpload into group
POST/doubao/v1/asset-groups/{group_id}/refreshRefresh processing status
POST/doubao/v1/visual-validate/sessionsCreate liveness session
GET/doubao/v1/visual-validate/sessions/{session_id}Poll session

1. Upload asset (default virtual group)

POST https://maasunion.com/doubao/v1/assets/upload

AssetType: Image / Video / Audio.

curl --location --request POST "https://maasunion.com/doubao/v1/assets/upload" \
  --header "Authorization: Bearer $API_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "URL": "https://example.com/image.jpg",
    "AssetType": "Image",
    "Name": "optional name"
  }'

Example response:

{
  "Id": "asset-20260624152252-fz9tt",
  "Name": "optional name",
  "AssetType": "Image",
  "Status": "Processing",
  "URL": "https://...",
  "CreateTime": "2026-06-24T07:22:52Z"
}

Use response Id with asset:// in video tasks. Poll until Status is Active.


2. List assets

GET https://maasunion.com/doubao/v1/assets

QueryDescription
page / page_sizePagination
keywordSearch
asset_typeImage / Video / Audio / all
kindvirtual / real_person / all
curl --location "https://maasunion.com/doubao/v1/assets?page=1&page_size=20&asset_type=all&kind=all" \
  --header "Authorization: Bearer $API_TOKEN"

Response shape: { "Assets": [...], "Total", "PageNumber", "PageSize" }.


3. Get / update / delete asset

  • GET /doubao/v1/assets/{asset_id} — may sync upstream status
  • PATCH /doubao/v1/assets/{asset_id} — body: { "Name", "Description" }
  • DELETE /doubao/v1/assets/{asset_id} — returns { "Id": "..." }

4. Asset groups

POST https://maasunion.com/doubao/v1/asset-groups

{
  "Name": "My virtual group",
  "Description": "optional",
  "Kind": "virtual"
}

Kind: virtual (default) or real_person (starts a liveness session).

Virtual create response includes Id, Name, Status, Kind, AssetCount, etc. Real-person create returns session fields (SessionID, H5Link, ExpiresAt, …).

MethodPathNotes
GET/doubao/v1/asset-groupsQuery: page, page_size, keyword, kind, status
GET/doubao/v1/asset-groups/{group_id}Group + AssetStats
PATCH/doubao/v1/asset-groups/{group_id}Update Name / Description
DELETE/doubao/v1/asset-groups/{group_id}204 on success
GET/doubao/v1/asset-groups/{group_id}/assetsAssets in group
POST/doubao/v1/asset-groups/{group_id}/assetsUpload into group
POST/doubao/v1/asset-groups/{group_id}/refreshRefresh processing assets

Upload into a group:

curl --location --request POST "https://maasunion.com/doubao/v1/asset-groups/{group_id}/assets" \
  --header "Authorization: Bearer $API_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "URL": "https://example.com/clip.mp4",
    "AssetType": "Video",
    "Name": "reference video"
  }'

5. Visual validation sessions

POST https://maasunion.com/doubao/v1/visual-validate/sessions

{ "Name": "real-person group name" }

Open H5Link, complete liveness, then poll:

GET https://maasunion.com/doubao/v1/visual-validate/sessions/{session_id}

After success, upload real-person assets into that group.


Use assets in video generation

When status is Active, reference the asset in Create Doubao Video Task content via asset://. Prefer the dedicated route: POST /doubao/v1/video/generations.

{
  "model": "doubao-seedance-2-0-260128",
  "content": [
    {
      "type": "text",
      "text": "Image 1 presenting a weather forecast"
    },
    {
      "type": "image_url",
      "image_url": {
        "url": "asset://asset-20260624152252-fz9tt"
      },
      "role": "first_frame"
    }
  ],
  "ratio": "1:1",
  "duration": 5,
  "resolution": "720p",
  "generate_audio": true
}

Get the ID from the console asset details, or from API response Id.

Important: Use the Id from asset details, and confirm the asset status is Active. If you get asset not found, check the ID and status, then retry.


FAQ

1. Stuck on Processing

Video assets take longer. Use Refresh status or POST .../asset-groups/{group_id}/refresh. If still stuck after ~5 minutes, check format requirements.

2. Status Failed

Inspect FailedReason (console or GET asset). Common causes: face mismatch, safety review, unreachable URL, type/format/duration/size violations.

3. Auth QR expired

Valid for 120 seconds. Regenerate in the console, or create a new visual-validate session via API.

4. Cannot delete real-person group

Not deletable while authorization is still valid. Only expired or rejected groups can be deleted.

5. asset not found in video generation

Confirm the asset status is Active, and that the ID after asset:// matches the Id in asset details.


Document updated: 2026-07-21

How is this guide?