simpla.fydocs
Seguros API

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

CampoTipoDescrição
statusCodenumberCódigo HTTP da resposta (mesma valor do status da resposta).
messagestringMensagem sanitizada destinada ao cliente.
timestampstringTimestamp ISO 8601 (UTC) do momento em que o erro foi tratado.
pathstringCaminho da requisição que originou o erro (request.url).
errorstringApenas em desenvolvimento. Mensagem detalhada da exceção original.
stackstringApenas 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.

StatusSignificadoMensagem em produção
400Bad RequestBad Request - Invalid parameters
401UnauthorizedUnauthorized - Authentication required
403ForbiddenForbidden - Insufficient permissions
404Not FoundNot Found
409ConflictConflict - Resource already exists
422Unprocessable EntityUnprocessable Entity - Invalid input
429Too Many RequestsToo Many Requests - Rate limit exceeded
500Internal Server ErrorInternal 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ódigoQuando ocorre
HTTP_EXCEPTIONExceção HTTP padrão do NestJS sem error customizado no payload.
INTERNAL_SERVER_ERRORExceçã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 detectadoMensagem retornada
QueryFailedError, menção a column ou tableDatabase error occurred
ENOENT ou menção a fileResource not found
ECONNREFUSED ou TIMEOUTService 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.

On this page