API RapidVideoMaker
L'API REST permet de traiter des fichiers vidéo depuis n'importe quel client HTTP — scripts Python, workflows n8n, outils tiers. Trois usages sont disponibles : Créer une vidéo (1 image JPG/PNG + 1 MP3 → génère une vidéo avec texte optionnel et fades), Modifier l'audio (1 MP4 + 1 MP3 → remplace ou superpose la piste audio) et Fusionner des vidéos (plusieurs MP4 assemblés en un avec transitions optionnelles). Le traitement est asynchrone : vous soumettez les fichiers, puis vous interrogez le statut jusqu'à ce que le résultat soit prêt.
Workflow complet
Toute intégration suit le même enchaînement en 4 étapes :
POST /api/v1/render.phpmultipart/form-data avec votre token Bearer. 1 image JPG/PNG + 1 MP3 + mode=image_to_video → génération vidéo. 1 MP4 + 1 MP3 → modification audio (ajoutez mode=mix_audio pour superposer les pistes). Plusieurs MP4 → fusion. Le serveur retourne un job_id unique.GET /api/v1/jobs.php?job_id=…queued → processing → ready (ou error). La réponse inclut la position dans la file et une estimation du temps restant.ready, la réponse contient un champ download_url prêt à l'emploi.GET /api/download.php?job_id=…410 Gone (au lieu de 404) pour indiquer que le job a bien existé mais n'est plus récupérable.Authentification
Chaque requête doit inclure votre token API. Deux formats sont acceptés :
Votre token est disponible dans votre espace membre — un seul token par compte, créé automatiquement à l'inscription. Il n'est affiché en clair qu'une seule fois, conservez-le. Si vous le perdez, vous pouvez le régénérer depuis votre espace membre.
Quota
Chaque compte membre dispose de 20 requêtes par jour, partagées entre l'interface web et l'API. Les jobs en erreur ne consomment pas de quota. Le compteur se remet à zéro à minuit UTC.
Les réponses du POST incluent quota_used et quota_remaining. En cas de dépassement, le serveur répond 429.
File d'attente
Un seul job est traité à la fois. Si plusieurs jobs sont soumis simultanément, ils sont mis en file d'attente et traités dans l'ordre d'arrivée. Pendant l'attente, la réponse de statut inclut :
queue_position— position du job dans la file (1 = prochain à être traité)queue_total— nombre total de jobs en attenteeta_minutes— estimation du temps avant début de traitement
/api/v1/jobs.php accepte au maximum 12 appels par minute par token (1 toutes les 5 s). Au-delà, le serveur répond 429 avec un header Retry-After: 5. Recommandation : 10 secondes entre chaque appel.
Transitions disponibles
Passez transition_type=none (défaut) pour une fusion directe, ou l'un des types ci-dessous pour un fondu entre les clips :
La durée (transition_duration) est comprise entre 0.2 et 2.0 secondes. Si un clip est trop court pour accueillir la transition, elle est ignorée et la fusion se fait sans transition.
Endpoints
Trois usages principaux, accessibles via le champ mode :
| Usage | Mode(s) API | Fichiers requis | Description |
|---|---|---|---|
| Créer une vidéo | image_to_video |
1 image JPG/PNG + 1 MP3 | Génère une vidéo à partir d'une image fixe et d'un fichier audio. Texte en overlay, fades, résolution et fps configurables via le champ options. |
| Modifier l'audio | add_audio ou mix_audio |
1 MP4 + 1 MP3 | Remplace ou enrichit la piste audio d'une vidéo. La piste vidéo n'est jamais réencodée (-c:v copy).add_audio — l'audio d'origine est supprimé et entièrement remplacé par le MP3.mix_audio — l'audio d'origine est conservé et le MP3 est superposé (amix). Passez options={"mp3_volume":…} pour ajuster le volume du MP3 ajouté. Si la vidéo n'a pas d'audio, se comporte comme add_audio. |
| Fusionner des vidéos | fusion |
2–20 fichiers MP4 | Les clips sont assemblés bout à bout dans l'ordre fourni. Transitions optionnelles entre les clips. |
add_audio et mix_audio acceptent uniquement 1 MP4 + 1 MP3 (exactement). image_to_video accepte uniquement 1 image JPG/PNG + 1 MP3 (exactement). Toute autre combinaison est rejetée avec un code d'erreur explicite. Les types MIME sont vérifiés par magic bytes, pas seulement par l'extension. Plusieurs MP4 sans champ mode → auto-détection fusion.-c:v copy).Paramètres communs (multipart/form-data)
| Champ | Type | Req. | Description |
|---|---|---|---|
| videos[] | File[] | OUI | Fichiers à traiter. Selon le mode : 2–20 MP4, ou 1 MP4 + 1 MP3, ou 1 image (JPG/PNG) + 1 MP3. Max 500 MB par fichier. |
| mode | string | * | image_to_video | add_audio | mix_audio. Obligatoire pour ces trois modes. Ignoré (et auto-détecté) uniquement si tous les fichiers sont MP4 (fusion). Pour modifier l'audio : add_audio supprime l'original, mix_audio le conserve et superpose. Si le champ mode est fourni, les fichiers envoyés doivent correspondre exactement — sinon la requête est rejetée. |
| order | JSON | Mode fusion uniquement — tableau JSON des indices définissant l'ordre des clips. | |
| transition_type | string | Mode fusion uniquement. Défaut : none. Voir la liste des transitions disponibles. | |
| transition_duration | float | Mode fusion uniquement. Durée 0.2–2.0 s. Défaut : 0.5. | |
| options | JSON | Mode image_to_video uniquement — objet JSON de paramètres de rendu (voir ci-dessous). | |
| callback_url | string | URL publique (http/https) appelée en fin de job. La réponse inclut un webhook_secret. |
Paramètres options — mode image_to_video
Tous optionnels. Valeurs non fournies → defaults appliqués par le worker.
| Clé | Type | Défaut | Description |
|---|---|---|---|
| text | string | "" | Texte affiché en overlay. Vide = pas de texte. Max 500 caractères. |
| font_size | int | 60 | Taille de police en pixels. Plage : 10–300. Valeurs conseillées : 36, 48, 60, 72, 96. |
| text_color | string | "white" | Couleur du texte (ex: white, yellow, #ffffff, 0xffffff). |
| text_position | string | "center" | Position du texte : center, top, bottom. |
| box | bool | true | Fond semi-transparent derrière le texte. |
| box_color | string | "black@0.4" | Couleur + opacité du fond texte au format FFmpeg : couleur@opacité. Couleurs : black, white, yellow, #ff4444, #00ccff, #ff8800, #ff69b4… Opacité : 0.0–1.0 (ex: black@0.4 = noir à 40%, white@0.70 = blanc à 70%). |
| fade_duration | float | 0.5 | Durée du fondu in/out en secondes (0–2). Le texte est inclu dans le fondu. 0 = pas de fondu. |
| width | int | 1080 | Largeur vidéo en pixels (64–3840, forcé pair). Combos standard : 1080/1920/720/1280. |
| height | int | 1920 | Hauteur vidéo en pixels (64–3840, forcé pair). |
| fps | int | 24 | Fréquence d'images (1–60). |
| image_fit | string | "contain" | Mode de cadrage : contain = l'image entière est visible, les bandes vides sont remplies par bg_color (letterbox/pillarbox) ; cover = l'image est zoomée pour remplir le cadre entier, centrée, les bords excédentaires sont rognés (aucune bande noire). Le paramètre bg_color est ignoré en mode cover. |
| bg_color | string | "black" | Couleur de fond (padding) si l'image ne remplit pas la résolution cible — pertinent uniquement avec image_fit=contain (ex: black, white, #1a1a2e). |
| enable_image_motion | bool | false | Active l'animation de la photo. Si false, l'image reste statique. Si true, l'effet défini par image_motion_effect est appliqué via le filtre FFmpeg zoompan. |
| image_motion_effect | string | "ken_burns" | Effet d'animation (ignoré si enable_image_motion est false). Valeurs acceptées : 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. Valeur par défaut si absente ou invalide : ken_burns. |
Paramètres options — Modifier l'audio (mix_audio)
Disponible uniquement avec mode=mix_audio. Ignoré pour add_audio.
| Clé | Type | Défaut | Description |
|---|---|---|---|
| mp3_volume | float | 1.0 | Volume du MP3 superposé (0.0 = muet, 1.0 = volume original, 2.0 = double). Valeurs au-delà de 1.0 peuvent saturer. |
Réponse succès (HTTP 200)
Exemple curl — mode image_to_video
Exemple curl — Modifier l'audio
Exemple curl — Fusionner des vidéos
Statuts possibles
| Statut | Signification | Champs supplémentaires |
|---|---|---|
| queued | En file d'attente, pas encore traité | queue_position, queue_total, eta_minutes |
| processing | Traitement FFmpeg en cours | — |
| ready | Terminé — fichier disponible | download_url |
| error | Échec du traitement | error (message) |
Réponses selon le statut
Exemple curl
Retourne le fichier MP4 final en streaming (Content-Type: video/mp4). Ne nécessite pas de token — l'URL est suffisamment opaque. Disponible uniquement si le statut est ready.
Le fichier est conservé 2 heures après la fin du job, puis supprimé. Téléchargez-le dès que le statut passe à ready.
Paramètre optionnel
| Paramètre | Description |
|---|---|
| filename | Nom suggéré pour le fichier téléchargé (ex: ma-video.mp4) |
Exemple curl
Webhooks
Le webhook est une alternative au polling : au lieu d'interroger le statut toutes les X secondes, vous fournissez une URL et le serveur vous appelle automatiquement quand le job se termine.
Fonctionnement
- Passez
callback_urldans le POST/api/v1/render.php - La réponse contient un
webhook_secret— conservez-le pour vérifier les signatures - Quand le job passe à
readyouerror, le serveur envoie unPOSTJSON signé vers votre URL - Vérifiez la signature avec
HMAC-SHA256(webhook_secret, corps_brut)
callback_url doit être une URL publiquement accessible (http ou https). Les adresses IP privées, loopback et réservées sont bloquées côté serveur. Timeout : 10 secondes.
Payload reçu
Headers envoyés par le serveur
| Header | Valeur |
|---|---|
| Content-Type | application/json |
| X-RVM-Signature | sha256=<hmac_hex> — signature HMAC-SHA256 du corps brut |
| X-RVM-Job-Id | Le job_id concerné |
Vérification de la signature
Codes d'erreur
| HTTP | code JSON | Cause |
|---|---|---|
| 401 | unauthorized | Token absent, invalide ou révoqué |
| 400 | missing_files | Aucun fichier reçu |
| 400 | too_few_files | Moins de 2 fichiers envoyés |
| 400 | too_many_files | Plus de 20 fichiers envoyés |
| 400 | invalid_mime | Fichier non supporté — seuls MP4, MP3 et images JPG/PNG sont acceptés (MIME vérifié par magic bytes) |
| 400 | wrong_file_count | Le nombre de fichiers ne correspond pas au mode choisi (ex : 3 fichiers avec mode=add_audio qui en exige 2) |
| 400 | wrong_file_types | Les types de fichiers ne correspondent pas au mode choisi (ex : 2 MP4 avec mode=add_audio qui exige 1 MP4 + 1 MP3 ; ou 1 MP4 + 1 MP3 avec mode=image_to_video) |
| 400 | invalid_file_combination | Combinaison de fichiers sans mode précisé ne correspond à aucun mode supporté |
| 400 | invalid_options | Le champ options n'est pas un JSON valide ou contient un objet attendu |
| 400 | invalid_option | Une valeur dans options est invalide (couleur, nom de police, position…) |
| 400 | file_too_large | Un fichier dépasse 500 MB |
| 400 | invalid_order | Le tableau order n'est pas une permutation valide |
| 400 | invalid_job_id | Format job_id incorrect (doit être hex 32 chars) |
| 404 | job_not_found | Job introuvable — job_id inconnu ou jamais existé |
| 410 | job_expired | Job expiré — a existé mais la fenêtre de récupération de 2 h est dépassée |
| 429 | quota_exceeded | 10 jobs réussis/jour atteints (tous modes confondus) |
| 429 | rate_limited | Plus de 12 appels/min sur /api/v1/jobs.php — attendre Retry-After secondes |
| 500 | server_error | Erreur interne serveur |
Exemples d'intégration
Exemples pour chaque mode — installe requests avec pip install requests.
Configuration commune
Mode image_to_video — image + audio → vidéo
Modifier l'audio
Fusionner des vidéos
Polling + téléchargement (commun à tous les modes)
Deux approches possibles dans n8n : polling (boucle sur le statut) ou webhook (le serveur appelle n8n). Le webhook est recommandé — plus propre, zéro charge inutile.
Approche A — Webhook (recommandée)
3 nœuds seulement, pas de boucle.
Nœud 1 — Webhook trigger
Ajoutez un nœud Webhook en entrée de workflow (méthode POST). Notez l'URL générée, ex : https://votre-n8n.com/webhook/rvm-callback.
Nœud 2 — Créer le job (HTTP Request)
| Method | POST |
| URL | https://rapidvideomaker.com/api/v1/render.php |
| Authentication | Header Auth — Authorization: Bearer rvm_… |
| Body Content Type | Form-Data Multipart |
| Body params | Champ Binary videos[] pour chaque clip + champ Text callback_url = URL du nœud Webhook ci-dessus |
Conservez webhook_secret de la réponse dans une variable de workflow pour vérifier la signature à la réception.
Nœud 3 — Traiter le résultat (dans le workflow déclenché par le Webhook)
Quand n8n reçoit le POST du serveur, $json.status vaut ready ou error. Si ready, $json.download_url contient l'URL de téléchargement directe.
{{ $headers['x-rvm-signature'] }} avec sha256= + HMAC-SHA256 du corps brut calculé depuis votre webhook_secret. Utilisez un nœud Code avec crypto.createHmac('sha256', secret).update(body).digest('hex').Approche B — Polling (sans webhook)
5 nœuds, boucle sur le statut toutes les 10 s.
Nœud 1 — Créer le job — même config que ci-dessus, sans callback_url.
Nœud 2 — Wait — 10 secondes.
Nœud 3 — Interroger le statut (HTTP Request GET)
| URL | https://rapidvideomaker.com/api/v1/jobs.php |
| Query params | job_id = {{ $('Nœud 1').item.json.job_id }} |
| Authentication | Header Auth — même token |
Nœud 4 — If : {{ $json.status }} === 'ready' → true : Nœud 5 / false : retour Nœud 2.
Nœud 5 — Télécharger : HTTP Request GET sur {{ $json.download_url }}, Response Format File.
Étape 1 — Créer le job (choisir un mode)
Étape 2 — Polling
Étape 3 — Télécharger
Bonnes pratiques
- Fréquence de polling : l'endpoint
/api/v1/jobs.phpest limité à 12 appels/min par token. Respectez au moins 5 secondes entre chaque appel (10 s recommandé) pour éviter un429. La durée d'un job varie selon le mode et la taille des fichiers (de quelques secondes à plusieurs minutes). - Timeout : implémentez un timeout côté client (ex: 10 minutes). Si le job n'est pas
readyaprès ce délai, considérez-le en erreur. - Téléchargement rapide : dès que le statut est
ready, téléchargez le fichier. Il est supprimé 2 heures après la fin du job. - Gestion du quota : vérifiez
quota_remainingdans la réponse du POST. Si0, le prochain job sera refusé avec429. - Erreurs réseau : en cas d'erreur réseau pendant le polling, attendez et réessayez — le job continue de s'exécuter côté serveur indépendamment.
ready.