DocumentationGérer les erreurs

Gérer les erreurs

Interprétez les réponses d'erreur et les échecs de transcription, et sachez quand relancer une requête.

L'API peut refuser votre requête, ou l'accepter avant que la transcription échoue pendant le traitement. Dans ce second cas, l'objet transcription passe au statut failed. Ces deux situations se traitent différemment.

Lire une réponse d'erreur

Quand une requête /v1 est refusée, l'API renvoie toujours cette structure :

{
  "error": {
    "code": "insufficient_minutes",
    "message": "Not enough minutes",
    "retryable": false,
    "action_url": "https://transcript1.com/dashboard/billing",
    "minutes_needed": 20,
    "minutes_remaining": 3
  }
}

Dans votre code, utilisez code pour décider quoi faire. Réservez message à l'affichage : sa formulation peut évoluer. Si retryable vaut true, vous pouvez réessayer la même requête plus tard.

Selon l'erreur, d'autres champs complètent retryable :

ChampErreur concernéeÀ quoi il sert
action_urlinsufficient_minutes, no_active_plan, topup_needs_userLien pour souscrire une offre ou acheter une recharge.
minutes_needed, minutes_remaininginsufficient_minutesNombre de minutes nécessaires et solde disponible. Le premier vaut null tant que la durée nécessaire est inconnue.
reason, packstopup_needs_userLa raison pour laquelle la carte n'a pas été débitée, et le nombre de packs demandés.
supported_platformsunsupported_platformListe des plateformes acceptées : ["youtube", "x", "tiktok", "instagram", "facebook", "bluesky", "twitch", "dailymotion", "pinterest", "linkedin", "snapchat"].
missing_chunksupload_incompleteIndex des blocs que le serveur n'a pas reçus.
max_bytesmedia_too_largeTaille maximale de fichier autorisée pour votre compte, en octets.
paramsinvalid_requestObjet qui indique, champ par champ, les erreurs de validation du corps ou des paramètres d'URL.

Comprendre pourquoi une requête est refusée

Statut HTTPcodeRéessayer tel quel ?Cause et action
400, 422invalid_requestNonIl manque un champ, sa valeur est invalide ou le corps n'est pas un JSON valide. Certaines associations sont aussi interdites, comme diarize avec source: "captions", ou reuse_recent avec webhook_url.
422invalid_urlNonLe lien ne convient pas, ou platform ne correspond pas à sa plateforme. Utilisez le lien d'une vidéo sur YouTube, X, TikTok, Instagram, Facebook, Bluesky ou une autre plateforme de la page Sources et options.
422unsupported_platformNonLa valeur de platform ne désigne pas une plateforme acceptée.
422unsupported_mediaNonL'extension du fichier importé n'est pas acceptée.
401unauthorizedNonLes informations d'authentification manquent, sont invalides, ont expiré ou ont été révoquées. Pour un import, le token peut aussi être invalide ou expiré.
403insufficient_scopeNonLe token OAuth ne dispose pas de la permission transcriptions:read ou transcriptions:write nécessaire.
403email_not_verifiedNonVous devez vérifier votre adresse e-mail avant de créer des transcriptions ou des sessions en direct.
402insufficient_minutesNonVotre solde utilisable est à 0, ne couvre pas la durée de la transcription ou est inférieur à une minute entamée d'une session en direct. Si la recharge automatique est active, transcript1 tente d'abord une recharge. Achetez des minutes via action_url, ou laissez un agent les acheter avec POST /v1/topups ou l'outil MCP top_up.
402no_active_planNonL'achat d'une recharge exige une offre payante active. Ce code vient de POST /v1/topups et des endpoints de facturation du tableau de bord, jamais des endpoints de transcription.
402topup_needs_userSeulement pour pending et in_progressPOST /v1/topups n'a pas débité la carte. reason en donne la raison : not_allowed (l'identifiant ne peut pas acheter de recharges, ou son utilisateur n'est pas admin de l'équipe), cap_reached (la limite mensuelle des agents n'a plus de marge), card_declined, authentication_required ou no_card. L'utilisateur peut acheter les packs via action_url. Pour pending (le paiement n'est pas encore confirmé) et in_progress (une autre recharge est en cours), le paiement peut encore aboutir : réessayez plus tard avec la même Idempotency-Key au lieu d'envoyer l'utilisateur acheter.
404not_foundNonLa transcription n'existe pas ou appartient à une autre équipe.
409upload_incompleteNonEnvoyez les blocs manquants, puis appelez à nouveau la validation de l'import.
409invalid_stateNonLa transcription n'est plus en attente d'import. Vous ne pouvez donc plus envoyer de blocs ni valider l'envoi.
409session_endedNonLa session en direct est terminée : POST /v1/live/sessions/:id/token ne peut donc pas émettre de token. Également envoyé comme événement error sur le WebSocket.
422unsupported_languageNonLe language de la session en direct n'est pas pris en charge.
422unsupported_translationNonLa langue translate_to de la session en direct n'est pas prise en charge, ou la traduction en direct n'est pas disponible.
409idempotency_conflictNonVous avez déjà utilisé cette Idempotency-Key avec d'autres paramètres.
413media_too_largeNonLe fichier est trop volumineux pour la limite de votre compte. Consultez Imports de fichiers.
413invalid_requestNonLe corps JSON dépasse 1 Mo. Pour un fichier trop volumineux, l'erreur serait media_too_large.
429rate_limitedOuiVous avez envoyé trop de requêtes par minute. Attendez le nombre de secondes indiqué dans Retry-After.
429too_many_active_jobsOuiTrop de transcriptions sont en cours, ou trop d'imports sont ouverts. Attendez le nombre de secondes indiqué dans Retry-After.
429too_many_live_sessionsOuiLes sessions en direct simultanées de votre offre sont toutes utilisées. Attendez le nombre de secondes indiqué dans Retry-After (30).
500internal_errorOuiUne erreur s'est produite sur nos serveurs. Réessayez dans un instant.
503service_unavailableOuitranscript1 est temporairement indisponible. Réessayez dans un instant.
503live_capacityOuiToute la capacité en direct est utilisée. Attendez le nombre de secondes indiqué dans Retry-After (30), puis recréez la session.
503live_unavailableNonLa transcription en direct n'est pas disponible pour le moment.

Si votre navigateur s'authentifie avec un cookie de connexion plutôt qu'un token bearer, l'API vérifie aussi l'origine de la requête. Un appel depuis un autre site reçoit 403 forbidden_origin. Ce contrôle ne concerne pas les appels API qui utilisent l'en-tête Authorization.

Toutes les réponses 429 précisent le délai d'attente en secondes dans Retry-After. Les seuils sont détaillés dans Facturation et limites.

Quand relancer une requête

  • Relancez une requête inchangée seulement si retryable vaut true. C'est le cas pour rate_limited, too_many_active_jobs, too_many_live_sessions, live_capacity, internal_error, service_unavailable, et pour topup_needs_user avec le reason pending ou in_progress. Respectez le délai de Retry-After s'il est présent ; sinon, espacez les tentatives.
  • Pour relancer POST /v1/transcriptions ou POST /v1/topups, gardez le même en-tête Idempotency-Key. Si le premier appel a abouti, vous éviterez ainsi une seconde facturation.
  • Pour les autres codes, corrigez d'abord la requête.

Transcription en direct

POST /v1/live/sessions et les autres endpoints en direct utilisent la même enveloppe d'erreur. Les codes invalid_request, unsupported_language, insufficient_minutes et email_not_verified s'y appliquent aussi, avec les codes en direct du tableau ci-dessus. La création d'une session n'est pas idempotente : réessayer après too_many_live_sessions ou live_capacity crée une nouvelle session.

Une fois la session créée, les problèmes arrivent sur le WebSocket sous forme d'événements error et de codes de fermeture, pas d'erreurs HTTP. Tous les événements sont décrits dans Transcription en direct.

Code de fermetureSignification
1000Fermeture normale, après session.ended.
1011Erreur inattendue du serveur. Reprenez avec un nouveau token.
1012Redémarrage du serveur, après reconnect. Reprenez avec un nouveau token.
4001Token invalide, expiré ou déjà utilisé.
4004Session introuvable ou déjà terminée.
4008Violation du protocole : une trame audio de longueur impaire ou trop volumineuse.
4010Remplacée par une connexion plus récente à la même session.

Une session en direct qui se termine pour une raison comme balance_exhausted ou idle_timeout n'est pas une erreur : elle envoie session.ended avec un motif de fin et elle est enregistrée. Voir Motifs de fin.

Si la transcription échoue pendant le traitement

La transcription peut échouer après la réponse à votre requête. Si status vaut failed, l'objet contient error: { "code", "message" }. Lisez le champ error dans les réponses de suivi du traitement ou dans le webhook transcription.failed. Si une traduction échoue, le webhook transcription.translation.failed est envoyé, et la transcription n’échoue jamais pour autant.

error.codeCe qui s'est passéQue faire ?
media_unavailableLa vidéo n'existe pas ou n'est plus accessible.Ne relancez pas sans vérifier l'URL.
media_privateLa vidéo est privée.Choisissez une publication publique, ou une vidéo YouTube publique ou non répertoriée. Relancer le même lien ne résoudra rien.
login_requiredIl faut se connecter à la plateforme pour accéder à la vidéo.Inutile de relancer. L'échec est définitif et l'API ne réessaie pas.
no_audioLa vidéo ne contient pas de piste audio.Inutile de relancer. L'échec est définitif et l'API ne réessaie pas.
age_restrictedLa plateforme impose une restriction d'âge pour cette vidéo.Ne relancez pas le lien. Importez le fichier à la place.
live_streamLe direct est en cours ou n'a pas encore commencé.Attendez la fin du direct avant de relancer.
no_captionsVous avez choisi captions pour source, mais la vidéo n'a pas de sous-titres utilisables.Passez à source: "auto" ou "stt".
media_too_longL'enregistrement dépasse la limite de 5 heures pour la transcription par IA.Découpez l'enregistrement avant de l'envoyer à nouveau.
unsupported_mediaLe fichier est illisible ou ne contient pas de piste audio.Envoyez un fichier dans un format accepté plutôt que de relancer le même.
no_speechAucune parole détectée.Inutile de relancer.
unsupported_languageLa langue de l'enregistrement n'est pas prise en charge.Indiquez un code accepté dans language ou laissez "auto". Ne relancez pas sans modifier le réglage.
insufficient_minutesLe solde ne suffisait plus au moment de facturer la transcription, et la recharge automatique, si elle est active, n'a pas pu en ajouter.Après une recharge.
fetch_failedLe téléchargement du média a échoué malgré plusieurs tentatives.Vous pouvez réessayer plus tard.
transcription_failedLa transcription par IA a échoué malgré plusieurs tentatives.Vous pouvez réessayer plus tard.

Si une transcription échoue ou si vous l'annulez, vous ne payez rien. Les minutes déjà prélevées vous sont rendues.

Dernière mise à jour 5 novembre 2026