05 · гайд
Видео (async)
Видео — асинхронное: создаёте задачу, получаете её id, опрашиваете статус. Тарификация посекундная: цена за секунду × длительность (цены — на странице модели). Списание происходит при создании задачи; за провалившуюся генерацию токены возвращаются на баланс (подробности — в разделе про возвраты).
1. Создать задачу
curl https://api.node404.ru/v1/video/generations \
-H "Authorization: Bearer sk-ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-video-1080p",
"prompt": "бумажный кораблик плывёт по луже, кинематографично",
"seconds": "6",
"aspect_ratio": "16:9"
}'
Ответ: {"id": "task_NXl5bz…", "task_id": "task_NXl5bz…", "status": "queued", "progress": 0, …} — идентификатор задачи начинается с task_, опрашивайте статус по нему.
2. Опросить статус
curl https://api.node404.ru/v1/video/generations/task_NXl5bz… \
-H "Authorization: Bearer sk-ВАШ_КЛЮЧ"
Ответ на опросе приходит в обёртке шлюза: {"code": "success", "data": {…}}. Смотрите data.status: QUEUED → IN_PROGRESS → SUCCESS, провал — FAILURE (причина — в data.fail_reason; сравнивайте статус без учёта регистра). Полное тело задачи вложено в data.data, ссылки на готовые файлы — data.data.output[].url. У результата старше 14 дней во вложенном теле статус expired (код result_expired) — файлы удалены. Обычное время: 1–5 минут в зависимости от модели и длительности.
Оживление изображения (i2v)
Модели с i2v принимают исходные кадры публичными ссылками в поле image_urls (строка или массив строк):
"image_urls": ["https://ваш-домен/frame.png"]
Длительность
Поле seconds — строкой. Допустимые значения у каждой модели свои (диапазон или фиксированный набор) — см. страницу модели. Значение вне списка вернёт 400 с перечнем допустимых.
Действия над готовым роликом (Veo 3.1, Grok Imagine)
Продление и апскейл — отдельные модели. Veo 3.1: veo-3.1-lite-extend, veo-3.1-fast-extend, veo-3.1-quality-extend, veo-3.1-1080p-upscale, veo-3.1-4k-upscale. Grok Imagine: grok-video-480p-extend, grok-video-720p-extend, grok-video-1080p-extend, grok-video-upscale-480p-720p, grok-video-upscale-720p-1080p, grok-video-upscale-480p-1080p. Вместо генерации с нуля передайте task_id вашей прошлой задачи — это внутренний идентификатор из вложенного тела статуса (data.data.id, UUID), а не task_… шлюза. Поле prompt обязательно у всех действий (для апскейла — любой текст); seconds у Veo — "8", у продления Grok — "6" или "10", у апскейла Grok — "1" (цена фиксированная за ролик).
curl https://api.node404.ru/v1/video/generations \
-H "Authorization: Bearer sk-ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"model": "veo-3.1-lite-extend",
"task_id": "379e6560-d7c0-44e4-af3f-d1a7063110dc",
"prompt": "кораблик медленно поворачивает к камышам",
"seconds": "8"
}'
- Продление добавляет к ролику ~8 секунд и всегда отдаёт 720p, каким бы ни был исходник (1080p и 4K продлеваются). Тир продления должен совпадать с тиром исходной задачи (
lite→veo-3.1-lite-extend), иначе400 source_mode_mismatch. Принимаетseeds(10000–99999) иwatermark. - Апскейл работает только с исходной генерации: результат продления в 4K не берётся (
400 upstream_rejected). 1080p готов за 1–3 минуты, 4K — за 2–10; статус опрашивайте как обычно. - Grok Imagine: модель продления выбирается по разрешению исходного ролика (
grok-video-720pили-720p-i2v→grok-video-720p-extend), цена — посекундно по ставке этого разрешения; продлить можно на 6 или 10 секунд. Апскейл — по паре «из какого разрешения → в какое» (grok-video-upscale-480p-1080pдля ролика в 480p); источником может быть только генерация, не результат другого действия. Несовпадение —400 source_mismatchс подсказкой, какую модель взять.
Seedance 2: первый и последний кадр, референс-видео
Позиции seedance-2*-…-i2v принимают в image_urls один или два кадра: первый — старт ролика, второй — финальный ориентир (last_frame_url у модели; сцена ведётся к нему, точного совпадения последнего кадра модель не гарантирует). Цена — как у обычной генерации.
Позиции seedance-2*-…-vref — режим референс-видео: reference_video_urls — 1–3 публичные ссылки на mp4 по 2–15 секунд (вместе не больше 15), в промпте ссылайтесь на них как @Video1…; дополнительно можно до 9 image_urls (@Image1…). Ставка за секунду у этих позиций ниже, но считается за секунды ролика и референсов вместе: поле seconds обязано равняться длине ролика (4–15) плюс суммарной длине референсов, округлённой до секунды. Сервер измеряет референсы сам и при расхождении отвечает 400 reference_video_seconds с допустимым диапазоном.
curl https://api.node404.ru/v1/video/generations \
-H "Authorization: Bearer sk-ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-720p-vref",
"prompt": "Reference @Video1 for the camera motion, @Image1 for the character",
"reference_video_urls": ["https://example.com/motion-6s.mp4"],
"image_urls": ["https://example.com/hero.jpg"],
"seconds": "11"
}'
Здесь ролик 5 секунд плюс референс 6 секунд = "seconds": "11".
Kling 3.0: мультикадр
Любая позиция kling-3.0-* принимает multi_shots: true и список сцен multi_prompt (до 5, у каждой prompt до 500 символов и duration 1–12 с). Поле seconds обязано равняться сумме длительностей сцен — по нему считается цена; общий prompt при мультикадре модель не читает, но поле должно быть непустым. С кадром принимается только один (первый) кадр.
curl https://api.node404.ru/v1/video/generations \
-H "Authorization: Bearer sk-ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling-3.0-720p",
"prompt": "кораблик на пруду",
"multi_shots": true,
"multi_prompt": [
{"prompt": "бумажный кораблик на тихом пруду, утренний свет, статичная камера", "duration": 3},
{"prompt": "кораблик плывёт к камышам, камера медленно следует", "duration": 3}
],
"seconds": "6",
"aspect_ratio": "16:9"
}'
Kling 3.0: перенос движения (Motion Control)
Модели kling-3.0-motion-control-720p и -1080p переносят движение с вашего ролика на фото персонажа. Входы: image_urls — одно фото персонажа, video_url — ссылка на ролик-источник движения (3–30 секунд, до 100 МБ). Поля длительности у модели нет: результат длится столько же, сколько исходный ролик, поэтому seconds передавайте равным его длине — по нему считается цена. Опционально character_orientation (video | image) и background_source (input_video | input_image).
curl https://api.node404.ru/v1/video/generations \
-H "Authorization: Bearer sk-ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"model": "kling-3.0-motion-control-720p",
"prompt": "перенести движение",
"image_urls": ["https://example.com/person.jpg"],
"video_url": "https://example.com/dance.mp4",
"seconds": "6"
}'