Skip to content
WhatIsUp.dev

Erros

Todo corpo de resposta 4xx e 5xx usa o mesmo envelope:

{
  "error": {
    "code": "channel_unavailable",
    "message": "Channel is not connected. Re-pair to continue.",
    "details": { "channel_id": "..." }
  },
  "request_id": "req_01J..."
}

Faça match no code — ele é o contrato estável. message é legível por humanos e pode mudar entre releases. details é opcional e específico de cada código.

O conjunto completo de códigos vem no contrato Zod ERROR_CODES. A tabela abaixo é canônica.

Auth / identidade

CódigoQuando você vai ver
auth_missingNenhum header Authorization enviado.
auth_invalidO token bearer não corresponde a nenhuma chave ativa.
auth_malformedHeader presente mas não Bearer …, ou formato de token errado.
auth_expiredA chave foi revogada ou expirou.
auth_no_emailO token de sessão do dashboard não tem email verificado.

Ciclo de vida do canal

CódigoQuando você vai ver
channel_not_foundO UUID do canal não existe (ou pertence a outro cliente).
channel_access_deniedChave de API escopada por canal sendo usada contra um canal diferente.
channel_unavailableO canal está em estado terminal (logged_out, stopped_by_user, disabled_by_admin, error, failed).
channel_scoped_keyA chave está escopada a um único canal, mas uma rota multi-canal foi chamada.
invalid_lifecycle_transitionTentou dar connect num canal já conectado, etc.
pair_code_unavailableO estado do canal não permite gerar um código de pareamento agora.
pair_code_failedO upstream rejeitou a requisição do código de pareamento.
no_qrQR ainda não pronto (o canal não inicializou), ou nenhum QR para este estado.
not_disabledTentou reativar um canal que não foi desativado por admin.
concurrent_modificationDuas escritas colidiram na mesma linha; refaça seu read-modify-write.

Plano / cota

CódigoQuando você vai ver
plan_channel_limitLimite de canais do plano atingido. Faça upgrade ou apague um canal existente.
rate_limitedLimite de requisições por chave esgotado. Respeite o Retry-After.
worker_at_capacityNenhum worker tem vaga livre agora — extremamente raro; refaça a retentativa.

Webhook + mídia

CódigoQuando você vai ver
webhook_endpoint_not_foundO UUID do endpoint não existe.
media_goneO token de mídia assinado é válido, mas os bytes saíram do cache por idade. Refaça o fetch da origem.

Genéricos

CódigoQuando você vai ver
invalid_requestCorpo ou query falhou na validação Zod. details contém a lista de problemas.
not_found404 genérico.
bad_request400 genérico onde nenhum código mais específico se encaixa.
no_opA mutação não teve efeito (já estava no estado-alvo).
otherCatch-all para erros do provedor upstream.
internal_errorExceção não tratada no servidor. Somos alertados; request_id é a chave de rastreamento.

Boas práticas

  • Sempre registre o request_id. O suporte ao cliente usa ele para achar a requisição exata nos nossos traces.
  • Faça match no code, nunca na message. As mensagens são afinadas para legibilidade humana e mudam com o tempo.
  • Trate códigos desconhecidos como transitórios. Novos códigos são adicionados; assuma que dá pra retentar até a documentação ser atualizada.
  • Para 429, respeite o Retry-After em vez de chutar o backoff.