> ## 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.

# Проверка материалов в задаче генерации видео

> Используйте private_asset_review для проверки материалов и генерации видео в одной задаче

Установите `private_asset_review: true` в запросе генерации видео. Платформа подготовит фактически используемые материалы и отправит видео на генерацию после проверки всех материалов. Дублировать список, заранее создавать группу или отдельно опрашивать API проверки не нужно.

<Note>
  Этот способ доступен только для асинхронных видеоканалов Seedance с включенной проверкой материалов по запросу. Он не распространяется на все видеомодели и синхронные API. Если функция отключена или совместимого канала нет, запрос завершится ошибкой. В материковом Китае можно заменить `https://toapis.com` на `https://toapis.cn`.
</Note>

## Отправка запроса

Используйте `POST /v1/videos/generations`. Изображения, видео и аудио остаются в прежних входных полях; добавьте булев переключатель.

```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
  }'
```

Замените адреса в примере своими публичными URL. Проверяются все фактически используемые материалы, выбрать только часть нельзя. Ограничения моделей на количество и проверка ролей не меняются.

| Поле                   | Тип     | Описание                                                                                                                                          |
| ---------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `private_asset_review` | boolean | Необязательное, по умолчанию `false`. Значение `true` включает проверку по запросу. При отсутствии поля или `false` сохраняется прежнее поведение |

Используйте следующие поля. Ограничения моделей на количество материалов и сочетания ролей остаются прежними:

Для изображений выбирается первое непустое поле: `image_with_roles[].url` > `reference_images` > `image_urls` > `images` > `image`. Поля не объединяются. Модели, запрещающие их совместное использование, по-прежнему возвращают ошибку. Промпт и metadata не сканируются, а игнорируемые поля не начинают использоваться.

| Тип материала | Поле входных данных      | Роль                                              |
| ------------- | ------------------------ | ------------------------------------------------- |
| `image`       | `image_with_roles[].url` | `first_frame`, `last_frame` или `reference_image` |
| `video`       | `video_with_roles[].url` | `reference_video`                                 |
| `audio`       | `audio_with_roles[].url` | `reference_audio`                                 |

HTTP(S) URL сравниваются после удаления пробелов по краям, ограничены 2048 байтами UTF-8 и не должны содержать учетные данные. Одинаковые URL одного типа переиспользуются; конфликт типов вызывает ошибку. Изображения также принимаются в чистом Base64 или `data:image/...;base64,...`: они декодируются, проверяются и сохраняются до отправки на проверку. Видео и аудио требуют HTTP(S). Локальные пути не поддерживаются. Можно предварительно [загрузить изображение](../../uploads/images) и получить URL.

Файл не должен быть пустым. Для сохранения по запросу предел составляет 20 MiB для изображений и 100 MiB для видео и аудио. Модель или сервис проверки могут устанавливать более строгие ограничения на формат, длительность и размер. Ссылка загрузки выше предназначена для изображений; для других типов используйте [загрузку видео](../../uploads/videos) или [загрузку аудио](../../uploads/audios).

## Ожидание результата

1. После приема запроса возвращается задача видео. HTTP-соединение не остается открытым на все время проверки. Прием задачи не означает, что проверка пройдена или генерация уже началась.
2. Платформа сохраняет копию и проверяет, есть ли пригодная запись о проверке на выбранном канале. При необходимости запускается проверка. Одновременные запросы одного пользователя с одинаковыми URL и каналом используют общий процесс подготовки.
3. Все фактически используемые материалы должны пройти проверку до отправки видео. Первая подготовка может занять несколько минут. При наличии пригодной записи повторная проверка пропускается, но генерация остается асинхронной.

Запрашивайте ту же задачу по возвращенному ID или своему `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'
```

Используйте существующий API [статуса видеозадачи](../../tasks/video-status) или [Webhook задач](../../webhooks/task-webhooks). Во время проверки статус может оставаться `queued`. Опрос старого API материалов не нужен. `completed` означает готовность видео. При `failed` смотрите `error.message`.

По умолчанию на один раунд подготовки отводится 20 минут с начала этого раунда. Срок общий для всех материалов, а не по 20 минут на каждый. Последующая генерация видео в него не входит. Срок может меняться настройками платформы; при смене канала начинается новый раунд подготовки. Отказ в проверке или тайм-аут подготовки завершает задачу без отправки видео на генерацию.

Если первоначальная проверка не пройдена, плата за генерацию видео не взимается. После успешной проверки действуют обычные резервирование средств и окончательный расчет. Повторное использование проверки не меняет тарификацию видео.

## Повторное использование, повторы и хранение

* В следующих запросах снова передавайте материалы и `private_asset_review: true`; ID материала не нужен. В пределах одного пользователя и канала URL сравниваются целиком, а изображения Base64 по хешу декодированного содержимого. Чистый Base64 и data URI с одинаковыми байтами используют одну запись. Между пользователями или каналами записи не разделяются.
* Другой URL считается новым источником. Изменение содержимого по прежнему URL не определяется по файлу, поэтому для обновленного материала используйте URL с новой версией.
* Платформа хранит независимую копию. По умолчанию копии, не использовавшиеся более 30 дней, могут быть удалены; фактический срок зависит от настроек. Использование учитывается при приеме отправленного видео, до завершения генерации. После очистки следующий запрос запускает подготовку заново, поэтому исходные URL должны оставаться доступными.
* При сетевом повторе одного бизнес-запроса используйте тот же `client_business_id`: вернется существующая задача, новая не создается. Для другого видео или новой попытки после ошибки используйте новый бизнес-ID. Не создавайте повторные задачи только из-за длительной проверки.
* Если отправка видео еще не подтверждена, продолжайте проверять исходную задачу или обратитесь в поддержку. Не отправляйте запрос сразу заново с другим бизнес-ID.

## Совместимость с прежними API материалов

При отсутствии переключателя или значении `false` прежний [API приватных аватаров](./private-avatar) и ссылки `asset://` работают как раньше. При `true` любая ссылка `asset://` в полях медиа вызывает HTTP 400. Старые записи не ищутся, не копируются и не переносятся.

Переключатель не меняет возможности модели и требования к содержимому и не заменяет отдельную [проверку реального человека](./real-avatar). Прежнее поле `private_assets` больше не принимается; используйте булево поле `private_asset_review`.

При ошибке валидации проверьте булев тип, ссылки asset:// и формат URL или Base64. При ошибке скачивания проверьте доступность и срок действия URL. Если функция отключена или совместимого канала нет, обратитесь к платформе.
