Errors
Envelope real aplicado pelo GlobalExceptionFilter — confirmado no código em packages/common/src/filters.ts e exceptions.ts. Nenhum código foi criado ou granularizado aqui.
{
"success": false,
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Link \"abc123\" not found",
"details": { "resource": "Link", "identifier": "abc123" }
},
"requestId": "req-01J0000000000000000000000"
}details só aparece quando a exceção carrega detalhes. Toda resposta de erro inclui o header X-Request-Id (e X-Correlation-Id quando houver correlação).
Códigos reais
VALIDATION_ERROR · HTTP 400
Payload inválido (Zod). Sempre 400 — nunca 422.
RESOURCE_NOT_FOUND · HTTP 404
Recurso inexistente. NotFoundException(resource, id?) inclui details { resource, identifier }. Também quando o recurso é de outro workspace.
UNAUTHORIZED · HTTP 401
Não autenticado. Token/chave ausente, inválido ou expirado.
FORBIDDEN · HTTP 403
Sem permissão. API Key sem o scope exigido (RequirePermissionGuard).
CONFLICT · HTTP 409
Conflito. Slug duplicado, domínio em uso, subdomínio reservado/em uso, URL de webhook não-HTTPS.
RATE_LIMIT_EXCEEDED · HTTP 429
Rate limit excedido. Guards de rate limit (ex.: subdomain no Dashboard, 60/60). Details trazem retryAfter.
QUOTA_EXCEEDED · HTTP 409
Limite do plano excedido. QuotaService.enforceQuota. Também 409 — distinguir pelo code. Details: { scopeType, limit, current }.
BAD_REQUEST · HTTP 400
Requisição inválida genérica. Ex.: webhook Stripe sem raw body ou sem header stripe-signature.
NOT_FOUND · HTTP 404
Não encontrado genérico. Exceções HTTP sem código de domínio.
INTERNAL_SERVER_ERROR · HTTP 500
Erro interno. Exceções não mapeadas — inclui Zod .parse() manual do Analytics (params inválidos).