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/MOV), Audio bearbeiten (1 MP4/MOV + 1 MP3), Video erstellen (1 JPG/PNG + 1 MP3), Video-Overlay (2 MP4/MOV 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/MOV + 1 MP3 → Audio bearbeiten (mode=mix_audio zum Überlagern). Mehrere MP4/MOV → zusammenfügen. Der Server gibt eine eindeutige job_id zurück. Oder 1 Bild + options.text + options.voice: Die Stimme wird aus dem Text erzeugt, ohne MP3.
2
Job überwachen — GET /api/v1/jobs.php?job_id=…
Diesen Endpunkt regelmäßig abrufen (alle 5–10 Sek.). Der Job durchläuft queued → processing → ready (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/MOV-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/MOV-Dateien Clips werden in der angegebenen Reihenfolge zusammengefügt. Optionale Übergänge zwischen Clips.
Audio bearbeiten add_audio oder mix_audio 1 MP4/MOV + 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 – oder 1 JPG/PNG + ein Text (options.text + options.voice): Die Stimme wird erzeugt Erzeugt ein Video aus einem Standbild und deiner MP3 – oder aus einem einfachen Text (options.text), dessen Stimme erzeugt wird (options.voice). Textüberlagerung (statisch, Wort für Wort oder Karaoke), Überblendungen, Auflösung und FPS über das Feld options konfigurierbar.
Video-Overlay overlay_video 2 MP4/MOV Legt ein zweites Video über das Hauptvideo. Position, Größe, Deckkraft und Audio über das Feld options konfigurierbar.
Text hinzufügen add_text 1 MP4/MOV Blendet Text in ein vorhandenes Video ein (Auflösung, Bildrate und Ton bleiben erhalten). Dieselben Texteinstellungen wie bei image_to_video, plus der Zeitpunkt des Erscheinens. options.text ist erforderlich.
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/MOV + 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. Ausnahme: Mit options.text + options.voice akzeptiert image_to_video 1 Bild allein – die Stimme wird aus dem Text erzeugt (ohne MP3).
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). Mit options.voice dauert image_to_video so lange wie die aus dem Text erzeugte Stimme (+0,6 s).

Gemeinsame Parameter (multipart/form-data)

FeldTypPfl.Beschreibung
videos[]File[]JAZu verarbeitende Dateien. Je nach Modus: 2–20 MP4/MOV, oder 1 MP4/MOV + 1 MP3, oder 1 Bild (JPG/PNG) + 1 MP3. Max. 500 MB pro Datei.
modestring*image_to_video | add_audio | mix_audio | overlay_video | text_to_mp3. Erforderlich für diese Nicht-Fusion-Modi. Das Weglassen von mode bei ausschließlich MP4/MOV-Dateien löst immer fusion aus (Stream-Copy-Zusammenführung) — niemals overlay_video, selbst bei genau 2 MP4/MOV-Dateien. Für die Audiobearbeitung: add_audio löscht das Original, mix_audio behält es und überlagert. Wird das Feld mode angegeben, müssen die hochgeladenen Dateien genau übereinstimmen — sonst wird die Anfrage abgelehnt. add_text wird ebenfalls akzeptiert: Es ist der einzige Modus mit nur einer MP4/MOV-Datei und erfordert options.text.
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.
optionsJSONJSON-Objekt der Render-Parameter für image_to_video, add_text, mix_audio und overlay_video (siehe Tabellen unten).
timingsFile / stringimage_to_video / add_text: Timing-Datei für Karaoke (SRT oder LRC, max. 200 KB) – als Dateifeld oder reiner Text. Der angezeigte Text stammt aus der Datei; erzwingt text_mode=karaoke; nicht mit voice kombinierbar.
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.
fontstring"default"Schrift des Textes, per Kennung. Zulässige Werte: default, dejavu-sans-bold, dejavu-serif, liberation-serif, dejavu-mono, amiri, noto-sans-sc (简体中文), noto-sans-tc (繁體中文), noto-sans-jp (日本語), noto-sans-kr (한국어), noto-sans-hebrew (עברית), noto-sans-thai (ไทย). default = Standardschrift (Emojis werden unterstützt); amiri = Naskh-Schrift, ideal für arabischen Text. Jeder andere Wert liefert den Fehler invalid_option. Emojis werden nur mit default dargestellt.
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"contain: Das ganze Bild oder Video anzeigen und freie Flächen mit dem gewählten Hintergrund füllen. solid (Standard) oder blur. Unschärfe erfordert image_fit=contain. Der Text bleibt scharf. cover: Das Bild wird gezoomt um den Rahmen zu füllen, zentriert — Ränder werden abgeschnitten.
bg_colorstring"black"background_mode=solid: Hintergrundfarbe wenn das Bild die Zielauflösung nicht ausfüllt — nur bei image_fit=contain (z.B. black, white, #1a1a2e).
background_modestring"solid"solid (Standard) oder blur. Unschärfe erfordert image_fit=contain. Der Text bleibt scharf.
blur_strengthnumber20Zahl von 1 bis 50; Standard 20. Gaußsche Unschärfe nur für den Hintergrund.
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_border_colorstring"black"Farbe der Zeichenkontur (gleiches Format wie text_color, Standard "black"). Wird verwendet, wenn text_border_width > 0.
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. "karaoke": Der Text färbt sich im Takt des Audios, Seite für Seite (bis zu 1.000 Zeichen). Mit voice Wort für Wort synchronisiert, sonst nach Wortlänge über das Audio verteilt.
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.
karaoke_stylestring"fill"Karaoke-Stil: fill (gesprochene Wörter erhalten die Hervorhebungsfarbe), sweep (jedes Wort füllt sich allmählich; ganze Wörter bei Schriften von rechts nach links) oder highlight (nur das aktuelle Wort ist eingefärbt).
highlight_colorstring"#FFD200"Farbe der gesprochenen Wörter / des aktuellen Worts im Karaoke-Modus (gleiches Format wie text_color).
karaoke_linesint2Angezeigte Zeilen pro Seite im Karaoke-Modus (1–4).
voicestring""Stimmen-ID (gleiche Liste wie bei text_to_mp3, z. B. de-DE-KatjaNeural): Die Stimme wird im selben Job aus text erzeugt. image_to_video braucht dann nur das Bild (eine zusätzlich gesendete MP3 wird abgelehnt). Im Karaoke-Modus ist jedes Wort mit der Stimme synchron.
voice_rateint0Geschwindigkeit der generierten Stimme in % (−50 bis +50).

Karaoke mit eigenen Timings (SRT / LRC)

Sende eine SRT- oder LRC-Datei im Feld timings: Jede Zeile erscheint zu ihrem Zeitpunkt und bildet eine Karaoke-Seite (bis zu 500 Zeilen, 5.000 Zeichen). SRT: Eine Zeile verschwindet zu ihrer Endzeit. LRC: Eine Zeile bleibt bis zur nächsten (eine leere Zeile beendet sie); [offset:] und Wort-Timings im Enhanced-LRC <mm:ss.xx> werden unterstützt – sonst wird jede Zeile über ihre Dauer verteilt. Bei add_text sind die Zeiten relativ zum Videoanfang, verschoben um text_start.

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

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.

options-Parameter — Modus add_text

Text ist erforderlich. Standardmäßig bleiben Format, Bildrate und Ton erhalten. output_format aktiviert die Anpassung mit image_fit, bg_color und background_mode. width, height, fps und Fotobewegung werden weiterhin ignoriert. Maximale Länge: 15 Minuten.

{"text":"Hello","output_format":"portrait","image_fit":"contain","background_mode":"blur","blur_strength":20}
SchlüsselTypStandardBeschreibung
textstringJAEinzublendender Text. Erforderlich, 1–200 Zeichen.
text_startfloat0Sekunde, in der der Text erscheint (≥ 0). Muss vor dem Ende des Videos liegen.
text_durationfloat0Wie lange der Text sichtbar bleibt, in Sekunden (0,1–3600). 0 = bis zum Ende des Videos.
fontstring"default"Schrift des Textes, per Kennung. Zulässige Werte: default, dejavu-sans-bold, dejavu-serif, liberation-serif, dejavu-mono, amiri, noto-sans-sc (简体中文), noto-sans-tc (繁體中文), noto-sans-jp (日本語), noto-sans-kr (한국어), noto-sans-hebrew (עברית), noto-sans-thai (ไทย). default = Standardschrift (Emojis werden unterstützt); amiri = Naskh-Schrift, ideal für arabischen Text. Jeder andere Wert liefert den Fehler invalid_option. Emojis werden nur mit default dargestellt.
font_sizeint60Schriftgröße, angegeben für ein Video mit 1080 px kurzer Seite und automatisch auf die tatsächliche Auflösung skaliert — derselbe Wert sieht in 720p und 4K gleich aus. Bereich: 10–300.
fade_durationfloat0.5Dauer der Ein-/Ausblendung des Textes (nicht des Videos) in Sekunden. Bereich: 0–2.
text_color, box, box_color, text_position, text_border_width, text_border_color, text_effect, text_effect_intensity, text_mode, word_reveal_speed, word_anim, karaoke_style, highlight_color, karaoke_lines, voice, voice_rate——Identisch mit image_to_video (siehe Tabelle oben).
original_volumefloat0.3Mit voice: Lautstärke des Originaltons unter der Stimme (0–2, Standard 0.3; 0 = ersetzt). Die Stimme beginnt bei text_start; der Text bleibt bis zu ihrem Ende sichtbar, und reicht sie über das Videoende hinaus, wird das letzte Bild gehalten.
background_modestring"solid"solid (Standard) oder blur. Unschärfe erfordert image_fit=contain. Der Text bleibt scharf.
blur_strengthnumber20Zahl von 1 bis 50; Standard 20. Gaußsche Unschärfe nur für den Hintergrund.
output_formatstring"original"Nur add_text: original (Standard), portrait (1080×1920), square (1080×1080), landscape (1920×1080). Unschärfe erfordert ein anderes Format als original.
image_fitstring"contain"contain: Das ganze Bild oder Video anzeigen und freie Flächen mit dem gewählten Hintergrund füllen. solid (Standard) oder blur. Unschärfe erfordert image_fit=contain. Der Text bleibt scharf. cover: Das Bild wird gezoomt um den Rahmen zu füllen, zentriert — Ränder werden abgeschnitten.
bg_colorstring"black"background_mode=solid: Hintergrundfarbe wenn das Bild die Zielauflösung nicht ausfüllt — nur bei image_fit=contain (z.B. black, white, #1a1a2e).

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.

Modus text_to_mp3 — direkte Parameter (kein options-JSON)

Anders als bei den übrigen Modi werden diese Felder direkt als Formularfelder gesendet, nicht innerhalb des options-JSON-Objekts. Nur text ist erforderlich.

SchlüsselTypStandardBeschreibung
textstring—In Sprache umzuwandelnder Text. Erforderlich. Maximal 5.000 Zeichen.
langstring"en"Sprachcode zur Auswahl der Standardstimme, wenn voice fehlt oder ungültig ist. Einer der 20 Sprachen der Website (siehe Tabelle unten). Fällt auf en zurück, wenn unbekannt.
voicestringautomatischedge-tts-Stimmen-ID (siehe Tabelle unten). Fehlt sie oder ist sie ungültig, wird automatisch die erste Stimme von lang verwendet.
slowboolfalseAuf true (oder 1) setzen, um die Sprechgeschwindigkeit um 25 % zu verlangsamen. Jeder andere Wert wird als false behandelt.
Kein Datei-Upload nötig: Anders als bei den anderen Modi benötigt text_to_mp3 kein videos[]. Sende mode=text_to_mp3 zusammen mit text / lang / voice / slow als normale Formularfelder.

Verfügbare Stimmen (edge-tts, Microsoft Neural), gruppiert nach Sprachcode:

SpracheVerfügbare Stimmen
en en-US-AvaNeural, en-US-AndrewNeural, en-GB-LibbyNeural, en-AU-NatashaNeural, en-AU-WilliamMultilingualNeural
fr fr-FR-DeniseNeural, fr-FR-HenriNeural, fr-FR-EloiseNeural, fr-CA-SylvieNeural, fr-CA-ThierryNeural
es es-ES-ElviraNeural, es-ES-AlvaroNeural, es-MX-DaliaNeural, es-AR-ElenaNeural, es-AR-TomasNeural
ar ar-SA-ZariyahNeural, ar-SA-HamedNeural, ar-EG-SalmaNeural, ar-MA-MounaNeural, ar-MA-JamalNeural
pt pt-BR-FranciscaNeural, pt-BR-AntonioNeural, pt-PT-RaquelNeural
de de-DE-KatjaNeural, de-DE-ConradNeural, de-DE-AmalaNeural, de-AT-IngridNeural, de-AT-JonasNeural
it it-IT-ElsaNeural, it-IT-DiegoNeural, it-IT-IsabellaNeural
nl nl-NL-ColetteNeural, nl-NL-MaartenNeural, nl-BE-DenaNeural, nl-BE-ArnaudNeural
ru ru-RU-SvetlanaNeural, ru-RU-DmitryNeural
tr tr-TR-EmelNeural, tr-TR-AhmetNeural
hi hi-IN-SwaraNeural, hi-IN-MadhurNeural
bn bn-IN-TanishaaNeural, bn-IN-BashkarNeural, bn-BD-NabanitaNeural, bn-BD-PradeepNeural
ur ur-PK-UzmaNeural, ur-PK-AsadNeural, ur-IN-GulNeural, ur-IN-SalmanNeural
id id-ID-GadisNeural, id-ID-ArdiNeural
ja ja-JP-NanamiNeural, ja-JP-KeitaNeural
ko ko-KR-SunHiNeural, ko-KR-InJoonNeural
zh-CN zh-CN-XiaoxiaoNeural, zh-CN-YunxiNeural, zh-CN-XiaoyiNeural
zh-TW zh-TW-HsiaoChenNeural, zh-TW-YunJheNeural
vi vi-VN-HoaiMyNeural, vi-VN-NamMinhNeural
pl pl-PL-ZofiaNeural, pl-PL-MarekNeural

Erfolgsantwort (HTTP 200)

{ "success": true, "job_id": "a3f1c8d2e5b09471...", "mode": "fusion", // "fusion" | "add_audio" | "mix_audio" | "image_to_video" | "overlay_video" | "add_text" | "text_to_mp3" "file_count": 2, "transition": null, "quota_used": 1, "quota_remaining": 9, "status_url": "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..." }
Bei text_to_mp3 enthält die Antwort keine Felder file_count oder transition (es wurde keine Datei hochgeladen) — der Rest ist identisch: job_id, quota_used, quota_remaining, status_url, webhook_secret.

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" # background_mode : "solid" | "blur" (blur requires contain) # blur_strength : 1–50, default 20 # bg_color : ignored if image_fit="cover" # enable_image_motion : true = animation on, false (default) = static image # image_motion_effect : zoom_in | zoom_out | pan_left_to_right | pan_right_to_left | pan_top_to_bottom | pan_bottom_to_top | zoom_pan_soft | ken_burns # motion_intensity : 0.25–2.0 — photo animation amplitude (default 1.0) # text_effect : none | fade_in | slide_up | slide_down | slide_left | bounce (ignored if text_mode=word_by_word) # text_effect_intensity : 0.25–2.0 — text animation intensity (default 1.0) # text_border_width : 0–10 px — outline around characters (0 = disabled) # text_border_color : outline color, default "black" (e.g. "#FF3366", "white@0.8") # text_mode : "static" (default) | "word_by_word" — reveal words one by one # word_reveal_speed : 0.3–5.0 w/s — speed for word_by_word mode (default 1.5, ~2.0 for OpenAI TTS) # word_anim : "none" (default) | "fade" — fade-in crossfade on each word (word_by_word only)

Karaoke-Text mit generierter Stimme (image_to_video, ohne MP3)

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

Karaoke mit einer SRT-Datei (image_to_video + deine MP3)

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

curl-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 — Modus add_text

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

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

curl-Beispiel — Modus text_to_mp3

# No file upload — text + lang + voice as plain form fields curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "mode=text_to_mp3" \ -F "text=Welcome to Rapid Video Maker." \ -F "lang=en" \ -F "voice=en-US-AvaNeural" \ -F "slow=false" # voice omitted or invalid -> falls back to the first voice of "lang" curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "mode=text_to_mp3" \ -F "text=Bienvenue sur Rapid Video Maker." \ -F "lang=fr"
GET /api/v1/jobs.php?job_id=<hex32> Job-Status

Der Status enthält die tatsächliche Phase und die vergangene Zeit. Schätzungen sind unverbindlich; ein Client-Timeout bedeutet keinen Fehler. Fragen Sie dieselbe Job-ID weiter ab. Dateien verfallen zwei Stunden nach Abschluss.

Mögliche Status

StatusBedeutungZusätzliche Felder
queued In der Warteschlange, noch nicht verarbeitet queue_position, queue_total, eta_minutes
processing FFmpeg-Verarbeitung läuft processing_stage, processing_elapsed_seconds, stage_elapsed_seconds, last_activity_at, processed_media_seconds, eta_overrun
ready Abgeschlossen — Datei verfügbar download_url, media_available, created_at, expires_at
error Verarbeitung fehlgeschlagen error (message), quota_refund_status: pending | confirmed | not_required
cancelled Abgebrochen quota_refund_status: pending | confirmed | not_required

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 Listet alle mit diesem Token erstellten Jobs auf (seitenweise, nach Datum absteigend sortiert)

Gemeinsame Parameter (multipart/form-data)

ParameterTypStandardBeschreibung
pageinteger1Seitennummer (beginnt bei 1)
limitinteger20Ergebnisse pro Seite (max. 50, Standard 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 }
GET /api/download.php?job_id=<hex32> Fertige Datei herunterladen

Streamt die fertige Datei. Content-Type ist video/mp4 für Video-Modi, oder audio/mpeg für text_to_mp3. 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.

Optionale Parameter

ParameterBeschreibung
filenameVorgeschlagener Name für die heruntergeladene Datei (z.B. mein-video.mp4)
previewAuf 1 setzen für Inline-Wiedergabe (lässt Content-Disposition: attachment weg) statt einen Download auszulösen — für die Vorschau im Browser.

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
400text_requiredDas Feld options.text fehlt oder ist leer (Modus add_text)
400video_too_longVideo länger als 15 Minuten (Modus add_text)
400text_start_out_of_rangetext_start liegt nach dem Ende des Videos
400invalid_voiceUnbekannte voice-ID.
400invalid_timingsUnlesbare Timing-Datei (Format nicht erkannt, keine Zeile mit Zeitstempel, Ende vor Beginn, zu lang …).
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.php — Retry-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" "background_mode": "solid", # or "blur" with contain "blur_strength": 20, "bg_color": "black", # ignored if image_fit="cover" "enable_image_motion": True, "image_motion_effect": "ken_burns", "motion_intensity": 1.0, # 0.25–2.0 — photo animation amplitude "text_effect": "slide_up", # none | fade_in | slide_up | slide_down | slide_left | bounce (ignored if text_mode=word_by_word) "text_effect_intensity": 1.0, # 0.25–2.0 — text animation intensity # word-by-word reveal (mutually exclusive with text_effect): # "text_mode": "word_by_word", "word_reveal_speed": 2.0, "word_anim": "fade" }), }, )

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

Modus add_text — Text auf einem Video

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

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

Modus text_to_mp3 — Text zu Sprache

# No files — text + lang (+ optional voice / slow) as form fields resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, data={ "mode": "text_to_mp3", "text": "Welcome to Rapid Video Maker.", "lang": "en", # one of the 20 site language codes "voice": "en-US-AvaNeural", # optional — falls back to the first voice of "lang" "slow": "false", # "true" = -25% speech rate }, )

Polling + Download (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.