RapidVideoMaker
Konto erstellen

API RapidVideoMaker

Die REST API ermöglicht die Verarbeitung von Videodateien aus jedem HTTP-Client — Python-Skripte, n8n-Workflows, Drittanbieter-Tools. Fünf Modi verfügbar: Videos zusammenführen (mehrere MP4), Audio bearbeiten (1 MP4 + 1 MP3), Video erstellen (1 JPG/PNG + 1 MP3), Video-Overlay (2 MP4 Bild-im-Bild). Die Verarbeitung ist asynchron: Dateien einreichen, dann das Ergebnis abfragen.

Hol dir deinen API-Token kostenlos
Erstelle ein Konto um deinen API-Token zu erhalten — 20 Anfragen pro Tag inklusive, nutzbar über die Oberfläche oder die API.
Kostenloses Konto erstellen Bereits ein Konto? Anmelden

Vollständiger Arbeitsablauf

Jede Integration folgt derselben 4-Schritte-Abfolge:

1
Job erstellen — POST /api/v1/render.php
Dateien als multipart/form-data mit Bearer-Token senden. 1 JPG/PNG + 1 MP3 + mode=image_to_video → Videoerzeugung. 1 MP4 + 1 MP3 → Audio bearbeiten (mode=mix_audio zum Überlagern). Mehrere MP4 → zusammenfügen. Der Server gibt eine eindeutige job_id zurück.
2
Job überwachen — GET /api/v1/jobs.php?job_id=…
Diesen Endpunkt regelmäßig abrufen (alle 5–10 Sek.). Der Job durchläuft queuedprocessingready (oder error). Die Antwort enthält die Warteschlangenposition und eine geschätzte Restzeit.
3
Download-URL abrufen
Wenn der Status ready ist, enthält die Antwort ein fertiges download_url-Feld.
4
Datei herunterladen — GET /api/download.php?job_id=…
Die fertige MP4-Datei herunterladen. Die Datei ist 2 Stunden nach Abschluss des Jobs verfügbar, dann automatisch gelöscht. Nach Ablauf antwortet die API mit 410 Gone (statt 404), um anzuzeigen, dass der Job existierte, aber nicht mehr abrufbar ist.

Authentifizierung

Jede Anfrage muss Ihr API-Token enthalten. Zwei Formate werden akzeptiert:

# Authentifizierung — Jede Anfrage muss Ihr API-Token enthalten. Zwei Formate werden akzeptiert: Authorization: Bearer rvm_your_token_here # Alternative X-API-Key: rvm_your_token_here

Ihr Token ist in Ihrem Mitgliederbereich verfügbar — ein Token pro Konto, automatisch bei der Registrierung erstellt. Er wird nur einmal im Klartext angezeigt — bewahren Sie ihn sicher auf. Falls verloren, können Sie ihn aus Ihrem Mitgliederbereich neu generieren.

Kontingent

Jedes Mitgliedskonto hat 20 Anfragen pro Tag, geteilt zwischen Web-Interface und API. Fehlgeschlagene Jobs verbrauchen kein Kontingent. Der Zähler wird um Mitternacht UTC zurückgesetzt.

POST-Antworten enthalten quota_used und quota_remaining. Bei Überschreitung antwortet der Server mit 429.

Interface + API = gleicher Zähler. Ein über das Web-Interface erstelltes Video und eine API-Anfrage verbrauchen je 1 Credit aus demselben Tageskontingent.

Warteschlange

Es wird jeweils ein Job verarbeitet. Bei gleichzeitig eingereichten Jobs werden diese in Eingangsreihenfolge verarbeitet. Während des Wartens enthält die Statusantwort:

Rate-Limit angewendet: Der Endpunkt /api/v1/jobs.php akzeptiert maximal 12 Aufrufe pro Minute pro Token (1 alle 5 Sek.). Darüber hinaus antwortet der Server mit 429 und einem Retry-After: 5-Header. Empfehlung: 10 Sekunden zwischen Aufrufen.

Verfügbare Übergänge

Übergeben Sie transition_type=none (Standard) für direktes Zusammenfügen oder einen der unten stehenden Typen für einen Übergang zwischen Clips:

none fade fadeblack dissolve wipeleft wiperight slideleft slideright zoomin circleclose

Die Dauer (transition_duration) liegt zwischen 0,2 und 2,0 Sekunden. Ist ein Clip zu kurz für den Übergang, wird dieser ignoriert und die Zusammenführung ohne Übergang durchgeführt.

Endpunkte

POST /api/v1/render.php Erstellt einen Video-Verarbeitungsjob

Fünf Modi, zugänglich über das Feld mode (lasse mode bei mehreren MP4 weg, um fusion automatisch zu erkennen):

VerwendungAPI-ModusErforderliche DateienBeschreibung
Videos zusammenfügen fusion 2–20 MP4-Dateien Clips werden in der angegebenen Reihenfolge zusammengefügt. Optionale Übergänge zwischen Clips.
Audio bearbeiten add_audio oder mix_audio 1 MP4 + 1 MP3 Ersetzt oder bereichert die Audiospur eines Videos. Die Videospur wird nie neu kodiert (-c:v copy).

add_audio — das Originalton wird gelöscht und vollständig durch die MP3 ersetzt.
mix_audio — der Originalton bleibt erhalten und die MP3 wird überlagert (amix). options={"mp3_volume":…} zum Anpassen der Lautstärke. Ohne Audiospur verhält sich wie add_audio.
Video erstellen image_to_video 1 JPG/PNG + 1 MP3 Erzeugt ein Video aus einem Standbild und einer Audiodatei. Textüberlagerung, Überblendungen, Auflösung und FPS über das Feld options konfigurierbar.
Video-Overlay overlay_video 2 MP4 Legt ein zweites Video über das Hauptvideo. Position, Größe, Deckkraft und Audio über das Feld options konfigurierbar.
Text zu MP3 text_to_mp3 (nur Text) Wandelt Text in Sprache um und gibt eine MP3-Datei zurück. Kein Datei-Upload erforderlich — sende mode=text_to_mp3, text und lang als Formularfelder. Unterstützt alle 20 Sprachen der Website.
Strenge Validierung: Jeder Modus erfordert eine genaue Anzahl und Art von Dateien. add_audio und mix_audio akzeptieren nur 1 MP4 + 1 MP3. image_to_video nur 1 JPG/PNG + 1 MP3. Andere Kombinationen werden mit einem expliziten Fehlercode abgelehnt. MIME-Typen werden per Magic Bytes verifiziert.
Dauerregel: In Audio- und image_to_video-Modus entspricht die Ergebnisdauer der MP3-Dauer. Die Videospur wird in Audiomodi nie neu kodiert (-c:v copy).

Gemeinsame Parameter (multipart/form-data)

FeldTypPfl.Beschreibung
videos[]File[]JAZu verarbeitende Dateien. Je nach Modus: 2–20 MP4, oder 1 MP4 + 1 MP3, oder 1 Bild (JPG/PNG) + 1 MP3. Max. 500 MB pro Datei.
modestring*image_to_video | add_audio | mix_audio. Für diese drei Modi erforderlich. Wird ignoriert (automatisch erkannt) wenn alle Dateien MP4 sind (fusion). Bei Angabe des mode-Felds müssen hochgeladene Dateien genau übereinstimmen — sonst wird die Anfrage abgelehnt.
orderJSONNur für fusion-Modus — JSON-Array von Indizes zur Clip-Reihenfolge.
transition_typestringNur fusion-Modus. Standard: none. Siehe Liste der verfügbaren Übergänge.
transition_durationfloatNur fusion-Modus. Dauer 0,2–2,0 Sek. Standard: 0.5.
optionsJSONNur image_to_video-Modus — JSON-Objekt der Render-Parameter (siehe unten).
callback_urlstringÖffentliche URL (http/https), die bei Job-Abschluss aufgerufen wird. Die Antwort enthält ein webhook_secret.

Parameter options — image_to_video-Modus

Alle optional. Nicht angegebene Werte → Worker-Standardwerte.

SchlüsselTypStandardBeschreibung
textstring""Als Überlagerung angezeigter Text. Leer = kein Text. Max. 500 Zeichen.
font_sizeint60Schriftgröße in Pixeln. Bereich: 10–300. Empfohlen: 36, 48, 60, 72, 96.
text_colorstring"white"Textfarbe (z.B. white, yellow, #ffffff, 0xffffff).
text_positionstring"center"Textposition: center, top, bottom.
boxbooltrueHalbtransparenter Hintergrund hinter dem Text.
box_colorstring"black@0.4"Farbe + Deckkraft im FFmpeg-Format: farbe@deckkraft. Farben: black, white, yellow… Deckkraft: 0,0–1,0 (z.B. black@0.4 = 40% Schwarz).
fade_durationfloat0.5Ein-/Ausblendedauer in Sekunden (0–2). 0 = keine Überblendung.
widthint1080Videobreite in Pixeln (64–3840, gerade Zahl). Standard: 1080/1920/720/1280.
heightint1920Videohöhe in Pixeln (64–3840, gerade Zahl).
fpsint24Bildrate (1–60).
image_fitstring"contain"Rahmenmodus: contain = vollständiges Bild, Leerräume mit bg_color gefüllt; cover = Bild gezoomt, überschüssige Ränder abgeschnitten. bg_color wird im cover-Modus ignoriert.
bg_colorstring"black"Hintergrundfarbe wenn das Bild die Zielauflösung nicht ausfüllt — nur bei image_fit=contain (z.B. black, white, #1a1a2e).
enable_image_motionboolfalseAktiviert die Fotoanimation. Bei false bleibt das Bild statisch. Bei true wird der durch image_motion_effect definierte Effekt via FFmpeg zoompan angewendet.
image_motion_effectstring"ken_burns"Animationseffekt. Werte: 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. Standard: ken_burns.
motion_intensityfloat1.0Fotoanimationsintensität (0,25–2,0). Multipliziert Zoomamplitude und Schwenkgeschwindigkeit. Ignoriert wenn enable_image_motion false.
text_effectstring"none"Textanimation (ignoriert wenn text fehlt). Werte: none, fade_in, slide_up, slide_down, slide_left, bounce.
text_effect_intensityfloat1.0Textanimationsintensität (0,25–2,0). Steuert Einblendgeschwindigkeit, Eintrittsdauer oder Hüpffrequenz.
text_border_widthint0Umrandungsstärke in Pixeln (0 = deaktiviert, 1–10). Verbessert die Lesbarkeit. Ignoriert wenn text fehlt.
text_modestring"static"Textanzeigemodus. static (Standard): vollständiger Text ab dem ersten Frame. word_by_word: Wörter erscheinen einzeln im Tempo von word_reveal_speed. Schließt text_effect aus: bei text_mode=word_by_word wird text_effect ignoriert.
word_reveal_speedfloat1.5Anzeigegeschwindigkeit in Wörtern pro Sekunde (0,3–5,0, Standard 1,5). Nur bei text_mode=word_by_word. Empfohlener Wert für OpenAI TTS-Synchronisierung: 2,0.
word_animstring"none"Animation beim Erscheinen jedes Wortes. none (Standard): sofortige Anzeige. fade: jedes neue Wort wird über 0.2s eingeblendet mit Crossfade zum vorherigen Block. Nur bei text_mode=word_by_word.

Parameter options — Modus overlay_video

Alle optional. Die Uploadreihenfolge ist wichtig: die erste Datei ist das Hauptvideo (Hintergrund), die zweite Datei ist das Overlay (Vordergrund). Verwende chroma_key, um einen Greenscreen im Overlay zu entfernen.

SchlüsselTypStandardBeschreibung
positionstring"bottom-right"Ecke, in der das Overlay platziert wird: top-left, top-right, bottom-left, bottom-right oder center.
scalefloat0.30Größe des Overlays als Bruchteil der Breite des Hauptvideos. 0.25 = 25% der Breite. Bereich: 0.05–1.0.
opacityfloat1.0Transparenz des Overlays. 1.0 = vollständig sichtbar, 0.0 = unsichtbar.
marginint10Abstand in Pixeln zwischen Overlay und Bildrand. Ignoriert bei position=center. Bereich: 0–200.
audiostring"main"Welche Audiospur behalten. main: nur Hauptvideo-Audio. overlay: nur Overlay-Audio. mix: beide Spuren gemischt.
chroma_keyboolfalsetrue setzen, um den reinen Grünhintergrund (#00FF00) des Overlays zu entfernen — nützlich für Webcam-Einblendungen auf Greenscreen.
chroma_similarityfloat0.20Greenscreen-Toleranz. Niedrig = strenge Übereinstimmung. Hoch = breitere Entfernung. Empfohlen: 0.10–0.20 für digitales Grün, 0.25–0.45 für physischen Bildschirm. Bereich: 0.01–0.60.

Parameter options — Audio bearbeiten (mix_audio)

Nur mit mode=mix_audio verfügbar. Bei add_audio ignoriert.

SchlüsselTypStandardBeschreibung
mp3_volumefloat1.0Lautstärke der überlagerten MP3 (0,0 = stumm, 1,0 = Original, 2,0 = doppelt). Werte über 1,0 können übersteuern.

Erfolgsantwort (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-Beispiel — 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-Beispiel — Audio bearbeiten

# 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-Beispiel — 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-Beispiel — Videos zusammenfügen

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> Job-Status

Mögliche Status

StatusBedeutungZusätzliche Felder
queued In der Warteschlange, noch nicht verarbeitet queue_position, queue_total, eta_minutes
processing FFmpeg-Verarbeitung läuft
ready Abgeschlossen — Datei verfügbar download_url, created_at, expires_at
error Verarbeitung fehlgeschlagen error (message)

Antworten nach 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-Beispiel

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)

Gemeinsame Parameter (multipart/form-data)

apidocs_th_paramTypStandardapidocs_th_desc
pageinteger1Page number (starts at 1)
limitinteger20Results per page (max 50, default 20)

Antworten nach 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 auf YouTube oder TikTok veröffentlichen

Veröffentlicht einen fertigen Job (status=ready) auf einem oder mehreren sozialen Konten. Das Token muss zu einem Mitgliedskonto gehören (kein Admin-Token).

Voraussetzung: Soziale Konten (YouTube, TikTok) müssen zunächst per OAuth auf der Publikationsseite im Mitgliederbereich verbunden werden. Die account_id jedes Kontos wird dort angezeigt.

Gemeinsame Parameter (multipart/form-data)

apidocs_th_paramTypapidocs_th_requiredapidocs_th_desc
job_idstringapidocs_requiredJob-ID (32-stelliger Hex) des fertigen Videos
publicationsarrayapidocs_requiredArray von Publikationsobjekten (max. 10)

Publikationsobjekt

apidocs_th_paramTypapidocs_th_requiredapidocs_th_desc
account_idintegerapidocs_requiredID des verbundenen sozialen Kontos — auf der Publikationsseite im Mitgliederbereich zu finden
titlestringVideotitel (max. 512 Zeichen)
descriptionstringVideobeschreibung (max. 5 000 Zeichen)
tagsstringKommagetrennte Tags (max. 1 024 Zeichen)
visibilitystringpublic | private | unlisted — Standard: public
tiktok_modestringdraft | direct — Nur TikTok — Standard: direct
tiktok_privacystringDirect-ModusNur TikTok — im Direct-Modus erforderlich
allow_commentbooleanNur TikTok — Kommentare erlauben
allow_duetbooleanNur TikTok — Duette erlauben
allow_stitchbooleanNur TikTok — Stitches erlauben
your_brandbooleanNur TikTok — organische Werbeinhalte („Ihre Marke").
branded_contentbooleanNur TikTok — Kennzeichnung von Werbeinhalten
tiktok_cover_msintegerNur TikTok — Cover-Frame-Zeitstempel in ms (0–60 000, Standard 1 000)

Antworten nach Status

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

Fehlercodes pro Publikation

apidocs_th_codeBedeutung
job_not_readyJob noch nicht abgeschlossen
mode_not_supportedJobs im Modus text_to_mp3 können nicht veröffentlicht werden
account_not_foundKonto nicht gefunden oder nicht verbunden
tiktok_privacy_requiredDatenschutzstufe im Direct-Modus erforderlich
publication_failedDer Anbieter hat beim Upload einen Fehler zurückgegeben

cURL-Beispiel

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> Fertige Datei herunterladen

Gibt die fertige MP4-Datei als Stream zurück (Content-Type: video/mp4). Kein Token erforderlich — die URL ist ausreichend undurchsichtig. Nur verfügbar wenn der Status ready ist.

Die Datei wird 2 Stunden nach Job-Abschluss aufbewahrt, dann gelöscht. Laden Sie das Video herunter, sobald der Status ready wird.

Optionaler Parameter

ParameterBeschreibung
filenameVorgeschlagener Name für die heruntergeladene Datei (z.B. mein-video.mp4)

curl-Beispiel

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

Webhooks

Webhooks sind eine Alternative zum Polling: statt alle X Sekunden den Status zu prüfen, geben Sie eine URL an und der Server ruft Sie automatisch auf, wenn der Job abgeschlossen ist.

So funktioniert es

  1. callback_url im POST an /api/v1/render.php übergeben
  2. Die Antwort enthält ein webhook_secret — aufbewahren zur Signaturverifizierung
  3. Wenn der Job ready oder error erreicht, sendet der Server einen signierten JSON-POST an Ihre URL
  4. Signatur mit HMAC-SHA256(webhook_secret, raw_body) verifizieren
Einschränkungen: callback_url muss öffentlich zugänglich sein (http oder https). Private, Loopback- und reservierte IPs sind gesperrt. Zeitüberschreitung: 10 Sekunden.

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

Vom Server gesendete Header

HeaderWert
Content-Typeapplication/json
X-RVM-Signaturesha256=<hmac_hex> — HMAC-SHA256-Signatur des Raw-Body
X-RVM-Job-IdDie relevante job_id

Signaturverifizierung

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

Fehlercodes

HTTPJSON-CodeUrsache
401unauthorizedToken fehlt, ungültig oder widerrufen
400missing_filesKeine Dateien empfangen
400too_few_filesWeniger als 2 Dateien gesendet
400too_many_filesMehr als 20 Dateien gesendet
400invalid_mimeNicht unterstützte Datei — nur MP4, MP3 und JPG/PNG werden akzeptiert (MIME per Magic Bytes verifiziert)
400wrong_file_countDateianzahl stimmt nicht mit dem gewählten Modus überein
400wrong_file_typesDateitypen stimmen nicht mit dem gewählten Modus überein
400invalid_file_combinationDateikombination ohne Modus entspricht keinem unterstützten Modus
400invalid_optionsDas Feld options ist kein gültiges JSON oder enthält kein Objekt
400invalid_optionEin Wert in options ist ungültig (Farbe, Schriftname, Position…)
400file_too_largeEine Datei überschreitet 500 MB
400invalid_orderDas order-Array ist keine gültige Permutation
400invalid_job_idFalsches job_id-Format (muss 32-stellige Hexadezimalzahl sein)
404job_not_foundJob nicht gefunden — job_id unbekannt oder nie existiert
410job_expiredJob abgelaufen — existierte, aber das 2-Stunden-Abruffenster ist verstrichen
429quota_exceeded20 erfolgreiche Jobs/Tag erreicht (alle Modi zusammen)
429rate_limitedMehr als 12 Aufrufe/Min auf /api/v1/jobs.phpRetry-After Sekunden warten
500server_errorInterner Serverfehler

Integrationsbeispiele

Beispiele für jeden Modus — requests installieren mit pip install requests.

Gemeinsame Konfiguration

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 — Bild + 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 bearbeiten

# 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 — Bild-im-Bild

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

Videos zusammenfügen

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 (gemeinsam für 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")

Zwei Ansätze in n8n: Polling (Statusschleife) oder Webhook (Server ruft n8n). Der Webhook wird empfohlen — sauberer, keine unnötige Last.

Ansatz A — Webhook (empfohlen)

Nur 3 Nodes, keine Schleife.

Node 1 — Webhook-Trigger
Einen Webhook-Node als Workflow-Eingang hinzufügen (Methode POST). Die generierte URL notieren, z.B. https://ihr-n8n.com/webhook/rvm-callback.

Node 2 — Job erstellen (HTTP Request)

MethodePOST
URLhttps://rapidvideomaker.com/api/v1/render.php
AuthentifizierungHeader Auth — Authorization: Bearer rvm_…
Body-InhaltstypForm-Data Multipart
Body paramsBinary-Feld videos[] für jeden Clip + Text-Feld callback_url = Webhook-Node-URL

webhook_secret aus der Antwort in einer Workflow-Variable speichern.

Node 3 — Ergebnis verarbeiten (im webhook-ausgelösten Workflow)
Wenn n8n den POST des Servers empfängt, ist $json.status ready oder error. Bei ready enthält $json.download_url die direkte Download-URL.

Signatur verifizieren: {{ $headers['x-rvm-signature'] }} mit sha256= + HMAC-SHA256 des Raw-Body vergleichen. Code-Node: crypto.createHmac('sha256', secret).update(body).digest('hex').

Ansatz B — Polling (ohne Webhook)

5 Nodes, Statusschleife alle 10 Sek.

Node 1 — Job erstellen — gleiche Konfiguration wie oben, ohne callback_url.

Node 2 — Warten — 10 Sekunden.

Node 3 — Status abrufen (HTTP Request GET)

URLhttps://rapidvideomaker.com/api/v1/jobs.php
Query-Parameterjob_id = {{ $('Node 1').item.json.job_id }}
AuthentifizierungHeader-Auth — gleicher Token

Node 4 — If: {{ $json.status }} === 'ready' → true: Node 5 / false: zurück zu Node 2.

Iterationszähler in einem Set-Node hinzufügen, um die Schleife nach 60 Versuchen (max. 10 Min.) zu unterbrechen.

Node 5 — Herunterladen: HTTP Request GET auf {{ $json.download_url }}, Antwortformat File.

Schritt 1 — Job erstellen (Modus wählen)

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

Schritt 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

Schritt 3 — Herunterladen

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

Best Practices

Ergebnisdateien werden 2 Stunden nach Job-Abschluss aufbewahrt, dann automatisch gelöscht. Laden Sie Ihr Video herunter, sobald der Status ready wird.