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/MOV), Edit audio (1 MP4/MOV + 1 MP3), Create a video (1 JPG/PNG + 1 MP3), Overlay video (2 MP4/MOV picture-in-picture). Processing is asynchronous: submit files, then poll for the result.
Flusso di lavoro completo
Ogni integrazione segue la stessa sequenza di 4 passaggi:
POST /api/v1/render.phpmultipart/form-data con il token Bearer. 1 JPG/PNG + 1 MP3 + mode=image_to_video → generazione video. 1 MP4/MOV + 1 MP3 → modifica audio (mode=mix_audio per sovrapporre). Più MP4/MOV → unione. Il server restituisce un job_id univoco. Oppure 1 immagine + options.text + options.voice: la voce viene generata dal testo, senza MP3.GET /api/v1/jobs.php?job_id=…queued → processing → ready (o error). La risposta include la posizione in coda e il tempo stimato rimanente.ready, la risposta contiene un campo download_url pronto all'uso.GET /api/download.php?job_id=…410 Gone per indicare che il job esisteva ma non è più recuperabile.Autenticazione
Ogni richiesta deve includere il token API. Sono accettati due formati:
Il token è disponibile nel tuo spazio membro — un token per account, creato automaticamente alla registrazione. Viene mostrato in chiaro solo una volta — conservalo in modo sicuro. In caso di smarrimento, puoi rigenerarlo dallo spazio membro.
Quota
Ogni account membro ha 20 richieste al giorno, condivise tra interfaccia web e API. I job falliti non consumano quota. Il contatore si azzera a mezzanotte UTC.
Le risposte POST includono quota_used e quota_remaining. Quando il limite è superato, il server risponde 429.
Coda
Un job alla volta viene elaborato. Se vengono inviati più job contemporaneamente, vengono accodati in ordine di arrivo. Nell'attesa, la risposta di stato include:
queue_position— posizione del job nella coda (1 = prossimo)queue_total— numero totale di job in attesaeta_minutes— tempo stimato prima dell'inizio dell'elaborazione
/api/v1/jobs.php accetta al massimo 12 chiamate al minuto per token (1 ogni 5 sec.). Oltre, il server risponde 429 con header Retry-After: 5. Raccomandazione: 10 secondi tra ogni chiamata. Transizioni disponibili
Passa transition_type=none (predefinito) per unione diretta, o uno dei tipi seguenti per una dissolvenza tra clip:
La durata (transition_duration) è compresa tra 0,2 e 2,0 secondi. Se un clip è troppo corto per la transizione, viene ignorata e l'unione procede senza.
Endpoint
Five modes, accessible via the mode field (omit mode with multiple MP4s to auto-detect fusion):
| Utilizzo | Modalità API | File richiesti | Descrizione |
|---|---|---|---|
| Unire video | fusion |
2–20 file MP4/MOV | I clip vengono assemblati in sequenza nell'ordine fornito. Transizioni opzionali tra clip. |
| Modificare audio | add_audio o mix_audio |
1 MP4/MOV + 1 MP3 | Sostituisce o arricchisce la traccia audio di un video. La traccia video non viene mai ricodificata (-c:v copy).add_audio — l'audio originale è eliminato e sostituito dall'MP3.mix_audio — l'audio originale è mantenuto e l'MP3 è sovrapposto (amix). options={"mp3_volume":…} per regolare il volume. Senza audio, si comporta come add_audio. |
| Creare un video | image_to_video |
1 JPG/PNG + 1 MP3 — oppure 1 JPG/PNG + un testo (options.text + options.voice): la voce viene generata |
Genera un video da un'immagine fissa e dal tuo MP3 — oppure da un semplice testo (options.text) la cui voce viene generata (options.voice). Testo in sovrimpressione (fisso, parola per parola o karaoke), dissolvenze, risoluzione e fps configurabili tramite il campo options. |
| Overlay video | overlay_video |
2 MP4/MOV | Sovrappone un secondo video al video principale. Posizione, dimensione, opacità e audio configurabili tramite il campo options. |
| Aggiungi testo | add_text |
1 MP4/MOV | Sovrappone del testo a un video esistente (risoluzione, frame rate e audio vengono mantenuti). Stesse impostazioni di testo di image_to_video, più il momento in cui il testo appare. options.text è obbligatorio. |
| Testo in MP3 | text_to_mp3 |
(solo testo) | Converte testo in parlato e restituisce un file MP3. Nessun upload necessario — invia mode=text_to_mp3, text e lang come campi form. Supporta tutte le 20 lingue del sito. |
add_audio e mix_audio accettano solo 1 MP4/MOV + 1 MP3. image_to_video solo 1 JPG/PNG + 1 MP3. Qualsiasi altra combinazione viene rifiutata. I tipi MIME sono verificati per magic bytes. Eccezione: con options.text + options.voice, image_to_video accetta 1 sola immagine — la voce viene generata dal testo (senza MP3).-c:v copy). Con options.voice, image_to_video dura quanto la voce generata dal testo (+0,6 s).Parametri comuni (multipart/form-data)
| Campo | Tipo | Obb. | Descrizione |
|---|---|---|---|
| videos[] | File[] | SÌ | File da elaborare. In base alla modalità: 2–20 MP4/MOV, o 1 MP4/MOV + 1 MP3, o 1 immagine (JPG/PNG) + 1 MP3. Max 500 MB per file. |
| mode | string | * | image_to_video | add_audio | mix_audio | overlay_video | text_to_mp3. Obbligatorio per queste modalità non-fusion. Omettere mode con solo file MP4/MOV attiva sempre fusion (concatenazione per copia di stream) — mai overlay_video, anche con esattamente 2 MP4/MOV. Per la modifica audio: add_audio elimina l'originale, mix_audio lo mantiene e sovrappone. Se il campo mode è fornito, i file caricati devono corrispondere esattamente — altrimenti la richiesta viene rifiutata. È accettato anche add_text: è l'unica modalità che riceve un solo file MP4/MOV e richiede options.text. |
| order | JSON | Solo modalità fusion — array JSON di indici per l'ordine dei clip. | |
| transition_type | string | Solo modalità fusion. Predefinito: none. Vedi elenco transizioni disponibili. | |
| transition_duration | float | Solo modalità fusion. Durata 0,2–2,0 sec. Predefinito: 0.5. | |
| options | JSON | Oggetto JSON di parametri di rendering per image_to_video, add_text, mix_audio e overlay_video (vedi le tabelle sotto). | |
| timings | File / string | image_to_video / add_text: file di tempi del karaoke (SRT o LRC, max 200 KB) — campo file o testo semplice. Il testo mostrato proviene dal file; impone text_mode=karaoke; non compatibile con voice. | |
| callback_url | string | URL pubblico (http/https) chiamato al completamento del job. La risposta include un webhook_secret. |
Parametri options — modalità image_to_video
Tutti opzionali. Valori non forniti → predefiniti del worker.
| Chiave | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| text | string | "" | Testo mostrato come sovrapposizione. Vuoto = nessun testo. Max 500 caratteri. |
| font | string | "default" | Font del testo, tramite identificatore. Valori accettati: 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 = font standard (emoji supportate); amiri = font Naskh, ideale per il testo arabo. Qualsiasi altro valore restituisce l'errore invalid_option. Le emoji vengono mostrate solo con default. |
| font_size | int | 60 | Dimensione font in pixel. Intervallo: 10–300. Raccomandati: 36, 48, 60, 72, 96. |
| text_color | string | "white" | Colore testo (es. white, yellow, #ffffff, 0xffffff). |
| text_position | string | "center" | Posizione testo: center, top, bottom. |
| box | bool | true | Sfondo semi-trasparente dietro il testo. |
| box_color | string | "black@0.4" | Colore + opacità in formato FFmpeg: colore@opacità. Opacità: 0,0–1,0 (es. black@0.4 = nero al 40%). |
| fade_duration | float | 0.5 | Durata dissolvenza in entrata/uscita in secondi (0–2). 0 = nessuna dissolvenza. |
| width | int | 1080 | Larghezza video in pixel (64–3840, pari forzato). Standard: 1080/1920/720/1280. |
| height | int | 1920 | Altezza video in pixel (64–3840, pari forzato). |
| fps | int | 24 | Frame rate (1–60). |
| image_fit | string | "contain" | contain: Mostra tutta l’immagine o il video e riempi gli spazi vuoti con lo sfondo scelto. solid (predefinito) o blur. La sfocatura richiede image_fit=contain. Il testo rimane nitido. cover: L'immagine viene ingrandita per riempire il frame, centrata — i bordi vengono tagliati. |
| bg_color | string | "black" | background_mode=solid: Colore sfondo se l'immagine non riempie la risoluzione — solo con image_fit=contain (es. black, white, #1a1a2e). |
| background_mode | string | "solid" | solid (predefinito) o blur. La sfocatura richiede image_fit=contain. Il testo rimane nitido. |
| blur_strength | number | 20 | Numero da 1 a 50; predefinito 20. Sfocatura gaussiana solo sullo sfondo. |
| enable_image_motion | bool | false | Abilita l'animazione foto. Se false, l'immagine rimane statica. Se true, l'effetto di image_motion_effect viene applicato via FFmpeg zoompan. |
| image_motion_effect | string | "ken_burns" | Effetto animazione. Valori: 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. Predefinito: ken_burns. |
| motion_intensity | float | 1.0 | Intensità animazione foto (0,25–2,0). Moltiplica ampiezza zoom e velocità panoramica. |
| text_effect | string | "none" | Animazione testo. Valori: none, fade_in, slide_up, slide_down, slide_left, bounce. |
| text_effect_intensity | float | 1.0 | Intensità animazione testo (0,25–2,0). |
| text_border_width | int | 0 | Spessore contorno nero in pixel (0 = disabilitato, 1–10). Migliora la leggibilità. |
| text_border_color | string | "black" | Colore del contorno dei caratteri (stesso formato di text_color, predefinito "black"). Usato se text_border_width > 0. |
| text_mode | string | "static" | Modalità di rivelazione del testo. static (predefinito): testo completo visibile dal primo fotogramma. word_by_word: le parole appaiono una per una alla velocità di word_reveal_speed. Esclusivo con text_effect: se text_mode=word_by_word, text_effect viene ignorato. "karaoke": il testo si colora al ritmo dell'audio, pagina per pagina (fino a 1.000 caratteri). Sincronizzato parola per parola con voice, altrimenti distribuito sull'audio in base alla lunghezza delle parole. |
| word_reveal_speed | float | 1.5 | Velocità di rivelazione in parole al secondo (0.3–5.0, predefinito 1.5). Usato solo con text_mode=word_by_word. Valore consigliato per sincronizzazione con OpenAI TTS: 2.0. |
| word_anim | string | "none" | Animazione di apparizione di ogni parola. none (default): rivelazione istantanea. fade: ogni nuova parola appare con una dissolvenza di 0.2s e crossfade con il blocco precedente. Solo con text_mode=word_by_word. |
| karaoke_style | string | "fill" | Stile karaoke: fill (le parole pronunciate prendono il colore di evidenziazione), sweep (ogni parola si riempie progressivamente; parole intere per le scritture da destra a sinistra) o highlight (solo la parola corrente è colorata). |
| highlight_color | string | "#FFD200" | Colore delle parole pronunciate / della parola corrente in modalità karaoke (stesso formato di text_color). |
| karaoke_lines | int | 2 | Righe mostrate per pagina in modalità karaoke (1–4). |
| voice | string | "" | ID della voce (stessa lista di text_to_mp3, es. it-IT-ElsaNeural): la voce viene generata da text nello stesso job. image_to_video richiede allora solo l'immagine (un MP3 inviato in più viene rifiutato). In modalità karaoke ogni parola è sincronizzata con la voce. |
| voice_rate | int | 0 | Velocità della voce generata, in % (da −50 a +50). |
Karaoke con i tuoi tempi (SRT / LRC)
Invia un file SRT o LRC nel campo timings: ogni riga appare al suo momento e forma una pagina del karaoke (fino a 500 righe, 5.000 caratteri). SRT: una riga scompare alla sua ora di fine. LRC: una riga resta fino alla successiva (una riga vuota la interrompe); sono supportati [offset:] e i tempi per parola dell'LRC «enhanced» <mm:ss.xx> — altrimenti ogni riga è distribuita sulla sua durata. In add_text, i tempi sono relativi all'inizio del video, spostati di text_start.
Parametri options — modalità overlay_video
Tutti opzionali. L'ordine di caricamento è importante: il primo file è il video principale (sfondo), il secondo file è l'overlay (primo piano). Usa chroma_key per rimuovere uno sfondo verde dall'overlay.
| Chiave | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| position | string | "bottom-right" | Angolo dove viene posizionato l'overlay: top-left, top-right, bottom-left, bottom-right, o center. |
| scale | float | 0.30 | Dimensione dell'overlay come frazione della larghezza del video principale. 0.25 = 25% della larghezza. Intervallo: 0.05–1.0. |
| opacity | float | 1.0 | Trasparenza dell'overlay. 1.0 = completamente opaco, 0.0 = invisibile. |
| margin | int | 10 | Distanza in pixel tra l'overlay e il bordo. Ignorato se position=center. Intervallo: 0–200. |
| audio | string | "main" | Quale traccia audio mantenere. main: solo audio principale. overlay: solo audio dell'overlay. mix: entrambe le tracce mixate. |
| chroma_key | bool | false | Imposta true per rimuovere lo sfondo verde puro (#00FF00) dall'overlay — utile per webcam o animazioni su sfondo verde. |
| chroma_similarity | float | 0.20 | Tolleranza del chroma key. Bassa = corrispondenza stretta. Alta = rimozione più ampia. Consigliato: 0.10–0.20 per verde digitale, 0.25–0.45 per schermo fisico. Intervallo: 0.01–0.60. |
Parametri options — modalità add_text
Il testo è obbligatorio. Per impostazione predefinita si conservano formato, frequenza fotogrammi e audio. output_format attiva l’adattamento con image_fit, bg_color e background_mode. width, height, fps e movimento foto restano ignorati. Durata massima: 15 minuti.
{"text":"Hello","output_format":"portrait","image_fit":"contain","background_mode":"blur","blur_strength":20}
| Chiave | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| text | string | SÌ | Testo da sovrapporre. Obbligatorio, da 1 a 200 caratteri. |
| text_start | float | 0 | Secondo in cui appare il testo (≥ 0). Deve essere prima della fine del video. |
| text_duration | float | 0 | Per quanto tempo il testo resta visibile, in secondi (0,1–3600). 0 = fino alla fine del video. |
| font | string | "default" | Font del testo, tramite identificatore. Valori accettati: 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 = font standard (emoji supportate); amiri = font Naskh, ideale per il testo arabo. Qualsiasi altro valore restituisce l'errore invalid_option. Le emoji vengono mostrate solo con default. |
| font_size | int | 60 | Dimensione del carattere, espressa per un video il cui lato corto misura 1080 px e scalata automaticamente alla risoluzione reale: lo stesso valore appare identico in 720p e in 4K. Intervallo: 10–300. |
| fade_duration | float | 0.5 | Durata della dissolvenza in entrata/uscita del testo (non del video), in secondi. Intervallo: 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 | — | — | Identiche a image_to_video (vedi la tabella sopra). |
| original_volume | float | 0.3 | Con voice: volume dell'audio originale del video sotto la voce (0–2, predefinito 0.3; 0 = sostituito). La voce parte a text_start; il testo resta visibile fino alla sua fine e, se supera la fine del video, l'ultima immagine viene mantenuta. |
| background_mode | string | "solid" | solid (predefinito) o blur. La sfocatura richiede image_fit=contain. Il testo rimane nitido. |
| blur_strength | number | 20 | Numero da 1 a 50; predefinito 20. Sfocatura gaussiana solo sullo sfondo. |
| output_format | string | "original" | Solo add_text: original (predefinito), portrait (1080×1920), square (1080×1080), landscape (1920×1080). La sfocatura richiede un formato diverso da original. |
| image_fit | string | "contain" | contain: Mostra tutta l’immagine o il video e riempi gli spazi vuoti con lo sfondo scelto. solid (predefinito) o blur. La sfocatura richiede image_fit=contain. Il testo rimane nitido. cover: L'immagine viene ingrandita per riempire il frame, centrata — i bordi vengono tagliati. |
| bg_color | string | "black" | background_mode=solid: Colore sfondo se l'immagine non riempie la risoluzione — solo con image_fit=contain (es. black, white, #1a1a2e). |
Parametri options — Modifica audio (mix_audio)
Disponibile solo con mode=mix_audio. Ignorato per add_audio.
| Chiave | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| mp3_volume | float | 1.0 | Volume dell'MP3 sovrapposto (0,0 = muto, 1,0 = originale, 2,0 = doppio). Valori sopra 1,0 possono saturare. |
Modalità text_to_mp3 — parametri diretti (senza JSON options)
A differenza degli altri modi, questi campi vengono inviati direttamente come campi del modulo, non all'interno dell'oggetto JSON options. Solo text è obbligatorio.
| Chiave | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| text | string | — | Testo da convertire in voce. Obbligatorio. Massimo 5.000 caratteri. |
| lang | string | "en" | Codice lingua usato per scegliere la voce predefinita quando voice è omesso o non valido. Una delle 20 lingue del sito (vedi tabella sotto). Se sconosciuto, usa en. |
| voice | string | automatico | ID voce edge-tts (vedi tabella sotto). Se omesso o non valido, viene usata automaticamente la prima voce di lang. |
| slow | bool | false | Imposta su true (o 1) per rallentare la voce del 25%. Qualsiasi altro valore è trattato come false. |
text_to_mp3 non richiede videos[]. Invia mode=text_to_mp3 insieme a text / lang / voice / slow come normali campi del modulo.Voci disponibili (edge-tts, Microsoft Neural), raggruppate per codice lingua:
| Lingua | Voci disponibili |
|---|---|
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 |
Risposta di successo (HTTP 200)
text_to_mp3, la risposta non ha i campi file_count né transition (nessun file caricato) — il resto è identico: job_id, quota_used, quota_remaining, status_url, webhook_secret.Esempio curl — modalità image_to_video
Testo karaoke con voce generata (image_to_video, senza MP3)
Karaoke con un file SRT (image_to_video + il tuo MP3)
Esempio curl — Modifica audio
Esempio curl — modalità overlay_video
Esempio curl — modalità add_text
Esempio curl — Unire video
Esempio curl — modalità text_to_mp3
Lo stato include la fase reale e il tempo trascorso. Le stime sono indicative; un timeout del client non indica un errore. Riprendi il monitoraggio dello stesso ID. I file scadono due ore dopo il completamento.
Stati possibili
| Stato | Significato | Campi aggiuntivi |
|---|---|---|
| queued | In coda, non ancora elaborato | queue_position, queue_total, eta_minutes |
| processing | Elaborazione FFmpeg in corso | processing_stage, processing_elapsed_seconds, stage_elapsed_seconds, last_activity_at, processed_media_seconds, eta_overrun |
| ready | Completato — file disponibile | download_url, media_available, created_at, expires_at |
| error | Elaborazione fallita | error (message), quota_refund_status: pending | confirmed | not_required |
| cancelled | Annullato | quota_refund_status: pending | confirmed | not_required |
Risposte per stato
Esempio curl
Parametri comuni (multipart/form-data)
| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
page | integer | 1 | Numero di pagina (parte da 1) |
limit | integer | 20 | Risultati per pagina (max 50, predefinito 20) |
Risposte per stato
Trasmette il file finale in streaming. Il Content-Type è video/mp4 per le modalità video, oppure audio/mpeg per text_to_mp3. Non richiede token. Disponibile solo quando lo stato è ready.
Il file è conservato per 2 ore dopo il completamento, poi eliminato. Scaricalo appena lo stato diventa ready.
Parametri opzionali
| Parametro | Descrizione |
|---|---|
| filename | Nome suggerito per il file scaricato (es. mio-video.mp4) |
| preview | Imposta su 1 per la riproduzione inline (omette Content-Disposition: attachment) invece di avviare un download — usato per l'anteprima nel browser. |
Esempio curl
Webhook
I webhook sono un'alternativa al polling: invece di controllare lo stato ogni X secondi, fornisci un URL e il server ti chiama automaticamente quando il job è completato.
Come funziona
- Passa
callback_urlnel POST a/api/v1/render.php - La risposta contiene un
webhook_secret— conservalo per verificare le firme - Quando il job raggiunge
readyoerror, il server invia unPOSTJSON firmato al tuo URL - Verifica la firma con
HMAC-SHA256(webhook_secret, raw_body)
callback_url deve essere un URL pubblicamente accessibile. IP privati e di loopback sono bloccati. Timeout: 10 secondi. Payload ricevuto
Header inviati dal server
| Header | Valore |
|---|---|
| Content-Type | application/json |
| X-RVM-Signature | sha256=<hmac_hex> — firma HMAC-SHA256 del body grezzo |
| X-RVM-Job-Id | Il job_id rilevante |
Verifica della firma
Codici di errore
| HTTP | Codice JSON | Causa |
|---|---|---|
| 401 | unauthorized | Token mancante, non valido o revocato |
| 400 | missing_files | Nessun file ricevuto |
| 400 | too_few_files | Meno di 2 file inviati |
| 400 | too_many_files | Più di 20 file inviati |
| 400 | invalid_mime | File non supportato — solo MP4, MP3 e JPG/PNG accettati (MIME verificato per magic bytes) |
| 400 | wrong_file_count | Il numero di file non corrisponde alla modalità scelta |
| 400 | wrong_file_types | I tipi di file non corrispondono alla modalità scelta |
| 400 | invalid_file_combination | La combinazione di file non corrisponde ad alcuna modalità supportata |
| 400 | invalid_options | Il campo options non è JSON valido o non contiene un oggetto |
| 400 | invalid_option | Un valore in options non è valido (colore, font, posizione…) |
| 400 | file_too_large | Un file supera i 500 MB |
| 400 | text_required | Il campo options.text è assente o vuoto (modalità add_text) |
| 400 | video_too_long | Video più lungo di 15 minuti (modalità add_text) |
| 400 | text_start_out_of_range | text_start supera la fine del video |
| 400 | invalid_voice | ID voice sconosciuto. |
| 400 | invalid_timings | File di tempi illeggibile (formato non riconosciuto, nessuna riga con tempo, fine prima dell'inizio, troppo lungo…). |
| 400 | invalid_order | L'array order non è una permutazione valida |
| 400 | invalid_job_id | Formato job_id errato (deve essere esadecimale a 32 caratteri) |
| 404 | job_not_found | Job non trovato — job_id sconosciuto o mai esistito |
| 410 | job_expired | Job scaduto — esisteva ma la finestra di 2 ore è passata |
| 429 | quota_exceeded | 20 job riusciti/giorno raggiunti (tutte le modalità) |
| 429 | rate_limited | Più di 12 chiamate/min su /api/v1/jobs.php — attendere Retry-After secondi |
| 500 | server_error | Errore interno del server |
Esempi di integrazione
Esempi per ogni modalità — installare requests con pip install requests.
Configurazione comune
Modalità image_to_video — immagine + audio → video
Modifica audio
Modalità overlay_video — picture-in-picture
Modalità add_text — testo su un video
Unire video
Modalità text_to_mp3 — testo in voce
Polling + download (comune a tutte le modalità)
Due approcci in n8n: polling (loop di stato) o webhook (il server chiama n8n). Il webhook è raccomandato — più pulito, zero carico inutile.
Approccio A — Webhook (raccomandato)
Solo 3 nodi, nessun loop.
Nodo 1 — Trigger Webhook
Aggiungere un nodo Webhook come input del workflow (metodo POST). Annotare l'URL generato, es. https://tuo-n8n.com/webhook/rvm-callback.
Nodo 2 — Creare il job (HTTP Request)
| Metodo | POST |
| URL | https://rapidvideomaker.com/api/v1/render.php |
| Autenticazione | Header Auth — Authorization: Bearer rvm_… |
| Tipo contenuto body | Form-Data Multipart |
| Body params | Campo Binary videos[] per ogni clip + Campo Text callback_url = URL del nodo webhook |
Conservare il webhook_secret dalla risposta in una variabile del workflow.
Nodo 3 — Elaborare il risultato (nel workflow attivato dal webhook)
Quando n8n riceve il POST del server, $json.status è ready o error. Se ready, $json.download_url contiene l'URL diretto.
{{ $headers['x-rvm-signature'] }} con sha256= + HMAC-SHA256 del body grezzo. Nodo Code: crypto.createHmac('sha256', secret).update(body).digest('hex').Approccio B — Polling (senza webhook)
5 nodi, loop di stato ogni 10 sec.
Nodo 1 — Creare il job — stessa configurazione, senza callback_url.
Nodo 2 — Attendere — 10 secondi.
Nodo 3 — Stato polling (HTTP Request GET)
| URL | https://rapidvideomaker.com/api/v1/jobs.php |
| Parametri query | job_id = {{ $('Nodo 1').item.json.job_id }} |
| Autenticazione | Header Auth — stesso token |
Nodo 4 — If: {{ $json.status }} === 'ready' → true: Nodo 5 / false: torna a Nodo 2.
Nodo 5 — Download: HTTP Request GET su {{ $json.download_url }}, formato risposta File.
Passaggio 1 — Creare il job (scegli una modalità)
Passaggio 2 — Polling
Passaggio 3 — Download
Best practice
- Controlla lo stesso lavoro ogni 5–10 secondi. La durata dipende dalla modalità e dalle dimensioni dei dati.
- Lo stato include la fase reale e il tempo trascorso. Le stime sono indicative; un timeout del client non indica un errore. Riprendi il monitoraggio dello stesso ID. I file scadono due ore dopo il completamento.
- Scarica rapidamente: non appena lo stato è
ready, scarica il file. Viene eliminato 2 ore dopo il completamento. - Gestione quota: controllare
quota_remainingnella risposta POST. Se0, il prossimo job sarà rifiutato con429. - Errori di rete: in caso di errore di rete durante il polling, attendere e riprovare — il job continua sul server.
ready.