DocumentatieFouten afhandelen

Fouten afhandelen

Herken fouten aan hun code, lees het foutobject en bepaal wanneer je een request opnieuw kunt sturen.

Een request kan meteen worden geweigerd. Een transcriptie kan ook pas later mislukken, nadat de API die al heeft geaccepteerd. In dat geval staat status op failed. Houd deze twee situaties uit elkaar bij het afhandelen van fouten.

Zo ziet een foutresponse eruit

Als een /v1-request mislukt, krijg je dit vaste formaat:

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

Laat je code reageren op code, niet op de tekst van message. Die tekst is voor de gebruiker en kan veranderen. Staat retryable op true, dan kan hetzelfde request later wel slagen.

Afhankelijk van de fout krijg je naast retryable extra velden:

VeldFoutcodeWat staat erin?
action_urlinsufficient_minutes, no_active_plan, topup_needs_userDe link om een abonnement te nemen of minuten bij te kopen.
minutes_needed, minutes_remaininginsufficient_minutesHet aantal benodigde minuten en je huidige saldo. Het benodigde aantal is null zolang de duur nog onbekend is.
reason, packstopup_needs_userWaarom de kaart niet is belast, en het aantal gevraagde pakketten.
supported_platformsunsupported_platformDe toegestane platforms: ["youtube", "x", "tiktok", "instagram", "facebook", "bluesky", "twitch", "dailymotion", "pinterest", "linkedin", "snapchat"].
missing_chunksupload_incompleteDe indexen van de chunks die de server nog mist.
max_bytesmedia_too_largeJouw maximale bestandsgrootte in bytes.
paramsinvalid_requestBij ongeldige body- of queryvelden een object dat per veld uitlegt wat je moet aanpassen.

Wanneer de API je request weigert

HTTP-statuscodeOpnieuw proberen?Oorzaak
400, 422invalid_requestNeeEen parameter of bodyveld ontbreekt of is ongeldig. Dit geldt ook voor ongeldige JSON en combinaties zoals diarize met source: "captions" of reuse_recent met webhook_url.
422invalid_urlNeeDe link is niet geldig of komt niet overeen met platform. Gebruik YouTube, X, TikTok, Instagram, Facebook, Bluesky of een ander platform uit Bronnen en instellingen.
422unsupported_platformNeeDe opgegeven waarde voor platform is niet toegestaan.
422unsupported_mediaNeeDe bestandsextensie wordt niet ondersteund.
401unauthorizedNeeJe API-sleutel of token ontbreekt, is ongeldig, verlopen of ingetrokken. Ook een ongeldig of verlopen uploadtoken geeft deze fout.
403insufficient_scopeNeeHet OAuth-token heeft geen transcriptions:read of transcriptions:write waar die scope nodig is.
403email_not_verifiedNeeJe moet eerst je e-mailadres bevestigen om transcripties of live sessies te kunnen starten.
402insufficient_minutesNeeJe beschikbare saldo is 0 of je hebt te weinig minuten voor deze transcriptie, of voor een live sessie minder dan één gestarte minuut. Staat automatisch opwaarderen aan, dan probeert transcript1 eerst op te waarderen. Koop minuten via action_url, of laat een agent ze kopen met POST /v1/topups of de MCP-tool top_up.
402no_active_planNeeJe wilt minuten bijkopen, maar hebt geen actief betaald abonnement. Alleen POST /v1/topups en de billing-endpoints van het dashboard geven deze fout, niet de transcriptie-endpoints.
402topup_needs_userAlleen bij pending en in_progressPOST /v1/topups heeft de kaart niet belast. reason geeft de reden: not_allowed (de inloggegevens mogen geen opwaarderingen kopen, of de gebruiker is geen teamadmin), cap_reached (de maandlimiet voor agents heeft geen ruimte meer), card_declined, authentication_required of no_card. De gebruiker kan de pakketten kopen via action_url. Bij pending (de betaling is nog niet bevestigd) en in_progress (er loopt al een andere opwaardering) kan de betaling nog doorgaan: probeer het later opnieuw met dezelfde Idempotency-Key in plaats van de gebruiker naar de aankooppagina te sturen.
404not_foundNeeDe transcriptie bestaat niet of is van een ander team.
409upload_incompleteNeeDe server mist nog chunks. Verstuur die en rond de upload daarna opnieuw af.
409invalid_stateNeeDe transcriptie wacht niet meer op een upload. Je kunt geen chunks meer sturen en de upload niet meer afronden.
409session_endedNeeEen live sessie is afgelopen, dus POST /v1/live/sessions/:id/token kan geen token meer uitgeven. Wordt ook verstuurd als error-event op de WebSocket.
422unsupported_languageNeeDe language van een live sessie wordt niet ondersteund.
422unsupported_translationNeeDe translate_to-taal van een live sessie wordt niet ondersteund, of live vertalen is niet beschikbaar.
409idempotency_conflictNeeJe hebt deze Idempotency-Key eerder met andere parameters gebruikt.
413media_too_largeNeeHet bestand overschrijdt je uploadlimiet. Bekijk Bestanden uploaden.
413invalid_requestNeeDe JSON-body is groter dan 1 MB. Bij te grote bestanden krijg je media_too_large.
429rate_limitedJaJe stuurt te veel requests per minuut. Wacht het aantal seconden uit Retry-After.
429too_many_active_jobsJaEr lopen te veel transcripties of er staan te veel uploads open. Wacht het aantal seconden uit Retry-After.
429too_many_live_sessionsJaDe gelijktijdige live sessies van je abonnement zijn in gebruik. Wacht Retry-After seconden (30).
500internal_errorJaEr gaat iets mis bij transcript1. Probeer het na een korte pauze opnieuw.
503service_unavailableJatranscript1 is even niet beschikbaar. Probeer het na een korte pauze opnieuw.
503live_capacityJaAlle live capaciteit is in gebruik. Wacht Retry-After seconden (30) en maak de sessie opnieuw aan.
503live_unavailableNeeLive transcriptie is op dit moment niet beschikbaar.

Bij browserrequests met een inlogcookie controleren we ook vanaf welke site het request komt. Een andere site krijgt 403 forbidden_origin. Voor API-requests met een bearer-token in de Authorization-header geldt die controle niet.

In elke 429-response staat Retry-After: het aantal seconden dat je moet wachten. De limieten zelf vind je bij Minuten, abonnementen en limieten.

Wanneer stuur je een request opnieuw?

  • Herhaal alleen requests met retryable op true: rate_limited, too_many_active_jobs, too_many_live_sessions, live_capacity, internal_error, service_unavailable en topup_needs_user met reason pending of in_progress. Houd de wachttijd uit Retry-After aan. Ontbreekt die header, wacht dan bij elke poging langer.
  • Herhaal je POST /v1/transcriptions of POST /v1/topups, gebruik dan dezelfde Idempotency-Key-header. Zo betaal je niet dubbel als het eerste request toch is gelukt.
  • Pas bij alle andere codes eerst je request aan voordat je het nog eens verstuurt.

Live transcriptie

POST /v1/live/sessions en de andere live endpoints gebruiken dezelfde foutenvelop. invalid_request, unsupported_language, insufficient_minutes en email_not_verified gelden er ook voor, samen met de live codes in de tabel hierboven. Een sessie aanmaken is niet idempotent: een nieuwe poging na too_many_live_sessions of live_capacity maakt dus een nieuwe sessie aan.

Zodra de sessie bestaat, komen problemen binnen op de WebSocket als error-events en sluitcodes, niet als HTTP-fouten. Zie Live transcriptie voor elk event.

SluitcodeBetekenis
1000Normale sluiting, na session.ended.
1011Onverwachte serverfout. Hervat met een nieuw token.
1012Serverherstart, na reconnect. Hervat met een nieuw token.
4001Ongeldig, verlopen of al gebruikt token.
4004Sessie niet gevonden of al afgelopen.
4008Protocolschending: een audioframe met oneven lengte of dat te groot is.
4010Vervangen door een nieuwere verbinding met dezelfde sessie.

Een live sessie die eindigt om een reden als balance_exhausted of idle_timeout is geen fout: hij stuurt session.ended met een eindreden en wordt opgeslagen. Zie Eindredenen.

Als een transcriptie later mislukt

Ook na een geslaagd request kan de transcriptie nog mislukken. Dan krijg je status op failed en error: { "code", "message" } in het object. Controleer error dus ook tijdens het pollen of bij een webhook van het type transcription.failed. Mislukt een vertaling, dan wordt de webhook transcription.translation.failed verstuurd en mislukt het transcript daardoor nooit.

error.codeWat is er mis?Wat kun je doen?
media_unavailableDe video bestaat niet of is niet meer beschikbaar.Niet opnieuw proberen. Controleer de URL.
media_privateDe video is afgeschermd.Gebruik een openbare post of een openbare of verborgen YouTube-video. Hetzelfde request herhalen helpt niet.
login_requiredJe moet op het platform ingelogd zijn om de video te bekijken.Niet opnieuw proberen. Deze fout is definitief; we proberen het niet automatisch opnieuw.
no_audioEr zit geen audiospoor in de video.Niet opnieuw proberen. Deze fout is definitief; we proberen het niet automatisch opnieuw.
age_restrictedDe video heeft een leeftijdsbeperking.Hetzelfde request herhalen helpt niet. Upload het bestand.
live_streamDe uitzending loopt nog of is nog niet begonnen.Probeer het na afloop van de uitzending.
no_captionsJe zette source op captions, maar er is geen bruikbaar ondertitelspoor.Kies source: "auto" of "stt".
media_too_longDe opname duurt langer dan de 5 uur die speech-to-text aankan.Splits het bestand. Hetzelfde request herhalen helpt niet.
unsupported_mediaHet bestand is niet leesbaar of heeft geen audiospoor.Stuur een ondersteund bestand; herhaal niet hetzelfde request.
no_speechGeen spraak gedetecteerd.Niet opnieuw proberen.
unsupported_languageWe ondersteunen de taal van deze opname niet.Kies voor language een ondersteunde code of "auto"; probeer niet opnieuw met dezelfde instelling.
insufficient_minutesJe saldo was op voordat we de minuten konden afschrijven, en automatisch opwaarderen kon, als het aanstond, geen minuten toevoegen.Na een opwaardering.
fetch_failedOok na meerdere pogingen konden we de opname niet ophalen.Probeer het later opnieuw.
transcription_failedOok na meerdere pogingen lukte speech-to-text niet.Probeer het later opnieuw.

Mislukt een transcriptie of annuleer je die, dan betaal je niets. Hadden we al minuten afgeschreven, dan krijg je die terug.

Laatst bijgewerkt 5 november 2026