Erros
Formato canônico das respostas de erro da Simplafy Seguros API, lista de códigos HTTP e códigos internos, e como tratá-los no cliente.
Erros
A Simplafy Seguros API retorna erros em um formato consistente, padronizado por um exception filter global (AllExceptionsFilter). Toda resposta de erro carrega o status HTTP, uma mensagem sanitizada, o caminho da requisição e um timestamp ISO 8601.
Em produção, mensagens são genéricas por padrão para não vazar detalhes internos (stack traces, nomes de tabelas, erros de driver). Em ambiente de desenvolvimento (NODE_ENV !== 'production'), a resposta inclui campos extras error e stack para depuração.
Formato canônico
Todas as respostas de erro seguem a mesma estrutura JSON:
{
"statusCode": 400,
"message": "Bad Request - Invalid parameters",
"timestamp": "2026-05-29T14:23:11.482Z",
"path": "/api/policies"
}Em ambiente de desenvolvimento, dois campos adicionais aparecem:
{
"statusCode": 500,
"message": "Internal Server Error - Please try again later",
"timestamp": "2026-05-29T14:23:11.482Z",
"path": "/api/policies",
"error": "QueryFailedError: column \"foo\" does not exist",
"stack": "QueryFailedError: ..."
}Campos
| Campo | Tipo | Descrição |
|---|---|---|
statusCode | number | Código HTTP da resposta (mesma valor do status da resposta). |
message | string | Mensagem sanitizada destinada ao cliente. |
timestamp | string | Timestamp ISO 8601 (UTC) do momento em que o erro foi tratado. |
path | string | Caminho da requisição que originou o erro (request.url). |
error | string | Apenas em desenvolvimento. Mensagem detalhada da exceção original. |
stack | string | Apenas em desenvolvimento. Stack trace completo. |
Erros de validação
Erros de validação (DTO via class-validator) chegam ao filtro como BadRequestException com message em formato de array de strings. O array é preservado em errorDetails.validationErrors no log de auditoria interno e, em desenvolvimento, retornado integralmente na resposta.
{
"statusCode": 400,
"message": "Bad Request - Invalid parameters",
"timestamp": "2026-05-29T14:23:11.482Z",
"path": "/api/sells",
"error": [
"value must be a positive number",
"source should not be empty"
]
}Correlação por request ID
A API correlaciona requisições e erros via header x-request-id. Se o cliente envia esse header, o filtro de exceções atualiza o log de evento de API correspondente (criado pelo ApiLoggingInterceptor) com os detalhes do erro. Recomendado enviar um UUID por requisição para facilitar suporte e debugging.
curl https://api-seguros.simplafy.com.br/api/policies \
-H "x-api-key: $SIMPLAFY_API_KEY" \
-H "x-request-id: $(uuidgen)"Códigos HTTP
O filtro global mapeia o status HTTP para uma mensagem sanitizada em produção. A tabela abaixo lista os códigos com tratamento explícito.
| Status | Significado | Mensagem em produção |
|---|---|---|
400 | Bad Request | Bad Request - Invalid parameters |
401 | Unauthorized | Unauthorized - Authentication required |
403 | Forbidden | Forbidden - Insufficient permissions |
404 | Not Found | Not Found |
409 | Conflict | Conflict - Resource already exists |
422 | Unprocessable Entity | Unprocessable Entity - Invalid input |
429 | Too Many Requests | Too Many Requests - Rate limit exceeded |
500 | Internal Server Error | Internal Server Error - Please try again later |
Outros códigos HTTP retornados por exceções específicas (ex.: 503 em manutenção) caem no caso default e recebem a mensagem genérica de 500.
Autenticação dupla (JWT + API key)
A API aceita duas formas de autenticação no mesmo guard (JwtOrApiKeyGuard):
- JWT em cookie httpOnly — usado pelo frontend autenticado.
- API key no header
x-api-key— usado por integrações server-to-server.
Quando ambas falham, a resposta é 401. A ordem de avaliação é jwt primeiro, depois api-key; uma API key inválida não bloqueia o fallback para JWT.
Códigos internos
O campo errorCode é registrado no log interno (api_event_logs.errorDetails.errorCode) e ajuda no diagnóstico. Ele não é exposto na resposta HTTP por padrão, mas pode ser obtido via suporte ou via endpoints administrativos.
| Código | Quando ocorre |
|---|---|
HTTP_EXCEPTION | Exceção HTTP padrão do NestJS sem error customizado no payload. |
INTERNAL_SERVER_ERROR | Exceção não tratada (qualquer Error que não seja HttpException). |
Erros de banco e infraestrutura
Erros vindos do driver ou do TypeORM passam por um mapeamento de mensagens genéricas antes de chegar ao cliente, evitando vazamento de schema:
| Padrão detectado | Mensagem retornada |
|---|---|
QueryFailedError, menção a column ou table | Database error occurred |
ENOENT ou menção a file | Resource not found |
ECONNREFUSED ou TIMEOUT | Service unavailable - Please try again later |
Códigos brutos do PostgreSQL mais relevantes para idempotência e validação:
export const POSTGRES_ERROR_CODES = {
UNIQUE_VIOLATION: '23505',
NOT_NULL_VIOLATION: '23502',
};Esses códigos são usados internamente para converter conflitos de unicidade em 409 Conflict e violações de NOT NULL em 400 Bad Request.
Como tratar
Sempre cheque statusCode
Use statusCode da resposta como verdade. Não dependa do conteúdo de message para roteamento de fluxo — a mensagem é localizável e pode mudar entre ambientes.
const response = await fetch(url, options);
if (!response.ok) {
const body = await response.json();
switch (body.statusCode) {
case 401:
return redirectToLogin();
case 403:
return showForbidden();
case 429:
return scheduleRetry(body);
default:
return reportError(body);
}
}Envie x-request-id
Gere um UUID por requisição e envie no header x-request-id. Esse ID será propagado no log de auditoria interno e permite correlação rápida com a equipe de suporte.
const requestId = crypto.randomUUID();
const response = await fetch(url, {
headers: {
'x-api-key': process.env.SIMPLAFY_API_KEY,
'x-request-id': requestId,
},
});
// Guarde requestId junto com seus logs locais.Retry apenas para 429 e 5xx
Erros 4xx (exceto 429) indicam problema na requisição e não devem ser repetidos sem alteração. Para 429 e 5xx, aplique backoff exponencial com jitter.
Não tente parsear message
A mensagem sanitizada em produção é genérica e estável, mas não foi desenhada para parsing programático. Para detalhes acionáveis (ex.: campos inválidos em 400), use ambiente de desenvolvimento ou consulte os logs internos via x-request-id.
Log local da resposta inteira
Em caso de erro inesperado, registre a resposta completa (statusCode, message, timestamp, path, x-request-id) nos seus próprios logs antes de propagar a falha. Isso acelera muito a investigação.
Em produção, a resposta nunca contém stack trace nem o tipo da exceção original. Se você precisa desses dados durante uma investigação, envie o x-request-id para o suporte ou consulte api_event_logs no painel administrativo.