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

API RapidVideoMaker

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

Получите ваш 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/MOV + 1 MP3 → редактирование аудио (mode=mix_audio для наложения). Несколько MP4/MOV → объединение. Сервер возвращает уникальный 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/MOV-файл. Файл доступен в течение 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/MOV Клипы собираются последовательно в указанном порядке. Опциональные переходы между клипами.
Редактировать аудио add_audio или mix_audio 1 MP4/MOV + 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/MOV Накладывает второе видео поверх основного. Позиция, размер, прозрачность и аудио настраиваются через поле options.
Текст в MP3 text_to_mp3 (только текст) Преобразует текст в речь и возвращает MP3-файл. Загружать файлы не нужно — передайте mode=text_to_mp3, text и lang как поля формы. Поддерживает все 20 языков сайта.
Строгая валидация: каждый режим требует точного количества и типов файлов. add_audio и mix_audio принимают только 1 MP4/MOV + 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/MOV, или 1 MP4/MOV + 1 MP3, или 1 изображение (JPG/PNG) + 1 MP3. Макс. 500 МБ на файл.
modestring*image_to_video | add_audio | mix_audio | overlay_video | text_to_mp3. Обязательно для этих режимов, отличных от fusion. Отсутствие mode при загрузке только MP4/MOV-файлов всегда запускает fusion (объединение копированием потока) — никогда overlay_video, даже если загружены ровно 2 MP4/MOV. Для редактирования аудио: add_audio удаляет оригинал, mix_audio сохраняет его и накладывает. Если поле 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 могут вызвать перегрузку.

Режим text_to_mp3 — прямые параметры (без JSON options)

В отличие от других режимов, эти поля отправляются напрямую как поля формы, а не внутри объекта JSON options. Обязательно только поле text.

КлючТипПо умолчаниюОписание
textstringТекст для преобразования в речь. Обязательно. Максимум 5000 символов.
langstring"en"Код языка, используемый для выбора голоса по умолчанию, если voice не указан или недействителен. Один из 20 языков сайта (см. таблицу ниже). Если язык неизвестен, используется en.
voicestringавтоID голоса edge-tts (см. таблицу ниже). Если не указан или недействителен, автоматически используется первый голос языка lang.
slowboolfalseУстановите true (или 1), чтобы замедлить речь на 25%. Любое другое значение считается false.
Загрузка файлов не требуется: в отличие от других режимов, text_to_mp3 не требует videos[]. Отправьте mode=text_to_mp3 вместе с text / lang / voice / slow как обычные поля формы.

Доступные голоса (edge-tts, Microsoft Neural), сгруппированные по коду языка:

ЯзыкДоступные голоса
en en-US-AvaNeural, en-US-AndrewNeural, en-GB-LibbyNeural
fr fr-FR-DeniseNeural, fr-FR-HenriNeural, fr-FR-EloiseNeural
es es-ES-ElviraNeural, es-ES-AlvaroNeural, es-MX-DaliaNeural
ar ar-SA-ZariyahNeural, ar-SA-HamedNeural, ar-EG-SalmaNeural
pt pt-BR-FranciscaNeural, pt-BR-AntonioNeural, pt-PT-RaquelNeural
de de-DE-KatjaNeural, de-DE-ConradNeural, de-DE-AmalaNeural
it it-IT-ElsaNeural, it-IT-DiegoNeural, it-IT-IsabellaNeural
nl nl-NL-ColetteNeural, nl-NL-MaartenNeural
ru ru-RU-SvetlanaNeural, ru-RU-DmitryNeural
tr tr-TR-EmelNeural, tr-TR-AhmetNeural
hi hi-IN-SwaraNeural, hi-IN-MadhurNeural
bn bn-IN-TanishaaNeural, bn-IN-BashkarNeural
ur ur-PK-UzmaNeural, ur-PK-AsadNeural
id id-ID-GadisNeural, id-ID-ArdiNeural
ja ja-JP-NanamiNeural, ja-JP-KeitaNeural
ko ko-KR-SunHiNeural, ko-KR-InJoonNeural
zh-CN zh-CN-XiaoxiaoNeural, zh-CN-YunxiNeural, zh-CN-XiaoyiNeural
zh-TW zh-TW-HsiaoChenNeural, zh-TW-YunJheNeural
vi vi-VN-HoaiMyNeural, vi-VN-NamMinhNeural
pl pl-PL-ZofiaNeural, pl-PL-MarekNeural

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

{ "success": true, "job_id": "a3f1c8d2e5b09471...", "mode": "fusion", // "fusion" | "add_audio" | "mix_audio" | "image_to_video" | "overlay_video" | "text_to_mp3" "file_count": 2, "transition": null, "quota_used": 1, "quota_remaining": 9, "status_url": "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..." }
Для text_to_mp3 в ответе нет полей file_count и transition (файл не загружался) — остальное идентично: job_id, quota_used, quota_remaining, status_url, webhook_secret.

Пример 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"

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

# No file upload — text + lang + voice as plain form fields curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "mode=text_to_mp3" \ -F "text=Welcome to Rapid Video Maker." \ -F "lang=en" \ -F "voice=en-US-AvaNeural" \ -F "slow=false" # voice omitted or invalid -> falls back to the first voice of "lang" curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "mode=text_to_mp3" \ -F "text=Bienvenue sur Rapid Video Maker." \ -F "lang=fr"
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)

ПараметрТипПо умолчаниюОписание
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)

ПараметрТипОбязательноОписание
job_idstringДАID job (hex 32 символа) завершённого видео
publicationsarrayДАМассив объектов публикации (макс. 10)

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

ПараметрТипОбязательноОписание
account_idintegerДАID подключённого социального аккаунта — отображается на странице Публикаций в личном кабинете
titlestringНазвание видео (макс. 512 символов)
descriptionstringОписание видео (макс. 5 000 символов)
tagsstringТеги через запятую (макс. 1 024 символа)
visibilitystringpublic | private | unlisted — По умолчанию: public
tiktok_modestringdraft | direct — Только TikTok — по умолчанию: draft
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" } ] }

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

КодЗначение
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> Скачать готовый файл

Транслирует готовый файл. Content-Typevideo/mp4 для видеорежимов или audio/mpeg для text_to_mp3. Токен не требуется. Доступно только когда статус ready.

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

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

ПараметрОписание
filenameПредлагаемое имя для скачиваемого файла (напр. моё-видео.mp4)
previewУстановите 1 для встроенного воспроизведения (без Content-Disposition: attachment) вместо скачивания — используется для предпросмотра в браузере.

Пример 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"}, )

Режим text_to_mp3 — текст в речь

# No files — text + lang (+ optional voice / slow) as form fields resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, data={ "mode": "text_to_mp3", "text": "Welcome to Rapid Video Maker.", "lang": "en", # one of the 20 site language codes "voice": "en-US-AvaNeural", # optional — falls back to the first voice of "lang" "slow": "false", # "true" = -25% speech rate }, )

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

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.