Видео
Два сценария. Понимание — видео на вход /chat/completions. Генерация — асинхронный POST /videos: задача, опрос статуса, скачивание MP4.
Понимание видео
Запросы с видео идут в POST https://api.daaj.ru/v1/chat/completions с параметром messages в формате multi-part. video_url.url может быть публичным URL или data-URI с base64. Несколько роликов — отдельные элементы массива content. Текст лучше ставить первым, затем видео.
Модель должна уметь видео во входе: в каталоге у неё modalities.input содержит video. Пример ниже — gemini-3.7-flash.
Использование URL видео
curl https://api.daaj.ru/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-VTOP Ai-xxx" \
-d '{
"model": "gemini-3.7-flash",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "Опиши, что происходит в этом видео."},
{
"type": "video_url",
"video_url": {"url": "https://www.youtube.com/watch?v=aqz-KE-bpKQ"}
}
]
}
]
}'Использование видео в формате Base64
Для локально хранящихся видео отправьте их как data-URI data:video/mp4;base64,... (подставьте MIME файла).
# url — data-URI: data:video/mp4;base64,<...>
curl https://api.daaj.ru/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-VTOP Ai-xxx" \
-d '{
"model": "gemini-3.7-flash",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "Что происходит в этом видео?"},
{
"type": "video_url",
"video_url": {"url": "data:video/mp4;base64,AAAA..."}
}
]
}
]
}'Поддерживаемые типы видео:
video/mp4video/mpegvideo/movvideo/webm
Какие чат-модели видят видео — группа chat публичного каталога, фильтр по modalities.input:
curl https://api.daaj.ru/public/VTOP Ai/models/chatВидеофайлы бывают большими: сжимайте, обрезайте до нужного фрагмента, не гоните 4K, если хватает 720p. Длинный ролик лучше резать на сегменты — у моделей разные потолки длительности.
Генерация видео
VTOP Ai поддерживает генерацию видео по текстовому промпту (text-to-video), по опорному изображению (image-to-video), по референсу (reference-to-video) и правку существующего видео (video-to-video) через асинхронный API.
Процесс состоит из трёх шагов:
- Отправить задачу:
POST /v1/videos— мгновенно возвращаетid,polling_urlиstatus: "pending". - Опрашивать статус:
GET /v1/videos/{id}— повторять каждые 15–30 секунд доcompletedилиfailed. - Скачать результат:
GET /v1/videos/{id}/content— возвращает MP4.
Поддерживаемые модели
Актуальный список моделей генерации видео вместе с их возможностями (размеры, aspect ratio, длительности, поддержка аудио, image-to-video, референсов, video-to-video, passthrough-параметров и тарификации) доступен через публичный эндпоинт:
curl https://api.daaj.ru/public/VTOP Ai/models/videosТакже его можно посмотреть на странице моделей.
Каждая запись содержит поля:
| Поле | Описание |
|---|---|
provider | Провайдер модели (например, google, openai, bytedance, alibaba) |
supported_resolutions | Поддерживаемые разрешения (например, 720p, 1080p, 4K) |
supported_aspect_ratios | Поддерживаемые соотношения сторон (например, 16:9, 9:16) |
supported_sizes | Точные пиксельные размеры WIDTHxHEIGHT |
supported_durations | Допустимые значения duration в секундах |
supported_frame_images | Типы опорных кадров для image-to-video: first_frame, last_frame |
generate_audio | Управление аудио: true — параметр generate_audio можно переключать, false — модель никогда не генерирует аудио, null — переключатель не документирован (аудио может присутствовать непредсказуемо, без возможности управления) |
supports_seed | Принимает ли параметр seed |
supports_input_references | Поддерживает ли input_references (изображения, а у части моделей — также video_url / audio_url) |
modalities.input | Входные модальности. Если есть "video" — модель умеет править исходное видео (video-to-video) через input_references с type: "video_url" |
allowed_passthrough_parameters | Разрешённые ключи в provider.options.<slug>.parameters |
Тарификация
Стоимость зависит от модели, разрешения и длительности:
- В момент отправки задачи мы резервируем максимальную возможную стоимость запроса (
worst-case) на вашем балансе. Резерв — это не списание: пока задача не завершилась, деньги удержаны, но ещё не потрачены, и в истории расходов их нет. - Когда задача завершается (
completed), мы списываем фактическую стоимость и возвращаем разницу на баланс. - Если задача упала (
failed), истекла (expired) или была отменена провайдером (cancelled) — вся зарезервированная сумма возвращается автоматически, а списания не появляется вообще. - Больше зарезервированной суммы с вас не спишут никогда. Если провайдер выставил нам больше — разницу оплачиваем мы.
- Расчёт делает сервер, а не ваш опрос: каждую минуту планировщик проверяет незавершённые задачи, поэтому резерв освобождается сам — даже если вы больше не обращались к API.
- У каждой задачи есть жёсткий срок (поле
expires_at, около часа для видео). Если к этому времени провайдер не отдал результат, задача переводится вexpiredи резерв возвращается полностью. Зависнуть вpendingнавсегда задача не может. - Итоговая стоимость в рублях приходит в поле
usage.cost_rubответаGET /v1/videos/{id}, но только после расчёта.
Отправка задачи
Базовый text-to-video
# 1. Отправить задачу
curl -X POST "https://api.daaj.ru/v1/videos" \
-H "Authorization: Bearer sk-VTOP Ai-xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0-fast",
"prompt": "A golden retriever playing fetch on a sunny beach",
"size": "1280x720",
"duration": 5
}'
# => { "id": "abc123", "polling_url": "https://api.daaj.ru/v1/videos/abc123", "status": "pending" }
# 2. Опросить статус (повторять до completed/failed)
curl "https://api.daaj.ru/v1/videos/abc123" \
-H "Authorization: Bearer sk-VTOP Ai-xxx"
# 3. Скачать видео после completed
curl -L "https://api.daaj.ru/v1/videos/abc123/content?index=0" \
-H "Authorization: Bearer sk-VTOP Ai-xxx" \
--output video.mp4Параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
model | string | да | ID модели (например, seedance-2.0). Список — через публичный эндпоинт моделей |
prompt | string | да | Текстовое описание видео |
duration | integer | нет | Длительность в секундах (значение должно входить в supported_durations модели) |
resolution | string | нет | Разрешение выхода (например, 720p, 1080p) |
aspect_ratio | string | нет | Соотношение сторон (например, 16:9, 9:16) |
size | string | нет | Точные пиксели WIDTHxHEIGHT. Альтернатива паре resolution + aspect_ratio |
frame_images | array | нет | Опорные кадры для image-to-video (first_frame, last_frame) |
input_references | array | нет | Референсы: image_url, а у моделей с "video" во входе — также video_url (правка видео) и при поддержке провайдера audio_url |
generate_audio | boolean | нет | Генерировать ли аудио. Доступен только для моделей с generate_audio: true — для остальных запрос вернёт ошибку 400 |
seed | integer | нет | Seed для детерминизма (не гарантируется всеми провайдерами) |
provider | object | нет | Passthrough-параметры провайдера |
Поддерживаемые разрешения и aspect ratio
Общий набор значений по всем моделям (конкретные опции зависят от модели — сверяйтесь с её supported_resolutions / supported_aspect_ratios / supported_sizes):
- Разрешения:
480p,720p,1080p,1K,2K,4K - Aspect ratios:
16:9,9:16,1:1,4:3,3:4,21:9,9:21
Image-to-Video (опорные кадры)
Передайте массив frame_images с первым и/или последним кадром — модель сгенерирует переход между ними (или продолжение первого кадра).
{
"model": "wan-2.7",
"prompt": "A character walking through a misty forest",
"frame_images": [
{
"type": "image_url",
"image_url": { "url": "https://example.com/first-frame.png" },
"frame_type": "first_frame"
}
],
"resolution": "1080p",
"duration": 5
}Для указания последнего кадра используйте "frame_type": "last_frame". Поддерживаемые типы опорных кадров для модели указаны в поле supported_frame_images публичного эндпоинта.
Reference-to-Video (визуальный референс)
input_references — референсные изображения для стиля или содержания, а не покадровая основа. Поддерживается моделями, у которых supports_input_references: true.
{
"model": "seedance-1-5-pro",
"prompt": "A colossal solar flare beside a planet",
"input_references": [
{
"type": "image_url",
"image_url": { "url": "https://example.com/style-ref.png" }
}
],
"resolution": "1080p",
"duration": 6
}Video-to-Video (правка видео)
Модели, у которых в каталоге modalities.input содержит "video" (например, aleph-2, hailuo-3), принимают исходное видео в input_references с типом video_url. Промпт описывает правку: заменить объект, сменить фон, переосмыслить стиль, освещение и т.п.
URL может быть публичной HTTPS-ссылкой или data URL (data:video/mp4;base64,…). Провайдер принимает только HTTPS для video_url / audio_url — при data URL VTOP Ai сам выкладывает файл во временное хранилище и подставляет публичный URL перед отправкой.
{
"model": "aleph-2",
"prompt": "Replace the red car with a blue convertible, keep camera motion",
"aspect_ratio": "16:9",
"duration": 5,
"input_references": [
{
"type": "video_url",
"video_url": { "url": "https://example.com/source.mp4" }
}
]
}Можно комбинировать исходное видео с image-референсом (стиль / ключевой кадр), если модель это допускает:
{
"model": "hailuo-3",
"prompt": "Transfer the motion from the source clip onto this character",
"size": "1280x720",
"duration": 6,
"input_references": [
{
"type": "video_url",
"video_url": { "url": "https://example.com/motion-source.mp4" }
},
{
"type": "image_url",
"image_url": { "url": "https://example.com/character.png" }
}
]
}Passthrough-параметры провайдера
Некоторые модели принимают специфичные опции через поле provider.options.<slug>.parameters:
{
"model": "veo-3.1",
"prompt": "A time-lapse of a flower blooming",
"provider": {
"options": {
"google-vertex": {
"parameters": {
"personGeneration": "allow",
"negativePrompt": "blurry, low quality"
}
}
}
}
}Разрешённые ключи для каждой модели приходят в поле allowed_passthrough_parameters публичного эндпоинта моделей. Всё, что не входит в этот список, будет отфильтровано и залогировано, но не приведёт к ошибке.
Формат ответов
POST /v1/videos — отправка (202 Accepted)
{
"id": "abc123",
"polling_url": "https://api.daaj.ru/v1/videos/abc123",
"status": "pending"
}На этом шаге usage не возвращается — итоговая стоимость известна только после completed.
GET /v1/videos/{id} — статус
Поля расширяются по мере прогресса задачи.
Pending / in_progress:
{
"id": "abc123",
"polling_url": "https://api.daaj.ru/v1/videos/abc123",
"status": "in_progress"
}Completed:
{
"id": "abc123",
"generation_id": "gen-1234567890-abcdef",
"polling_url": "https://api.daaj.ru/v1/videos/abc123",
"status": "completed",
"unsigned_urls": [
"https://api.daaj.ru/v1/videos/abc123/content?index=0"
],
"model": "seedance-2.0-fast",
"usage": {
"cost_rub": 47.92
}
}Failed:
{
"id": "abc123",
"status": "failed",
"error": "Provider rejected the prompt due to content policy",
"model": "seedance-2.0-fast",
"usage": {
"cost_rub": 0
}
}Возможные статусы
| Статус | Описание |
|---|---|
pending | Задача принята и стоит в очереди |
in_progress | Идёт генерация |
completed | Видео готово, можно скачивать |
expired | Задача не завершилась до expires_at — провайдер так и не отдал результат. Резерв возвращён полностью, списания нет |
cancelled | Провайдер отменил задачу на своей стороне; резерв возвращён полностью. Через API отменить задачу нельзя |
failed | Генерация упала (см. поле error); резерв полностью возвращён |
Скачивание видео
После completed — используйте либо URL из unsigned_urls[0], либо обращайтесь напрямую к content-эндпоинту:
curl -L "https://api.daaj.ru/v1/videos/abc123/content?index=0" \
-H "Authorization: Bearer sk-VTOP Ai-xxx" \
--output video.mp4Параметр index по умолчанию 0. Используйте другие значения, если модель вернула несколько выходных видео.
Ссылки в unsigned_urls указывают на наш content-эндпоинт и не имеют срока действия с истекающей подписью — они работают, пока задача доступна у нас. Это не временные подписанные ссылки провайдера.
Задачи хранятся у нас 3 месяца, потом завершённые удаляются (списания в истории расходов остаются). Сам файл живёт у провайдера и может стать недоступен раньше, поэтому скачивайте нужное видео сразу, а не рассчитывайте на ссылку как на хранилище.
Прямая ссылка с токеном в URL
Если нужно скачать видео по обычной ссылке без заголовка Authorization (например, чтобы Telegram или браузер могли забрать файл по прямому URL), передайте API-ключ в query-параметре token:
# Без заголовка Authorization — ключ прямо в URL
curl -L "https://api.daaj.ru/v1/videos/abc123/content?index=0&token=sk-VTOP Ai-xxx" \
--output video.mp4Такую ссылку можно отдать, например, Telegram Bot API (sendVideo с video=<URL>), который скачает файл сам.
Список задач
Если id потерялся или нужно понять, что ещё выполняется, задачи можно перечислить.
# Только видео, новые сверху
curl "https://api.daaj.ru/v1/videos?limit=20" \
-H "Authorization: Bearer sk-VTOP Ai-xxx"
# Только те, что ещё держат резерв
curl "https://api.daaj.ru/v1/videos?active=true" \
-H "Authorization: Bearer sk-VTOP Ai-xxx"Параметры: status, active=true, limit (до 100), after — id последней задачи предыдущей страницы. Ответ содержит data, has_more и last_id.
Все асинхронные задачи любого типа — видео и Batch — доступны одним запросом:
curl "https://api.daaj.ru/v1/jobs?active=true" \
-H "Authorization: Bearer sk-VTOP Ai-xxx"GET /v1/jobs дополнительно отвечает на главный вопрос по деньгам: active_count и active_reserved_rub — сколько задач ещё выполняется и сколько рублей они держат. У каждой записи есть kind (video / batch), reserved_rub, а после расчёта — cost_rub и refunded_rub. GET /v1/jobs/{id} возвращает одну задачу любого типа.
Задачи доступны только владельцу ключа: чужой id вернёт 404.
В личном кабинете
То же самое без кода — на странице Статистика → Задачи:
- сколько денег сейчас в резерве и сколько задач выполняется;
- статус каждой задачи, фактическое списание и сумма возврата;
- фильтры по типу и статусу;
- готовое видео можно посмотреть прямо в браузере и скачать, а результаты Batch — выгрузить в JSON.
Списания живут в соседней вкладке «Расходы»: там только фактически потраченное, резервы туда не попадают.
Лучшие практики
- Подробные промпты — указывайте движение, ракурс, освещение, композицию сцены.
- Разумный duration — чем короче, тем дешевле и быстрее. Задавайте явно, чтобы не резервировать максимум.
- Интервал опроса — 15–30 секунд. Генерация занимает от 30 секунд до нескольких минут.
- Не бойтесь прекратить опрос — задачу мы досчитаем сами. Сохраните
idи вернитесь за результатом позже; никакого «брошенного» резерва от этого не возникнет. - Обрабатывайте все терминальные статусы, а не только
failed:expiredиcancelledдля вашего кода означают то же самое — результата нет, деньги вернулись. - Качество референсов — для image-to-video и reference-to-video используйте изображения с разрешением, близким к выходному
size. Для video-to-video исходный клип лучше держать коротким и в том же aspect ratio, что и выход.
Устранение неполадок
Задача надолго зависла в pending?
- Нормально для тяжёлых моделей (
veo-3.1,sora-2-proна 1080p) — генерация может занять несколько минут. - Продолжайте опрос на обычном интервале либо просто вернитесь позже: навсегда задача не зависнет — до
expires_atона либо завершится, либо станетexpiredс полным возвратом резерва. - Проверить, что именно держит деньги, можно в кабинете: Статистика → Задачи показывает все незавершённые задачи и сумму резерва.
400 Bad Request на POST /v1/videos?
- Проверьте, что
size/resolution/aspect_ratio/durationвходят в capability-лист модели (supported_sizes,supported_resolutions,supported_aspect_ratios,supported_durationsиз эндпоинта моделей). - Для моделей с
supports_input_references: falseполеinput_referencesвернёт 400. - Поле
frame_imagesработает только для моделей с непустымsupported_frame_images.
status: "failed"?
- Проверьте поле
error— чаще всего это content-policy отказ или недоступное опорное изображение. - Убедитесь, что все URL в
frame_images/input_referencesпублично доступны по HTTPS (или data URL — дляvideo_url/audio_urlVTOP Ai сам конвертирует в HTTPS) и в поддерживаемом формате (изображения: JPEG / PNG / WebP; видео: MP4 / WebM / MOV). Для video-to-video модель должна иметь"video"вmodalities.input. - Резерв уже возвращён на баланс — можно смело повторять.
Модель не найдена?
- Используйте ID модели без префикса провайдера (например,
seedance-2.0, а неbytedance/seedance-2.0). - Актуальный список доступен по
GET https://api.daaj.ru/public/VTOP Ai/models/videosи на странице моделей.
Видео не обрабатывается в чате?
- Проверьте, что модель поддерживает видео-вход (
modalities.inputвключает"video"). - Если URL не работает, попробуйте base64. У Gemini по ссылке обычно YouTube.
- Проверьте формат файла и что он не повреждён.
Смотрите также
- Понимание видео в чате — раздел выше на этой странице
- Картинки — понимание и генерация изображений
- Аудио — аудио в чате
- Распознавание речи — аудио в текст
- Ошибки и отладка