Respawn Tech Dev

Códigos de erro

Envelope de resposta, formato de erro e referência de todos os códigos retornados pelas ferramentas.

Resposta de sucesso

{
  "success": true,
  "trace_id": "550e8400-e29b-41d4-a716-446655440000",
  "data": {},
  "meta": {}
}
CampoDescrição
successtrue em respostas OK
trace_idID de correlação (também no header X-Trace-Id)
dataRecurso ou resultado
metaOpcional — custo (meta.cost), paginação etc.

Com X-Include-Cost: true ou em dry-run, meta traz o custo da operação — veja os formatos em Dry-run. Listagens trazem a paginação dentro de data (total e, no PDF, page e page_size), não em meta.

Formato de erro

{
  "success": false,
  "trace_id": "550e8400-e29b-41d4-a716-446655440000",
  "error": {
    "code": "billing.insufficient_credits",
    "message": "Créditos insuficientes para esta operação.",
    "details": { "required": 100, "available": 50 }
  }
}
CampoDescrição
error.codeIdentificador estável — trate erros por ele, nunca pela message
error.messageTexto legível; pode mudar entre versões
error.detailsContexto estruturado opcional; em validation.failed, details.fields traz os erros por campo
trace_idInforme em tickets de suporte

Erros comuns a todas as ferramentas

Autenticação e permissões

CódigoHTTPQuando
auth.missing_token401Header de autenticação não enviado.
auth.invalid_token401Token malformado.
auth.unauthorized401Token inválido, expirado ou revogado.
auth.email_not_verified403E-mail da conta ainda não verificado.
scope.missing403Token sem o escopo exigido pela rota (details.required, details.provided).
tool.disabled403A ferramenta ainda não está liberada para a conta: está desligada ou em testes com contas selecionadas. Ferramentas com código próprio (como rag.disabled) respondem com ele.
forbidden403A chave não pode fazer esta ação (ex.: chave restrita a bases de conhecimento específicas tentando criar uma base).

Créditos e conta

CódigoHTTPQuando
billing.insufficient_credits402Saldo insuficiente para a operação.
billing.user_bankrupt402Conta suspensa por saldo negativo.
billing.spend_limit_reached402A cobrança passaria do limite diário de gasto da chave (details.limit, details.spent_today, details.required).
billing.call_limit_exceeded402Uma única cobrança passaria do teto por chamada da conexão MCP (max_call_credits).

Requisição e limites

CódigoHTTPQuando
validation.failed400Payload inválido; veja details.fields.
validation.invalid_id400UUID ou ID malformado.
idempotency.conflict409Chave de idempotência reutilizada com payload diferente.
not_found404Recurso inexistente, de outra conta ou fora das restrições da chave.
conflict409O recurso está num estado que não permite a operação (ex.: documento sendo excluído).
rate_limit.exceeded429Limite de requisições excedido; aguarde X-RateLimit-Reset.

Agentes de IA (MCP)

CódigoHTTPQuando
mcp.disabled404Servidor MCP desligado.
mcp.agents_disabled403Acesso de agentes de IA desligado na conta (botão de pânico no dashboard).
mcp.tool_disabled403Ferramenta desligada temporariamente para agentes.
mcp.timeout504A ferramenta passou do tempo limite; tente de novo.
mcp.result_too_large400Resultado acima de 32 KB; peça menos itens ou response_format=concise.
mcp.tools_search_rate_limited429Mais de 60 chamadas de tools_search por minuto.

Plataforma

CódigoHTTPQuando
internal.unexpected500Erro interno inesperado. Informe o trace_id ao suporte.
gateway.timeout504Um serviço interno demorou demais para responder; tente de novo.

Vídeo

CódigoHTTPQuando
video.spec_invalid400VideoSpec fora do schema ou dos limites (o erro traz o caminho do campo).
video.asset_invalid400Um asset do vídeo não pôde ser usado.
video.retention_invalid400Retenção do render inválida.
video.price_above_max409O preço do render passa de max_credits; nada é cobrado.
video.too_many_in_flight429Renders demais em andamento na conta; espere algum terminar.
video.not_ready409O render ainda não terminou.
video.not_cancelable409O render já terminou e não pode ser cancelado.
video.not_found404Render inexistente ou de outra conta.
video.unavailable503Renderização de vídeo indisponível no momento.
video.enqueue_failed500Falha ao enfileirar o render.
video.internal500Erro interno ao processar o vídeo.
video.preview_time_invalid400O instante t do quadro está fora da duração do vídeo.
video.preview_busy503Há prévias demais em andamento; tente de novo em instantes.
video.preview_failed422Não foi possível renderizar o quadro de prévia.

Erros por ferramenta

QR Dinâmico

CódigoHTTPQuando
dynamic_qr.name_required400Campo name obrigatório.
dynamic_qr.invalid_url400URL de destino inválida.
dynamic_qr.invalid_slug400Slug fora do padrão [a-zA-Z0-9-]{3,50}.
dynamic_qr.malicious_url403URL bloqueada pela verificação de segurança.
dynamic_qr.not_found404QR inexistente ou de outra conta.
dynamic_qr.slug_taken409Slug já em uso.
dynamic_qr.invalid_rules400Regra de redirect inválida: sem condição, id repetido, valor de condição desconhecido ou mais de 20 regras.
dynamic_qr.invalid_variants400Teste A/B inválido: de 2 a 10 variantes, id único, weight de 1 a 1000 e target_url absoluta.
dynamic_qr.invalid_pixels400ID de pixel fora do formato (GA4 G-XXXX, Meta só dígitos, GTM GTM-XXXX).
dynamic_qr.invalid_fallback_urls400expired_url e limit_reached_url precisam ser URLs absolutas.
dynamic_qr.invalid_content400Conteúdo hospedado inválido para o type informado.
dynamic_qr.folder_not_found404Pasta inexistente ou de outra conta.
dynamic_qr.folder_taken409Já existe uma pasta com esse nome.
dynamic_qr.folder_invalid400O nome da pasta tem de 1 a 80 caracteres.
dynamic_qr.tags_invalid400Tags inválidas: até 20 por QR, até 40 caracteres cada e sem vírgula ou ponto e vírgula.
dynamic_qr.bulk_invalid400Edição em massa inválida: action desconhecida, de 1 a 500 ids ou campo exigido pela ação ausente.
dynamic_qr.batch_not_found404Lote inexistente ou de outra conta.
dynamic_qr.batch_invalid400Lote sem linhas ou CSV malformado (sem cabeçalho, coluna desconhecida ou sem target_url).
dynamic_qr.batch_too_large413Mais de 1.000 linhas no lote.
dynamic_qr.scan_range_invalid400from/to/before fora do formato YYYY-MM-DD.
qr_domain.invalid_hostname400O hostname precisa ser um subdomínio público, como qr.suaempresa.com (sem porta, caminho, IP ou curinga).
qr_domain.not_found404Domínio inexistente ou de outra conta.
qr_domain.taken409Esse hostname já está cadastrado.
qr_domain.in_use409Há QRs usando o domínio; exclua-os ou mova-os antes de remover.
qr_domain.not_usable409O domínio falhou ou está suspenso e não aceita novos QRs.
qr_domain.plan_limit403O plano não permite mais domínios próprios.
qr_domain.unavailable503Domínios próprios indisponíveis no momento.
qr_domain.provider_failed502O provedor de certificados recusou ou não respondeu; tente de novo.
dynamic_qr.generation_failed502Falha ao gerar o QR.
dynamic_qr.image_generation_failed502Falha ao renderizar a imagem do QR.

PDF Convert

CódigoHTTPQuando
pdf.invalid_request400Corpo da requisição inválido.
pdf.html_required400html e url ausentes: envie um dos dois.
pdf.html_too_large400HTML acima de 10 MB.
pdf.css_too_large400CSS acima de 1 MB.
pdf.invalid_page_size400Tamanho de página inválido.
pdf.invalid_format400Formato diferente de pdf, png ou jpg.
pdf.invalid_url400url (ou google_fonts_url) inválida: precisa ser um endereço público http/https de até 2048 caracteres.
pdf.invalid_option400Opção inválida ou combinação não permitida (html com url, post_process fora do formato pdf, pdfa com protection, template_id com html…).
pdf.template_not_found404Template (ou versão) não encontrado na conta.
pdf.font_not_found404Fonte não encontrada na conta.
pdf.font_invalid400Fonte inválida: arquivo ausente, acima de 5 MiB, que não seja woff2/ttf, ou family, weight ou style fora do permitido.
pdf.font_exists409Já existe uma fonte com a mesma família, peso e estilo.
pdf.font_limit400Limite de 50 fontes por conta atingido.
pdf.retention_invalid400retention_days inválido.
pdf.batch_empty400Batch sem itens.
pdf.batch_too_large400Mais de 500 itens no batch.
pdf.template_required400Template HTML obrigatório no batch.
pdf.not_completed400Download solicitado antes de a conversão terminar.
pdf.no_file400Arquivo não disponível (expirado ou não gerado).
pdf.download_failed400Falha ao ler ou descomprimir o arquivo.
pdf.decrypt_failed400Falha ao preparar o arquivo para download.
pdf.render_failed502Falha no render.
pdf.storage_failed502Falha ao armazenar o arquivo.
pdf.enqueue_failed502Falha ao enfileirar o job.
pdf.render_timeout504Tempo esgotado no render.
pdf.internal500Erro interno ao processar a conversão.
pdf.template_failedassíncronoFalha ao aplicar os dados do item no template (batch).

Verificação de URL

CódigoHTTPQuando
tools.safety.invalid_url400Parâmetro url ausente ou inválido.
tools.safety.domain_required400Parâmetro domain ausente.
tools.safety.favicon_not_found404Favicon não encontrado para o domínio.

Base de conhecimento

CódigoHTTPQuando
rag.disabled403Base de conhecimento ainda não liberada para a conta.
rag.document_too_large413Conteúdo acima de 5 MB.
rag.chunk_quota_exceeded403A conta passaria de 200.000 trechos indexados.
rag.collection_limit_reached403Limite de 50 bases por conta.
rag.too_many_pending_documents429Já há 20 documentos em processamento; aguarde alguns terminarem.
rag.capacity_exhausted429Serviço de busca sem capacidade no momento; tente de novo em alguns segundos.
rag.embedding_failed502Falha no serviço de embeddings.
rag.feedback_rate_limited429Mais de 30 votos de feedback por minuto.
rag.document_not_failed409Só documentos com status failed podem ser reprocessados.
rag.collection_create_restricted403A conexão MCP está limitada a bases específicas e não pode criar bases novas.
rag.model_switch_in_progress409A base está trocando de modelo de busca; envie documentos quando a troca terminar ou cancele-a.
rag.service_unavailable503Serviço de rerank (inclusive o Laya), conversão de arquivo, analytics ou chaves públicas indisponível no momento.
rag.decrypt_failed500Falha ao ler o conteúdo guardado. Informe o trace_id ao suporte.
embedding_failedassíncronoA indexação do documento falhou; use o reprocessamento.
insufficient_creditsassíncronoSaldo ou limite diário insuficiente para cobrar a ingestão ao terminar.
empty_documentassíncronoO documento não tem texto indexável.
chunk_quota_exceededassíncronoA ingestão passaria do limite de trechos da conta.
persist_failedassíncronoFalha ao gravar o resultado; a cobrança é estornada.
enqueue_failedassíncronoFalha ao enfileirar a ingestão.

Webhook Relay

CódigoHTTPQuando
webhook.relay_disabled403Webhook Relay ainda não liberado para a conta.
webhook.limit_reached403Limite da conta atingido: projetos, endpoints, tipos de evento, fontes ou rotas por fonte. Os limites valem para a conta inteira, somando todos os projetos; ao duplicar um projeto, nada é criado.
webhook.payload_invalid422payload não é JSON válido ou não segue o JSON Schema do tipo de evento. Nada é cobrado.
webhook.invalid_url400URL de destino inválida ou restrita: só URLs públicas http/https (também vale para a webhook_url do PDF).
webhook.invalid_event400Evento desconhecido na API legada de webhooks da conta (/v1/account/webhooks, obsoleta). No Webhook Relay qualquer nome de evento válido é aceito.

Realtime

CódigoHTTPQuando
realtime.disabled403Realtime ainda não liberado para a conta (na conexão WebSocket, close 4003).
realtime.token_invalid401Token de conexão inválido ou expirado; na conexão WebSocket, close 4001. Emita um token novo.
realtime.capability_denied403O token não permite a operação (subscribe, publish ou presence) no canal; no WebSocket, frame error com channel e a conexão continua aberta.
realtime.channel_invalid400Nome de canal ou padrão de canal inválido: vazio, com mais de 128 caracteres ou com caracteres fora de A-Z a-z 0-9 : _ - ..
realtime.message_too_large413Mensagem (data) acima de 64 KB.
realtime.rate_limited429A conta passou do limite de publicações por segundo; a mensagem é descartada e, no WebSocket, a conexão continua aberta.
realtime.connection_limit429A conta atingiu o limite de conexões simultâneas (WebSocket: close 4029). Reconecte com backoff.
realtime.presence_limit429O canal já tem o máximo de membros na presença (200).
realtime.insufficient_credits402Saldo insuficiente para publicar uma mensagem além da franquia mensal.
realtime.session_required403A rota só aceita a sessão do dashboard (POST /inspector-token), não uma chave de API.

Extrator de erro de CI

CódigoHTTPQuando
tools.ci.log_required400Campo log ausente ou vazio.
tools.ci.log_too_large413Log acima do tamanho máximo aceito.

Página web para Markdown

CódigoHTTPQuando
tools.web.invalid_url400Campo url ausente ou inválido (só http e https).
tools.web.blocked_url400URL recusada: aponta para um endereço interno ou privado.
tools.web.fetch_failed502Não foi possível baixar a página.
tools.web.not_html422O endereço não devolveu uma página HTML.
tools.web.too_large413Página acima do tamanho máximo aceito.
tools.web.no_content422Nenhum conteúdo de texto encontrado na página (por exemplo, página que depende de JavaScript).

Notificações

CódigoHTTPQuando
notify.invalid_channel400Canal inválido: tipo desconhecido ou campos que não combinam com o tipo (URL do webhook, servidor e tópico do ntfy).
notify.channel_not_found404Canal inexistente ou de outra conta.
notify.channel_name_taken409Já existe um canal com esse nome na conta.
notify.channel_disabled409O canal escolhido está desativado.
notify.rate_limited429Limite de notificações por período excedido; tente de novo mais tarde.
notify.delivery_failed502Não foi possível entregar a notificação no canal (nada é cobrado).
notify.unavailable503O envio de notificações está indisponível no momento; tente de novo em alguns segundos.

Memória de aprendizados

CódigoHTTPQuando

Áudio

CódigoHTTPQuando
audio.disabled403Áudio ainda não liberado para a conta.
audio.input_invalid400Corpo inválido, ou áudio informado de forma errada (mande exatamente um entre audio_url, audio_base64 e file_id).
audio.input_blocked400A URL do áudio aponta para um endereço não permitido (rede interna ou privada), ou a descrição de audio_generate pede imitação de artistas, vozes ou obras. Nada é cobrado.
audio.too_long400Áudio acima de 60 minutos, ou texto acima de 5.000 caracteres: recusado antes de cobrar.
audio.input_too_large413Arquivo de áudio acima de 25 MB (ou 10 MB em audio_base64).
audio.format_unsupported415Formato de áudio não suportado; use mp3, wav, ogg, m4a, flac ou webm.
audio.input_fetch_failed502Não foi possível baixar o áudio da audio_url.
audio.provider_failed502O motor de áudio falhou; a cobrança é devolvida.
audio.input_timeout504O download do áudio passou de 30 segundos.
audio.price_above_max409O preço passa de max_credits; nada é cobrado.
audio.pricing_unavailable503Preço do serviço de áudio indisponível no momento; tente de novo.
audio.not_found404Job de áudio inexistente, de outra conta ou já expirado.
audio.voice_unknown400Voz inexistente ou apagada: use um id de GET /audio/voices ou uma voz clonada da conta que já esteja pronta.
audio.consent_required400voice_create sem o consentimento aceito, ou com versão dos termos desatualizada (leia os termos com dry_run).
audio.voice_sample_rejected422Amostra recusada: sem a frase de consentimento lida em voz alta, com mais de uma voz ou fora de 10 a 60 segundos. O valor é devolvido.
audio.voice_limit409A conta já tem o máximo de 3 vozes clonadas; apague uma com voice_delete.
audio.voice_rate_limited429Limite de criações de voz por dia (5) ou de usos por hora (60) atingido.

Jobs assíncronos (PDF) também expõem error_code no próprio recurso quando status é failed; códigos marcados como assíncrono aparecem apenas ali.

Boas práticas

  1. Trate 402 com um fluxo de recarga no seu sistema.
  2. Em 429, respeite X-RateLimit-Reset antes de tentar de novo.
  3. Use X-Dry-Run para capturar validation.failed sem custo.
  4. Repita apenas erros 5xx e de rede, sempre com a mesma X-Idempotency-Key.
  5. Registre o trace_id de toda resposta com erro.

Atualizado em