RapidVideoMaker
Создать аккаунт

API RapidVideoMaker

REST API позволяет обрабатывать видеофайлы из любого HTTP-клиента — Python-скрипты, n8n-воркфлоу, сторонние инструменты. Доступно пять режимов: Объединение видео (несколько MP4), Редактирование аудио (1 MP4 + 1 MP3), Создание видео (1 JPG/PNG + 1 MP3), Наложение видео (2 MP4, картинка в картинке). Обработка асинхронная: отправьте файлы, затем опрашивайте результат.

Получите ваш API-токен бесплатно
Создайте аккаунт для получения API-токена — 20 запросов в день включено, используется через интерфейс или API.
Создать бесплатный аккаунт Уже есть аккаунт? Войти

Полный рабочий процесс

Каждая интеграция следует одной и той же последовательности из 4 шагов:

1
Создать задание — POST /api/v1/render.php
Отправьте файлы как multipart/form-data с вашим Bearer-токеном. 1 JPG/PNG + 1 MP3 + mode=image_to_video → генерация видео. 1 MP4 + 1 MP3 → редактирование аудио (mode=mix_audio для наложения). Несколько MP4 → объединение. Сервер возвращает уникальный job_id.
2
Отслеживать задание — GET /api/v1/jobs.php?job_id=…
Опрашивайте этот endpoint регулярно (каждые 5–10 сек.). Задание проходит через queuedprocessingready (или error). Ответ содержит позицию в очереди и расчётное оставшееся время.
3
Получить URL для скачивания
Когда статус ready, ответ содержит готовое поле download_url.
4
Скачать файл — GET /api/download.php?job_id=…
Скачайте готовый MP4-файл. Файл доступен в течение 2 часов после завершения задания, затем автоматически удаляется. После истечения срока API отвечает 410 Gone.

Аутентификация

Каждый запрос должен содержать ваш API-токен. Принимаются два формата:

# Аутентификация — Каждый запрос должен содержать ваш API-токен. Принимаются два формата: Authorization: Bearer rvm_your_token_here # Alternative X-API-Key: rvm_your_token_here

Ваш токен доступен в вашем личном кабинетеодин токен на аккаунт, создаётся автоматически при регистрации. Отображается в открытом виде только один раз — храните его в безопасности. При утрате можно регенерировать из личного кабинета.

Квота

Каждый аккаунт имеет 20 запросов в день, общих для веб-интерфейса и API. Неудавшиеся задания не расходуют квоту. Счётчик сбрасывается в полночь по UTC.

Ответы POST содержат quota_used и quota_remaining. При превышении лимита сервер отвечает 429.

Интерфейс + API = один счётчик. Видео, созданное через веб-интерфейс, и API-запрос расходуют по 1 кредиту из одной суточной квоты.

Очередь

Обрабатывается одно задание за раз. Если несколько заданий отправлены одновременно, они ставятся в очередь по порядку поступления. В ожидании ответ статуса содержит:

Применяется ограничение частоты: endpoint /api/v1/jobs.php принимает не более 12 вызовов в минуту на токен. Сверх этого сервер отвечает 429 с заголовком Retry-After: 5. Рекомендация: 10 секунд между вызовами.

Доступные переходы

Передайте transition_type=none (по умолчанию) для прямого объединения или один из типов ниже для перехода между клипами:

none fade fadeblack dissolve wipeleft wiperight slideleft slideright zoomin circleclose

Длительность (transition_duration) — от 0,2 до 2,0 секунд. Если клип слишком короткий, переход игнорируется.

Endpoints

POST /api/v1/render.php Создаёт задание обработки видео

Пять режимов, доступных через поле mode (опустите mode при нескольких MP4 для автоопределения fusion):

ПрименениеРежим APIНеобходимые файлыОписание
Объединить видео fusion 2–20 файлов MP4 Клипы собираются последовательно в указанном порядке. Опциональные переходы между клипами.
Редактировать аудио add_audio или mix_audio 1 MP4 + 1 MP3 Заменяет или дополняет аудиодорожку видео. Видеодорожка никогда не перекодируется (-c:v copy).

add_audio — оригинальный звук удаляется и заменяется MP3.
mix_audio — оригинальный звук сохраняется и MP3 накладывается (amix).
Создать видео image_to_video 1 JPG/PNG + 1 MP3 Создаёт видео из статичного изображения и аудиофайла. Текстовый оверлей, затухание, разрешение и FPS настраиваются через поле options.
Наложение видео overlay_video 2 MP4 Накладывает второе видео поверх основного. Позиция, размер, прозрачность и аудио настраиваются через поле options.
Текст в MP3 text_to_mp3 (только текст) Преобразует текст в речь и возвращает MP3-файл. Загружать файлы не нужно — передайте mode=text_to_mp3, text и lang как поля формы. Поддерживает все 20 языков сайта.
Строгая валидация: каждый режим требует точного количества и типов файлов. add_audio и mix_audio принимают только 1 MP4 + 1 MP3. image_to_video только 1 JPG/PNG + 1 MP3. MIME-типы проверяются по magic bytes.
Правило длительности: в режимах audio и image_to_video длительность результата равна длительности MP3. Видеодорожка в аудиорежимах никогда не перекодируется (-c:v copy).

Общие параметры (multipart/form-data)

ПолеТипОбяз.Описание
videos[]File[]ДАФайлы для обработки. В зависимости от режима: 2–20 MP4, или 1 MP4 + 1 MP3, или 1 изображение (JPG/PNG) + 1 MP3. Макс. 500 МБ на файл.
modestring*image_to_video | add_audio | mix_audio. Обязательно для этих трёх режимов. Игнорируется (автоопределение) если все файлы MP4 (fusion). Если поле mode указано, загруженные файлы должны точно совпадать.
orderJSONТолько режим fusion — JSON-массив индексов, определяющих порядок клипов.
transition_typestringТолько режим fusion. По умолчанию: none. См. список доступных переходов.
transition_durationfloatТолько режим fusion. Длительность 0,2–2,0 сек. По умолчанию: 0.5.
optionsJSONТолько режим image_to_video — JSON-объект параметров рендеринга (см. ниже).
callback_urlstringПубличный URL (http/https), вызываемый при завершении задания. Ответ содержит webhook_secret.

Параметры options — режим image_to_video

Все необязательны. Неуказанные значения → значения worker по умолчанию.

КлючТипПо умолчаниюОписание
textstring""Текст, отображаемый как оверлей. Пусто = нет текста. Макс. 500 символов.
font_sizeint60Размер шрифта в пикселях. Диапазон: 10–300. Рекомендуется: 36, 48, 60, 72, 96.
text_colorstring"white"Цвет текста (напр. white, yellow, #ffffff).
text_positionstring"center"Позиция текста: center, top, bottom.
boxbooltrueПолупрозрачный фон за текстом.
box_colorstring"black@0.4"Цвет + прозрачность в формате FFmpeg: цвет@прозрачность. Прозрачность: 0,0–1,0 (напр. black@0.4 = 40% чёрного).
fade_durationfloat0.5Длительность плавного появления/исчезновения в секундах (0–2). 0 = без эффекта.
widthint1080Ширина видео в пикселях (64–3840, чётное число). Стандарт: 1080/1920/720/1280.
heightint1920Высота видео в пикселях (64–3840, чётное число).
fpsint24Частота кадров (1–60).
image_fitstring"contain"Режим кадрирования: contain = всё изображение видно, пустые области заполняются bg_color; cover = изображение масштабируется, лишние края обрезаются. bg_color игнорируется в режиме cover.
bg_colorstring"black"Цвет фона если изображение не заполняет разрешение — только при image_fit=contain (напр. black, white, #1a1a2e).
enable_image_motionboolfalseВключает анимацию фото. При false изображение остаётся статичным. При true применяется эффект image_motion_effect через FFmpeg zoompan.
image_motion_effectstring"ken_burns"Эффект анимации. Значения: zoom_in, zoom_out, pan_left_to_right, pan_right_to_left, pan_top_to_bottom, pan_bottom_to_top, zoom_pan_soft, ken_burns. По умолчанию: ken_burns.
motion_intensityfloat1.0Интенсивность анимации фото (0,25–2,0). Умножает амплитуду зума и скорость панорамирования.
text_effectstring"none"Анимация текста. Значения: none, fade_in, slide_up, slide_down, slide_left, bounce.
text_effect_intensityfloat1.0Интенсивность анимации текста (0,25–2,0).
text_border_widthint0Толщина чёрного контура в пикселях (0 = отключено, 1–10). Улучшает читаемость.
text_modestring"static"Режим отображения текста. static (по умолчанию): полный текст виден с первого кадра. word_by_word: слова появляются по одному в темпе word_reveal_speed. Исключает text_effect: при text_mode=word_by_word text_effect игнорируется.
word_reveal_speedfloat1.5Скорость отображения в словах в секунду (0,3–5,0, по умолчанию 1,5). Только при text_mode=word_by_word. Рекомендуется для синхронизации с OpenAI TTS: 2,0.
word_animstring"none"Анимация появления каждого слова. none (по умолчанию): мгновенное появление. fade: каждое слово появляется с затуханием 0.2с и перекрёстным переходом. Только при text_mode=word_by_word.

Параметры options — режим overlay_video

Все необязательны. Порядок загрузки важен: первый файл — основное видео (фон), второй файл — оверлей (передний план). Используйте chroma_key для удаления зелёного фона с оверлея.

КлючТипПо умолчаниюОписание
positionstring"bottom-right"Угол расположения оверлея: top-left, top-right, bottom-left, bottom-right или center.
scalefloat0.30Размер оверлея как доля ширины основного видео. 0.25 = 25% ширины. Диапазон: 0.05–1.0.
opacityfloat1.0Прозрачность оверлея. 1.0 = полностью непрозрачный, 0.0 = невидимый.
marginint10Отступ в пикселях от края кадра. Игнорируется при position=center. Диапазон: 0–200.
audiostring"main"Какую аудиодорожку оставить. main: только основное аудио. overlay: только аудио оверлея. mix: обе дорожки смешаны.
chroma_keyboolfalseУстановите true для удаления зелёного (#00FF00) фона с оверлея — полезно для вебкамеры или анимаций на хромакее.
chroma_similarityfloat0.20Допуск хромакея. Низкий = строгое соответствие. Высокий = более широкое удаление. Рекомендуется: 0.10–0.20 для цифрового зелёного, 0.25–0.45 для физического экрана. Диапазон: 0.01–0.60.

Параметры options — Редактирование аудио (mix_audio)

Доступно только с mode=mix_audio. Игнорируется для add_audio.

КлючТипПо умолчаниюОписание
mp3_volumefloat1.0Громкость накладываемого MP3 (0,0 = отключено, 1,0 = оригинал, 2,0 = удвоено). Значения выше 1,0 могут вызвать перегрузку.

Успешный ответ (HTTP 200)

{ "success": true, "job_id": "a3f1c8d2e5b09471...", "mode": "fusion", // "fusion" | "add_audio" | "mix_audio" | "image_to_video" | "overlay_video" "file_count": 2, "transition": null, "quota_used": 1, "quota_remaining": 9, "status_url": "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..." }

Пример curl — режим image_to_video

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" \ -F "videos[]=@narration.mp3" \ -F "mode=image_to_video" \ -F 'options={"text":"Chapter 1","font_size":72,"text_color":"white","text_position":"bottom","box":true,"box_color":"black@0.4","fade_duration":0.5,"width":1080,"height":1920,"image_fit":"contain","bg_color":"black","enable_image_motion":true,"image_motion_effect":"ken_burns","motion_intensity":1.0,"text_effect":"slide_up","text_effect_intensity":1.0}' # image_fit : "contain" | "cover" # bg_color : ignored if image_fit="cover" # enable_image_motion : true = animation on, false (default) = static image # image_motion_effect : zoom_in | zoom_out | pan_left_to_right | pan_right_to_left | pan_top_to_bottom | pan_bottom_to_top | zoom_pan_soft | ken_burns # motion_intensity : 0.25–2.0 — photo animation amplitude (default 1.0) # text_effect : none | fade_in | slide_up | slide_down | slide_left | bounce (ignored if text_mode=word_by_word) # text_effect_intensity : 0.25–2.0 — text animation intensity (default 1.0) # text_border_width : 0–10 px — black outline around characters (0 = disabled) # text_mode : "static" (default) | "word_by_word" — reveal words one by one # word_reveal_speed : 0.3–5.0 w/s — speed for word_by_word mode (default 1.5, ~2.0 for OpenAI TTS) # word_anim : "none" (default) | "fade" — fade-in crossfade on each word (word_by_word only)

Пример curl — Редактирование аудио

# Replace audio (deletes original) curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "videos[]=@my_music.mp3" \ -F "mode=add_audio" # Keep original audio + overlay MP3 curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "videos[]=@my_music.mp3" \ -F "mode=mix_audio" \ -F 'options={"mp3_volume":0.7}' # mp3_volume : 0.0 (muted) → 1.0 (original volume, default) → 2.0 (amplified)

Пример curl — режим overlay_video

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@main_video.mp4" \ -F "videos[]=@overlay_video.mp4" \ -F "mode=overlay_video" \ -F 'options={"position":"bottom-right","scale":0.25,"opacity":1.0,"margin":20,"audio":"main"}' # Green screen overlay curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@main_video.mp4" \ -F "videos[]=@webcam_greenscreen.mp4" \ -F "mode=overlay_video" \ -F 'options={"position":"bottom-left","scale":0.35,"chroma_key":true,"chroma_similarity":0.15,"audio":"mix"}' # position : top-left | top-right | bottom-left | bottom-right | center (default: bottom-right) # scale : 0.05–1.0 — overlay width as fraction of main video (default 0.30) # opacity : 0.0–1.0 — overlay transparency (default 1.0) # margin : 0–200 px — gap from frame edge, ignored if center (default 10) # audio : main | overlay | mix — audio to keep (default: main) # chroma_key : true | false — remove green (#00FF00) background from overlay (default false) # chroma_similarity : 0.01–0.60 — green screen tolerance (default 0.20)

Пример curl — Объединение видео

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@clip1.mp4" \ -F "videos[]=@clip2.mp4" \ -F "transition_type=fade" \ -F "transition_duration=0.5"
GET /api/v1/jobs.php?job_id=<hex32> Статус задания

Возможные статусы

СтатусЗначениеДополнительные поля
queued В очереди, ещё не обработано queue_position, queue_total, eta_minutes
processing Обработка FFmpeg в процессе
ready Завершено — файл доступен download_url, created_at, expires_at
error Обработка не удалась error (message)

Ответы по статусам

{ "job_id": "a3f1c8...", "status": "queued", "queue_position": 2, "queue_total": 3, "eta_minutes": 7 }
{ "job_id": "a3f1c8...", "status": "ready", "download_url": "https://rapidvideomaker.com/api/download.php?job_id=a3f1c8...", "created_at": "2026-06-02T10:00:00+00:00", "expires_at": "2026-06-02T12:00:00+00:00" }

Пример curl

curl -H "Authorization: Bearer rvm_your_token" \ "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..."
GET /api/v1/jobs.php List all jobs created with this token (paginated, sorted by date desc)

Общие параметры (multipart/form-data)

apidocs_th_paramТипПо умолчаниюapidocs_th_desc
pageinteger1Page number (starts at 1)
limitinteger20Results per page (max 50, default 20)

Ответы по статусам

{ "success": true, "jobs": [ { "job_id": "a3f1c8...", "status": "ready", "mode": "fusion", "created_at": "2026-06-02T10:00:00+00:00", "expires_at": "2026-06-02T12:00:00+00:00", "download_url": "https://..." }, ... ], "total": 12, "page": 1, "limit": 20 }
POST /api/v1/publish.php Опубликовать видео на YouTube или TikTok

Публикует завершённый job (status=ready) на одном или нескольких социальных аккаунтах. Токен должен принадлежать аккаунту участника (не токен администратора).

Предварительное условие: Социальные аккаунты (YouTube, TikTok) должны быть предварительно подключены через OAuth на странице Публикаций в личном кабинете. Там отображается account_id каждого аккаунта.

Общие параметры (multipart/form-data)

apidocs_th_paramТипapidocs_th_requiredapidocs_th_desc
job_idstringapidocs_requiredID job (hex 32 символа) завершённого видео
publicationsarrayapidocs_requiredМассив объектов публикации (макс. 10)

Объект публикации

apidocs_th_paramТипapidocs_th_requiredapidocs_th_desc
account_idintegerapidocs_requiredID подключённого социального аккаунта — отображается на странице Публикаций в личном кабинете
titlestringНазвание видео (макс. 512 символов)
descriptionstringОписание видео (макс. 5 000 символов)
tagsstringТеги через запятую (макс. 1 024 символа)
visibilitystringpublic | private | unlisted — По умолчанию: public
tiktok_modestringdraft | direct — Только TikTok — по умолчанию: direct
tiktok_privacystringрежим directТолько TikTok — обязательно в режиме direct
allow_commentbooleanТолько TikTok — разрешить комментарии
allow_duetbooleanТолько TikTok — разрешить дуэты
allow_stitchbooleanТолько TikTok — разрешить стич
your_brandbooleanТолько TikTok — органический рекламный контент («Ваш бренд»).
branded_contentbooleanТолько TikTok — раскрытие брендированного контента
tiktok_cover_msintegerТолько TikTok — метка времени кадра обложки в мс (0–60 000, по умолчанию 1 000)

Ответы по статусам

{ "success": true, "results": [ { "account_id": 12, "pub_id": 47, "status": "published", "provider": "youtube", "url": "https://youtu.be/abc123" } ] }

Коды ошибок для каждой публикации

apidocs_th_codeЗначение
job_not_readyJob ещё не завершён
mode_not_supportedJobs text_to_mp3 нельзя публиковать
account_not_foundАккаунт не найден или отключён
tiktok_privacy_requiredУровень конфиденциальности обязателен в режиме direct
publication_failedПровайдер вернул ошибку во время загрузки

Пример cURL

curl -X POST https://rapidvideomaker.com/api/v1/publish.php \ -H "Authorization: Bearer rvm_your_token" \ -H "Content-Type: application/json" \ -d '{ "job_id": "a3f1c8...", "publications": [ { "account_id": 12, "title": "My video", "description": "Created with RapidVideoMaker", "visibility": "public" } ] }'
GET /api/download.php?job_id=<hex32> Скачать готовый файл

Возвращает готовый MP4-файл в виде потока (Content-Type: video/mp4). Токен не требуется. Доступно только когда статус ready.

Файл хранится 2 часа после завершения, затем удаляется. Скачайте его, как только статус станет ready.

Необязательный параметр

ПараметрОписание
filenameПредлагаемое имя для скачиваемого файла (напр. моё-видео.mp4)

Пример curl

curl -o "output.mp4" \ "https://rapidvideomaker.com/api/download.php?job_id=a3f1c8...&filename=output.mp4"

Вебхуки

Вебхуки — альтернатива поллингу: вместо проверки статуса каждые X секунд вы указываете URL и сервер автоматически уведомляет вас о завершении задания.

Как это работает

  1. Передайте callback_url в POST на /api/v1/render.php
  2. Ответ содержит webhook_secret — сохраните его для проверки подписей
  3. Когда задание достигает ready или error, сервер отправляет подписанный JSON-POST на ваш URL
  4. Проверьте подпись с помощью HMAC-SHA256(webhook_secret, raw_body)
Ограничения: callback_url должен быть публично доступным URL. Частные и loopback IP-адреса заблокированы. Тайм-аут: 10 секунд.

Полученный payload

{ "job_id": "a3f1c8...", "status": "ready", "download_url": "https://rapidvideomaker.com /api/download.php?job_id=a3f1c8...", "timestamp": "2026-04-04T12:00:00+00:00" }
{ "job_id": "a3f1c8...", "status": "error", "error": "FFmpeg xfade failed:...", "timestamp": "2026-04-04T12:00:00+00:00" }

Заголовки, отправляемые сервером

ЗаголовокЗначение
Content-Typeapplication/json
X-RVM-Signaturesha256=<hmac_hex> — HMAC-SHA256 подпись raw body
X-RVM-Job-IdСоответствующий job_id

Проверка подписи

# Python import hmac, hashlib def verify_webhook(secret: str, body: bytes, signature_header: str) -> bool: expected = "sha256=" + hmac.new( secret.encode(), body, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature_header) # Flask/FastAPI endpoint: sig = request.headers.get("X-RVM-Signature", "") if not verify_webhook(WEBHOOK_SECRET, request.data, sig): return "Invalid signature", 403 data = request.get_json()

Коды ошибок

HTTPJSON-кодПричина
401unauthorizedТокен отсутствует, недействителен или отозван
400missing_filesФайлы не получены
400too_few_filesОтправлено менее 2 файлов
400too_many_filesОтправлено более 20 файлов
400invalid_mimeНеподдерживаемый файл — принимаются только MP4, MP3 и JPG/PNG (MIME проверяется по magic bytes)
400wrong_file_countКоличество файлов не соответствует выбранному режиму
400wrong_file_typesТипы файлов не соответствуют выбранному режиму
400invalid_file_combinationКомбинация файлов без режима не соответствует ни одному поддерживаемому режиму
400invalid_optionsПоле options не является корректным JSON или не содержит объект
400invalid_optionЗначение в options недействительно (цвет, шрифт, позиция…)
400file_too_largeФайл превышает 500 МБ
400invalid_orderМассив order не является корректной перестановкой
400invalid_job_idНеверный формат job_id (должен быть 32-символьным шестнадцатеричным)
404job_not_foundЗадание не найдено — job_id неизвестен или никогда не существовал
410job_expiredЗадание истекло — существовало, но 2-часовое окно прошло
429quota_exceededДостигнуто 20 успешных заданий/день
429rate_limitedБолее 12 вызовов/мин на /api/v1/jobs.php — ожидайте Retry-After секунд
500server_errorВнутренняя ошибка сервера

Примеры интеграции

Примеры для каждого режима — установите requests через pip install requests.

Общая конфигурация

import requests, time, sys, json API_BASE = "https://rapidvideomaker.com" API_TOKEN = "rvm_your_token_here" HEADERS = {"Authorization": f"Bearer {API_TOKEN}"}

Режим image_to_video — изображение + аудио → видео

with open("scene.jpg", "rb") as fi, open("narration.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("scene.jpg", fi, "image/jpeg")), ("videos[]", ("narration.mp3", fa, "audio/mpeg")), ], data={ "mode": "image_to_video", "options": json.dumps({ "text": "Chapter 1", "font_size": 72, "text_color": "white", "text_position": "bottom", "box": True, "box_color": "black@0.4", "fade_duration": 0.5, "width": 1080, "height": 1920, "image_fit": "contain", # "contain" | "cover" "bg_color": "black", # ignored if image_fit="cover" "enable_image_motion": True, "image_motion_effect": "ken_burns", "motion_intensity": 1.0, # 0.25–2.0 — photo animation amplitude "text_effect": "slide_up", # none | fade_in | slide_up | slide_down | slide_left | bounce (ignored if text_mode=word_by_word) "text_effect_intensity": 1.0, # 0.25–2.0 — text animation intensity # word-by-word reveal (mutually exclusive with text_effect): # "text_mode": "word_by_word", "word_reveal_speed": 2.0, "word_anim": "fade" }), }, )

Редактирование аудио

# Replace audio (deletes original) — mode=add_audio with open("video.mp4", "rb") as fv, open("music.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("video.mp4", fv, "video/mp4")), ("videos[]", ("music.mp3", fa, "audio/mpeg")), ], data={"mode": "add_audio"}, ) # Keep original audio + overlay MP3 — mode=mix_audio with open("video.mp4", "rb") as fv, open("music.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("video.mp4", fv, "video/mp4")), ("videos[]", ("music.mp3", fa, "audio/mpeg")), ], data={"mode": "mix_audio", "options": json.dumps({"mp3_volume": 0.7})}, # mp3_volume : 0.0 = muted, 1.0 = original volume (default), 2.0 = amplified )

Режим overlay_video — картинка в картинке

with open("main.mp4", "rb") as fm, open("overlay.mp4", "rb") as fo: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("main.mp4", fm, "video/mp4")), ("videos[]", ("overlay.mp4", fo, "video/mp4")), ], data={ "mode": "overlay_video", "options": json.dumps({ "position": "bottom-right", # top-left | top-right | bottom-left | bottom-right | center "scale": 0.25, # 0.05–1.0 — overlay width fraction "opacity": 1.0, # 0.0–1.0 — transparency "margin": 20, # 0–200 px — gap from frame edge "audio": "main", # main | overlay | mix # green screen: "chroma_key": True, "chroma_similarity": 0.15 }), }, )

Объединение видео

with open("clip1.mp4", "rb") as f1, open("clip2.mp4", "rb") as f2: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("clip1.mp4", f1, "video/mp4")), ("videos[]", ("clip2.mp4", f2, "video/mp4")), ], data={"transition_type": "fade", "transition_duration": "0.5"}, )

Поллинг + скачивание (общее для всех режимов)

resp.raise_for_status() job_id = resp.json()["job_id"] print(f"Job created: {job_id}") for _ in range(120): # timeout 10 min (120 × 5s) r = requests.get( f"{API_BASE}/api/v1/jobs.php", headers=HEADERS, params={"job_id": job_id}, ) data = r.json() status = data["status"] if status == "queued": pos = data.get("queue_position", "?") eta = data.get("eta_minutes", "?") print(f"Queued — position {pos}, ETA ~{eta} min") elif status == "processing": print("Processing…") elif status == "ready": download_url = data["download_url"] break elif status == "error": sys.exit(f"Error: {data.get('error')}") time.sleep(5) else: sys.exit("Timeout: job not completed after 10 min") r = requests.get(download_url, stream=True) with open("output.mp4", "wb") as f: for chunk in r.iter_content(65536): f.write(chunk) print("Downloaded: output.mp4")

Два подхода в n8n: поллинг (цикл статусов) или вебхук (сервер вызывает n8n). Вебхук рекомендуется — чище, без лишней нагрузки.

Подход A — Вебхук (рекомендуется)

Только 3 узла, без цикла.

Узел 1 — Триггер Webhook
Добавьте узел Webhook как вход рабочего процесса (метод POST). Запишите сгенерированный URL, напр. https://ваш-n8n.com/webhook/rvm-callback.

Узел 2 — Создать задание (HTTP Request)

МетодPOST
URLhttps://rapidvideomaker.com/api/v1/render.php
АутентификацияHeader Auth — Authorization: Bearer rvm_…
Тип содержимого bodyForm-Data Multipart
Body paramsBinary-поле videos[] для каждого клипа + Text-поле callback_url = URL узла webhook

Сохраните webhook_secret из ответа в переменной рабочего процесса.

Узел 3 — Обработать результат (в рабочем процессе, активированном вебхуком)
Когда n8n получает POST от сервера, $json.status — это ready или error. При ready, $json.download_url содержит прямой URL скачивания.

Проверка подписи: сравните {{ $headers['x-rvm-signature'] }} с sha256= + HMAC-SHA256 raw body. Узел Code: crypto.createHmac('sha256', secret).update(body).digest('hex').

Подход B — Поллинг (без вебхука)

5 узлов, цикл статусов каждые 10 сек.

Узел 1 — Создать задание — та же конфигурация, без callback_url.

Узел 2 — Ожидание — 10 секунд.

Узел 3 — Опрос статуса (HTTP Request GET)

URLhttps://rapidvideomaker.com/api/v1/jobs.php
Параметры запросаjob_id = {{ $('Узел 1').item.json.job_id }}
АутентификацияАутентификация заголовком — тот же токен

Узел 4 — If: {{ $json.status }} === 'ready' → true: Узел 5 / false: вернуться к Узлу 2.

Добавьте счётчик итераций в узле Set, чтобы прервать цикл после 60 попыток (макс. 10 мин.).

Узел 5 — Скачать: HTTP Request GET на {{ $json.download_url }}, формат ответа File.

Шаг 1 — Создать задание (выберите режим)

# fusion JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@clip1.mp4" -F "videos[]=@clip2.mp4") # add_audio (replace audio) JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@video.mp4" -F "videos[]=@music.mp3" \ -F "mode=add_audio") # mix_audio (overlay music at 70% volume) JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@video.mp4" -F "videos[]=@music.mp3" \ -F "mode=mix_audio" -F 'options={"mp3_volume":0.7}') # image_to_video JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" -F "videos[]=@narration.mp3" \ -F "mode=image_to_video" \ -F 'options={"text":"Chapter 1","font_size":72,"text_position":"bottom","fade_duration":0.5,"width":1080,"height":1920}') JOB_ID=$(echo $JOB | grep -o '"job_id":"[^"]*"' | cut -d'"' -f4) echo "Job ID: $JOB_ID"

Шаг 2 — Поллинг

while true; do STATUS=$(curl -s \ -H "Authorization: Bearer rvm_your_token" \ "https://rapidvideomaker.com/api/v1/jobs.php?job_id=$JOB_ID") STATE=$(echo $STATUS | grep -o '"status":"[^"]*"' | cut -d'"' -f4) echo "Status: $STATE" [ "$STATE" = "ready" ] && break [ "$STATE" = "error" ] && { echo "Error"; exit 1; } sleep 10 done

Шаг 3 — Скачивание

DOWNLOAD_URL=$(echo $STATUS | grep -o '"download_url":"[^"]*"' | cut -d'"' -f4) curl -o output.mp4 "$DOWNLOAD_URL"

Рекомендации

Файлы результатов хранятся 2 часа после завершения задания, затем автоматически удаляются. Скачайте видео, как только статус станет ready.