EditCaption

Documentation technique

Documentation API EditCaption

Référence complète de l'API REST et du serveur MCP : authentification, endpoints, statuts de job, erreurs, exemples de code. Pour les tarifs et la création de clé, voir la page API.

Vue d'ensemble

L'API EditCaption fonctionne toujours selon le même schéma en 3 étapes : tu uploades un média, tu lances un traitement (un endpoint par outil), puis tu interroges le job jusqu'à ce qu'il soit terminé et tu télécharges le résultat. Chaque appel qui lance un traitement débite des crédits prépayés, réservés immédiatement et remboursés intégralement si le job échoue.

# 1. Uploader une vidéo (fichier ou URL publique)
curl -X POST https://editcaption.com/api/v1/uploads \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://exemple.com/ma-video.mp4"}'
# → { "uploadId": "…", "durationSeconds": 53, "expiresIn": 10800 }

# 2. Lancer un traitement (ici : sous-titres automatiques)
curl -X POST https://editcaption.com/api/v1/subtitles \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"uploadId": "…"}'
# → { "jobId": "…", "status": "queued", "creditsUsed": 18,
#     "creditsRemaining": 9982, "estimatedSeconds": 80 }

# 3. Interroger le job jusqu'à "completed", puis télécharger
curl https://editcaption.com/api/v1/jobs/JOB_ID \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE"
# → { "status": "completed", "result": { "url": "/api/download/…", "filename": "…" } }

Authentification

Toutes les routes /api/v1/* et le serveur MCP utilisent la même clé API, envoyée en en-tête HTTP standard :

Authorization: Bearer ecap_live_...
Format de la cléecap_live_…
CréationDepuis Mon compte → Développeur(la clé complète n'est affichée qu'une seule fois, à sa création), ou automatiquement quand tu autorises un connecteur MCP (Claude, ChatGPT, Perplexity — voir Serveur MCP), auquel cas elle n'est jamais affichée en clair, seulement utilisable par ce connecteur.
Stockage côté serveurSeule une empreinte (sha256) est conservée : la clé en clair n'est jamais récupérable après sa création.
RévocationDepuis le dashboard, à tout moment. Une clé révoquée renvoie immédiatement 401 sur tous les endpoints (et le serveur MCP).
PortéeUne clé donne accès à l'ensemble du solde de crédits du compte. Il n'y a pas de scopes par outil pour l'instant : toute clé peut appeler tous les endpoints.

Limites & formats de fichiers

Taille max par fichier5 Go, en upload direct comme en ingestion par URL.
Durée maxAucune limite de durée dédiée : seule la limite de taille de 5 Go s'applique.
Formats vidéo en entréeTout format lisible par ffmpeg (mp4, mov, avi, mkv, webm…). Aucune vérification de format à l'upload : une erreur n'apparaît qu'au traitement si le fichier est illisible.
Formats vidéo en sortiemp4, webm, mov, avi, mkv (convert) ; mp4 (sous-titres, filigrane, découpe, changement de voix, fusion).
Formats audio en sortiemp3, wav, aac (extraction) ; wav (texte vers voix).
Rétention des fichiers3 heures après l'upload ou la complétion du job. Un résultat est téléchargeable plusieurs fois pendant cette fenêtre (contrairement au site grand public, où le fichier est supprimé après le premier téléchargement).
Limite de débit (rate limit)Aucune limite de requêtes/seconde appliquée pour l'instant : la seule contrainte est ton solde de crédits.

Statuts des jobs & polling

Chaque traitement passe par 4 statuts possibles, renvoyés par GET /api/v1/jobs/:id :

queuedLe job est en file d'attente, pas encore pris en charge par un worker.
processingLe traitement est en cours.
completedTerminé avec succès. La réponse contient result.url et result.filename.
failedÉchoué. La réponse contient un champ error (message). Les crédits réservés sont automatiquement remboursés en intégralité, sans action de ta part.

Pas de webhooks : fais du polling

L'API n'envoie pas de callback HTTP à la complétion d'un job — il faut interroger GET /api/v1/jobs/:id périodiquement. Chaque réponse de lancement (status: "queued") renvoie un estimatedSecondsindicatif : c'est une bonne base pour ton premier délai d'attente. Recommandation pratique : poll toutes les 2 à 5 secondes, sans backoff agressif nécessaire (pas de limite de débit à ce jour), jusqu'à completed ou failed.

Gestion des erreurs

Toute erreur renvoie un corps JSON de la forme { error: { code, message } } avec le status HTTP correspondant. Les codes possibles, tous endpoints confondus :

StatuscodeQuand
400invalid_requestParamètre manquant ou invalide (détaillé par endpoint dans les sections ci-dessous).
401unauthorizedEn-tête Authorization absent, clé invalide ou révoquée.
402insufficient_creditsSolde insuffisant. La réponse ajoute balance et required.
404not_foundJob introuvable, expiré, ou appartenant à une autre clé API.
500internal_errorErreur serveur imprévue. Réessaie ; contacte-nous si ça persiste.
{
  "error": {
    "code": "insufficient_credits",
    "message": "Crédits insuffisants. Rechargez votre compte sur editcaption.com/api",
    "balance": 12,
    "required": 60
  }
}

Référence

Endpoints

Toutes les routes ci-dessous acceptent un corps JSON (Content-Type: application/json), sauf /api/v1/uploads qui accepte aussi le multipart.

POST/api/v1/uploads

Uploader un média

Ingère un fichier vidéo ou audio, soit par upload multipart direct (champ "file"), soit en JSON avec une URL publique à télécharger. Retourne un uploadId réutilisable pendant 3 heures par tous les autres endpoints. Toujours la première étape avant d'appeler un outil.

Paramètres

ParamètreTypeDéfautDescription
filestringFichier binaire (multipart/form-data). Exclusif avec url.
urlstringURL http(s) publique du média à télécharger (JSON). Exclusif avec file.

Exemple de requête

curl -X POST https://editcaption.com/api/v1/uploads \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://exemple.com/ma-video.mp4"}'

Réponse 200

{
  "uploadId": "3f2a9c7e-...",
  "durationSeconds": 53,
  "expiresIn": 10800
}

Erreurs possibles

400
invalid_request
Ni file ni url fourni, URL invalide/inaccessible, ou fichier au-delà de 5 Go.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
500
internal_error
Erreur serveur imprévue.
  • ·Taille max : 5 Go, que ce soit en upload direct ou via URL (la limite est appliquée pendant le téléchargement, pas seulement sur l'en-tête Content-Length).
  • ·La durée du média est mesurée immédiatement (ffprobe) et renvoyée dans la réponse : elle sert de base au calcul du coût des outils qui suivent.
POST/api/v1/subtitles20 crédits / minute de vidéo

Sous-titres automatiques incrustés

Transcrit l'audio et incruste des sous-titres stylés directement dans la vidéo (rendu, pas un simple fichier .srt à part — voir /api/v1/transcribe pour ça).

Paramètres

ParamètreTypeDéfautDescription
uploadIdrequisstringRenvoyé par POST /api/v1/uploads.
stylestringclassiqueclassique = ombre portée, impact = fond rectangulaire, contour = contour épais coloré.
Valeurs : classique | impact | contour
colorstring#FFFFFFCouleur du texte, hex #RRGGBB.
effectColorstring#000000Couleur de l'ombre (classique), du fond (impact) ou du contour (contour).
positionnumber820 = haut de l'écran, 100 = bas. Attention : inversé par rapport au slider affiché sur editcaption.com.
sizestringnormaleTaille du texte.
Valeurs : petite | normale | grande
captionWordsinteger4Mots par groupe de sous-titres affiché (ignoré si srtContent est fourni avec un découpage déjà fixé).
Valeurs : 1 | 2 | 4
srtContentstringContenu .srt fourni par toi (bypass la transcription automatique) — utile pour réutiliser une transcription déjà corrigée.
fontIdstringinterPolice d'affichage.
Valeurs : inter | montserrat | poppins | fredoka | archivo-black | anton
karaokeModestringnoneMise en valeur mot par mot façon karaoké. Ignoré si captionWords = 1.
Valeurs : none | couleur | taille | halo
highlightColorstring#FFD166Couleur du mot actif en mode karaoké.
shadowIntensitynumber600-100. Style classique uniquement.
contourThicknessnumber500-100. Style contour uniquement.
boxOpacitynumber750-100. Style impact uniquement.

Exemple de requête

curl -X POST https://editcaption.com/api/v1/subtitles \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"uploadId":"3f2a9c7e-...","style":"impact","color":"#FFFFFF","position":85,"captionWords":2}'

Réponse 200

{
  "jobId": "b91c...",
  "status": "queued",
  "creditsUsed": 18,
  "creditsRemaining": 9982,
  "estimatedSeconds": 80
}

Erreurs possibles

400
invalid_request
uploadId manquant, captionWords hors de {1,2,4}, ou srtContent ne contient pas de "-->".
402
insufficient_credits
Solde de crédits inférieur au coût du traitement. La réponse contient balance et required.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
500
internal_error
Erreur serveur imprévue.
POST/api/v1/transcribe15 crédits / minute

Transcription (texte ou SRT)

Transcrit l'audio d'une vidéo en fichier texte brut ou en sous-titres .srt téléchargeables — sans les incruster dans la vidéo.

Paramètres

ParamètreTypeDéfautDescription
uploadIdrequisstringRenvoyé par POST /api/v1/uploads.
languagestringautoCode ISO 639-1 (fr, en, es…) ou "auto" pour la détection automatique. Voir l'annexe des langues.
formatstringtxttxt = texte continu avec retours à la ligne en fin de phrase. srt = sous-titres horodatés.
Valeurs : txt | srt
srtSplitModestringphraseUniquement si format=srt. "phrase" regroupe les mots en phrases complètes, une par entrée. "mot" produit une entrée par mot, avec son propre timecode de début et de fin. Les deux conservent le texte tel quel (ponctuation et majuscules) : pour des sous-titres mis en forme et incrustés, voir /api/v1/subtitles.
Valeurs : "phrase" | "mot"

Exemple de requête

curl -X POST https://editcaption.com/api/v1/transcribe \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"uploadId":"3f2a9c7e-...","format":"srt","srtSplitMode":"mot"}'

Réponse 200

{
  "jobId": "b91c...",
  "status": "queued",
  "creditsUsed": 14,
  "creditsRemaining": 9968,
  "estimatedSeconds": 16
}

Erreurs possibles

400
invalid_request
uploadId manquant, format invalide, ou srtSplitMode invalide.
402
insufficient_credits
Solde de crédits inférieur au coût du traitement. La réponse contient balance et required.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
500
internal_error
Erreur serveur imprévue.
POST/api/v1/clean-audio10 crédits / minute

Amélioration du son

Nettoie le bruit de fond et clarifie la voix d'une vidéo. Aucun paramètre de réglage : traitement automatique.

Paramètres

ParamètreTypeDéfautDescription
uploadIdrequisstringRenvoyé par POST /api/v1/uploads.

Exemple de requête

curl -X POST https://editcaption.com/api/v1/clean-audio \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"uploadId":"3f2a9c7e-..."}'

Réponse 200

{
  "jobId": "b91c...",
  "status": "queued",
  "creditsUsed": 9,
  "creditsRemaining": 9959,
  "estimatedSeconds": 80
}

Erreurs possibles

400
invalid_request
uploadId manquant.
402
insufficient_credits
Solde de crédits inférieur au coût du traitement. La réponse contient balance et required.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
500
internal_error
Erreur serveur imprévue.
POST/api/v1/extract-audio3 crédits / appel (coût fixe, indépendant de la durée)

Extraction audio

Extrait la piste audio d'une vidéo dans le format demandé.

Paramètres

ParamètreTypeDéfautDescription
uploadIdrequisstringRenvoyé par POST /api/v1/uploads.
formatstringmp3Format du fichier audio de sortie.
Valeurs : mp3 | wav | aac

Exemple de requête

curl -X POST https://editcaption.com/api/v1/extract-audio \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"uploadId":"3f2a9c7e-...","format":"wav"}'

Réponse 200

{
  "jobId": "b91c...",
  "status": "queued",
  "creditsUsed": 3,
  "creditsRemaining": 9956,
  "estimatedSeconds": 16
}

Erreurs possibles

400
invalid_request
uploadId manquant ou format non supporté.
402
insufficient_credits
Solde de crédits inférieur au coût du traitement. La réponse contient balance et required.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
500
internal_error
Erreur serveur imprévue.
POST/api/v1/convert5 crédits / minute

Conversion de format

Convertit une vidéo vers un autre format conteneur.

Paramètres

ParamètreTypeDéfautDescription
uploadIdrequisstringRenvoyé par POST /api/v1/uploads.
formatstringmp4Format vidéo de sortie.
Valeurs : mp4 | webm | mov | avi | mkv

Exemple de requête

curl -X POST https://editcaption.com/api/v1/convert \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"uploadId":"3f2a9c7e-...","format":"webm"}'

Réponse 200

{
  "jobId": "b91c...",
  "status": "queued",
  "creditsUsed": 5,
  "creditsRemaining": 9951,
  "estimatedSeconds": 80
}

Erreurs possibles

400
invalid_request
uploadId manquant ou format non supporté.
402
insufficient_credits
Solde de crédits inférieur au coût du traitement. La réponse contient balance et required.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
500
internal_error
Erreur serveur imprévue.
POST/api/v1/merge5 crédits / minute de durée totale combinée

Fusion de vidéos

Fusionne au moins 2 vidéos déjà uploadées en une seule, concaténées dans l'ordre du tableau fourni.

Paramètres

ParamètreTypeDéfautDescription
uploadIdsrequisarrayAu moins 2 uploadId, dans l'ordre de fusion souhaité.

Exemple de requête

curl -X POST https://editcaption.com/api/v1/merge \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"uploadIds":["3f2a9c7e-...","a11b22cc-..."]}'

Réponse 200

{
  "jobId": "b91c...",
  "status": "queued",
  "creditsUsed": 10,
  "creditsRemaining": 9941,
  "estimatedSeconds": 160
}

Erreurs possibles

400
invalid_request
uploadIds absent, moins de 2 éléments, ou un élément n'est pas un uploadId valide.
402
insufficient_credits
Solde de crédits inférieur au coût du traitement. La réponse contient balance et required.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
500
internal_error
Erreur serveur imprévue.
  • ·Le résultat est un nouveau fichier indépendant : les uploadIds sources restent valides (et téléchargeables séparément) jusqu'à leur propre expiration à 3h.
POST/api/v1/watermark5 crédits / minute

Filigrane image ou texte

Ajoute un filigrane en mosaïque répétée ("fixe") ou en position flottante qui change toutes les 3/5/8 secondes ("flottant"). Le filigrane peut être une image déjà uploadée ou un texte (rendu automatiquement en logo).

Paramètres

ParamètreTypeDéfautDescription
uploadIdrequisstringVidéo à filigraner, renvoyé par POST /api/v1/uploads.
watermarkUploadIdstringuploadId d'une image (uploadée au préalable via /api/v1/uploads). Requis si watermarkText absent.
watermarkTextstringTexte à convertir en logo. Requis si watermarkUploadId absent.
typestringfixefixe = mosaïque inclinée répétée sur toute l'image. flottant = une seule occurrence qui change de position.
Valeurs : fixe | flottant
opacityinteger80Opacité du filigrane.
Valeurs : 10-100
intervalinteger5Secondes entre deux positions. Mode flottant uniquement.
Valeurs : 3 | 5 | 8

Exemple de requête

curl -X POST https://editcaption.com/api/v1/watermark \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"uploadId":"3f2a9c7e-...","watermarkText":"@moncompte","type":"flottant","opacity":70}'

Réponse 200

{
  "jobId": "b91c...",
  "status": "queued",
  "creditsUsed": 5,
  "creditsRemaining": 9936,
  "estimatedSeconds": 80
}

Erreurs possibles

400
invalid_request
uploadId manquant, ni watermarkUploadId ni watermarkText fourni, ou type invalide.
402
insufficient_credits
Solde de crédits inférieur au coût du traitement. La réponse contient balance et required.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
500
internal_error
Erreur serveur imprévue.
POST/api/v1/trim3 crédits / minute de l'extrait de SORTIE (end − start), pas de la vidéo source

Découpe d'un extrait

Extrait le segment [start, end] d'une vidéo, en secondes.

Paramètres

ParamètreTypeDéfautDescription
uploadIdrequisstringRenvoyé par POST /api/v1/uploads.
startrequisnumberDébut de l'extrait en secondes, ≥ 0.
endrequisnumberFin de l'extrait en secondes, doit être > start.

Exemple de requête

curl -X POST https://editcaption.com/api/v1/trim \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"uploadId":"3f2a9c7e-...","start":12.5,"end":45}'

Réponse 200

{
  "jobId": "b91c...",
  "status": "queued",
  "creditsUsed": 2,
  "creditsRemaining": 9934,
  "estimatedSeconds": 48
}

Erreurs possibles

400
invalid_request
uploadId manquant, start < 0, ou end ≤ start.
402
insufficient_credits
Solde de crédits inférieur au coût du traitement. La réponse contient balance et required.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
500
internal_error
Erreur serveur imprévue.
  • ·La vidéo source du découpage n'est pas consommée par cet appel : elle reste utilisable pour d'autres extraits jusqu'à son expiration à 3h.
POST/api/v1/text-to-speech5 crédits / 1000 caractères (40 en voix clonée)

Texte vers voix

Génère un fichier audio (.wav) à partir d'un texte, avec une voix du catalogue ou la voix clonée du compte (Premium).

Paramètres

ParamètreTypeDéfautDescription
textrequisstringTexte à synthétiser.
voicestringlea"clone" utilise la voix clonée enregistrée sur le compte propriétaire de la clé — erreur 400 si aucune voix n'a été enregistrée sur editcaption.com.
Valeurs : lea | camille | thomas | gilles | clone

Exemple de requête

curl -X POST https://editcaption.com/api/v1/text-to-speech \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"text":"Bienvenue dans cette vidéo générée automatiquement.","voice":"thomas"}'

Réponse 200

{
  "jobId": "b91c...",
  "status": "queued",
  "creditsUsed": 1,
  "creditsRemaining": 9933,
  "estimatedSeconds": 10
}

Erreurs possibles

400
invalid_request
text manquant, voice invalide, ou voice="clone" sans voix clonée enregistrée sur le compte.
402
insufficient_credits
Solde de crédits inférieur au coût du traitement. La réponse contient balance et required.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
500
internal_error
Erreur serveur imprévue.
POST/api/v1/voice-change15 crédits / minute (60 en voix clonée)

Changement de voix

Retranscrit la parole d'une vidéo puis remplace entièrement sa piste audio par une nouvelle voix de synthèse.

Paramètres

ParamètreTypeDéfautDescription
uploadIdrequisstringRenvoyé par POST /api/v1/uploads.
voicestringleaVoix de remplacement. "clone" nécessite une voix clonée sur le compte.
Valeurs : lea | camille | thomas | gilles | clone
languagestringfrLangue parlée dans la vidéo source (code ISO 639-1), utilisée pour la transcription intermédiaire.

Exemple de requête

curl -X POST https://editcaption.com/api/v1/voice-change \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"uploadId":"3f2a9c7e-...","voice":"camille"}'

Réponse 200

{
  "jobId": "b91c...",
  "status": "queued",
  "creditsUsed": 12,
  "creditsRemaining": 9921,
  "estimatedSeconds": 80
}

Erreurs possibles

400
invalid_request
uploadId manquant, voice invalide, voice="clone" sans voix clonée, ou aucune parole détectée dans la vidéo.
402
insufficient_credits
Solde de crédits inférieur au coût du traitement. La réponse contient balance et required.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
500
internal_error
Erreur serveur imprévue.
GET/api/v1/jobs/{id}

Statut d'un job

Interroge l'état d'un traitement lancé par un des 10 endpoints outils. Un job n'est visible que par la clé API qui l'a créé (une autre clé, même sur le même compte, reçoit 404).

Paramètres

ParamètreTypeDéfautDescription
idrequisstringjobId renvoyé par l'endpoint outil (dans l'URL, pas dans le corps).

Exemple de requête

curl -X GET https://editcaption.com/api/v1/jobs/JOB_ID \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE"

Réponse 200

{
  "jobId": "b91c...",
  "status": "completed",
  "result": {
    "url": "/api/download/3f2a9c7e-...",
    "filename": "video-sous-titres.mp4"
  }
}

Erreurs possibles

404
not_found
jobId inexistant, expiré (> 3h après complétion), ou appartenant à une autre clé.
401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.
  • ·result.url est un chemin relatif : préfixe-le avec https://editcaption.com pour obtenir un lien téléchargeable.
  • ·Le fichier reste téléchargeable plusieurs fois pendant 3 heures après complétion — ce n'est pas un lien à usage unique.
GET/api/v1/account

Solde de crédits

Retourne le solde de crédits actuel et l'email du compte propriétaire de la clé API.

Exemple de requête

curl -X GET https://editcaption.com/api/v1/account \
  -H "Authorization: Bearer ecap_live_VOTRE_CLE"

Réponse 200

{
  "balance": 9940,
  "email": "toi@exemple.com"
}

Erreurs possibles

401
unauthorized
En-tête Authorization manquant, clé invalide ou révoquée.

Exemples de code complets

Un flux complet upload → traitement → attente → résultat, en JavaScript et en Python. Remplace l'URL d'exemple et la clé API par les tiennes.

// Node.js 18+ (fetch natif) ou navigateur. npm install non nécessaire.
const API_KEY = "ecap_live_VOTRE_CLE";
const BASE = "https://editcaption.com";

async function call(path, body) {
  const res = await fetch(BASE + path, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify(body),
  });
  const data = await res.json();
  if (!res.ok) throw new Error(data.error?.message ?? res.statusText);
  return data;
}

async function waitForJob(jobId) {
  while (true) {
    const res = await fetch(`${BASE}/api/v1/jobs/${jobId}`, {
      headers: { Authorization: `Bearer ${API_KEY}` },
    });
    const data = await res.json();
    if (data.status === "completed") return data.result;
    if (data.status === "failed") throw new Error(data.error);
    await new Promise((r) => setTimeout(r, 3000)); // pas de webhook : on poll toutes les 3s
  }
}

async function main() {
  const upload = await call("/api/v1/uploads", { url: "https://exemple.com/ma-video.mp4" });
  const job = await call("/api/v1/subtitles", { uploadId: upload.uploadId, style: "impact" });
  const result = await waitForJob(job.jobId);
  console.log("Vidéo prête :", BASE + result.url);
}

main();

Agents IA

Serveur MCP

EditCaption expose un serveur MCP distant (Streamable HTTP) à https://editcaption.com/api/mcp. Une fois branché, les 12 outils ci-dessous apparaissent directement dans ton agent, sans rien installer.

Connexion en un clic (recommandé)

EditCaption implémente un vrai serveur d'autorisation OAuth 2.1 (RFC 8414 + RFC 9728, Dynamic Client Registration RFC 7591) au-dessus du serveur MCP. Les connecteurs personnalisés natifs de Claude, ChatGPT et Perplexityle détectent automatiquement : colle l'URL ci-dessous dans leur écran « Ajouter un connecteur personnalisé », connecte-toi à ton compte EditCaption, clique « Autoriser ». Aucune clé à copier-coller : une clé API est créée et gérée automatiquement en coulisses (visible et révocable dans Mon compte → Développeur, sous le libellé « Connecteur MCP »). Le détail des clics exacts par plateforme est sur la page API, section « Installation en 30 secondes ».

https://editcaption.com/api/mcp

Alternative manuelle (sans OAuth)

Pour un client MCP qui ne fait pas de découverte OAuth (script, environnement headless, ancienne config…), crée une clé depuis Mon compte → Développeur et passe-la en en-tête statique :

{
  "mcpServers": {
    "editcaption": {
      "url": "https://editcaption.com/api/mcp",
      "headers": { "Authorization": "Bearer ecap_live_VOTRE_CLE" }
    }
  }
}

Outils disponibles

upload_mediaIngère un fichier depuis une URL publique. Retourne uploadId + durationSeconds.
generate_subtitlesSous-titres automatiques incrustés. 20 crédits/min.
transcribe_videoTranscription en texte ou SRT. 15 crédits/min.
clean_audioAmélioration du son. 10 crédits/min.
extract_audioExtraction audio (mp3/wav/aac). 3 crédits/appel.
convert_videoConversion de format (mp4/webm/mov/avi/mkv). 5 crédits/min.
merge_videosFusion de plusieurs vidéos. 5 crédits/min de durée totale.
add_watermarkFiligrane image ou texte, mosaïque ou flottant. 5 crédits/min.
trim_videoDécoupe d'un segment [start, end]. 3 crédits/min de sortie.
text_to_speechTexte vers voix. 5 crédits/1000 caractères (40 en voix clonée).
change_voiceRemplace la voix d'une vidéo. 15 crédits/min (60 en voix clonée).
get_job_statusStatut d'un job (queued/processing/completed/failed).

Exemples de prompts

  • « Uploade cette vidéo https://exemple.com/interview.mp4 et ajoute-lui des sous-titres style impact, texte blanc. »
  • « Prends cette vidéo, découpe les 30 premières secondes, puis convertis le résultat en webm. »
  • « Extrais l'audio de cette vidéo en mp3, puis transcris-le en anglais. »
  • « Fusionne ces trois vidéos dans cet ordre, puis ajoute un filigrane texte "@moncompte" en position flottante. »

Claude Code & agents IA

Pour utiliser EditCaption comme outil dans Claude Code (ou tout autre client MCP : Claude Desktop, Cursor, Codex…), ajoute un serveur MCP distant en HTTP. Le CLI gère l'autorisation OAuth automatiquement (ouvre ton navigateur, même flux que Claude.ai) :

# Le CLI ouvre ton navigateur pour te connecter et autoriser l'accès —
# aucune clé à saisir, même flux que Claude.ai / Claude Desktop.
claude mcp add --transport http editcaption https://editcaption.com/api/mcp

Sans navigateur disponible (headless, CI…), passe une clé statique en en-tête à la place :

# Si le navigateur n'est pas disponible (environnement headless/CI), utilise
# une clé statique créée depuis Mon compte → Développeur :
claude mcp add --transport http editcaption \
  https://editcaption.com/api/mcp \
  --header "Authorization: Bearer ecap_live_VOTRE_CLE"

La syntaxe exacte des options peut varier selon ta version (claude mcp add --help). Pour Claude Desktop ou tout autre client à fichier de config, colle plutôt le bloc mcpServers vu dans la section précédente.

Une fois connecté, demande directement à l'agent ce que tu veux faire en langage naturel (voir les exemples de prompts ci-dessus) : il choisit lui-même les bons outils MCP, uploade le média, lance le traitement et attend le résultat.

OpenAPI / Swagger

Le schéma OpenAPI 3.1 complet (tous les endpoints, schémas de requête/réponse, erreurs) est disponible en téléchargement. Importe-le directement dans Postman, Insomnia, ou l'éditeur Swagger pour générer une collection de requêtes ou un client dans le langage de ton choix.

Télécharger openapi.json

Annexe : codes de langue

Codes ISO 639-1 acceptés par les paramètres language (transcription, changement de voix). Utilise autopour laisser l'API détecter la langue automatiquement.

autoDétection automatique
afAfrikaans
sqAlbanais
amAmharique
arArabe
hyArménien
asAssamais
azAzerbaïdjanais
baBachkir
euBasque
beBiélorusse
bnBengali
bsBosnien
brBreton
bgBulgare
myBirman
caCatalan
zhChinois
hrCroate
csTchèque
daDanois
nlNéerlandais
enAnglais
etEstonien
foFéroïen
fiFinnois
frFrançais
glGalicien
kaGéorgien
deAllemand
elGrec
guGujarati
htCréole haïtien
haHaoussa
hawHawaïen
heHébreu
hiHindi
huHongrois
isIslandais
idIndonésien
itItalien
jaJaponais
jwJavanais
knKannada
kkKazakh
kmKhmer
koCoréen
loLaotien
laLatin
lvLetton
lnLingala
ltLituanien
lbLuxembourgeois
mkMacédonien
mgMalgache
msMalais
mlMalayalam
mtMaltais
miMaori
mrMarathi
mnMongol
neNépalais
noNorvégien
nnNorvégien (Nynorsk)
ocOccitan
psPachto
faPersan
plPolonais
ptPortugais
paPendjabi
roRoumain
ruRusse
saSanskrit
srSerbe
snShona
sdSindhi
siCingalais
skSlovaque
slSlovène
soSomali
esEspagnol
suSoundanais
swSwahili
svSuédois
tlTagalog
tgTadjik
taTamoul
ttTatar
teTélougou
thThaï
boTibétain
trTurc
tkTurkmène
ukUkrainien
urOurdou
uzOuzbek
viVietnamien
cyGallois
yiYiddish
yoYoruba

Une question, un cas d'usage précis ?

editcaption.contact@gmail.com