transcrevo docs

Erros

O envelope de erro da API e a tabela completa de códigos, de validation e invalid_api_key a insufficient_balance, rate_limited e concurrency_limit.

Erros seguem o envelope padrão:

{
	"error": {
		"code": "validation",
		"message": "The request body failed validation; `fields` maps each invalid field to a stable message key.",
		"retryable": false,
		"requestId": "0f9c2e5a-8f4b-4d61-9a3e-2c7d1b5f0a44",
		"fields": { "url": "url_invalid" }
	}
}
  • message explica em texto o que houve. É o campo para ler durante a integração e para registrar no seu log.
  • code identifica o tipo do erro e é o que o seu código deve testar: sempre um dos códigos abaixo, nunca uma string arbitrária.
  • retryable diz se repetir a MESMA requisição pode dar outro resultado. É a única decisão que o código HTTP não responde sozinho: um 429 se repete, um 409 de idempotência nunca vai passar. Ramifique por ele em vez de manter a sua própria tabela de quais erros valem retry.
  • requestId é o identificador desta resposta, também no header X-Request-Id. Guarde-o no seu log: é por ele que encontramos, do nosso lado, o que aconteceu naquela chamada específica.
  • fields (apenas em validation) aponta uma chave estável por campo inválido.

retryable: true não quer dizer "repita agora": em rate_limited o Retry-After diz quando, e nos demais vale espera exponencial com jitter.

Códigos

HTTPcodeQuando acontece
400validationCorpo inválido. Veja fields.
400chunk_emptyChunk sem conteúdo.
400upload_mismatchO recebido não bate com o expectedBytes declarado no upload.
401invalid_api_keyChave ausente ou inválida no header Authorization.
402insufficient_balanceSem créditos. Recarregue no painel.
404not_foundTranscrição inexistente ou de outra conta.
404upload_not_foundUpload inexistente ou de outra conta.
409upload_busyOutro chunk do mesmo upload ainda está sendo gravado.
409idempotency_conflictIdempotency-Key reaproveitada com outro corpo.
409transcript_processingTranscrição ainda processando não pode ser apagada.
409transcript_finishedA transcrição já terminou e não pode mais ser cancelada.
409no_webhookA transcrição não tem webhookUrl (ou não terminou) para reenviar.
413chunk_too_largeChunk acima de 16 MiB.
413upload_too_largeArquivo (ou upload) passaria de 2 GiB.
429rate_limitedLimite de requisições atingido. Veja o header Retry-After.
429concurrency_limitConta ainda sem recarga com 2 transcrições já rodando.
500internalErro nosso. Tente de novo; se persistir, fale com o suporte.

A referência da API documenta, por endpoint, exatamente quais códigos cada status pode devolver.

Limites de requisição

Toda resposta de uma rota limitada traz os três cabeçalhos, não só o 429:

CabeçalhoO que diz
RateLimit-LimitO teto da janela
RateLimit-RemainingQuantas requisições ainda cabem nela
RateLimit-ResetEm quantos segundos a próxima vaga abre

É com eles que dá para desacelerar ANTES de bater no teto, em vez de descobri-lo sendo recusado. O 429 rate_limited traz ainda Retry-After com a espera real, em segundos. Os tetos são por conta, em janela deslizante:

CaminhoTeto por minuto
POST /v1/transcripts120
POST /v1/uploads120
PUT /v1/uploads/{id}600

Um backlog destravando de uma vez encosta nesses tetos com facilidade, porque o pico de um cliente não se parece com o tráfego médio dele. Espalhe a rajada pela espera do Retry-After em vez de tentar de novo na hora; nada é perdido, só adiado. Precisando de mais, fale com a gente antes de a migração começar.

Chaves de validação

CampoChaveSignificado
urlurl_invalidNão é uma URL http/https válida.
urlurl_or_upload_idInforme url ou uploadId, exatamente um.
uploadIdupload_id_invalidFormato inválido.
uploadIdupload_emptyO upload não recebeu nenhum byte.
languagelanguage_invalidCódigo de idioma inválido.
speakersspeakers_invalidNão é true, um inteiro de 1 a 20 ou "min-max".
idempotencyKeyidempotency_key_invalidPassa de 64 caracteres.
webhookUrlwebhook_url_invalidNão é uma URL http/https pública alcançável.
glossaryglossary_invalidPassa de 100 entradas, ou alguma tem lado vazio ou acima de 80 caracteres.
reuseIfIdenticalreuse_needs_sha256O upload foi criado sem sha256, então não há como reconhecer o conteúdo.
expectedBytesexpected_bytes_invalidNão é um inteiro positivo dentro do limite de 2 GiB.
sha256sha256_invalidNão são 64 caracteres hexadecimais.
since / untildate_invalidNão é uma data ISO 8601 válida.
cursorcursor_invalidO cursor não veio de um nextCursor desta API.
metadatametadata_invalidPassa de 20 pares, ou alguma chave/valor passa do tamanho.
externalIdexternal_id_invalidVazio ou acima de 128 caracteres.
retentionDaysretention_invalidFora do intervalo de 1 a 365 dias.
waitwait_invalidFora do intervalo de 1 a 60 segundos.

Falhas de transcrição

Quando uma transcrição termina em status: "failed", o campo error dela traz { code, message } com o motivo. Transcrições que falham não são cobradas.

error.codeSignificado
audio_too_longÁudio acima do limite de 10 horas.
insufficient_balanceO áudio é mais longo do que o saldo restante cobre. Recarregue e reenvie.
audio_unreachableNão foi possível baixar a url.
audio_invalidO áudio não pôde ser decodificado.
audio_too_largeO arquivo baixado passa de 2 GiB.
audio_mismatchO áudio guardado não bate com o sha256 declarado no upload.
engine_failedFalhou em todas as tentativas. Nada foi cobrado; reenvie.

status: "canceled" não é falha: é uma transcrição que você cancelou com POST /v1/transcripts/{id}/cancel. Ela é terminal, error fica null e nada é cobrado.

On this page