Skip to main content
Real-person assets let you reference a person’s likeness in videos after that person has completed verification. The workflow is to create an asset group, have the person complete web verification, add assets, wait for the assets to become available, and then submit a video generation task. This page uses image assets as an example and manages assets through the AIHubMix API, with the new /ai/v1/videos endpoint as the preferred option for video generation. Existing /v1/videos clients can refer to the compatibility protocol example.

Prerequisites

  • Prepare a valid AIHubMix API Key and read it from the AIHUBMIX_API_KEY environment variable.
  • Before using the new video API, enable async tasks in the console and confirm that your account has sufficient balance and permission to use the target model.
  • The person depicted in the assets must consent to the intended uses and personally complete the verification process on the web page. Add assets of only the same person to each asset group.
  • Prepare a direct image URL that the model provider can access, and ensure that it remains valid throughout asset processing.
  • The command-line examples require Bash, curl, and jq. Run the steps in the same terminal and retain the returned asset group, verification session, asset, and video task IDs.
The official BytePlus real-person assets guide covers Seedance 2.0 and Seedance 2.5. The main example for the new video API on this page uses the AIHubMix model ID doubao-seedance-2-5-260628, which has been verified in production. Available versions, reference media types, and parameters depend on the current model Schema and the capabilities available to your account. See Workflow Verification for the scope of verification; do not infer that all Seedance versions support real-person assets.
Prepare the terminal environment. Your runtime environment should already have provided the API Key:

  1. Create an Asset Group

The request body accepts only name. The name must not be empty and can be up to 100 characters. Successful creation returns HTTP 201 with an initial status of pending_auth. The public asset group fields are id, object, name, status, created_at, and updated_at. The object value is always asset_group, and timestamps are in Unix seconds. Subsequently, use status=active to determine whether assets can be added to the group. If the creation response is lost, query the list first to avoid creating a duplicate group:
The list returns data, has_more, and next_after. For the next page, pass the previous page’s next_after as after; limit defaults to 20 and has a maximum of 100. Names are not idempotency identifiers. Use the ID and creation time together to identify an asset group.

  1. Get the Personal Verification Link

Create a verification session without a request body:
Successful creation returns HTTP 201. The public fields are id, object, group_id, status, created_at, expires_at, and completed_at. The object value is always verification_session, timestamps are in Unix seconds, and completed_at is null until completion.
verification_url is returned only in a successful creation response. Subsequent queries do not return the link again. Provide the link promptly to the person depicted in the assets, and do not include it in public logs, code repositories, or feedback screenshots. Its validity is determined by expires_at; the original link cannot be used after it expires.
The person must open verification_url, check the entity and intended uses displayed on the page, read and accept the relevant terms, and follow the on-screen instructions. The official BytePlus guide states that this process requires signing in to a personal BytePlus account. If the page requests camera access, the person must operate the device and grant permission personally. The official page may include steps such as asset uploads; follow the actual prompts. You must still complete the API asset creation step below and obtain the asset ID returned by AIHubMix. Do not substitute other asset IDs shown on the web page directly into the API examples.

  1. Check the Verification Result

Clients can query every 10 to 15 seconds and set a local waiting limit. This interval is a usage recommendation. Even if the web page shows completion or returns a blank page, use the API to confirm that the session is verified and the asset group is active before adding assets. If another creation attempt returns 409 verification_session_active, query the existing session and asset group first. Do not repeatedly create sessions while a valid session exists, the asset group has completed verification, or the previous result is still awaiting confirmation. Contact support if the process remains incomplete.
An internal error on the web page does not mean that the verification session has ended. First run the two GET requests in this section to query the session and asset group. Do not repeatedly create sessions for the same group while the session is still pending. Add assets only when the session is verified and the asset group is active. The web page error alone is insufficient to determine the cause. Retain the IDs and contact support if the process remains incomplete.

  1. Create an Asset from an Image URL

Image Requirements

Provide an absolute HTTP(S) URL that returns an image file, preferably using HTTPS. The link should be accessible without login or additional request headers. Local paths, private network addresses, Base64, and URLs containing a username and password are not suitable for the asset creation API. The URL should not contain a # fragment. According to the BytePlus real-person assets guide, a clear, front-facing photo is recommended, and images must meet the following asset library requirements: These are the official asset library requirements. Video models may have separate restrictions on reference assets. Also check the target model’s requirements before uploading. A successful HTTP creation response does not mean that asset processing has succeeded.

Creation Request

Replace IMAGE_URL with a direct URL to an image that you have the person’s consent to use. The example domain is a placeholder and does not provide a real-person image.
The request body accepts only these three fields. Idempotency-Key is an optional request header, up to 128 bytes, and must not contain leading or trailing whitespace or control characters. For audio and video file limits, consult the official guide linked above and check the types and durations supported by the target model. Initial creation usually returns HTTP 201; reusing an existing asset returns 200; when the result is still awaiting confirmation and the status is reconciling, the response is 202. Always read the object’s status. The public asset fields are id, object, group_id, asset_type, status, client_reference_id, created_at, updated_at, and deleted_at. The object value is always asset. A client_reference_id that was not provided or has been deleted is omitted, and deleted_at is null until deletion. Timestamps are in Unix seconds. Queries do not return the original image URL, so retain your own application records.

  1. Wait for the Asset to Become Available

You can query every 10 to 15 seconds and set a local waiting limit. Stopping local polling does not cancel the server-side operation.
If the creation result is unknown and no matching result is found over time, the asset may remain reconciling indefinitely. This may also affect deletion of the asset or asset group. Retain the ID and original request identifiers and contact support. Do not repeatedly create assets with different identifiers or assume they will be cleaned up automatically after some time.

  1. Generate a Video Using the Asset

Video references use the complete id from the AIHubMix asset creation response in the format asset://<asset_id>. All assets referenced in a single request must belong to the same asset group, be owned by the current account, and have a status of active. The asset group must also remain available. The reference type must match the asset_type specified when creating the asset. asset:// is used in video reference fields and cannot be used as a browser download URL.

New Video Protocol

First check the current model Schema by endpoint path:
Submit the request after confirming that the model supports reference images. The following uses the Seedance 2.5 parameters successfully verified in production during this test: duration=4, resolution="480p", aspect_ratio="3:4", and generate_audio=false. The new protocol uses input_references[].url directly, where ASSET_ID is the asset ID previously returned by AIHubMix:
The new protocol uses an integer duration for the requested duration; other allowed values are defined by the model Schema. resolution="480p" specifies the requested resolution tier and does not guarantee that the output width or height is exactly 480 pixels. Refer to the generated file for its actual dimensions. First and last frames can use frame_images[].image_url.url together with frame_type, only when the model supports the corresponding capability. See Video Generation for the full parameters.

Compatibility Video Protocol

For existing clients using /v1/videos, place references in content or extra_body.content, with each URL nested inside the corresponding media object. This example uses extra_body.content:
The compatibility example retains doubao-seedance-2-0-260128 and is based on the existing compatibility API contract and the official BytePlus asset reference documentation. Seedance 2.0 video generation and creation through the /v1/videos compatibility API were not tested in this verification. The results for Seedance 2.5 with the new protocol cannot be directly applied to this example.
Run only one of the two examples. Each video creation is a separate request. Do not include input_references in a compatibility request. If content is provided in both locations, extra_body.content overrides the top-level content; providing it in only one location is recommended. Use the id returned by the compatibility API with GET /v1/videos/{id} to query status, then download through GET /v1/videos/{id}/content after completion. Do not query /ai/v1/videos with a compatibility API ID. See the Compatibility Video API for details.

  1. Poll and Download the New-Protocol Video

The following Python example continues only from the new-protocol creation steps above. It reads VIDEO_ID from the environment and does not create another task. The requests package must be installed.
The 30-minute limit is the example’s local waiting limit, not a server-side task timeout. An HTTP 200 query response does not mean generation succeeded; you must check status. Use /ai/v1/videos/{id} for polling. The unified task endpoint /ai/v1/tasks/{id} provides a read-only snapshot. Query and download videos using the same API Key used to create the task. Download promptly after completion and retain your own copy. Results have a retention period defined by expires_at, and expired results may return 410 artifact_expired.

Workflow Verification

The production verification on 2026-09-07 used a publicly accessible direct HTTPS JPEG URL, web verification completed personally by the person depicted, and the Seedance 2.5 parameters above. The following results were observed: The file was 1,558,358 bytes. ffprobe reported H.264, 24 fps, 560 × 752 pixels, 4.041667 seconds, and no audio track. These values describe this particular generation result and do not mean that every request produces the same dimensions, duration, or file size. The verification page initially displayed internal error; a subsequent API query still showed pending, and the cause of the page error has not been confirmed. The test then used a new page for a separate test group. After the person completed the steps personally, the session was confirmed as verified and the asset group as active. Using a new group was specific to this test and is not a general recommendation to repeatedly recreate asset groups, nor does it mean that the original session had ended. This verification did not test Seedance 2.0 video generation, creation through the compatibility API, audio or video assets, first and last frames, deletion, or other combinations of exceptional conditions. The corresponding descriptions remain based on the API contract and official documentation. This verification does not cover every scenario in the guide.

Idempotent Retries

  • If asset creation times out or the response is lost, retain the original Idempotency-Key, client_reference_id, URL, and asset_type, and resend the same request. If either identifier matches an existing asset in the same account and asset group, that asset is reused.
  • If the URL or asset_type associated with the same identifier changes, the response is 409 asset_idempotency_conflict. Updating a signed image URL also counts as a URL change.
  • If neither identifier is provided, deduplication across requests is not guaranteed. Use a new identifier only when you intend to create another asset.
  • Once you have an asset ID, prefer querying with GET /ai/v1/assets/{id}. reconciling does not mean failure and should not prompt creation with a new identifier.
  • After asset deletion is complete, the original idempotency identifiers are no longer retained. Do not rely on them to recover a deleted asset or replay an old creation request.
  • The idempotency contract in this section applies only to asset creation. It does not apply to asset group, verification session, or video creation. If a new-protocol video creation response is lost, first use GET /ai/v1/videos?limit=20&order=desc to find the original task and avoid duplicate generation.

Delete Assets and Asset Groups

Before deletion, confirm that all videos referencing the asset have finished, including tasks submitted through the compatibility API. Deletion cannot be undone. Manage any downloaded video files yourself. Delete a single asset:
A 202 response means deletion is still in progress. Continue querying with GET /ai/v1/assets/{id} until status=deleted. Repeated deletion requests return the current status. If it is reconciling, continue checking the result and contact support if the process remains incomplete. Deleting an entire asset group also deletes its assets and requires explicitly passing cascade=true:
An accepted request returns 202. Query with GET /ai/v1/asset-groups/{id}. deleting means deletion is in progress, partially_deleted means deletion is not yet complete, and only deleted indicates completion. Lists exclude deleted asset groups by default. 409 asset_group_in_use means that operations or video tasks are still unfinished. Wait, query the relevant statuses, and retry. You must confirm that compatibility video tasks have finished yourself; do not rely on deletion requests to automatically determine whether all compatibility tasks are still using the group.

FAQ

Why Can I Still Not Add Assets After Completing the Web Steps?

First query the verification session and asset group, and use verified and active as the criteria. Perform the same checks if the page displays internal error. Do not repeatedly create sessions for the same group while the session is pending. Query again later if the result has not been confirmed. If the process remains incomplete, contact support with the IDs; you do not need to provide the verification link or the person’s photo.

Why Does Video Generation Still Fail When the Asset Is Available?

Check that the reference uses the asset ID returned by AIHubMix, all assets belong to the same group, the media types match, and the current model supports the corresponding inputs. An asset status of active means the asset is available. You must still check the video task’s completion status and error information separately.

How Do I Handle Common API Errors?

For other video errors, see Async Task Error Codes. When submitting feedback, include the time of the occurrence, HTTP status, error.code, the returned error.tid (if any), and related resource IDs. Do not provide your API Key, verification link, or signed image URL.

References

Last updated: 2026-09-07