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.
Vollständiger Arbeitsablauf
Jede Integration folgt derselben 4-Schritte-Abfolge:
POST /api/v1/render.phpmultipart/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.GET /api/v1/jobs.php?job_id=…queued → processing → ready (oder error). Die Antwort enthält die Warteschlangenposition und eine geschätzte Restzeit.ready ist, enthält die Antwort ein fertiges download_url-Feld.GET /api/download.php?job_id=…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:
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.
Warteschlange
Es wird jeweils ein Job verarbeitet. Bei gleichzeitig eingereichten Jobs werden diese in Eingangsreihenfolge verarbeitet. Während des Wartens enthält die Statusantwort:
queue_position— Position des Jobs in der Warteschlange (1 = nächster)queue_total— Gesamtanzahl wartender Jobseta_minutes— Geschätzte Zeit bis zur Verarbeitung
/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:
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
Fünf Modi, zugänglich über das Feld mode (lasse mode bei mehreren MP4 weg, um fusion automatisch zu erkennen):
| Verwendung | API-Modus | Erforderliche Dateien | Beschreibung |
|---|---|---|---|
| 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. |
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.-c:v copy).Gemeinsame Parameter (multipart/form-data)
| Feld | Typ | Pfl. | Beschreibung |
|---|---|---|---|
| videos[] | File[] | JA | Zu 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. |
| mode | string | * | 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. |
| order | JSON | Nur für fusion-Modus — JSON-Array von Indizes zur Clip-Reihenfolge. | |
| transition_type | string | Nur fusion-Modus. Standard: none. Siehe Liste der verfügbaren Übergänge. | |
| transition_duration | float | Nur fusion-Modus. Dauer 0,2–2,0 Sek. Standard: 0.5. | |
| options | JSON | Nur image_to_video-Modus — JSON-Objekt der Render-Parameter (siehe unten). | |
| callback_url | string | Ö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üssel | Typ | Standard | Beschreibung |
|---|---|---|---|
| text | string | "" | Als Überlagerung angezeigter Text. Leer = kein Text. Max. 500 Zeichen. |
| font_size | int | 60 | Schriftgröße in Pixeln. Bereich: 10–300. Empfohlen: 36, 48, 60, 72, 96. |
| text_color | string | "white" | Textfarbe (z.B. white, yellow, #ffffff, 0xffffff). |
| text_position | string | "center" | Textposition: center, top, bottom. |
| box | bool | true | Halbtransparenter Hintergrund hinter dem Text. |
| box_color | string | "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_duration | float | 0.5 | Ein-/Ausblendedauer in Sekunden (0–2). 0 = keine Überblendung. |
| width | int | 1080 | Videobreite in Pixeln (64–3840, gerade Zahl). Standard: 1080/1920/720/1280. |
| height | int | 1920 | Videohöhe in Pixeln (64–3840, gerade Zahl). |
| fps | int | 24 | Bildrate (1–60). |
| image_fit | string | "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_color | string | "black" | Hintergrundfarbe wenn das Bild die Zielauflösung nicht ausfüllt — nur bei image_fit=contain (z.B. black, white, #1a1a2e). |
| enable_image_motion | bool | false | Aktiviert die Fotoanimation. Bei false bleibt das Bild statisch. Bei true wird der durch image_motion_effect definierte Effekt via FFmpeg zoompan angewendet. |
| image_motion_effect | string | "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_intensity | float | 1.0 | Fotoanimationsintensität (0,25–2,0). Multipliziert Zoomamplitude und Schwenkgeschwindigkeit. Ignoriert wenn enable_image_motion false. |
| text_effect | string | "none" | Textanimation (ignoriert wenn text fehlt). Werte: none, fade_in, slide_up, slide_down, slide_left, bounce. |
| text_effect_intensity | float | 1.0 | Textanimationsintensität (0,25–2,0). Steuert Einblendgeschwindigkeit, Eintrittsdauer oder Hüpffrequenz. |
| text_border_width | int | 0 | Umrandungsstärke in Pixeln (0 = deaktiviert, 1–10). Verbessert die Lesbarkeit. Ignoriert wenn text fehlt. |
| text_mode | string | "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_speed | float | 1.5 | Anzeigegeschwindigkeit 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_anim | string | "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üssel | Typ | Standard | Beschreibung |
|---|---|---|---|
| position | string | "bottom-right" | Ecke, in der das Overlay platziert wird: top-left, top-right, bottom-left, bottom-right oder center. |
| scale | float | 0.30 | Größe des Overlays als Bruchteil der Breite des Hauptvideos. 0.25 = 25% der Breite. Bereich: 0.05–1.0. |
| opacity | float | 1.0 | Transparenz des Overlays. 1.0 = vollständig sichtbar, 0.0 = unsichtbar. |
| margin | int | 10 | Abstand in Pixeln zwischen Overlay und Bildrand. Ignoriert bei position=center. Bereich: 0–200. |
| audio | string | "main" | Welche Audiospur behalten. main: nur Hauptvideo-Audio. overlay: nur Overlay-Audio. mix: beide Spuren gemischt. |
| chroma_key | bool | false | true setzen, um den reinen Grünhintergrund (#00FF00) des Overlays zu entfernen — nützlich für Webcam-Einblendungen auf Greenscreen. |
| chroma_similarity | float | 0.20 | Greenscreen-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üssel | Typ | Standard | Beschreibung |
|---|---|---|---|
| mp3_volume | float | 1.0 | Lautstärke der überlagerten MP3 (0,0 = stumm, 1,0 = Original, 2,0 = doppelt). Werte über 1,0 können übersteuern. |
Erfolgsantwort (HTTP 200)
curl-Beispiel — image_to_video-Modus
curl-Beispiel — Audio bearbeiten
curl-Beispiel — Modus overlay_video
curl-Beispiel — Videos zusammenfügen
Mögliche Status
| Status | Bedeutung | Zusä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
curl-Beispiel
Gemeinsame Parameter (multipart/form-data)
| apidocs_th_param | Typ | Standard | apidocs_th_desc |
|---|---|---|---|
page | integer | 1 | Page number (starts at 1) |
limit | integer | 20 | Results per page (max 50, default 20) |
Antworten nach Status
Veröffentlicht einen fertigen Job (status=ready) auf einem oder mehreren sozialen Konten. Das Token muss zu einem Mitgliedskonto gehören (kein Admin-Token).
account_id jedes Kontos wird dort angezeigt.Gemeinsame Parameter (multipart/form-data)
| apidocs_th_param | Typ | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
job_id | string | apidocs_required | Job-ID (32-stelliger Hex) des fertigen Videos |
publications | array | apidocs_required | Array von Publikationsobjekten (max. 10) |
Publikationsobjekt
| apidocs_th_param | Typ | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
account_id | integer | apidocs_required | ID des verbundenen sozialen Kontos — auf der Publikationsseite im Mitgliederbereich zu finden |
title | string | — | Videotitel (max. 512 Zeichen) |
description | string | — | Videobeschreibung (max. 5 000 Zeichen) |
tags | string | — | Kommagetrennte Tags (max. 1 024 Zeichen) |
visibility | string | — | public | private | unlisted — Standard: public |
tiktok_mode | string | — | draft | direct — Nur TikTok — Standard: direct |
tiktok_privacy | string | Direct-Modus | Nur TikTok — im Direct-Modus erforderlich |
allow_comment | boolean | — | Nur TikTok — Kommentare erlauben |
allow_duet | boolean | — | Nur TikTok — Duette erlauben |
allow_stitch | boolean | — | Nur TikTok — Stitches erlauben |
your_brand | boolean | — | Nur TikTok — organische Werbeinhalte („Ihre Marke"). |
branded_content | boolean | — | Nur TikTok — Kennzeichnung von Werbeinhalten |
tiktok_cover_ms | integer | — | Nur TikTok — Cover-Frame-Zeitstempel in ms (0–60 000, Standard 1 000) |
Antworten nach Status
Fehlercodes pro Publikation
| apidocs_th_code | Bedeutung |
|---|---|
job_not_ready | Job noch nicht abgeschlossen |
mode_not_supported | Jobs im Modus text_to_mp3 können nicht veröffentlicht werden |
account_not_found | Konto nicht gefunden oder nicht verbunden |
tiktok_privacy_required | Datenschutzstufe im Direct-Modus erforderlich |
publication_failed | Der Anbieter hat beim Upload einen Fehler zurückgegeben |
cURL-Beispiel
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
| Parameter | Beschreibung |
|---|---|
| filename | Vorgeschlagener Name für die heruntergeladene Datei (z.B. mein-video.mp4) |
curl-Beispiel
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
callback_urlim POST an/api/v1/render.phpübergeben- Die Antwort enthält ein
webhook_secret— aufbewahren zur Signaturverifizierung - Wenn der Job
readyodererrorerreicht, sendet der Server einen signierten JSON-POSTan Ihre URL - Signatur mit
HMAC-SHA256(webhook_secret, raw_body)verifizieren
callback_url muss öffentlich zugänglich sein (http oder https). Private, Loopback- und reservierte IPs sind gesperrt. Zeitüberschreitung: 10 Sekunden. Empfangenes Payload
Vom Server gesendete Header
| Header | Wert |
|---|---|
| Content-Type | application/json |
| X-RVM-Signature | sha256=<hmac_hex> — HMAC-SHA256-Signatur des Raw-Body |
| X-RVM-Job-Id | Die relevante job_id |
Signaturverifizierung
Fehlercodes
| HTTP | JSON-Code | Ursache |
|---|---|---|
| 401 | unauthorized | Token fehlt, ungültig oder widerrufen |
| 400 | missing_files | Keine Dateien empfangen |
| 400 | too_few_files | Weniger als 2 Dateien gesendet |
| 400 | too_many_files | Mehr als 20 Dateien gesendet |
| 400 | invalid_mime | Nicht unterstützte Datei — nur MP4, MP3 und JPG/PNG werden akzeptiert (MIME per Magic Bytes verifiziert) |
| 400 | wrong_file_count | Dateianzahl stimmt nicht mit dem gewählten Modus überein |
| 400 | wrong_file_types | Dateitypen stimmen nicht mit dem gewählten Modus überein |
| 400 | invalid_file_combination | Dateikombination ohne Modus entspricht keinem unterstützten Modus |
| 400 | invalid_options | Das Feld options ist kein gültiges JSON oder enthält kein Objekt |
| 400 | invalid_option | Ein Wert in options ist ungültig (Farbe, Schriftname, Position…) |
| 400 | file_too_large | Eine Datei überschreitet 500 MB |
| 400 | invalid_order | Das order-Array ist keine gültige Permutation |
| 400 | invalid_job_id | Falsches job_id-Format (muss 32-stellige Hexadezimalzahl sein) |
| 404 | job_not_found | Job nicht gefunden — job_id unbekannt oder nie existiert |
| 410 | job_expired | Job abgelaufen — existierte, aber das 2-Stunden-Abruffenster ist verstrichen |
| 429 | quota_exceeded | 20 erfolgreiche Jobs/Tag erreicht (alle Modi zusammen) |
| 429 | rate_limited | Mehr als 12 Aufrufe/Min auf /api/v1/jobs.php — Retry-After Sekunden warten |
| 500 | server_error | Interner Serverfehler |
Integrationsbeispiele
Beispiele für jeden Modus — requests installieren mit pip install requests.
Gemeinsame Konfiguration
image_to_video-Modus — Bild + Audio → Video
Audio bearbeiten
Modus overlay_video — Bild-im-Bild
Videos zusammenfügen
Polling + Download (gemeinsam für alle Modi)
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)
| Methode | POST |
| URL | https://rapidvideomaker.com/api/v1/render.php |
| Authentifizierung | Header Auth — Authorization: Bearer rvm_… |
| Body-Inhaltstyp | Form-Data Multipart |
| Body params | Binary-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.
{{ $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)
| URL | https://rapidvideomaker.com/api/v1/jobs.php |
| Query-Parameter | job_id = {{ $('Node 1').item.json.job_id }} |
| Authentifizierung | Header-Auth — gleicher Token |
Node 4 — If: {{ $json.status }} === 'ready' → true: Node 5 / false: zurück zu Node 2.
Node 5 — Herunterladen: HTTP Request GET auf {{ $json.download_url }}, Antwortformat File.
Schritt 1 — Job erstellen (Modus wählen)
Schritt 2 — Polling
Schritt 3 — Herunterladen
Best Practices
- Polling-Frequenz: Der Endpunkt
/api/v1/jobs.phpist auf 12 Aufrufe/Min pro Token begrenzt. Mindestens 5 Sekunden zwischen Aufrufen (10 Sek. empfohlen). - Timeout: Clientseitigen Timeout implementieren (z.B. 10 Minuten). Falls Job nicht
ready, als Fehler behandeln. - Schnell herunterladen: Sobald der Status
readyist, Datei herunterladen. Sie wird 2 Stunden nach Job-Abschluss gelöscht. - Kontingent-Verwaltung:
quota_remainingin der POST-Antwort prüfen. Bei0wird der nächste Job mit429abgelehnt. - Netzwerkfehler: Bei Netzwerkfehler warten und erneut versuchen — der Job wird serverseitig unabhängig ausgeführt.
ready wird.