Pular para o conteúdo principal

Erros

Todos os erros compartilham um envelope único:

{
"error": {
"code": "validation_failed",
"message": "Field 'email' is required",
"details": {
"field": "email"
}
}
}
  • code é um identificador machine-readable. Estável entre releases.
  • message é texto legível em inglês. Não fornecemos strings localizadas — traduza no consumidor.
  • details é opcional e específico ao tipo de erro. Para validation errors inclui o campo ofensor; para rate-limit inclui retry_after numérico.

Códigos padrão​

HTTPcodeQuando
400bad_requestJSON malformado, Content-Type não suportado, etc.
400validation_failedBody/query falharam na validação.
401mtls_requiredCertificado cliente ausente/inválido.
401invalid_tokenJWT malformado ou assinatura inválida.
401invalid_audienceaud não corresponde ao ambiente.
401token_expiredClaim exp no passado.
401token_revokedjti listado em RevokedTokens.
403insufficient_scopeToken sem o scope exigido.
403insufficient_permissionA pessoa por trás do token não tem a permissão que o endpoint exige; message é o slug da permissão.
403forbiddenOrigin shared-secret ausente/errado, ou o token não resolve para nenhum tenant — message é unknown_organization, no_membership ou unknown_workspace. Veja Autenticação.
400workspace_requiredA organização tem vários workspaces e o X-Workspace-Id não foi enviado.
404not_foundRecurso inexistente (ou pertence a outro workspace).
409conflictConflito de estado (X-Idempotency-Key reutilizada com body diferente, violação de unique constraint).
422unprocessable_entityViolação de regra de negócio (ex.: não dá pra desativar um webhook com retries ativos).
429rate_limitedLimite por conta excedido. Inclui header Retry-After.
500internal_errorErro não tratado. ID de correlação em details.request_id.
503service_unavailableDependência upstream (S3, DB, AI Gateway) com falha.

Lendo details​

details é intencionalmente loose. Padrões comuns:

  • Erros de validação — { "field": "subscribed_events.0", "issue": "must be a known SystemEvent slug" }.
  • Rate limiting — { "retry_after": 17, "limit": 600, "remaining": 0 }.
  • Conflito de idempotência — { "key": "...", "original_status": 201, "original_response_id": "..." }.
  • Not found entre workspaces — nunca vaza a existência do recurso; a resposta é indistinguível de um id realmente inexistente.

Correlação​

Toda resposta — bem-sucedida ou não — carrega o header X-Request-Id. Inclua-o ao reportar problemas para podermos buscar o trace no OpenTelemetry.

Guia de retry​

Classe de erroRetry?
400, 401, 403, 404, 409, 422Não — corrija a requisição.
429Sim, após Retry-After segundos.
500, 503Sim, com backoff exponencial (começa em 1s, cap 30s, máx 5 tentativas).

Para operações idempotentes (GET, PATCH, DELETE) o retry é sempre seguro. Para POST sempre inclua X-Idempotency-Key para que retries não dupliquem.