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 :
| Champ | Erreur concernée | À quoi il sert |
|---|---|---|
action_url | insufficient_minutes, no_active_plan, topup_needs_user | Lien pour souscrire une offre ou acheter une recharge. |
minutes_needed, minutes_remaining | insufficient_minutes | Nombre de minutes nécessaires et solde disponible. Le premier vaut null tant que la durée nécessaire est inconnue. |
reason, packs | topup_needs_user | La raison pour laquelle la carte n'a pas été débitée, et le nombre de packs demandés. |
supported_platforms | unsupported_platform | Liste des plateformes acceptées : ["youtube", "x", "tiktok", "instagram", "facebook", "bluesky", "twitch", "dailymotion", "pinterest", "linkedin", "snapchat"]. |
missing_chunks | upload_incomplete | Index des blocs que le serveur n'a pas reçus. |
max_bytes | media_too_large | Taille maximale de fichier autorisée pour votre compte, en octets. |
params | invalid_request | Objet 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 HTTP | code | Réessayer tel quel ? | Cause et action |
|---|---|---|---|
| 400, 422 | invalid_request | Non | Il 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. |
| 422 | invalid_url | Non | Le 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. |
| 422 | unsupported_platform | Non | La valeur de platform ne désigne pas une plateforme acceptée. |
| 422 | unsupported_media | Non | L'extension du fichier importé n'est pas acceptée. |
| 401 | unauthorized | Non | Les 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é. |
| 403 | insufficient_scope | Non | Le token OAuth ne dispose pas de la permission transcriptions:read ou transcriptions:write nécessaire. |
| 403 | email_not_verified | Non | Vous devez vérifier votre adresse e-mail avant de créer des transcriptions ou des sessions en direct. |
| 402 | insufficient_minutes | Non | Votre 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. |
| 402 | no_active_plan | Non | L'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. |
| 402 | topup_needs_user | Seulement pour pending et in_progress | POST /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. |
| 404 | not_found | Non | La transcription n'existe pas ou appartient à une autre équipe. |
| 409 | upload_incomplete | Non | Envoyez les blocs manquants, puis appelez à nouveau la validation de l'import. |
| 409 | invalid_state | Non | La transcription n'est plus en attente d'import. Vous ne pouvez donc plus envoyer de blocs ni valider l'envoi. |
| 409 | session_ended | Non | La 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. |
| 422 | unsupported_language | Non | Le language de la session en direct n'est pas pris en charge. |
| 422 | unsupported_translation | Non | La langue translate_to de la session en direct n'est pas prise en charge, ou la traduction en direct n'est pas disponible. |
| 409 | idempotency_conflict | Non | Vous avez déjà utilisé cette Idempotency-Key avec d'autres paramètres. |
| 413 | media_too_large | Non | Le fichier est trop volumineux pour la limite de votre compte. Consultez Imports de fichiers. |
| 413 | invalid_request | Non | Le corps JSON dépasse 1 Mo. Pour un fichier trop volumineux, l'erreur serait media_too_large. |
| 429 | rate_limited | Oui | Vous avez envoyé trop de requêtes par minute. Attendez le nombre de secondes indiqué dans Retry-After. |
| 429 | too_many_active_jobs | Oui | Trop de transcriptions sont en cours, ou trop d'imports sont ouverts. Attendez le nombre de secondes indiqué dans Retry-After. |
| 429 | too_many_live_sessions | Oui | Les sessions en direct simultanées de votre offre sont toutes utilisées. Attendez le nombre de secondes indiqué dans Retry-After (30). |
| 500 | internal_error | Oui | Une erreur s'est produite sur nos serveurs. Réessayez dans un instant. |
| 503 | service_unavailable | Oui | transcript1 est temporairement indisponible. Réessayez dans un instant. |
| 503 | live_capacity | Oui | Toute la capacité en direct est utilisée. Attendez le nombre de secondes indiqué dans Retry-After (30), puis recréez la session. |
| 503 | live_unavailable | Non | La 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
retryablevauttrue. C'est le cas pourrate_limited,too_many_active_jobs,too_many_live_sessions,live_capacity,internal_error,service_unavailable, et pourtopup_needs_useravec lereasonpendingouin_progress. Respectez le délai deRetry-Afters'il est présent ; sinon, espacez les tentatives. - Pour relancer
POST /v1/transcriptionsouPOST /v1/topups, gardez le même en-têteIdempotency-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 fermeture | Signification |
|---|---|
1000 | Fermeture normale, après session.ended. |
1011 | Erreur inattendue du serveur. Reprenez avec un nouveau token. |
1012 | Redémarrage du serveur, après reconnect. Reprenez avec un nouveau token. |
4001 | Token invalide, expiré ou déjà utilisé. |
4004 | Session introuvable ou déjà terminée. |
4008 | Violation du protocole : une trame audio de longueur impaire ou trop volumineuse. |
4010 | Remplacé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.code | Ce qui s'est passé | Que faire ? |
|---|---|---|
media_unavailable | La vidéo n'existe pas ou n'est plus accessible. | Ne relancez pas sans vérifier l'URL. |
media_private | La 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_required | Il 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_audio | La vidéo ne contient pas de piste audio. | Inutile de relancer. L'échec est définitif et l'API ne réessaie pas. |
age_restricted | La plateforme impose une restriction d'âge pour cette vidéo. | Ne relancez pas le lien. Importez le fichier à la place. |
live_stream | Le direct est en cours ou n'a pas encore commencé. | Attendez la fin du direct avant de relancer. |
no_captions | Vous avez choisi captions pour source, mais la vidéo n'a pas de sous-titres utilisables. | Passez à source: "auto" ou "stt". |
media_too_long | L'enregistrement dépasse la limite de 5 heures pour la transcription par IA. | Découpez l'enregistrement avant de l'envoyer à nouveau. |
unsupported_media | Le 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_speech | Aucune parole détectée. | Inutile de relancer. |
unsupported_language | La 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_minutes | Le 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_failed | Le téléchargement du média a échoué malgré plusieurs tentatives. | Vous pouvez réessayer plus tard. |
transcription_failed | La 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