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

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 + 1 MP3 → audiobewerking (mode=mix_audio voor overlay). Meerdere MP4 → samenvoegen. De server geeft een unieke job_id terug.
2
Job bewaken — GET /api/v1/jobs.php?job_id=…
Bevraag dit endpoint regelmatig (elke 5–10 sec.). De job doorloopt queuedprocessingready (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-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-bestanden Clips worden aaneengesloten in de opgegeven volgorde. Optionele overgangen tussen clips.
Audio bewerken add_audio of mix_audio 1 MP4 + 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 Genereert een video van een stilstaand beeld en een audiobestand. Tekstoverlay, fades, resolutie en FPS instelbaar via het veld options.
Overlay video overlay_video 2 MP4 Plaatst een tweede video over de hoofdvideo. Positie, grootte, doorzichtigheid en audio instelbaar via het veld options.
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 + 1 MP3. image_to_video alleen 1 JPG/PNG + 1 MP3. MIME-typen worden gecontroleerd via magic bytes.
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).

Gemeenschappelijke parameters (multipart/form-data)

VeldTypeVer.Beschrijving
videos[]File[]JATe verwerken bestanden. Afhankelijk van modus: 2–20 MP4, of 1 MP4 + 1 MP3, of 1 afbeelding (JPG/PNG) + 1 MP3. Max. 500 MB per bestand.
modestring*image_to_video | add_audio | mix_audio. Verplicht voor deze drie modi. Genegeerd (automatisch gedetecteerd) als alle bestanden MP4 zijn (fusion). Als het veld mode is opgegeven, moeten geüploade bestanden exact overeenkomen.
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.
optionsJSONAlleen image_to_video-modus — JSON-object van renderparameters (zie hieronder).
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.
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"Kadermodus: contain = volledige afbeelding zichtbaar, lege gebieden gevuld met bg_color; cover = afbeelding ingezoomd, overtollige randen bijgesneden. bg_color genegeerd in cover.
bg_colorstring"black"Achtergrondkleur als de afbeelding de resolutie niet vult — alleen met image_fit=contain (bijv. black, white, #1a1a2e).
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_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.
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.

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.

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.

Succesantwoord (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-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" # 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-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 — 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"
GET /api/v1/jobs.php?job_id=<hex32> Jobstatus

Mogelijke statussen

StatusBetekenisExtra velden
queued In wachtrij, nog niet verwerkt queue_position, queue_total, eta_minutes
processing FFmpeg-verwerking bezig
ready Voltooid — bestand beschikbaar download_url, created_at, expires_at
error Verwerking mislukt error (message)

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 List all jobs created with this token (paginated, sorted by date desc)

Gemeenschappelijke parameters (multipart/form-data)

apidocs_th_paramTypeStandaardapidocs_th_desc
pageinteger1Page number (starts at 1)
limitinteger20Results per page (max 50, default 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 }
POST /api/v1/publish.php Video publiceren op YouTube of TikTok

Publiceert een voltooid job (status=ready) naar een of meer sociale accounts. Het token moet van een ledenaccount zijn (geen admin-token).

Vereiste: Sociale accounts (YouTube, TikTok) moeten eerst via OAuth worden verbonden op de Publicatiespagina van het ledengebied. De account_id van elk account staat daar vermeld.

Gemeenschappelijke parameters (multipart/form-data)

apidocs_th_paramTypeapidocs_th_requiredapidocs_th_desc
job_idstringapidocs_requiredJob-ID (hex 32 tekens) van de voltooide video
publicationsarrayapidocs_requiredArray van publicatieobjecten (max. 10)

Publicatieobject

apidocs_th_paramTypeapidocs_th_requiredapidocs_th_desc
account_idintegerapidocs_requiredID van het verbonden sociale account — te vinden op de Publicatiespagina van het ledengebied
titlestringVideotitel (max. 512 tekens)
descriptionstringVideobeschrijving (max. 5 000 tekens)
tagsstringKommagescheiden tags (max. 1 024 tekens)
visibilitystringpublic | private | unlisted — Standaard: public
tiktok_modestringdraft | direct — Alleen TikTok — standaard: direct
tiktok_privacystringdirect-modusAlleen TikTok — vereist in direct-modus
allow_commentbooleanAlleen TikTok — reacties toestaan
allow_duetbooleanAlleen TikTok — duetten toestaan
allow_stitchbooleanAlleen TikTok — stitches toestaan
your_brandbooleanAlleen TikTok — organische promotie-inhoud ("Jouw merk").
branded_contentbooleanAlleen TikTok — openbaarmaking merkinhoud
tiktok_cover_msintegerAlleen TikTok — tijdstempel omslagframe in ms (0–60 000, standaard 1 000)

Antwoorden per status

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

Foutcodes per publicatie

apidocs_th_codeBetekenis
job_not_readyJob nog niet voltooid
mode_not_supportedText_to_mp3-jobs kunnen niet worden gepubliceerd
account_not_foundAccount niet gevonden of verbroken
tiktok_privacy_requiredPrivacyniveau vereist in direct-modus
publication_failedProvider retourneerde een fout tijdens het uploaden

cURL-voorbeeld

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> Definitief bestand downloaden

Geeft het definitieve MP4-bestand terug als stream (Content-Type: video/mp4). 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 parameter

ParameterBeschrijving
filenameVoorgestelde naam voor het gedownloade bestand (bijv. mijn-video.mp4)

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

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

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.