RapidVideoMaker
Account aanmaken

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/MOV), Edit audio (1 MP4/MOV + 1 MP3), Create a video (1 JPG/PNG + 1 MP3), Overlay video (2 MP4/MOV picture-in-picture). Processing is asynchronous: submit files, then poll for the result.

Haal gratis je API-token
Maak een account aan om je API-token te krijgen — 20 verzoeken per dag inbegrepen, te gebruiken via de interface of de API.
Gratis account aanmaken Al een account? Inloggen

Volledig werkproces

Elke integratie volgt dezelfde reeks van 4 stappen:

1
Job aanmaken — POST /api/v1/render.php
Stuur bestanden als multipart/form-data met uw Bearer-token. 1 JPG/PNG + 1 MP3 + mode=image_to_video → videogeneratie. 1 MP4/MOV + 1 MP3 → audiobewerking (mode=mix_audio voor overlay). Meerdere MP4/MOV → samenvoegen. De server geeft een unieke job_id terug. Of 1 afbeelding + options.text + options.voice: de stem wordt uit de tekst gegenereerd, zonder MP3.
2
Job bewaken — GET /api/v1/jobs.php?job_id=…
Bevraag dit endpoint regelmatig (elke 5–10 sec.). De job doorloopt queued → processing → ready (of error). Het antwoord bevat de wachtrijpositie en een geschatte resterende tijd.
3
Download-URL ophalen
Wanneer de status ready is, bevat het antwoord een gebruiksklaar veld download_url.
4
Bestand downloaden — GET /api/download.php?job_id=…
Download het definitieve MP4/MOV-bestand. Het bestand is beschikbaar gedurende 2 uur na voltooiing van de job, daarna automatisch verwijderd. Na het verstrijken reageert de API met 410 Gone.

Authenticatie

Elke aanvraag moet uw API-token bevatten. Twee formaten worden geaccepteerd:

# Authenticatie — Elke aanvraag moet uw API-token bevatten. Twee formaten worden geaccepteerd: Authorization: Bearer rvm_your_token_here # Alternative X-API-Key: rvm_your_token_here

Uw token is beschikbaar in uw ledenruimte — één token per account, automatisch aangemaakt bij registratie. Het wordt slechts eenmalig in leesbare vorm getoond — bewaar het veilig. Indien verloren, kunt u het opnieuw genereren vanuit uw ledenruimte.

Quotum

Elk ledenkonto heeft 20 aanvragen per dag, gedeeld tussen webinterface en API. Mislukte jobs verbruiken geen quotum. De teller reset om middernacht UTC.

POST-antwoorden bevatten quota_used en quota_remaining. Wanneer de limiet is overschreden, reageert de server met 429.

Interface + API = zelfde teller. Een video gemaakt via de webinterface en een API-aanvraag verbruiken elk 1 credit van hetzelfde dagelijkse quotum.

Wachtrij

Er wordt één job tegelijk verwerkt. Als meerdere jobs tegelijkertijd worden ingediend, worden ze in volgorde van binnenkomst verwerkt. Tijdens het wachten bevat het statusantwoord:

Rate limit van toepassing: het endpoint /api/v1/jobs.php accepteert maximaal 12 aanroepen per minuut per token. Daarboven reageert de server met 429 en een Retry-After: 5-header. Aanbeveling: 10 seconden tussen aanroepen.

Beschikbare overgangen

Geef transition_type=none (standaard) voor direct samenvoegen, of een van de onderstaande typen voor een overgang tussen clips:

none fade fadeblack dissolve wipeleft wiperight slideleft slideright zoomin circleclose

De duur (transition_duration) is tussen 0,2 en 2,0 seconden. Als een clip te kort is voor de overgang, wordt deze genegeerd.

Endpoints

POST /api/v1/render.php Maakt een videoverwerkingsjob aan

Five modes, accessible via the mode field (omit mode with multiple MP4s to auto-detect fusion):

GebruikAPI-modusVereiste bestandenBeschrijving
Video's samenvoegen fusion 2–20 MP4/MOV-bestanden Clips worden aaneengesloten in de opgegeven volgorde. Optionele overgangen tussen clips.
Audio bewerken add_audio of mix_audio 1 MP4/MOV + 1 MP3 Vervangt of verrijkt het audiospoor van een video. Het videospoor wordt nooit opnieuw gecodeerd (-c:v copy).

add_audio — het originele geluid wordt verwijderd en volledig vervangen door de MP3.
mix_audio — het originele geluid blijft behouden en de MP3 wordt erover gelegd (amix).
Video aanmaken image_to_video 1 JPG/PNG + 1 MP3 — of 1 JPG/PNG + een tekst (options.text + options.voice): de stem wordt gegenereerd Maakt een video van een stilstaande afbeelding en je MP3 — of van alleen een tekst (options.text) waarvan de stem wordt gegenereerd (options.voice). Tekstoverlay (vast, woord voor woord of karaoke), fades, resolutie en fps instelbaar via het veld options.
Overlay video overlay_video 2 MP4/MOV Plaatst een tweede video over de hoofdvideo. Positie, grootte, doorzichtigheid en audio instelbaar via het veld options.
Tekst toevoegen add_text 1 MP4/MOV Plaatst tekst over een bestaande video (resolutie, framerate en geluid blijven behouden). Dezelfde tekstinstellingen als image_to_video, plus het moment waarop de tekst verschijnt. options.text is verplicht.
Tekst naar MP3 text_to_mp3 (alleen tekst) Converteert tekst naar spraak en geeft een MP3-bestand terug. Geen bestand uploaden nodig — stuur mode=text_to_mp3, text en lang als formuliervelden. Ondersteunt alle 20 talen van de site.
Strikte validatie: elke modus vereist een exact aantal en type bestanden. add_audio en mix_audio accepteren alleen 1 MP4/MOV + 1 MP3. image_to_video alleen 1 JPG/PNG + 1 MP3. MIME-typen worden gecontroleerd via magic bytes. Uitzondering: met options.text + options.voice accepteert image_to_video 1 afbeelding alleen — de stem wordt uit de tekst gegenereerd (zonder MP3).
Duratieregel: in audio- en image_to_video-modus is de resultaatduur gelijk aan de MP3-duur. Het videospoor wordt in audiomodi nooit opnieuw gecodeerd (-c:v copy). Met options.voice duurt image_to_video zo lang als de uit de tekst gegenereerde stem (+0,6 s).

Gemeenschappelijke parameters (multipart/form-data)

VeldTypeVer.Beschrijving
videos[]File[]JATe verwerken bestanden. Afhankelijk van modus: 2–20 MP4/MOV, of 1 MP4/MOV + 1 MP3, of 1 afbeelding (JPG/PNG) + 1 MP3. Max. 500 MB per bestand.
modestring*image_to_video | add_audio | mix_audio | overlay_video | text_to_mp3. Verplicht voor deze niet-fusion modi. Het weglaten van mode met alleen MP4/MOV-bestanden activeert altijd fusion (stream-copy concat) — nooit overlay_video, zelfs met precies 2 MP4/MOV's. Voor audiobewerking: add_audio verwijdert het origineel, mix_audio behoudt het en overlayt. Als het veld mode is opgegeven, moeten geüploade bestanden exact overeenkomen — anders wordt het verzoek afgewezen. add_text wordt ook geaccepteerd: het is de enige modus met één enkel MP4/MOV-bestand en vereist options.text.
orderJSONAlleen fusion-modus — JSON-array van indices voor de clipvolgorde.
transition_typestringAlleen fusion-modus. Standaard: none. Zie lijst met beschikbare overgangen.
transition_durationfloatAlleen fusion-modus. Duur 0,2–2,0 sec. Standaard: 0.5.
optionsJSONJSON-object met renderparameters voor image_to_video, add_text, mix_audio en overlay_video (zie de tabellen hieronder).
timingsFile / stringimage_to_video / add_text: timingbestand voor karaoke (SRT of LRC, max. 200 KB) — als bestandsveld of platte tekst. De getoonde tekst komt uit het bestand; dwingt text_mode=karaoke af; niet te combineren met voice.
callback_urlstringOpenbare URL (http/https) die wordt aangeroepen bij voltooiing van de job. Het antwoord bevat een webhook_secret.

Parameters options — image_to_video-modus

Alle optioneel. Niet opgegeven waarden → standaardwaarden van de worker.

SleutelTypeStandaardBeschrijving
textstring""Als overlay weergegeven tekst. Leeg = geen tekst. Max. 500 tekens.
fontstring"default"Lettertype van de tekst, op id. Toegestane waarden: default, dejavu-sans-bold, dejavu-serif, liberation-serif, dejavu-mono, amiri, noto-sans-sc (简体中文), noto-sans-tc (繁體中文), noto-sans-jp (日本語), noto-sans-kr (한국어), noto-sans-hebrew (עברית), noto-sans-thai (ไทย). default = standaardlettertype (emoji ondersteund); amiri = Naskh-lettertype, ideaal voor Arabische tekst. Elke andere waarde geeft de fout invalid_option terug. Emoji worden alleen weergegeven met default.
font_sizeint60Lettergrootte in pixels. Bereik: 10–300. Aanbevolen: 36, 48, 60, 72, 96.
text_colorstring"white"Tekstkleur (bijv. white, yellow, #ffffff).
text_positionstring"center"Tekstpositie: center, top, bottom.
boxbooltrueHalftransparante achtergrond achter de tekst.
box_colorstring"black@0.4"Kleur + dekking in FFmpeg-formaat: kleur@dekking. Dekking: 0,0–1,0 (bijv. black@0.4 = 40% zwart).
fade_durationfloat0.5Duur van fade-in/out in seconden (0–2). 0 = geen fade.
widthint1080Videobreedte in pixels (64–3840, even getal). Standaard: 1080/1920/720/1280.
heightint1920Videohoogte in pixels (64–3840, even getal).
fpsint24Framesnelheid (1–60).
image_fitstring"contain"contain: Toon de volledige afbeelding of video en vul lege ruimte met de gekozen achtergrond. solid (standaard) of blur. Vervaging vereist image_fit=contain. De tekst blijft scherp. cover: De afbeelding wordt ingezoomd om het frame te vullen, gecentreerd — randen worden bijgesneden.
bg_colorstring"black"background_mode=solid: Achtergrondkleur als de afbeelding de resolutie niet vult — alleen met image_fit=contain (bijv. black, white, #1a1a2e).
background_modestring"solid"solid (standaard) of blur. Vervaging vereist image_fit=contain. De tekst blijft scherp.
blur_strengthnumber20Getal van 1 tot 50; standaard 20. Gaussiaanse vervaging alleen op de achtergrond.
enable_image_motionboolfalseActiveert fotoanimatie. Bij false blijft de afbeelding statisch. Bij true wordt het effect van image_motion_effect toegepast via FFmpeg zoompan.
image_motion_effectstring"ken_burns"Animatie-effect. Waarden: 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. Standaard: ken_burns.
motion_intensityfloat1.0Intensiteit fotoanimatie (0,25–2,0). Vermenigvuldigt zoomamplitude en pansnelheid.
text_effectstring"none"Tekstanimatie. Waarden: none, fade_in, slide_up, slide_down, slide_left, bounce.
text_effect_intensityfloat1.0Intensiteit tekstanimatie (0,25–2,0).
text_border_widthint0Dikte van de zwarte omtrek in pixels (0 = uitgeschakeld, 1–10). Verbetert leesbaarheid.
text_border_colorstring"black"Kleur van de rand rond de tekens (zelfde formaat als text_color, standaard "black"). Gebruikt als text_border_width > 0.
text_modestring"static"Tekstweergavemodus. static (standaard): volledige tekst zichtbaar vanaf frame 1. word_by_word: woorden verschijnen één voor één op het tempo van word_reveal_speed. Sluit text_effect uit: bij text_mode=word_by_word wordt text_effect genegeerd. "karaoke": de tekst kleurt mee op het ritme van de audio, pagina voor pagina (tot 1.000 tekens). Woord voor woord gesynchroniseerd met voice, anders over de audio verdeeld naar woordlengte.
word_reveal_speedfloat1.5Onthullingssnelheid in woorden per seconde (0,3–5,0, standaard 1,5). Alleen bij text_mode=word_by_word. Aanbevolen voor OpenAI TTS-synchronisatie: 2,0.
word_animstring"none"Animatie bij het verschijnen van elk woord. none (standaard): directe weergave. fade: elk nieuw woord verschijnt met een fade van 0.2s en crossfade naar het vorige blok. Alleen bij text_mode=word_by_word.
karaoke_stylestring"fill"Karaokestijl: fill (uitgesproken woorden krijgen de markeerkleur), sweep (elk woord vult zich geleidelijk; hele woorden bij schriften van rechts naar links) of highlight (alleen het huidige woord is gekleurd).
highlight_colorstring"#FFD200"Kleur van de uitgesproken woorden / het huidige woord in karaokemodus (zelfde formaat als text_color).
karaoke_linesint2Getoonde regels per pagina in karaokemodus (1–4).
voicestring""Stem-ID (zelfde lijst als text_to_mp3, bv. nl-NL-ColetteNeural): de stem wordt in dezelfde job uit text gemaakt. image_to_video heeft dan alleen de afbeelding nodig (een extra meegestuurde MP3 wordt geweigerd). In karaokemodus is elk woord gesynchroniseerd met de stem.
voice_rateint0Snelheid van de gegenereerde stem, in % (−50 tot +50).

Karaoke met je eigen timings (SRT / LRC)

Stuur een SRT- of LRC-bestand in het veld timings: elke regel verschijnt op zijn eigen moment en vormt een karaokepagina (tot 500 regels, 5.000 tekens). SRT: een regel verdwijnt op zijn eindtijd. LRC: een regel blijft tot de volgende (een lege regel beëindigt hem); [offset:] en woordtimings van enhanced LRC <mm:ss.xx> worden ondersteund — anders wordt elke regel over zijn duur verdeeld. Bij add_text zijn de tijden relatief aan het begin van de video, verschoven met text_start.

# lyrics.srt 1 00:00:01,000 --> 00:00:03,500 First line of the song 2 00:00:04,000 --> 00:00:07,200 Second line, on its own page # lyrics.lrc — enhanced LRC: optional per-word times <mm:ss.xx> [00:01.00]<00:01.00>First <00:01.60>line <00:02.10>here [00:04.00]Second line [00:07.50]

Parameters options — modus overlay_video

Allemaal optioneel. De uploadvolgorde is belangrijk: het eerste bestand is de hoofdvideo (achtergrond), het tweede bestand is de overlay (voorgrond). Gebruik chroma_key om een groene achtergrond uit de overlay te verwijderen.

SleutelTypeStandaardBeschrijving
positionstring"bottom-right"Hoek waar de overlay wordt geplaatst: top-left, top-right, bottom-left, bottom-right, of center.
scalefloat0.30Grootte van de overlay als fractie van de breedte van de hoofdvideo. 0.25 = 25% van de breedte. Bereik: 0.05–1.0.
opacityfloat1.0Doorzichtigheid van de overlay. 1.0 = volledig zichtbaar, 0.0 = onzichtbaar.
marginint10Afstand in pixels tussen de overlay en de beeldrand. Genegeerd bij position=center. Bereik: 0–200.
audiostring"main"Welk audio te behouden. main: alleen hoofdvideo-audio. overlay: alleen overlay-audio. mix: beide tracks gemengd.
chroma_keyboolfalseStel in op true om de pure groene (#00FF00) achtergrond van de overlay te verwijderen — handig voor webcam of animaties op een greenscreen.
chroma_similarityfloat0.20Greenscreen-tolerantie. Laag = strikte overeenkomst. Hoog = bredere verwijdering. Aanbevolen: 0.10–0.20 voor digitaal groen, 0.25–0.45 voor fysiek scherm. Bereik: 0.01–0.60.

options-parameters — modus add_text

Tekst is verplicht. Standaard blijven formaat, beeldsnelheid en geluid behouden. output_format activeert aanpassing met image_fit, bg_color en background_mode. width, height, fps en fotobeweging blijven genegeerd. Maximale duur: 15 minuten.

{"text":"Hello","output_format":"portrait","image_fit":"contain","background_mode":"blur","blur_strength":20}
SleutelTypeStandaardBeschrijving
textstringJATe tonen tekst. Verplicht, 1–200 tekens.
text_startfloat0Seconde waarop de tekst verschijnt (≥ 0). Moet vóór het einde van de video liggen.
text_durationfloat0Hoe lang de tekst zichtbaar blijft, in seconden (0,1–3600). 0 = tot het einde van de video.
fontstring"default"Lettertype van de tekst, op id. Toegestane waarden: default, dejavu-sans-bold, dejavu-serif, liberation-serif, dejavu-mono, amiri, noto-sans-sc (简体中文), noto-sans-tc (繁體中文), noto-sans-jp (日本語), noto-sans-kr (한국어), noto-sans-hebrew (עברית), noto-sans-thai (ไทย). default = standaardlettertype (emoji ondersteund); amiri = Naskh-lettertype, ideaal voor Arabische tekst. Elke andere waarde geeft de fout invalid_option terug. Emoji worden alleen weergegeven met default.
font_sizeint60Lettergrootte, opgegeven voor een video met een korte zijde van 1080 px en automatisch geschaald naar de echte resolutie — dezelfde waarde ziet er in 720p en 4K identiek uit. Bereik: 10–300.
fade_durationfloat0.5Duur van het in-/uitfaden van de tekst (niet van de video), in seconden. Bereik: 0–2.
text_color, box, box_color, text_position, text_border_width, text_border_color, text_effect, text_effect_intensity, text_mode, word_reveal_speed, word_anim, karaoke_style, highlight_color, karaoke_lines, voice, voice_rate——Identiek aan image_to_video (zie de tabel hierboven).
original_volumefloat0.3Met voice: volume van het originele geluid onder de stem (0–2, standaard 0.3; 0 = vervangen). De stem begint op text_start; de tekst blijft zichtbaar tot ze eindigt en loopt ze door na het einde van de video, dan blijft het laatste beeld staan.
background_modestring"solid"solid (standaard) of blur. Vervaging vereist image_fit=contain. De tekst blijft scherp.
blur_strengthnumber20Getal van 1 tot 50; standaard 20. Gaussiaanse vervaging alleen op de achtergrond.
output_formatstring"original"Alleen add_text: original (standaard), portrait (1080×1920), square (1080×1080), landscape (1920×1080). Vervaging vereist een ander formaat dan original.
image_fitstring"contain"contain: Toon de volledige afbeelding of video en vul lege ruimte met de gekozen achtergrond. solid (standaard) of blur. Vervaging vereist image_fit=contain. De tekst blijft scherp. cover: De afbeelding wordt ingezoomd om het frame te vullen, gecentreerd — randen worden bijgesneden.
bg_colorstring"black"background_mode=solid: Achtergrondkleur als de afbeelding de resolutie niet vult — alleen met image_fit=contain (bijv. black, white, #1a1a2e).

Parameters options — Audio bewerken (mix_audio)

Alleen beschikbaar met mode=mix_audio. Genegeerd voor add_audio.

SleutelTypeStandaardBeschrijving
mp3_volumefloat1.0Volume van de overlay-MP3 (0,0 = gedempt, 1,0 = origineel, 2,0 = dubbel). Waarden boven 1,0 kunnen overdriving veroorzaken.

Modus text_to_mp3 — directe parameters (geen options-JSON)

In tegenstelling tot andere modi worden deze velden rechtstreeks als formuliervelden verzonden, niet binnen het options-JSON-object. Alleen text is verplicht.

SleutelTypeStandaardBeschrijving
textstring—Om te zetten tekst naar spraak. Verplicht. Maximaal 5.000 tekens.
langstring"en"Taalcode gebruikt om de standaardstem te kiezen wanneer voice ontbreekt of ongeldig is. Een van de 20 sitetalen (zie tabel hieronder). Valt terug op en indien onbekend.
voicestringautomatischedge-tts stem-ID (zie tabel hieronder). Indien weggelaten of ongeldig, wordt automatisch de eerste stem van lang gebruikt.
slowboolfalseStel in op true (of 1) om de spraaksnelheid met 25% te verlagen. Elke andere waarde wordt behandeld als false.
Geen bestandsupload vereist: in tegenstelling tot de andere modi heeft text_to_mp3 geen videos[] nodig. Stuur mode=text_to_mp3 samen met text / lang / voice / slow als gewone formuliervelden.

Beschikbare stemmen (edge-tts, Microsoft Neural), gegroepeerd per taalcode:

TaalBeschikbare stemmen
en en-US-AvaNeural, en-US-AndrewNeural, en-GB-LibbyNeural, en-AU-NatashaNeural, en-AU-WilliamMultilingualNeural
fr fr-FR-DeniseNeural, fr-FR-HenriNeural, fr-FR-EloiseNeural, fr-CA-SylvieNeural, fr-CA-ThierryNeural
es es-ES-ElviraNeural, es-ES-AlvaroNeural, es-MX-DaliaNeural, es-AR-ElenaNeural, es-AR-TomasNeural
ar ar-SA-ZariyahNeural, ar-SA-HamedNeural, ar-EG-SalmaNeural, ar-MA-MounaNeural, ar-MA-JamalNeural
pt pt-BR-FranciscaNeural, pt-BR-AntonioNeural, pt-PT-RaquelNeural
de de-DE-KatjaNeural, de-DE-ConradNeural, de-DE-AmalaNeural, de-AT-IngridNeural, de-AT-JonasNeural
it it-IT-ElsaNeural, it-IT-DiegoNeural, it-IT-IsabellaNeural
nl nl-NL-ColetteNeural, nl-NL-MaartenNeural, nl-BE-DenaNeural, nl-BE-ArnaudNeural
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, bn-BD-NabanitaNeural, bn-BD-PradeepNeural
ur ur-PK-UzmaNeural, ur-PK-AsadNeural, ur-IN-GulNeural, ur-IN-SalmanNeural
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

Succesantwoord (HTTP 200)

{ "success": true, "job_id": "a3f1c8d2e5b09471...", "mode": "fusion", // "fusion" | "add_audio" | "mix_audio" | "image_to_video" | "overlay_video" | "add_text" | "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..." }
Voor text_to_mp3 bevat het antwoord geen file_count of transition (er is geen bestand geüpload) — de rest is identiek: job_id, quota_used, quota_remaining, status_url, webhook_secret.

curl-voorbeeld — image_to_video-modus

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" # background_mode : "solid" | "blur" (blur requires contain) # blur_strength : 1–50, default 20 # 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 — outline around characters (0 = disabled) # text_border_color : outline color, default "black" (e.g. "#FF3366", "white@0.8") # 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)

Karaoketekst met gegenereerde stem (image_to_video, zonder MP3)

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" \ -F "mode=image_to_video" \ -F 'options={"text":"Every word lights up as the voice reads it.","voice":"en-US-AvaNeural","text_mode":"karaoke","karaoke_style":"sweep","highlight_color":"#FFD200","karaoke_lines":2,"text_position":"bottom","font_size":72}' # no MP3: the voice is generated from "text" and gives the timing of every word # text_mode="karaoke" : text up to 1000 characters, shown page by page (karaoke_lines: 1–4) # karaoke_style : "fill" (default) | "sweep" | "highlight" # voice_rate : -50…+50 (%), default 0 # with your own MP3 (no "voice"): karaoke timing is spread over the audio by word length # add_text: same options + "original_volume" (0–2, default 0.3) = original sound under the voice

Karaoke met een SRT-bestand (image_to_video + je MP3)

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@cover.jpg" \ -F "videos[]=@song.mp3" \ -F "timings=@lyrics.srt" \ -F "mode=image_to_video" \ -F 'options={"karaoke_style":"sweep","karaoke_lines":2,"text_position":"bottom","font_size":72}' # timings : SRT or LRC file (200 KB max), or its content as a plain text field: -F "timings=<lyrics.lrc" # the displayed text comes from the file ("text" is ignored), text_mode is forced to "karaoke" # not compatible with "voice" (the timings follow your own audio) # add_text: times are relative to the video start, shifted by "text_start"

curl-voorbeeld — Audio bewerken

# 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-voorbeeld — modus 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-voorbeeld — modus add_text

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "mode=add_text" \ -F 'options={"text":"Hello world","text_position":"bottom","font_size":72,"text_color":"#ffd700","text_start":2,"text_duration":5,"text_effect":"slide_up"}' # text : required, 1–200 characters # text_start : second at which the text appears (default 0) # text_duration : seconds the text stays visible, 0 = until the end (default 0) # the video keeps its resolution, frame rate and audio track

curl-voorbeeld — Video's samenvoegen

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-voorbeeld — modus 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> Jobstatus

De status bevat de werkelijke fase en verstreken tijd. Schattingen zijn indicatief; een clienttime-out betekent geen mislukking. Hervat het opvragen van dezelfde taak-ID. Bestanden verlopen twee uur na voltooiing.

Mogelijke statussen

StatusBetekenisExtra velden
queued In wachtrij, nog niet verwerkt queue_position, queue_total, eta_minutes
processing FFmpeg-verwerking bezig processing_stage, processing_elapsed_seconds, stage_elapsed_seconds, last_activity_at, processed_media_seconds, eta_overrun
ready Voltooid — bestand beschikbaar download_url, media_available, created_at, expires_at
error Verwerking mislukt error (message), quota_refund_status: pending | confirmed | not_required
cancelled Geannuleerd quota_refund_status: pending | confirmed | not_required

Antwoorden per status

{ "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-voorbeeld

curl -H "Authorization: Bearer rvm_your_token" \ "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..."
GET /api/v1/jobs.php Toont alle jobs die met dit token zijn aangemaakt (per pagina, gesorteerd op datum aflopend)

Gemeenschappelijke parameters (multipart/form-data)

ParameterTypeStandaardBeschrijving
pageinteger1Paginanummer (begint bij 1)
limitinteger20Resultaten per pagina (max. 50, standaard 20)

Antwoorden per status

{ "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 }
GET /api/download.php?job_id=<hex32> Definitief bestand downloaden

Streamt het definitieve bestand. Content-Type is video/mp4 voor videomodi, of audio/mpeg voor text_to_mp3. Vereist geen token. Beschikbaar alleen wanneer de status ready is.

Het bestand wordt 2 uur na voltooiing bewaard, daarna verwijderd. Download het zodra de status ready wordt.

Optionele parameters

ParameterBeschrijving
filenameVoorgestelde naam voor het gedownloade bestand (bijv. mijn-video.mp4)
previewZet op 1 voor inline afspelen (laat Content-Disposition: attachment weg) in plaats van een download te starten — gebruikt voor voorvertoning in de browser.

curl-voorbeeld

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

Webhooks

Webhooks zijn een alternatief voor polling: in plaats van elke X seconden de status te controleren, geeft u een URL op en roept de server u automatisch op wanneer de job is voltooid.

Hoe het werkt

  1. Geef callback_url mee in de POST naar /api/v1/render.php
  2. Het antwoord bevat een webhook_secret — bewaar dit om handtekeningen te verifiëren
  3. Wanneer de job ready of error bereikt, stuurt de server een ondertekende JSON-POST naar uw URL
  4. Verifieer de handtekening met HMAC-SHA256(webhook_secret, raw_body)
Beperkingen: callback_url moet een openbaar toegankelijke URL zijn. Privé- en loopback-IP-adressen zijn geblokkeerd. Timeout: 10 seconden.

Ontvangen 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" }

Door de server verzonden headers

HeaderWaarde
Content-Typeapplication/json
X-RVM-Signaturesha256=<hmac_hex> — HMAC-SHA256-handtekening van de raw body
X-RVM-Job-IdDe relevante job_id

Handtekeningverificatie

# 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()

Foutcodes

HTTPJSON-codeOorzaak
401unauthorizedToken ontbreekt, ongeldig of ingetrokken
400missing_filesGeen bestanden ontvangen
400too_few_filesMinder dan 2 bestanden verzonden
400too_many_filesMeer dan 20 bestanden verzonden
400invalid_mimeNiet-ondersteund bestand — alleen MP4, MP3 en JPG/PNG worden geaccepteerd (MIME gecontroleerd via magic bytes)
400wrong_file_countAantal bestanden komt niet overeen met de gekozen modus
400wrong_file_typesBestandstypen komen niet overeen met de gekozen modus
400invalid_file_combinationBestandscombinatie zonder modus komt niet overeen met een ondersteunde modus
400invalid_optionsHet veld options is geen geldig JSON of bevat geen object
400invalid_optionEen waarde in options is ongeldig (kleur, lettertype, positie…)
400file_too_largeEen bestand overschrijdt 500 MB
400text_requiredHet veld options.text ontbreekt of is leeg (modus add_text)
400video_too_longVideo langer dan 15 minuten (modus add_text)
400text_start_out_of_rangetext_start ligt na het einde van de video
400invalid_voiceOnbekende voice-ID.
400invalid_timingsOnleesbaar timingbestand (formaat niet herkend, geen regel met tijd, einde vóór begin, te lang…).
400invalid_orderDe order-array is geen geldige permutatie
400invalid_job_idOnjuist job_id-formaat (moet 32-cijferig hexadecimaal zijn)
404job_not_foundJob niet gevonden — job_id onbekend of nooit bestaan
410job_expiredJob verlopen — bestond maar het herstelvenster van 2 uur is verstreken
429quota_exceeded20 succesvolle jobs/dag bereikt
429rate_limitedMeer dan 12 aanroepen/min op /api/v1/jobs.php — wacht Retry-After seconden
500server_errorInterne serverfout

Integratievoorbeelden

Voorbeelden voor elke modus — installeer requests met pip install requests.

Gemeenschappelijke configuratie

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-modus — afbeelding + audio → 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" "background_mode": "solid", # or "blur" with contain "blur_strength": 20, "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" }), }, )

Audio bewerken

# 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 )

Modus overlay_video — beeld-in-beeld

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 }), }, )

Modus add_text — tekst op een video

with open("video.mp4", "rb") as fv: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[("videos[]", ("video.mp4", fv, "video/mp4"))], data={ "mode": "add_text", "options": json.dumps({ "text": "Hello world", # required "text_position": "bottom", # center | top | bottom "font": "amiri", # font id (see the table above) "font_size": 72, "text_start": 2, # appears at 2 s "text_duration": 5, # stays 5 s (0 = until the end) }), }, )

Video's samenvoegen

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"}, )

Modus text_to_mp3 — tekst naar spraak

# 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 }, )

Polling + download (gemeenschappelijk voor alle modi)

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")

Twee benaderingen in n8n: polling (statuslus) of webhook (server roept n8n). De webhook is aanbevolen — overzichtelijker, geen onnodige belasting.

Benadering A — Webhook (aanbevolen)

Slechts 3 nodes, geen lus.

Node 1 — Webhook-trigger
Voeg een Webhook-node toe als workflow-invoer (methode POST). Noteer de gegenereerde URL, bijv. https://uw-n8n.com/webhook/rvm-callback.

Node 2 — Job aanmaken (HTTP Request)

MethodePOST
URLhttps://rapidvideomaker.com/api/v1/render.php
AuthenticatieHeader Auth — Authorization: Bearer rvm_…
Body-inhoudstypeForm-Data Multipart
Body paramsBinair veld videos[] voor elke clip + Tekstveld callback_url = webhook-node-URL

Sla het webhook_secret uit het antwoord op in een workflowvariabele.

Node 3 — Resultaat verwerken (in de webhook-geactiveerde workflow)
Wanneer n8n de POST van de server ontvangt, is $json.status ready of error. Bij ready bevat $json.download_url de directe download-URL.

Handtekening verifiëren: {{ $headers['x-rvm-signature'] }} vergelijken met sha256= + HMAC-SHA256 van de raw body. Code-node: crypto.createHmac('sha256', secret).update(body).digest('hex').

Benadering B — Polling (zonder webhook)

5 nodes, statuslus elke 10 sec.

Node 1 — Job aanmaken — zelfde configuratie, zonder callback_url.

Node 2 — Wachten — 10 seconden.

Node 3 — Status opvragen (HTTP Request GET)

URLhttps://rapidvideomaker.com/api/v1/jobs.php
Queryparametersjob_id = {{ $('Node 1').item.json.job_id }}
AuthenticatieHeader-authenticatie — zelfde token

Node 4 — If: {{ $json.status }} === 'ready' → true: Node 5 / false: terug naar Node 2.

Voeg een iteratieteller toe in een Set-node om de lus na 60 pogingen (max. 10 min.) te onderbreken.

Node 5 — Download: HTTP Request GET op {{ $json.download_url }}, antwoordformaat File.

Stap 1 — Job aanmaken (kies een modus)

# 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"

Stap 2 — Polling

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

Stap 3 — Download

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

Best practices

Resultaatbestanden worden 2 uur na voltooiing bewaard, daarna automatisch verwijderd. Download uw video zodra de status ready wordt.