API RapidVideoMaker
The REST API lets you process video files from any HTTP client — Python scripts, n8n workflows, third-party tools. Five modes available: Merge videos (multiple MP4), Edit audio (1 MP4 + 1 MP3), Create a video (1 JPG/PNG + 1 MP3), Overlay video (2 MP4 picture-in-picture). Processing is asynchronous: submit files, then poll for the result.
Pełny przepływ pracy
Każda integracja przebiega według tej samej sekwencji 4 kroków:
POST /api/v1/render.phpmultipart/form-data z tokenem Bearer. 1 JPG/PNG + 1 MP3 + mode=image_to_video → generowanie wideo. 1 MP4 + 1 MP3 → edycja audio (mode=mix_audio do nakładania). Wiele MP4 → scalenie. Serwer zwraca unikalny job_id.GET /api/v1/jobs.php?job_id=…queued → processing → ready (lub error). Odpowiedź zawiera pozycję w kolejce i szacowany czas.ready, odpowiedź zawiera gotowe pole download_url.GET /api/download.php?job_id=…410 Gone.Uwierzytelnianie
Każde żądanie musi zawierać token API. Akceptowane są dwa formaty:
Twój token jest dostępny w przestrzeni członkowskiej — jeden token na konto, tworzony automatycznie przy rejestracji. Jest wyświetlany w postaci jawnej tylko raz — przechowuj go bezpiecznie. W razie utraty możesz go zregenerować ze swojej przestrzeni członkowskiej.
Limit
Każde konto członkowskie ma 20 żądań dziennie, wspólnych dla interfejsu webowego i API. Nieudane zadania nie zużywają limitu. Licznik resetuje się o północy UTC.
Odpowiedzi POST zawierają quota_used i quota_remaining. Po przekroczeniu limitu serwer odpowiada 429.
Kolejka
Jedno zadanie jest przetwarzane na raz. Jeśli kilka zadań zostanie przesłanych jednocześnie, są kolejkowane w kolejności przyjęcia. Podczas oczekiwania odpowiedź statusu zawiera:
queue_position— pozycja zadania w kolejce (1 = następne)queue_total— całkowita liczba oczekujących zadańeta_minutes— szacowany czas do rozpoczęcia przetwarzania
/api/v1/jobs.php akceptuje maksymalnie 12 wywołań na minutę na token. Powyżej serwer odpowiada 429 z nagłówkiem Retry-After: 5. Zalecenie: 10 sekund między wywołaniami. Dostępne przejścia
Przekaż transition_type=none (domyślnie) dla bezpośredniego scalenia lub jeden z poniższych typów dla przejścia między klipami:
Czas trwania (transition_duration) wynosi między 0,2 a 2,0 sekundy. Jeśli klip jest za krótki, przejście jest ignorowane.
Endpointy
Five modes, accessible via the mode field (omit mode with multiple MP4s to auto-detect fusion):
| Użycie | Tryb API | Wymagane pliki | Opis |
|---|---|---|---|
| Scal wideo | fusion |
2–20 plików MP4 | Klipy są składane sekwencyjnie w podanej kolejności. Opcjonalne przejścia między klipami. |
| Edytuj audio | add_audio lub mix_audio |
1 MP4 + 1 MP3 | Zastępuje lub wzbogaca ścieżkę audio wideo. Ścieżka wideo nigdy nie jest ponownie kodowana (-c:v copy).add_audio — oryginalne audio jest usuwane i zastępowane MP3.mix_audio — oryginalne audio jest zachowywane i MP3 jest nakładane (amix). |
| Utwórz wideo | image_to_video |
1 JPG/PNG + 1 MP3 | Generuje wideo ze statycznego obrazu i pliku audio. Nakładka tekstowa, zanikanie, rozdzielczość i FPS konfigurowalne przez pole options. |
| Overlay video | overlay_video |
2 MP4 | Nakłada drugi film na film główny. Pozycja, rozmiar, przezroczystość i dźwięk konfigurowalne przez pole options. |
| Tekst na MP3 | text_to_mp3 |
(tylko tekst) | Konwertuje tekst na mowę i zwraca plik MP3. Nie trzeba przesyłać pliku — wyślij mode=text_to_mp3, text i lang jako pola formularza. Obsługuje wszystkie 20 języków witryny. |
add_audio i mix_audio akceptują tylko 1 MP4 + 1 MP3. image_to_video tylko 1 JPG/PNG + 1 MP3. Typy MIME są weryfikowane przez magic bytes.-c:v copy).Wspólne parametry (multipart/form-data)
| Pole | Typ | Wym. | Opis |
|---|---|---|---|
| videos[] | File[] | TAK | Pliki do przetworzenia. W zależności od trybu: 2–20 MP4, lub 1 MP4 + 1 MP3, lub 1 obraz (JPG/PNG) + 1 MP3. Max. 500 MB na plik. |
| mode | string | * | image_to_video | add_audio | mix_audio. Wymagane dla tych trzech trybów. Ignorowane (automatycznie wykrywane) gdy wszystkie pliki to MP4 (fusion). Gdy pole mode jest podane, przesłane pliki muszą dokładnie pasować. |
| order | JSON | Tylko tryb fusion — tablica JSON indeksów definiujących kolejność klipów. | |
| transition_type | string | Tylko tryb fusion. Domyślnie: none. Zobacz listę dostępnych przejść. | |
| transition_duration | float | Tylko tryb fusion. Czas trwania 0,2–2,0 sek. Domyślnie: 0.5. | |
| options | JSON | Tylko tryb image_to_video — obiekt JSON parametrów renderowania (patrz poniżej). | |
| callback_url | string | Publiczny URL (http/https) wywoływany po zakończeniu zadania. Odpowiedź zawiera webhook_secret. |
Parametry options — tryb image_to_video
Wszystkie opcjonalne. Niepodane wartości → domyślne workera.
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
| text | string | "" | Tekst wyświetlany jako nakładka. Puste = brak tekstu. Max. 500 znaków. |
| font_size | int | 60 | Rozmiar czcionki w pikselach. Zakres: 10–300. Zalecane: 36, 48, 60, 72, 96. |
| text_color | string | "white" | Kolor tekstu (np. white, yellow, #ffffff). |
| text_position | string | "center" | Pozycja tekstu: center, top, bottom. |
| box | bool | true | Półprzezroczyste tło za tekstem. |
| box_color | string | "black@0.4" | Kolor + krycie w formacie FFmpeg: kolor@krycie. Krycie: 0,0–1,0 (np. black@0.4 = 40% czerni). |
| fade_duration | float | 0.5 | Czas trwania wejścia/wyjścia w sekundach (0–2). 0 = brak zanikania. |
| width | int | 1080 | Szerokość wideo w pikselach (64–3840, parzysta). Standard: 1080/1920/720/1280. |
| height | int | 1920 | Wysokość wideo w pikselach (64–3840, parzysta). |
| fps | int | 24 | Liczba klatek na sekundę (1–60). |
| image_fit | string | "contain" | Tryb kadrowania: contain = pełny obraz widoczny, puste obszary wypełnione bg_color; cover = obraz powiększony, nadmiar przycinany. bg_color ignorowane w cover. |
| bg_color | string | "black" | Kolor tła gdy obraz nie wypełnia rozdzielczości — tylko przy image_fit=contain (np. black, white, #1a1a2e). |
| enable_image_motion | bool | false | Włącza animację zdjęcia. Przy false obraz pozostaje statyczny. Przy true efekt image_motion_effect jest stosowany przez FFmpeg zoompan. |
| image_motion_effect | string | "ken_burns" | Efekt animacji. Wartości: 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. Domyślnie: ken_burns. |
| motion_intensity | float | 1.0 | Intensywność animacji zdjęcia (0,25–2,0). Mnoży amplitudę zoomu i prędkość panoramy. |
| text_effect | string | "none" | Animacja tekstu. Wartości: none, fade_in, slide_up, slide_down, slide_left, bounce. |
| text_effect_intensity | float | 1.0 | Intensywność animacji tekstu (0,25–2,0). |
| text_border_width | int | 0 | Grubość czarnego obrysu w pikselach (0 = wyłączone, 1–10). Poprawia czytelność. |
| text_mode | string | "static" | Tryb wyświetlania tekstu. static (domyślny): pełny tekst widoczny od pierwszej klatki. word_by_word: słowa pojawiają się jedno po drugim w tempie word_reveal_speed. Wyklucza text_effect: gdy text_mode=word_by_word, text_effect jest ignorowany. |
| word_reveal_speed | float | 1.5 | Prędkość odkrywania słów na sekundę (0,3–5,0, domyślnie 1,5). Tylko z text_mode=word_by_word. Zalecana wartość do synchronizacji z OpenAI TTS: 2,0. |
| word_anim | string | "none" | Animacja pojawiania się każdego słowa. none (domyślnie): natychmiastowe wyświetlenie. fade: każde nowe słowo pojawia się z zanikaniem 0.2s i crossfade. Tylko przy text_mode=word_by_word. |
Parametry options — tryb overlay_video
Wszystkie opcjonalne. Kolejność przesyłania ma znaczenie: pierwszy plik to główny film (tło), drugi plik to nakładka (pierwszy plan). Użyj chroma_key, aby usunąć zielone tło z nakładki.
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
| position | string | "bottom-right" | Narożnik, w którym umieszczana jest nakładka: top-left, top-right, bottom-left, bottom-right lub center. |
| scale | float | 0.30 | Rozmiar nakładki jako ułamek szerokości głównego filmu. 0.25 = 25% szerokości. Zakres: 0.05–1.0. |
| opacity | float | 1.0 | Przezroczystość nakładki. 1.0 = całkowicie nieprzezroczysta, 0.0 = niewidoczna. |
| margin | int | 10 | Odstęp w pikselach między nakładką a krawędzią kadru. Ignorowany przy position=center. Zakres: 0–200. |
| audio | string | "main" | Która ścieżka audio ma pozostać. main: tylko audio głównego filmu. overlay: tylko audio nakładki. mix: obie ścieżki zmiksowane. |
| chroma_key | bool | false | Ustaw true, aby usunąć czyste zielone tło (#00FF00) z nakładki — przydatne dla kamerki lub animacji nagranych na zielonym ekranie. |
| chroma_similarity | float | 0.20 | Tolerancja chromakey. Niska = ścisłe dopasowanie. Wysoka = szersze usuwanie. Zalecane: 0.10–0.20 dla zieleni cyfrowej, 0.25–0.45 dla ekranu fizycznego. Zakres: 0.01–0.60. |
Parametry options — Edycja audio (mix_audio)
Dostępne tylko z mode=mix_audio. Ignorowane dla add_audio.
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
| mp3_volume | float | 1.0 | Głośność nakładanego MP3 (0,0 = wyciszony, 1,0 = oryginał, 2,0 = podwójny). Wartości powyżej 1,0 mogą powodować przesterowanie. |
Odpowiedź sukcesu (HTTP 200)
Przykład curl — tryb image_to_video
Przykład curl — Edycja audio
Przykład curl — tryb overlay_video
Przykład curl — Scalanie wideo
Możliwe statusy
| Status | Znaczenie | Dodatkowe pola |
|---|---|---|
| queued | W kolejce, jeszcze nie przetworzone | queue_position, queue_total, eta_minutes |
| processing | Przetwarzanie FFmpeg w toku | — |
| ready | Ukończone — plik dostępny | download_url, created_at, expires_at |
| error | Przetwarzanie nie powiodło się | error (message) |
Odpowiedzi według statusu
Przykład curl
Wspólne parametry (multipart/form-data)
| apidocs_th_param | Typ | Domyślnie | apidocs_th_desc |
|---|---|---|---|
page | integer | 1 | Page number (starts at 1) |
limit | integer | 20 | Results per page (max 50, default 20) |
Odpowiedzi według statusu
Publikuje ukończone zadanie (status=ready) na jednym lub kilku kontach społecznościowych. Token musi należeć do konta członka (nie token administratora).
account_id każdego konta jest tam wyświetlane.Wspólne parametry (multipart/form-data)
| apidocs_th_param | Typ | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
job_id | string | apidocs_required | ID zadania (hex 32 znaki) ukończonego wideo |
publications | array | apidocs_required | Tablica obiektów publikacji (maks. 10) |
Obiekt publikacji
| apidocs_th_param | Typ | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
account_id | integer | apidocs_required | ID połączonego konta społecznościowego — widoczne na stronie Publikacji w obszarze członkowskim |
title | string | — | Tytuł wideo (maks. 512 znaków) |
description | string | — | Opis wideo (maks. 5 000 znaków) |
tags | string | — | Tagi oddzielone przecinkami (maks. 1 024 znaki) |
visibility | string | — | public | private | unlisted — Domyślnie: public |
tiktok_mode | string | — | draft | direct — Tylko TikTok — domyślnie: direct |
tiktok_privacy | string | tryb direct | Tylko TikTok — wymagane w trybie direct |
allow_comment | boolean | — | Tylko TikTok — zezwalaj na komentarze |
allow_duet | boolean | — | Tylko TikTok — zezwalaj na duety |
allow_stitch | boolean | — | Tylko TikTok — zezwalaj na stitche |
your_brand | boolean | — | Tylko TikTok — organiczne treści promocyjne ("Twoja marka"). |
branded_content | boolean | — | Tylko TikTok — ujawnienie treści markowych |
tiktok_cover_ms | integer | — | Tylko TikTok — znacznik czasu klatki okładki w ms (0–60 000, domyślnie 1 000) |
Odpowiedzi według statusu
Kody błędów dla każdej publikacji
| apidocs_th_code | Znaczenie |
|---|---|
job_not_ready | Zadanie nie zostało jeszcze ukończone |
mode_not_supported | Zadania text_to_mp3 nie mogą być publikowane |
account_not_found | Konto nie znalezione lub rozłączone |
tiktok_privacy_required | Poziom prywatności wymagany w trybie direct |
publication_failed | Dostawca zwrócił błąd podczas przesyłania |
Przykład cURL
Zwraca gotowy plik MP4 jako strumień (Content-Type: video/mp4). Nie wymaga tokenu. Dostępny tylko gdy status to ready.
Plik jest przechowywany przez 2 godziny po zakończeniu, potem usuwany. Pobierz go, gdy tylko status stanie się ready.
Opcjonalny parametr
| Parametr | Opis |
|---|---|
| filename | Sugerowana nazwa pobieranego pliku (np. moje-wideo.mp4) |
Przykład curl
Webhooki
Webhooki są alternatywą dla pollingu: zamiast sprawdzać status co X sekund, podajesz URL i serwer automatycznie Cię powiadamia, gdy zadanie jest gotowe.
Jak to działa
- Przekaż
callback_urlw POST do/api/v1/render.php - Odpowiedź zawiera
webhook_secret— zachowaj go do weryfikacji podpisów - Gdy zadanie osiągnie
readyluberror, serwer wysyła podpisany JSON-POSTna Twój URL - Zweryfikuj podpis za pomocą
HMAC-SHA256(webhook_secret, raw_body)
callback_url musi być publicznie dostępnym URL. Prywatne i loopback IP są zablokowane. Timeout: 10 sekund. Otrzymany payload
Nagłówki wysyłane przez serwer
| Nagłówek | Wartość |
|---|---|
| Content-Type | application/json |
| X-RVM-Signature | sha256=<hmac_hex> — podpis HMAC-SHA256 surowego body |
| X-RVM-Job-Id | Odpowiedni job_id |
Weryfikacja podpisu
Kody błędów
| HTTP | Kod JSON | Przyczyna |
|---|---|---|
| 401 | unauthorized | Brak tokenu, nieprawidłowy lub odwołany |
| 400 | missing_files | Nie otrzymano plików |
| 400 | too_few_files | Wysłano mniej niż 2 pliki |
| 400 | too_many_files | Wysłano więcej niż 20 plików |
| 400 | invalid_mime | Nieobsługiwany plik — akceptowane tylko MP4, MP3 i JPG/PNG (MIME weryfikowany przez magic bytes) |
| 400 | wrong_file_count | Liczba plików nie odpowiada wybranemu trybowi |
| 400 | wrong_file_types | Typy plików nie odpowiadają wybranemu trybowi |
| 400 | invalid_file_combination | Kombinacja plików bez trybu nie odpowiada żadnemu obsługiwanemu trybowi |
| 400 | invalid_options | Pole options nie jest prawidłowym JSON lub nie zawiera obiektu |
| 400 | invalid_option | Wartość w options jest nieprawidłowa (kolor, czcionka, pozycja…) |
| 400 | file_too_large | Plik przekracza 500 MB |
| 400 | invalid_order | Tablica order nie jest prawidłową permutacją |
| 400 | invalid_job_id | Nieprawidłowy format job_id (musi być 32-znakowym szesnastkowym) |
| 404 | job_not_found | Zadanie nie znalezione — job_id nieznany lub nigdy nie istniał |
| 410 | job_expired | Zadanie wygasło — istniało, ale 2-godzinne okno minęło |
| 429 | quota_exceeded | Osiągnięto 20 udanych zadań/dzień |
| 429 | rate_limited | Ponad 12 wywołań/min na /api/v1/jobs.php — poczekaj Retry-After sekund |
| 500 | server_error | Wewnętrzny błąd serwera |
Przykłady integracji
Przykłady dla każdego trybu — zainstaluj requests przez pip install requests.
Wspólna konfiguracja
Tryb image_to_video — obraz + audio → wideo
Edycja audio
Tryb overlay_video — obraz w obrazie
Scalanie wideo
Polling + pobieranie (wspólne dla wszystkich trybów)
Dwa podejścia w n8n: polling (pętla statusu) lub webhook (serwer wywołuje n8n). Webhook jest zalecany — czystszy, zero zbędnego obciążenia.
Podejście A — Webhook (zalecane)
Tylko 3 węzły, bez pętli.
Węzeł 1 — Wyzwalacz Webhook
Dodaj węzeł Webhook jako wejście workflow (metoda POST). Zanotuj wygenerowany URL, np. https://twoj-n8n.com/webhook/rvm-callback.
Węzeł 2 — Utwórz zadanie (HTTP Request)
| Metoda | POST |
| URL | https://rapidvideomaker.com/api/v1/render.php |
| Uwierzytelnianie | Header Auth — Authorization: Bearer rvm_… |
| Typ zawartości body | Form-Data Multipart |
| Body params | Pole Binary videos[] dla każdego klipu + Pole Text callback_url = URL węzła webhook |
Zachowaj webhook_secret z odpowiedzi w zmiennej workflow.
Węzeł 3 — Przetwórz wynik (w workflow aktywowanym przez webhook)
Gdy n8n otrzyma POST serwera, $json.status to ready lub error. Przy ready, $json.download_url zawiera bezpośredni URL pobierania.
{{ $headers['x-rvm-signature'] }} z sha256= + HMAC-SHA256 surowego body. Węzeł Code: crypto.createHmac('sha256', secret).update(body).digest('hex').Podejście B — Polling (bez webhooków)
5 węzłów, pętla statusu co 10 sek.
Węzeł 1 — Utwórz zadanie — ta sama konfiguracja, bez callback_url.
Węzeł 2 — Czekaj — 10 sekund.
Węzeł 3 — Pobierz status (HTTP Request GET)
| URL | https://rapidvideomaker.com/api/v1/jobs.php |
| Parametry zapytania | job_id = {{ $('Węzeł 1').item.json.job_id }} |
| Uwierzytelnianie | Uwierzytelnianie nagłówkiem — ten sam token |
Węzeł 4 — If: {{ $json.status }} === 'ready' → true: Węzeł 5 / false: wróć do Węzła 2.
Węzeł 5 — Pobierz: HTTP Request GET na {{ $json.download_url }}, format odpowiedzi File.
Krok 1 — Utwórz zadanie (wybierz tryb)
Krok 2 — Polling
Krok 3 — Pobieranie
Najlepsze praktyki
- Częstotliwość pollingu: endpoint
/api/v1/jobs.phpjest ograniczony do 12 wywołań/min na token. Co najmniej 5 sekund między wywołaniami (10 sek. zalecane). - Timeout: zaimplementuj timeout po stronie klienta (np. 10 minut). Jeśli zadanie nie jest
ready, traktuj to jako błąd. - Szybkie pobieranie: gdy tylko status to
ready, pobierz plik. Zostaje usunięty 2 godziny po zakończeniu. - Zarządzanie limitem: sprawdź
quota_remainingw odpowiedzi POST. Przy0następne zadanie zostanie odrzucone z429. - Błędy sieciowe: przy błędzie sieci poczekaj i spróbuj ponownie — zadanie kontynuuje wykonywanie po stronie serwera.
ready.