API RapidVideoMaker
L'API REST vous permet de traiter des fichiers vidéo depuis n'importe quel client HTTP — scripts Python, workflows n8n, outils tiers. Cinq modes disponibles : Fusionner des vidéos (plusieurs MP4), Modifier l'audio (1 MP4 + 1 MP3), Créer une vidéo (1 JPG/PNG + 1 MP3), Superposition vidéo (2 MP4 picture-in-picture). Le traitement est asynchrone : soumettez les fichiers, puis interrogez le résultat.
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 10 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
Cinq modes, accessibles via le champ mode (omettez mode avec plusieurs MP4 pour détecter automatiquement fusion) :
| Usage | Mode(s) API | Fichiers requis | Description |
|---|---|---|---|
| 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. |
| 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. |
| 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. |
| Superposition vidéo | overlay_video |
2 MP4 | Superpose une seconde vidéo sur la vidéo principale. Position, taille, opacité et audio configurables via le champ options. |
| Texte en MP3 | text_to_mp3 |
(texte uniquement) | Convertit du texte en parole et retourne un fichier MP3. Aucun fichier à envoyer — passez mode=text_to_mp3, text et lang en champs de formulaire. Supporte les 20 langues du site. |
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. |
| motion_intensity | float | 1.0 | Intensité de l'animation photo (0.25–2.0). Multiplie l'amplitude du zoom et la vitesse des panoramiques. 0.25 = très subtil, 1.0 = comportement par défaut, 2.0 = double amplitude. Ignoré si enable_image_motion est false. |
| text_effect | string | "none" | Animation du texte overlay (ignoré si text est absent ou si text_mode vaut word_by_word). Valeurs acceptées : none, fade_in (fondu d'apparition), slide_up (entrée par le bas), slide_down (entrée par le haut), slide_left (entrée par la droite), bounce (oscillation verticale continue). |
| text_effect_intensity | float | 1.0 | Intensité de l'animation du texte (0.25–2.0). Contrôle la vitesse du fondu, la durée d'entrée des glissements, ou la fréquence et amplitude du rebond. Ignoré si text_effect est none. |
| text_border_width | int | 0 | Épaisseur du contour noir autour des caractères, en pixels (0 = désactivé, 1–10). Améliore la lisibilité sur fonds clairs ou colorés. Ignoré si text est absent. |
| text_mode | string | "static" | Mode d'affichage du texte. static (défaut) : texte visible dès la première image. word_by_word : les mots apparaissent un par un au rythme défini par word_reveal_speed. Mutuellement exclusif avec text_effect : si text_mode=word_by_word, text_effect est ignoré. |
| word_reveal_speed | float | 1.5 | Vitesse de révélation en mots par seconde (0.3–5.0, défaut 1.5). Utilisé uniquement avec text_mode=word_by_word. Valeur recommandée pour la synchro avec une voix OpenAI TTS : 2.0. |
| word_anim | string | "none" | Animation à l'apparition de chaque mot. none (défaut) : révélation instantanée. fade : chaque nouveau mot apparaît en fondu sur 0.2s avec un crossfade vers le bloc précédent. Utilisé uniquement si text_mode=word_by_word. |
Paramètres options — mode overlay_video
Tous optionnels. L'ordre d'envoi est important : le premier fichier est la vidéo principale (fond), le deuxième fichier est l'overlay (avant-plan). Utilisez chroma_key pour supprimer un fond vert de l'overlay.
| Clé | Type | Défaut | Description |
|---|---|---|---|
| position | string | "bottom-right" | Coin où l'overlay est placé : top-left, top-right, bottom-left, bottom-right, ou center. |
| scale | float | 0.30 | Taille de l'overlay en fraction de la largeur de la vidéo principale. 0.25 = 25% de la largeur. Plage : 0.05–1.0. |
| opacity | float | 1.0 | Transparence de l'overlay. 1.0 = totalement opaque, 0.0 = invisible. |
| margin | int | 10 | Écart en pixels entre l'overlay et le bord de l'image. Ignoré si position=center. Plage : 0–200. |
| audio | string | "main" | Piste audio à conserver. main : uniquement la vidéo principale. overlay : uniquement l'overlay. mix : les deux pistes mélangées à volume égal. |
| chroma_key | bool | false | Mettre à true pour supprimer le fond vert pur (#00FF00) de l'overlay — utile pour une incrustation webcam ou une animation filmée sur fond vert. |
| chroma_similarity | float | 0.20 | Tolérance du chroma key. Faible = correspondance stricte (préserve les contours du sujet). Élevée = suppression plus large (compense l'éclairage irrégulier). Recommandé : 0.10–0.20 pour un fond vert numérique, 0.25–0.45 pour un écran physique. Plage : 0.01–0.60. |
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 — mode overlay_video
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, created_at, expires_at |
| error | Échec du traitement | error (message) |
Réponses selon le statut
Exemple curl
Paramètres communs (multipart/form-data)
| apidocs_th_param | Type | Défaut | apidocs_th_desc |
|---|---|---|---|
page | integer | 1 | Numéro de page (commence à 1) |
limit | integer | 20 | Résultats par page (max 50, défaut 20) |
Réponses selon le statut
Publie un job terminé (status=ready) sur un ou plusieurs comptes sociaux. Le token doit appartenir à un compte membre (pas un token admin).
account_id de chaque compte est affiché sur cette page.Paramètres communs (multipart/form-data)
| apidocs_th_param | Type | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
job_id | string | apidocs_required | ID du job (hex 32 chars) de la vidéo terminée |
publications | array | apidocs_required | Tableau d'objets de publication (max 10) |
Objet publication
| apidocs_th_param | Type | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
account_id | integer | apidocs_required | ID du compte social connecté — visible sur la page Publications de votre espace membre |
title | string | — | Titre de la vidéo (max 512 caractères) |
description | string | — | Description de la vidéo (max 5 000 caractères) |
tags | string | — | Tags séparés par des virgules (max 1 024 caractères) |
visibility | string | — | public | private | unlisted — Défaut : public |
tiktok_mode | string | — | draft | direct — TikTok uniquement — défaut : direct |
tiktok_privacy | string | mode direct | TikTok uniquement — requis en mode direct |
allow_comment | boolean | — | TikTok uniquement — autoriser les commentaires |
allow_duet | boolean | — | TikTok uniquement — autoriser les duos |
allow_stitch | boolean | — | TikTok uniquement — autoriser les stitches |
your_brand | boolean | — | TikTok uniquement — contenu promotionnel organique (« Votre marque »). |
branded_content | boolean | — | TikTok uniquement — contenu de marque (branded content) |
tiktok_cover_ms | integer | — | TikTok uniquement — timestamp de la frame de couverture en ms (0–60 000, défaut 1 000) |
Réponses selon le statut
Codes d'erreur par publication
| apidocs_th_code | Signification |
|---|---|
job_not_ready | Job pas encore terminé |
mode_not_supported | Les jobs text_to_mp3 ne peuvent pas être publiés |
account_not_found | Compte introuvable ou déconnecté |
tiktok_privacy_required | Niveau de confidentialité requis en mode direct |
publication_failed | Le provider a retourné une erreur lors de l'upload |
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
Mode overlay_video — incrustation vidéo (picture-in-picture)
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)
| Méthode | POST |
| URL | https://rapidvideomaker.com/api/v1/render.php |
| Authentification | Header Auth — Authorization: Bearer rvm_… |
| Type de contenu | 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 |
| Paramètres de requête | job_id = {{ $('Nœud 1').item.json.job_id }} |
| Authentification | 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.