> ## Documentation Index
> Fetch the complete documentation index at: https://docs.toapis.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Review assets within a video task

> Use private_asset_review to prepare and review media before generating a video in the same task

Set `private_asset_review: true` in your video request. The platform prepares the media actually used by the request and submits the video after all of it passes review. No duplicate asset list, asset group creation, or separate review polling is needed.

<Note>
  This workflow requires a Seedance asynchronous video channel with on-demand asset review enabled. It does not apply to every video model or synchronous endpoint. Requests fail if the feature is disabled or no compatible channel is available. Users in mainland China can replace `https://toapis.com` with `https://toapis.cn`.
</Note>

## Send the request

Use `POST /v1/videos/generations`. Keep images, video, and audio in their existing input fields and add the boolean switch.

```bash theme={null}
curl --request POST \
  --url https://toapis.com/v1/videos/generations \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "seedance-2",
    "client_business_id": "avatar-demo-001",
    "prompt": "Animate the character in image 1 using the movement in video 1.",
    "duration": 5,
    "aspect_ratio": "16:9",
    "image_with_roles": [
      {"url": "https://files.example.com/avatar.jpg", "role": "reference_image"}
    ],
    "video_with_roles": [
      {"url": "https://files.example.com/motion.mp4", "role": "reference_video"}
    ],
    "private_asset_review": true
  }'
```

Replace the example addresses with your own public URLs. The switch applies to all effective media inputs; selecting only a subset for review is not supported. Existing model limits and role validation still apply.

| Field                  | Type    | Description                                                                                                             |
| ---------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------- |
| `private_asset_review` | boolean | Optional, defaults to `false`. Set to `true` for on-demand review; omit or set to `false` to preserve existing behavior |

Use these input fields. Existing model limits and role combinations still apply:

Images use the first nonempty field in this order: `image_with_roles[].url` > `reference_images` > `image_urls` > `images` > `image`. These fields are not merged. Models that reject mixed image fields still reject them. Prompts and metadata are not scanned, and ignored input fields remain ignored.

| Asset type | Video input field        | Role                                              |
| ---------- | ------------------------ | ------------------------------------------------- |
| `image`    | `image_with_roles[].url` | `first_frame`, `last_frame`, or `reference_image` |
| `video`    | `video_with_roles[].url` | `reference_video`                                 |
| `audio`    | `audio_with_roles[].url` | `reference_audio`                                 |

HTTP(S) URLs are matched after trimming surrounding whitespace, may contain at most 2048 UTF-8 bytes, and cannot embed credentials. Repeated URLs of the same type are reused; conflicting types are rejected. Images also accept raw Base64 or `data:image/...;base64,...`, which is decoded, validated, and stored before review. Video and audio require HTTP(S). Local paths are unsupported; you can also [upload images](../../uploads/images) to obtain URLs.

Files must be nonempty. On-demand storage accepts images up to 20 MiB and video or audio up to 100 MiB. Models or review services may impose stricter format, duration, and size limits. The upload link above is for images; use [video upload](../../uploads/videos) or [audio upload](../../uploads/audios) for those media types.

## Wait for the video result

1. An accepted request returns a video task without holding the HTTP connection open for review. Acceptance does not mean review passed or video generation started.
2. The platform stores a copy and checks for a usable review record on the selected channel. If needed, it starts review. Concurrent requests for the same user, URL, and channel share preparation.
3. All effective media inputs must pass before video submission. First-time preparation can take several minutes. A usable record skips repeat review, but video generation remains asynchronous.

Query the same video task with its returned ID or your `client_business_id`:

```bash theme={null}
curl --request GET \
  --url https://toapis.com/v1/videos/generations/avatar-demo-001 \
  --header 'Authorization: Bearer YOUR_API_KEY'
```

Use the existing [video task status](../../tasks/video-status) endpoint or [task webhooks](../../webhooks/task-webhooks). The task may remain `queued` during review; do not poll the legacy asset endpoint. `completed` means the video is ready. For `failed`, inspect `error.message`.

The default preparation deadline is 20 minutes per round, measured from the start of that round. All assets share it; it is not 20 minutes per asset and does not include subsequent video generation. Platform configuration may change this deadline. Switching channels starts a new preparation round. Rejection or preparation timeout ends the video task without submitting the video.

If initial review does not pass, no video generation fee is charged. After review passes, normal video reservation and settlement apply. Reusing review records does not change video pricing.

## Reuse, retries, and retention

* Send the media again with `private_asset_review: true`; no asset ID is needed. Within the same user and channel, URLs match by full address and Base64 images by a digest of decoded content. Raw Base64 and data URIs with identical bytes reuse the same record. Records are not shared across users or channels.
* A different URL is a new source. Content changes at the same URL are not detected by file content; use a versioned URL for changed media.
* The platform stores an independent copy. By default, copies unused for more than 30 days may be cleaned up; actual retention depends on platform configuration. An accepted video submission counts as use, even before the video finishes. Later requests prepare cleaned-up assets again, so keep source URLs accessible.
* Retry the same business request with the same `client_business_id` to replay an existing task. Use a new business ID for another video or a fresh attempt after failure. Do not create repeated tasks just because review takes time.
* If video submission is still unconfirmed, keep querying the original task or contact support before resending with a new business ID.

## Compatibility with existing asset APIs

With the switch omitted or `false`, the [private avatar API](./private-avatar) and existing `asset://` references retain their behavior. With `true`, any `asset://` in media fields returns HTTP 400. Existing records are not looked up, copied, or migrated.

The switch does not change model capabilities or content requirements, or replace separate [real avatar verification](./real-avatar). The earlier `private_assets` field is no longer accepted; use the boolean `private_asset_review` field.

For validation errors, check the boolean type, asset:// references, and URL or Base64 format. For download failures, check URL access and expiry. Contact the platform if the feature is disabled or no compatible channel is available.
