Pular para o conteúdo principal

Erros e códigos

Todo erro da API v1 volta no mesmo envelope:

{
"message": "Valor original deve ser positivo",
"code": "VALIDATION_ERROR",
"details": { "...": "opcional; ex.: erros de validacao campo a campo" }
}

message é legível (e pode mudar); code é estável — programe contra o código, não contra a mensagem. Trate qualquer código desconhecido pelo status HTTP.

Códigos por status HTTP

400 — requisição inválida

CódigoQuando
VALIDATION_ERRORBody ou query inválidos; details traz os campos
INVALID_IDID fora do formato UUID
INVALID_WEBHOOK_URLURL de webhook recusada (não-HTTPS ou rede interna)
INVALID_WEBHOOK_AUTHConfiguração de autenticação do webhook incompleta
SSRF_BLOCKEDURL resolve para destino bloqueado
INVALID_RECIPIENTDestinatário inválido para o canal da notificação
INVALID_STATUS_FOR_RESENDNotificação em status que não permite reenvio
MISSING_CONTENT_PLACEHOLDERLayout de e-mail sem {{content}}
SELF_DEACTIVATION / SELF_ROLE_CHANGETentativa de desativar a própria conta / mudar o próprio role
EMAIL_EXISTSE-mail já cadastrado

401 — não autenticado

CódigoQuando
UNAUTHORIZEDChave ausente, inválida, revogada ou expirada; sessão inválida

403 — sem permissão

CódigoQuando
FORBIDDENO ator não tem a permissão exigida
API_KEY_FORBIDDENChave de API tentando recurso administrativo ou fora do escopo; required indica a permissão que faltou

404 — não encontrado

CódigoQuando
NOT_FOUNDRecurso inexistente (ou de outra organização)
PERSON_NOT_FOUND, CHARGE_NOT_FOUND, CLASSIFICATION_NOT_FOUND, COLLECTION_RULE_NOT_FOUND, STEP_NOT_FOUND, MESSAGE_TEMPLATE_NOT_FOUND, NOTIFICATION_NOT_FOUNDVariantes específicas quando a rota valida um vínculo

409 — conflito de estado

CódigoQuando
CONFLICT / DUPLICATERegistro conflita com um existente (documento, nome...) ou com o estado atual — ex.: aceitar um acordo que não está mais proposed (já aceito ou aceite concorrente)
USER_EXISTS / INVITATION_EXISTSConvite para e-mail já usuário / já convidado
LAST_ADMINRebaixar ou desativar o último administrador
ROLE_IN_USE, RULE_IN_USE, STEP_IN_USE, WORKSPACE_IN_USE, COMPANY_IN_USE, HAS_BRANCHESExclusão bloqueada: o recurso está em uso
CHARGE_HAS_RELATED_RECORDSCobrança com notificações/interações/negativações/protestos não pode ser excluída; details traz as contagens
ENDPOINT_INACTIVERe-envio de webhook para endpoint inativo
IDEMPOTENCY_KEY_REUSEDMesma X-Idempotency-Key com body diferente
IDEMPOTENCY_REQUEST_IN_PROGRESSRequisição concorrente com a mesma chave ainda em curso
NOT_READYRecurso ainda não está pronto (ex.: exportação em processamento)

410, 413, 422

StatusCódigoQuando
410EXPIREDRecurso expirado (ex.: download de exportação vencido)
413FILE_TOO_LARGEArquivo de importação acima do limite
422DEFAULT_IMMUTABLEWorkspace principal / empresa matriz não podem ser removidos
422SYSTEM_ROLE_IMMUTABLERoles de sistema não podem ser editados/excluídos

429 e 500

StatusCódigoQuando
429RATE_LIMITEDLimite de requisições da chave excedido; re-tente com backoff (detalhes)
500INTERNAL_ERRORFalha inesperada no servidor; re-tente com a mesma X-Idempotency-Key

Receita de tratamento

  • 4xx exceto 409/429: erro seu; corrija a requisição antes de repetir.
  • 409: leia o código; quase sempre é uma regra de negócio protegendo o estado (não é retry que resolve).
  • 429 e 5xx: re-tente com backoff exponencial e a mesma chave de idempotência — a idempotência garante que nada é executado duas vezes.