API RapidVideoMaker
The REST API lets you process video files from any HTTP client — Python scripts, n8n workflows, third-party tools. Five modes available: Merge videos (multiple MP4), Edit audio (1 MP4 + 1 MP3), Create a video (1 JPG/PNG + 1 MP3), Overlay video (2 MP4 picture-in-picture). Processing is asynchronous: submit files, then poll for the result.
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 + 1 MP3 → modifica audio (mode=mix_audio per sovrapporre). Più MP4 → unione. Il server restituisce un job_id univoco.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 | I clip vengono assemblati in sequenza nell'ordine fornito. Transizioni opzionali tra clip. |
| Modificare audio | add_audio o mix_audio |
1 MP4 + 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 | Genera un video da un'immagine statica e un file audio. Sovrapposizione testo, dissolvenze, risoluzione e FPS configurabili tramite il campo options. |
| Overlay video | overlay_video |
2 MP4 | Sovrappone un secondo video al video principale. Posizione, dimensione, opacità e audio configurabili tramite il campo options. |
| 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 + 1 MP3. image_to_video solo 1 JPG/PNG + 1 MP3. Qualsiasi altra combinazione viene rifiutata. I tipi MIME sono verificati per magic bytes.-c:v copy).Parametri comuni (multipart/form-data)
| Campo | Tipo | Obb. | Descrizione |
|---|---|---|---|
| videos[] | File[] | SÌ | File da elaborare. In base alla modalità: 2–20 MP4, o 1 MP4 + 1 MP3, o 1 immagine (JPG/PNG) + 1 MP3. Max 500 MB per file. |
| mode | string | * | image_to_video | add_audio | mix_audio. Obbligatorio per queste tre modalità. Ignorato (rilevato automaticamente) se tutti i file sono MP4 (fusion). Se il campo mode è fornito, i file caricati devono corrispondere esattamente — altrimenti la richiesta viene rifiutata. |
| 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 | Solo modalità image_to_video — oggetto JSON dei parametri di rendering (vedi sotto). | |
| 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_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" | Modalità inquadratura: contain = immagine completa visibile, aree vuote con bg_color; cover = immagine zoomata, bordi in eccesso tagliati. bg_color ignorato in cover. |
| bg_color | string | "black" | Colore sfondo se l'immagine non riempie la risoluzione — solo con image_fit=contain (es. black, white, #1a1a2e). |
| 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_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. |
| 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. |
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 — 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. |
Risposta di successo (HTTP 200)
Esempio curl — modalità image_to_video
Esempio curl — Modifica audio
Esempio curl — modalità overlay_video
Esempio curl — Unire video
Stati possibili
| Stato | Significato | Campi aggiuntivi |
|---|---|---|
| queued | In coda, non ancora elaborato | queue_position, queue_total, eta_minutes |
| processing | Elaborazione FFmpeg in corso | — |
| ready | Completato — file disponibile | download_url, created_at, expires_at |
| error | Elaborazione fallita | error (message) |
Risposte per stato
Esempio curl
Parametri comuni (multipart/form-data)
| apidocs_th_param | Tipo | Predefinito | apidocs_th_desc |
|---|---|---|---|
page | integer | 1 | Page number (starts at 1) |
limit | integer | 20 | Results per page (max 50, default 20) |
Risposte per stato
Pubblica un job completato (status=ready) su uno o più account social. Il token deve appartenere a un account membro (non un token admin).
account_id di ogni account è mostrato lì.Parametri comuni (multipart/form-data)
| apidocs_th_param | Tipo | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
job_id | string | apidocs_required | ID job (hex 32 caratteri) del video completato |
publications | array | apidocs_required | Array di oggetti di pubblicazione (max. 10) |
Oggetto pubblicazione
| apidocs_th_param | Tipo | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
account_id | integer | apidocs_required | ID dell'account social connesso — visibile nella pagina Pubblicazioni dell'area membro |
title | string | — | Titolo del video (max. 512 caratteri) |
description | string | — | Descrizione del video (max. 5 000 caratteri) |
tags | string | — | Tag separati da virgola (max. 1 024 caratteri) |
visibility | string | — | public | private | unlisted — Predefinito: public |
tiktok_mode | string | — | draft | direct — Solo TikTok — predefinito: direct |
tiktok_privacy | string | modalità direct | Solo TikTok — obbligatorio in modalità direct |
allow_comment | boolean | — | Solo TikTok — consenti commenti |
allow_duet | boolean | — | Solo TikTok — consenti duetti |
allow_stitch | boolean | — | Solo TikTok — consenti stitch |
your_brand | boolean | — | Solo TikTok — contenuto promozionale organico ("Il tuo brand"). |
branded_content | boolean | — | Solo TikTok — divulgazione contenuto di marca |
tiktok_cover_ms | integer | — | Solo TikTok — timestamp del frame copertina in ms (0–60 000, predefinito 1 000) |
Risposte per stato
Codici errore per pubblicazione
| apidocs_th_code | Significato |
|---|---|
job_not_ready | Job non ancora completato |
mode_not_supported | I job text_to_mp3 non possono essere pubblicati |
account_not_found | Account non trovato o disconnesso |
tiktok_privacy_required | Livello di privacy richiesto in modalità direct |
publication_failed | Il provider ha restituito un errore durante l'upload |
Esempio cURL
Restituisce il file MP4 finale come stream (Content-Type: video/mp4). 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.
Parametro opzionale
| Parametro | Descrizione |
|---|---|
| filename | Nome suggerito per il file scaricato (es. mio-video.mp4) |
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 | 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
Unire video
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
- Frequenza di polling: l'endpoint
/api/v1/jobs.phpè limitato a 12 chiamate/min per token. Attendere almeno 5 secondi tra le chiamate (10 sec. raccomandato). - Timeout: implementare un timeout lato client (es. 10 minuti). Se il job non è
ready, trattarlo come errore. - 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.