DocumentaçãoErros e novas tentativas

Erros e novas tentativas

Entenda os códigos da API, diferencie erros de chamada de falhas na transcrição e saiba quando tentar novamente.

Uma chamada pode falhar antes de criar a transcrição: nesse caso, a API recusa a requisição. Também pode aceitar a transcrição e encontrar um problema depois, durante o processamento. Nesse segundo caso, o objeto da transcrição fica com status igual a failed.

Como ler a resposta de erro

Quando uma chamada a /v1 falha, você recebe o erro neste formato:

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

No código da sua aplicação, use code para decidir o que fazer. O campo message serve para exibir uma explicação ao usuário e pode mudar de texto. Se retryable for true, vale repetir a mesma chamada mais tarde.

Dependendo do erro, a resposta inclui outros campos junto de retryable:

CampoCódigo associadoO que informa
action_urlinsufficient_minutes, no_active_plan, topup_needs_userLink para contratar um plano ou comprar uma recarga.
minutes_needed, minutes_remaininginsufficient_minutesQuantos minutos a chamada precisa consumir e quantos você tem. Se a duração ainda não for conhecida, o primeiro valor será null.
reason, packstopup_needs_userPor que o cartão não foi cobrado e quantos pacotes foram pedidos.
supported_platformsunsupported_platformValores de plataforma aceitos: ["youtube", "x", "tiktok", "instagram", "facebook", "bluesky", "twitch", "dailymotion", "pinterest", "linkedin", "snapchat"].
missing_chunksupload_incompleteÍndices das partes que ainda faltam no upload.
max_bytesmedia_too_largeTamanho máximo de arquivo permitido na sua conta, em bytes.
paramsinvalid_requestObjeto com os campos inválidos do corpo ou da query string e a explicação do problema em cada um.

Quando a API recusa a chamada

Status HTTPcodePode repetir?O que aconteceu
400, 422invalid_requestNãoFalta um parâmetro ou há um campo inválido no corpo. Isso inclui combinar diarize com source: "captions", combinar reuse_recent com webhook_url ou enviar um JSON inválido.
422invalid_urlNãoO link não foi aceito ou platform não corresponde ao endereço. Use YouTube, X, TikTok, Instagram, Facebook, Bluesky ou outra plataforma de Links aceitos e opções.
422unsupported_platformNãoO valor de platform não está entre as plataformas aceitas.
422unsupported_mediaNãoA extensão do arquivo enviado não está entre as aceitas.
401unauthorizedNãoFalta a credencial, ou ela é inválida, expirou ou foi revogada. Também vale para token de upload inválido ou expirado.
403insufficient_scopeNãoO token OAuth não tem o escopo necessário: transcriptions:read ou transcriptions:write.
403email_not_verifiedNãoConfirme o e-mail antes de criar transcrições ou sessões ao vivo.
402insufficient_minutesNãoO saldo disponível é 0, não cobre a duração da transcrição ou é menor que um minuto iniciado de uma sessão ao vivo. Com a recarga automática ligada, o transcript1 tenta recarregar primeiro. Compre minutos em action_url ou deixe um agente comprar com POST /v1/topups ou com a ferramenta MCP top_up.
402no_active_planNãoA compra de recarga exige um plano pago ativo. Esse erro vem de POST /v1/topups e dos endpoints de cobrança do painel, não dos endpoints de transcrição.
402topup_needs_userSó com pending e in_progressPOST /v1/topups não cobrou no cartão. O reason explica o motivo: not_allowed (a credencial não pode comprar recargas ou a pessoa dona dela não é admin da equipe), cap_reached (o limite mensal para agentes não tem mais margem), card_declined, authentication_required ou no_card. A pessoa pode comprar os pacotes em action_url. Com pending (o pagamento ainda não foi confirmado) e in_progress (outra recarga está em andamento), a cobrança ainda pode ser concluída: tente de novo mais tarde com o mesmo Idempotency-Key em vez de mandar a pessoa comprar.
404not_foundNãoEssa transcrição não existe ou é de outra equipe.
409upload_incompleteNãoAinda faltam partes do arquivo. Envie o que falta e peça a conclusão do upload novamente.
409invalid_stateNãoA transcrição já saiu da etapa de espera pelo upload. Não é mais possível enviar partes ou concluir o envio.
409session_endedNãoA sessão ao vivo terminou, então POST /v1/live/sessions/:id/token não consegue emitir um token. Também chega como evento error do WebSocket.
422unsupported_languageNãoO language da sessão ao vivo não é aceito.
422unsupported_translationNãoO idioma translate_to da sessão ao vivo não é aceito, ou a tradução ao vivo não está disponível.
409idempotency_conflictNãoVocê já usou esse Idempotency-Key com outros parâmetros.
413media_too_largeNãoO tamanho do arquivo ultrapassa o seu limite. Confira Uploads.
413invalid_requestNãoO corpo JSON ultrapassa 1 MB. Para arquivos grandes, o código é media_too_large.
429rate_limitedSimVocê atingiu o limite de chamadas por minuto. Aguarde o número de segundos de Retry-After.
429too_many_active_jobsSimVocê atingiu o limite de transcrições em andamento ou de uploads abertos. Aguarde o número de segundos de Retry-After.
429too_many_live_sessionsSimTodas as sessões ao vivo simultâneas do seu plano estão em uso. Aguarde o número de segundos de Retry-After (30).
500internal_errorSimTivemos um erro interno. Aguarde um pouco e tente novamente.
503service_unavailableSimO transcript1 está indisponível no momento. Aguarde um pouco e tente novamente.
503live_capacitySimToda a capacidade ao vivo está em uso. Aguarde o número de segundos de Retry-After (30) e crie a sessão novamente.
503live_unavailableNãoA transcrição ao vivo não está disponível no momento.

Quando o navegador usa o cookie de login em vez de uma credencial Bearer, também conferimos a origem da chamada. Se ela vier de outro site, a resposta será 403 forbidden_origin. Essa verificação não afeta chamadas à API com o cabeçalho Authorization.

Toda resposta 429 informa em Retry-After quantos segundos você deve esperar. Os valores de cada plano estão em Planos, minutos e limites.

Quando e como tentar novamente

  • Repita a chamada apenas se retryable for true. Isso vale para rate_limited, too_many_active_jobs, too_many_live_sessions, live_capacity, internal_error, service_unavailable e para topup_needs_user com reason pending ou in_progress. Respeite Retry-After quando vier na resposta. Sem esse cabeçalho, aumente a espera a cada tentativa.
  • Se for repetir POST /v1/transcriptions ou POST /v1/topups, mantenha o mesmo Idempotency-Key. Assim você evita outra cobrança caso a primeira chamada tenha funcionado.
  • Nos demais erros, corrija a causa antes de enviar a chamada novamente.

Transcrição ao vivo

POST /v1/live/sessions e os demais endpoints ao vivo usam o mesmo formato de erro. invalid_request, unsupported_language, insufficient_minutes e email_not_verified também valem para eles, junto com os códigos ao vivo da tabela acima. Criar uma sessão não é idempotente: repetir a chamada após too_many_live_sessions ou live_capacity cria uma sessão nova.

Depois que a sessão existe, os problemas chegam pelo WebSocket como eventos error e códigos de fechamento, não como erros HTTP. Veja todos os eventos em Transcrição ao vivo.

Código de fechamentoSignificado
1000Fechamento normal, depois de session.ended.
1011Erro inesperado do servidor. Retome com um token novo.
1012Reinício do servidor, depois de reconnect. Retome com um token novo.
4001Token inválido, expirado ou já usado.
4004Sessão não encontrada ou já encerrada.
4008Violação do protocolo: um quadro de áudio de tamanho ímpar ou grande demais.
4010Substituída por uma conexão mais nova à mesma sessão.

Uma sessão ao vivo que termina por um motivo como balance_exhausted ou idle_timeout não é um erro: ela envia session.ended com o motivo do encerramento e é salva. Veja Motivos de encerramento.

Falhas durante a transcrição

Se o processamento falhar, o objeto fica com status igual a failed e inclui error: { "code", "message" }. Isso pode acontecer depois da resposta à chamada de criação. Leia error nas consultas de status ou no webhook transcription.failed. Se uma tradução falhar, o webhook transcription.translation.failed é enviado e a transcrição nunca falha por causa disso.

error.codeO que aconteceuVale tentar novamente?
media_unavailableO vídeo não existe ou saiu do ar.Não. Confira o link.
media_privateO vídeo é privado.Não. Envie um post público ou um vídeo do YouTube público ou não listado.
login_requiredA plataforma só libera o conteúdo após login.Não. O serviço não repete essa tentativa.
no_audioNão há faixa de áudio no vídeo.Não. O serviço não repete essa tentativa.
age_restrictedO acesso ao vídeo tem restrição de idade.Não pelo link. Envie o arquivo por upload.
live_streamA transmissão está ao vivo ou ainda não começou.Espere a transmissão terminar.
no_captionsVocê escolheu captions em source, mas não há uma faixa de legendas que possa ser usada.Troque para source: "auto" ou "stt".
media_too_longA gravação ultrapassa o limite de 5 horas do speech-to-text.Divida a gravação antes de enviar.
unsupported_mediaNão foi possível ler o arquivo, ou ele não tem faixa de áudio.Envie outro arquivo em um formato aceito.
no_speechNenhuma fala detectada.Não.
unsupported_languageO serviço não aceita o idioma da gravação.Corrija language para um código aceito ou "auto".
insufficient_minutesO saldo acabou antes de cobrarmos a transcrição, e a recarga automática, se estava ligada, não conseguiu adicionar mais minutos.Depois de uma recarga.
fetch_failedNão conseguimos baixar o áudio ou vídeo, mesmo após várias tentativas.Sim. Tente mais tarde.
transcription_failedA transcrição por speech-to-text falhou após várias tentativas.Sim. Tente mais tarde.

Se a transcrição falhar ou você cancelar, não paga por ela. Se já tivermos descontado os minutos, eles voltam para o seu saldo.

Última atualização 5 de novembro de 2026