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.
Volledig werkproces
Elke integratie volgt dezelfde reeks van 4 stappen:
POST /api/v1/render.phpmultipart/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.GET /api/v1/jobs.php?job_id=…queued → processing → ready (of error). Het antwoord bevat de wachtrijpositie en een geschatte resterende tijd.ready is, bevat het antwoord een gebruiksklaar veld download_url.GET /api/download.php?job_id=…410 Gone.Authenticatie
Elke aanvraag moet uw API-token bevatten. Twee formaten worden geaccepteerd:
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.
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:
queue_position— positie van de job in de wachtrij (1 = volgende)queue_total— totaal aantal wachtende jobseta_minutes— geschatte tijd voor de verwerking begint
/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:
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
Five modes, accessible via the mode field (omit mode with multiple MP4s to auto-detect fusion):
| Gebruik | API-modus | Vereiste bestanden | Beschrijving |
|---|---|---|---|
| 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. |
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.-c:v copy).Gemeenschappelijke parameters (multipart/form-data)
| Veld | Type | Ver. | Beschrijving |
|---|---|---|---|
| videos[] | File[] | JA | Te 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. |
| mode | string | * | 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. |
| order | JSON | Alleen fusion-modus — JSON-array van indices voor de clipvolgorde. | |
| transition_type | string | Alleen fusion-modus. Standaard: none. Zie lijst met beschikbare overgangen. | |
| transition_duration | float | Alleen fusion-modus. Duur 0,2–2,0 sec. Standaard: 0.5. | |
| options | JSON | Alleen image_to_video-modus — JSON-object van renderparameters (zie hieronder). | |
| callback_url | string | Openbare 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.
| Sleutel | Type | Standaard | Beschrijving |
|---|---|---|---|
| text | string | "" | Als overlay weergegeven tekst. Leeg = geen tekst. Max. 500 tekens. |
| font_size | int | 60 | Lettergrootte in pixels. Bereik: 10–300. Aanbevolen: 36, 48, 60, 72, 96. |
| text_color | string | "white" | Tekstkleur (bijv. white, yellow, #ffffff). |
| text_position | string | "center" | Tekstpositie: center, top, bottom. |
| box | bool | true | Halftransparante achtergrond achter de tekst. |
| box_color | string | "black@0.4" | Kleur + dekking in FFmpeg-formaat: kleur@dekking. Dekking: 0,0–1,0 (bijv. black@0.4 = 40% zwart). |
| fade_duration | float | 0.5 | Duur van fade-in/out in seconden (0–2). 0 = geen fade. |
| width | int | 1080 | Videobreedte in pixels (64–3840, even getal). Standaard: 1080/1920/720/1280. |
| height | int | 1920 | Videohoogte in pixels (64–3840, even getal). |
| fps | int | 24 | Framesnelheid (1–60). |
| image_fit | string | "contain" | Kadermodus: contain = volledige afbeelding zichtbaar, lege gebieden gevuld met bg_color; cover = afbeelding ingezoomd, overtollige randen bijgesneden. bg_color genegeerd in cover. |
| bg_color | string | "black" | Achtergrondkleur als de afbeelding de resolutie niet vult — alleen met image_fit=contain (bijv. black, white, #1a1a2e). |
| enable_image_motion | bool | false | Activeert fotoanimatie. Bij false blijft de afbeelding statisch. Bij true wordt het effect van image_motion_effect toegepast via FFmpeg zoompan. |
| image_motion_effect | string | "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_intensity | float | 1.0 | Intensiteit fotoanimatie (0,25–2,0). Vermenigvuldigt zoomamplitude en pansnelheid. |
| text_effect | string | "none" | Tekstanimatie. Waarden: none, fade_in, slide_up, slide_down, slide_left, bounce. |
| text_effect_intensity | float | 1.0 | Intensiteit tekstanimatie (0,25–2,0). |
| text_border_width | int | 0 | Dikte van de zwarte omtrek in pixels (0 = uitgeschakeld, 1–10). Verbetert leesbaarheid. |
| text_mode | string | "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_speed | float | 1.5 | Onthullingssnelheid 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_anim | string | "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.
| Sleutel | Type | Standaard | Beschrijving |
|---|---|---|---|
| position | string | "bottom-right" | Hoek waar de overlay wordt geplaatst: top-left, top-right, bottom-left, bottom-right, of center. |
| scale | float | 0.30 | Grootte van de overlay als fractie van de breedte van de hoofdvideo. 0.25 = 25% van de breedte. Bereik: 0.05–1.0. |
| opacity | float | 1.0 | Doorzichtigheid van de overlay. 1.0 = volledig zichtbaar, 0.0 = onzichtbaar. |
| margin | int | 10 | Afstand in pixels tussen de overlay en de beeldrand. Genegeerd bij position=center. Bereik: 0–200. |
| audio | string | "main" | Welk audio te behouden. main: alleen hoofdvideo-audio. overlay: alleen overlay-audio. mix: beide tracks gemengd. |
| chroma_key | bool | false | Stel in op true om de pure groene (#00FF00) achtergrond van de overlay te verwijderen — handig voor webcam of animaties op een greenscreen. |
| chroma_similarity | float | 0.20 | Greenscreen-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.
| Sleutel | Type | Standaard | Beschrijving |
|---|---|---|---|
| mp3_volume | float | 1.0 | Volume van de overlay-MP3 (0,0 = gedempt, 1,0 = origineel, 2,0 = dubbel). Waarden boven 1,0 kunnen overdriving veroorzaken. |
Succesantwoord (HTTP 200)
curl-voorbeeld — image_to_video-modus
curl-voorbeeld — Audio bewerken
curl-voorbeeld — modus overlay_video
curl-voorbeeld — Video's samenvoegen
Mogelijke statussen
| Status | Betekenis | Extra 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
curl-voorbeeld
Gemeenschappelijke parameters (multipart/form-data)
| apidocs_th_param | Type | Standaard | apidocs_th_desc |
|---|---|---|---|
page | integer | 1 | Page number (starts at 1) |
limit | integer | 20 | Results per page (max 50, default 20) |
Antwoorden per status
Publiceert een voltooid job (status=ready) naar een of meer sociale accounts. Het token moet van een ledenaccount zijn (geen admin-token).
account_id van elk account staat daar vermeld.Gemeenschappelijke parameters (multipart/form-data)
| apidocs_th_param | Type | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
job_id | string | apidocs_required | Job-ID (hex 32 tekens) van de voltooide video |
publications | array | apidocs_required | Array van publicatieobjecten (max. 10) |
Publicatieobject
| apidocs_th_param | Type | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
account_id | integer | apidocs_required | ID van het verbonden sociale account — te vinden op de Publicatiespagina van het ledengebied |
title | string | — | Videotitel (max. 512 tekens) |
description | string | — | Videobeschrijving (max. 5 000 tekens) |
tags | string | — | Kommagescheiden tags (max. 1 024 tekens) |
visibility | string | — | public | private | unlisted — Standaard: public |
tiktok_mode | string | — | draft | direct — Alleen TikTok — standaard: direct |
tiktok_privacy | string | direct-modus | Alleen TikTok — vereist in direct-modus |
allow_comment | boolean | — | Alleen TikTok — reacties toestaan |
allow_duet | boolean | — | Alleen TikTok — duetten toestaan |
allow_stitch | boolean | — | Alleen TikTok — stitches toestaan |
your_brand | boolean | — | Alleen TikTok — organische promotie-inhoud ("Jouw merk"). |
branded_content | boolean | — | Alleen TikTok — openbaarmaking merkinhoud |
tiktok_cover_ms | integer | — | Alleen TikTok — tijdstempel omslagframe in ms (0–60 000, standaard 1 000) |
Antwoorden per status
Foutcodes per publicatie
| apidocs_th_code | Betekenis |
|---|---|
job_not_ready | Job nog niet voltooid |
mode_not_supported | Text_to_mp3-jobs kunnen niet worden gepubliceerd |
account_not_found | Account niet gevonden of verbroken |
tiktok_privacy_required | Privacyniveau vereist in direct-modus |
publication_failed | Provider retourneerde een fout tijdens het uploaden |
cURL-voorbeeld
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
| Parameter | Beschrijving |
|---|---|
| filename | Voorgestelde naam voor het gedownloade bestand (bijv. mijn-video.mp4) |
curl-voorbeeld
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
- Geef
callback_urlmee in de POST naar/api/v1/render.php - Het antwoord bevat een
webhook_secret— bewaar dit om handtekeningen te verifiëren - Wanneer de job
readyoferrorbereikt, stuurt de server een ondertekende JSON-POSTnaar uw URL - Verifieer de handtekening met
HMAC-SHA256(webhook_secret, raw_body)
callback_url moet een openbaar toegankelijke URL zijn. Privé- en loopback-IP-adressen zijn geblokkeerd. Timeout: 10 seconden. Ontvangen payload
Door de server verzonden headers
| Header | Waarde |
|---|---|
| Content-Type | application/json |
| X-RVM-Signature | sha256=<hmac_hex> — HMAC-SHA256-handtekening van de raw body |
| X-RVM-Job-Id | De relevante job_id |
Handtekeningverificatie
Foutcodes
| HTTP | JSON-code | Oorzaak |
|---|---|---|
| 401 | unauthorized | Token ontbreekt, ongeldig of ingetrokken |
| 400 | missing_files | Geen bestanden ontvangen |
| 400 | too_few_files | Minder dan 2 bestanden verzonden |
| 400 | too_many_files | Meer dan 20 bestanden verzonden |
| 400 | invalid_mime | Niet-ondersteund bestand — alleen MP4, MP3 en JPG/PNG worden geaccepteerd (MIME gecontroleerd via magic bytes) |
| 400 | wrong_file_count | Aantal bestanden komt niet overeen met de gekozen modus |
| 400 | wrong_file_types | Bestandstypen komen niet overeen met de gekozen modus |
| 400 | invalid_file_combination | Bestandscombinatie zonder modus komt niet overeen met een ondersteunde modus |
| 400 | invalid_options | Het veld options is geen geldig JSON of bevat geen object |
| 400 | invalid_option | Een waarde in options is ongeldig (kleur, lettertype, positie…) |
| 400 | file_too_large | Een bestand overschrijdt 500 MB |
| 400 | invalid_order | De order-array is geen geldige permutatie |
| 400 | invalid_job_id | Onjuist job_id-formaat (moet 32-cijferig hexadecimaal zijn) |
| 404 | job_not_found | Job niet gevonden — job_id onbekend of nooit bestaan |
| 410 | job_expired | Job verlopen — bestond maar het herstelvenster van 2 uur is verstreken |
| 429 | quota_exceeded | 20 succesvolle jobs/dag bereikt |
| 429 | rate_limited | Meer dan 12 aanroepen/min op /api/v1/jobs.php — wacht Retry-After seconden |
| 500 | server_error | Interne serverfout |
Integratievoorbeelden
Voorbeelden voor elke modus — installeer requests met pip install requests.
Gemeenschappelijke configuratie
image_to_video-modus — afbeelding + audio → video
Audio bewerken
Modus overlay_video — beeld-in-beeld
Video's samenvoegen
Polling + download (gemeenschappelijk voor alle modi)
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)
| Methode | POST |
| URL | https://rapidvideomaker.com/api/v1/render.php |
| Authenticatie | Header Auth — Authorization: Bearer rvm_… |
| Body-inhoudstype | Form-Data Multipart |
| Body params | Binair 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.
{{ $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)
| URL | https://rapidvideomaker.com/api/v1/jobs.php |
| Queryparameters | job_id = {{ $('Node 1').item.json.job_id }} |
| Authenticatie | Header-authenticatie — zelfde token |
Node 4 — If: {{ $json.status }} === 'ready' → true: Node 5 / false: terug naar Node 2.
Node 5 — Download: HTTP Request GET op {{ $json.download_url }}, antwoordformaat File.
Stap 1 — Job aanmaken (kies een modus)
Stap 2 — Polling
Stap 3 — Download
Best practices
- Polling-frequentie: het endpoint
/api/v1/jobs.phpis beperkt tot 12 aanroepen/min per token. Minstens 5 seconden tussen aanroepen (10 sec. aanbevolen). - Timeout: implementeer een client-side timeout (bijv. 10 minuten). Als de job niet
readyis, behandel het als een fout. - Snel downloaden: zodra de status
readyis, download het bestand. Het wordt 2 uur na voltooiing verwijderd. - Quotumbeheer: controleer
quota_remainingin het POST-antwoord. Bij0wordt de volgende job geweigerd met429. - Netwerkfouten: bij een netwerkfout tijdens polling, wacht en probeer opnieuw — de job wordt server-side onafhankelijk uitgevoerd.
ready wordt.