Tratamento de Erros
A API Selectwin utiliza códigos de status HTTP padrão e uma estrutura de resposta de erro consistente para comunicar problemas durante o processamento das requisições. Este documento detalha os difere
Visão Geral
A API Selectwin utiliza códigos de status HTTP padrão e uma estrutura de resposta de erro consistente para comunicar problemas durante o processamento das requisições. Este documento detalha os diferentes tipos de erros que podem ocorrer, como interpretá-los e as melhores práticas para lidar com eles em sua aplicação.
📖 Para a lista de valores de
error.codepor recurso (com o status HTTP de cada um), veja o Catálogo de Códigos de Erro.
Estrutura da Resposta de Erro
Todas as respostas de erro da API Selectwin seguem uma estrutura padrão:
{
"error": {
"status": "Bad Request",
"statusCode": 400,
"category": "validation",
"code": "invalidParameters",
"message": "Validation errors occurred.",
"resource": "transaction",
"details": "Informações adicionais sobre o erro",
"params": [
{
"field1": "Mensagem de erro específica para o campo"
}
]
}
}O campo
error.resourceestá sempre presente e indica o domínio dono do erro (ex.:transaction,customer,server).
Use
error.codepara a lógica do seu sistema. Ele é o identificador estável e legível por máquina do erro (ex.:validationError,resourceNotFound,rateLimitExceeded). Diferentemente demessage/status/details— textos que podem mudar —, ocodefaz parte do contrato da API e está sempre presente.
Campos Comuns
| Campo | Tipo | Descrição |
|---|---|---|
error.code | string | Identificador estável do erro (legível por máquina) — use-o para tratar erros programaticamente. Sempre presente. |
error.status | string | Descrição textual do status HTTP |
error.statusCode | integer | Código numérico do status HTTP |
error.category | string | Categoria do erro: validation, authentication, authorization, payment, client, server, rate_limit ou pending |
error.message | string | Mensagem principal descrevendo o erro (texto, pode mudar) |
error.resource | string | Domínio dono do erro (ex.: transaction, customer, server). Sempre presente. |
error.details | string | Detalhes adicionais sobre o erro (presente em alguns tipos de erro) |
Campos Específicos
Dependendo do tipo de erro, campos adicionais podem estar presentes:
| Campo | Tipo | Descrição |
|---|---|---|
error.params | array | Para erros de validação, contém os campos com problemas e suas mensagens |
error.docUrl | string | URL para documentação relacionada ao erro (presente em alguns códigos) |
error.supportUrls | array | URLs de suporte relacionadas ao erro (presente em alguns códigos) |
Rate limit (429): o tempo de espera é informado no cabeçalho HTTP
Retry-After(em segundos), não no corpo. O envelope JSON do429não trazretryAfter/retryAfterMinutes.
Códigos de Status HTTP
A API Selectwin utiliza os seguintes códigos de status HTTP para indicar erros:
Erros do Cliente (4xx)
| Código | Nome | Descrição |
|---|---|---|
| 400 | Bad Request | A requisição contém sintaxe inválida ou campos obrigatórios ausentes |
| 401 | Unauthorized | Autenticação necessária ou falha de autenticação (chave API inválida) |
| 402 | Payment Required | Falha/recusa no processamento do pagamento — ver Recusas de Pagamento |
| 403 | Forbidden | Acesso negado ao recurso solicitado |
| 404 | Not Found | O recurso solicitado não existe |
| 405 | Method Not Allowed | O método HTTP usado não é permitido para o endpoint |
| 409 | Conflict | Conflito com o estado atual do recurso |
| 422 | Unprocessable Entity | A requisição foi bem formada, mas não pode ser processada |
| 429 | Too Many Requests | Limite de taxa excedido (rate limiting) |
Erros do Servidor (5xx)
| Código | Nome | Descrição |
|---|---|---|
| 500 | Internal Server Error | Erro interno no servidor |
| 503 | Service Unavailable | Serviço temporariamente indisponível |
Detalhes dos Erros
400 - Bad Request
Indica que a requisição é inválida, geralmente devido a problemas de validação.
{
"error": {
"status": "Bad Request",
"statusCode": 400,
"category": "validation",
"message": "Validation error occurred.",
"params": [
{
"field1": "Mensagem de erro específica para o campo"
}
]
}
}Casos Comuns
- Dados de entrada em formato incorreto
- Campos obrigatórios ausentes
- Valores inválidos para determinados campos
401 - Unauthorized
Indica problemas com a autenticação.
{
"error": {
"status": "Unauthorized",
"statusCode": 401,
"category": "authentication",
"code": "unauthorized",
"message": "Authentication is required to access this resource.",
"resource": "server"
}
}Casos Comuns
- Chave API ausente ou inválida
- Chave API expirada
- Credenciais incorretas
402 - Payment Required
Indica recusa/falha no processamento do pagamento (category: "payment"). O envelope segue a mesma
estrutura padrão (status, statusCode, category, code, message, resource).
{
"error": {
"status": "Payment Required",
"statusCode": 402,
"category": "payment",
"code": "paymentDeclined",
"message": "The payment was declined by the issuer.",
"resource": "payorch"
}
}⚠️ Importante: a criação de uma transação (
POST /v1/transactions) é assíncrona — ela responde201 Createdcomstatus: "pending"e a cobrança é processada em segundo plano. Uma recusa de cartão normalmente não chega como um402síncrono nessa chamada; o resultado da cobrança aparece no objeto da transação (status: "failed") e no webhooktransaction.failed. Veja Recusas de Pagamento.
Casos Comuns
- Cobrança recusada pelo emissor/adquirente
- Falha no processamento do pagamento
403 - Forbidden
Indica que o cliente não tem permissão para acessar o recurso solicitado.
{
"error": {
"status": "Forbidden",
"statusCode": 403,
"category": "authorization",
"code": "forbidden",
"message": "You do not have permission to perform this action.",
"resource": "server"
}
}Casos Comuns
- Plano de assinatura não permite acesso ao recurso
- Restrições de IP
- Permissões insuficientes para a operação solicitada
404 - Not Found
Indica que o recurso solicitado não existe.
{
"error": {
"status": "Not Found",
"statusCode": 404,
"category": "client",
"code": "transactionNotFound",
"message": "Transaction not found.",
"resource": "transaction"
}
}O
error.codeeerror.resourcevariam conforme o recurso consultado (ex.:customerNotFound/customer).
Casos Comuns
- ID de recurso inexistente
- URL incorreta
- Recurso excluído
405 - Method Not Allowed
Indica que o método HTTP usado não é permitido para o endpoint.
Indica que o método HTTP usado não é permitido para o endpoint (o caminho existe, mas não para esse verbo).
Casos Comuns
- Tentativa de usar POST em um endpoint que só aceita GET
- Método HTTP não suportado para o recurso
409 - Conflict
Indica um conflito com o estado atual do recurso.
{
"error": {
"status": "Conflict",
"statusCode": 409,
"category": "client",
"code": "idempotencyMismatch",
"message": "This idempotency key was already used with a different request payload.",
"resource": "server"
}
}Casos Comuns
- Violação de restrição de idempotência (
idempotencyMismatch,idempotencyInProgress) — veja Idempotência - Tentativa de criação duplicada de recurso
- Condições de concorrência
- Conflito com regras de negócio
422 - Unprocessable Entity
Indica que a requisição está bem formada, mas não pode ser processada devido a erros semânticos.
{
"error": {
"status": "Unprocessable Entity",
"statusCode": 422,
"category": "validation",
"code": "providerNotConfigured",
"message": "No payment provider is configured for the requested mode.",
"resource": "payorch"
}
}Casos Comuns
- Valores de campos em formato correto, mas semanticamente inválidos
- CPF válido em formato, mas inexistente
- Provedor de pagamento não configurado para o modo solicitado (
providerNotConfigured)
A criação de transação é assíncrona: uma recusa de cartão chega como
status: "failed"no objeto da transação e no webhooktransaction.failed, não como um erro síncrono nessa chamada. Veja Recusas de Pagamento.
429 - Too Many Requests
Indica que o cliente excedeu o limite de requisições permitido.
{
"error": {
"status": "Too Many Requests",
"statusCode": 429,
"category": "rate_limit",
"code": "tooManyRequests",
"message": "Too many requests. Please slow down and retry after a short wait.",
"resource": "server",
"details": "This endpoint is rate limited. Check the Retry-After response header for when to retry."
}
}O tempo de espera vem no cabeçalho HTTP
Retry-After(segundos), não no corpo.
Casos Comuns
- Muitas requisições em curto período
- Excedeu quota de uso da API
500 - Internal Server Error
Indica um erro inesperado no servidor.
{
"error": {
"status": "Internal Server Error",
"statusCode": 500,
"category": "server",
"code": "serverError",
"message": "An unexpected error occurred. Please try again later.",
"resource": "server",
"details": "If the problem persists, contact support with the correlationId from the response headers."
}
}Casos Comuns
- Falhas inesperadas no servidor
- Problemas de infraestrutura
- Bugs no sistema
503 - Service Unavailable
Indica que o serviço está temporariamente indisponível.
{
"error": {
"status": "Service Unavailable",
"statusCode": 503,
"category": "server",
"code": "providerUnavailable",
"message": "The service is temporarily unavailable. Please try again later.",
"resource": "server"
}
}Casos Comuns
- Manutenção programada
- Sobrecarga do sistema
- Falha em serviços dependentes
Categorias de Erro
A API Selectwin agrupa os erros nas seguintes categorias:
| Categoria | Descrição |
|---|---|
validation | Erros de validação dos dados de entrada (400/422) |
authentication | Falha de autenticação (401) |
authorization | Falta de permissão (403) |
payment | Falha/recusa no processamento de pagamento (402) |
client | Outros erros causados pelo cliente (ex.: 404, 409) |
server | Erros internos do servidor (500/503) |
rate_limit | Limite de requisições excedido (429) |
pending | Operação ainda em processamento |
Conflitos de idempotência (
409) usam a categoriaclient(não há categoriaidempotency).
Perguntas Frequentes
Como devo lidar com erros 5xx?
Erros 5xx indicam problemas no servidor. Para estes casos:
- Implemente retry com backoff para tentativas automáticas
- Tenha um plano de fallback para operações críticas
- Notifique sua equipe de suporte se o problema persistir
Qual é a diferença entre erros 400 e 422?
- 400 (Bad Request): Problemas na sintaxe da requisição ou validação básica (tipos incorretos, campos obrigatórios ausentes)
- 422 (Unprocessable Entity): A requisição está sintaticamente correta, mas há problemas semânticos (ex: CPF inválido, provedor não configurado). A criação de transação é assíncrona — recusas de cartão chegam como
status: "failed"/webhooktransaction.failed, não como erro síncrono. Ver Recusas de Pagamento.
Como faço para interpretar erros de validação complexos?
Para erros de validação (categoria validation), verifique o campo error.params que contém informações detalhadas sobre cada campo com problema.
O que devo fazer quando recebo um erro 429 (Rate Limit)?
- Respeite o cabeçalho HTTP
Retry-After(segundos) retornado na resposta - Implemente backoff exponencial para retentativas
- Considere otimizar seu código para reduzir o número de requisições
- Se o problema persistir, avalie a necessidade de um plano com limites maiores
Por que estou recebendo erros 409 (Conflict)?
Erros 409 geralmente ocorrem nas seguintes situações:
- Tentativa de criar um recurso que já existe
- Uso incorreto de chaves de idempotência
- Tentativas de atualização concorrente do mesmo recurso
- Violação de regras de negócio que geram conflitos