VersellAPI

Códigos de Erro

Referência completa dos códigos de status HTTP e tratamento de erros da API Versell Pix

Visão Geral

As APIs de Cash In e Cash Out da Versell retornam erros seguindo o padrão RFC 7807 (Problem Details for HTTP APIs). Cada resposta de erro inclui um objeto JSON com informações estruturadas sobre o problema, facilitando o diagnóstico e o tratamento programático de erros.

Formato da Resposta de Erro

Todas as respostas de erro seguem a estrutura abaixo:

{
  "type": "https://pix.bcb.gov.br/api/v2/error/CobOperacaoInvalida",
  "title": "Cobranca invalida",
  "status": 400,
  "detail": "A cobranca informada apresenta inconsistencias.",
  "violacoes": [
    {
      "razao": "O campo valor.original deve ser maior que zero",
      "propriedade": "valor.original"
    }
  ]
}
CampoTipoDescrição
typestringURI que identifica o tipo de erro
titlestringTítulo legível do erro
statusintegerCódigo de status HTTP
detailstringDescrição detalhada do erro
violacoesarrayLista de violações de validação (opcional)

Códigos de Status HTTP

A tabela abaixo lista todos os códigos de status retornados pelas APIs:

StatusNomeQuando OcorreSolução
400Bad RequestParâmetros inválidos, corpo malformado ou campos obrigatórios ausentesVerifique o corpo da requisição e os parâmetros
401UnauthorizedToken expirado, inválido ou ausenteSolicite um novo token de acesso
403ForbiddenCertificado mTLS ausente ou inválido, escopo insuficienteVerifique o certificado e os escopos
404Not FoundRecurso não existe (txid, e2eid, webhook, etc.)Verifique se o ID ou chave informado existe
405Method Not AllowedMétodo HTTP incorreto para o endpointVerifique o método correto na documentação
409ConflictRecurso já existe ou conflito de estadoVerifique o estado atual do recurso
412Precondition FailedRequisição conflita com o estado do servidorVerifique as pré-condições da operação
422Unprocessable EntityDados semanticamente inválidos (ex: reembolso excede valor original)Corrija a lógica de negócio da requisição
429Too Many RequestsRate limit excedido (endpoint de token: 10 req/min)Faça cache dos tokens e implemente backoff exponencial
500Internal Server ErrorErro interno do servidorTente novamente com backoff exponencial
503Service UnavailableServiço temporariamente indisponívelAguarde e tente novamente após alguns segundos
504Gateway TimeoutTimeout do upstream (apenas Cash Out)Tente novamente a requisição
!
Para erros 5xx (500, 503, 504), sempre implemente retry com backoff exponencial. Nunca faça retry imediato em loops, pois isso pode agravar o problema.

Array de Violações

Quando a API retorna um erro 400, o campo violacoes pode conter uma lista de erros de validação a nível de campo. Cada objeto na lista possui dois campos:

CampoDescrição
razaoMotivo da violação — descreve o que está errado com o campo
propriedadeNome da propriedade/campo que causou o erro (ex: valor.original, chave)
{
  "type": "https://pix.bcb.gov.br/api/v2/error/CobOperacaoInvalida",
  "title": "Cobranca invalida",
  "status": 400,
  "detail": "A cobranca nao respeita o schema.",
  "violacoes": [
    {
      "razao": "O campo valor.original deve ser maior que zero",
      "propriedade": "valor.original"
    },
    {
      "razao": "O campo chave nao e uma chave Pix valida",
      "propriedade": "chave"
    }
  ]
}
i
Use o array violacoes para exibir mensagens de erro específicas ao usuário final, mapeando cada propriedade ao campo correspondente no formulário.

Cenários Comuns de Erro

Erros de Token

CenárioStatusSolução
Token expirado401Solicite um novo token antes que o atual expire (Cash In: 300s, Cash Out: 3600s)
Credenciais inválidas (client_id/client_secret)401Verifique as credenciais no painel Finance
Rate limit no endpoint de token (10 req/min)429Faça cache do token e renove apenas próximo da expiração

Erros de Certificado

CenárioStatusSolução
Falha no handshake mTLS403Confirme que o certificado .crt/.pfx está sendo enviado na requisição
Certificado de Cash In usado no Cash Out (ou vice-versa)403Use o certificado correto para cada módulo — são diferentes
Certificado expirado ou revogado403Solicite um novo certificado à Versell
X
Cash In e Cash Out utilizam certificados mTLS DIFERENTES. Usar o certificado errado resultará em erro 403 Forbidden.

Erros de Idempotência

CenárioStatusSolução
Chave de idempotência duplicada com payload diferente409Gere uma nova chave de idempotência (UUID v4) para cada requisição única
Chave de idempotência duplicada com mesmo payload200Comportamento correto — a API retorna a resposta original (seguro para retry)

Erros Específicos do Pix

CenárioStatusSolução
Valor da cobrança igual a zero ou negativo400O campo valor.original deve ser maior que zero (ex: "10.00")
Tipo de chave Pix inválido400Use um dos tipos válidos: CPF, CNPJ, telefone (+5511...), e-mail ou chave aleatória
Reembolso excede o valor original do Pix422O valor do reembolso não pode ser maior que o valor recebido
txid ou e2eid não encontrado404Verifique se o identificador está correto e se a transação existe

Tratamento de Erros em Código

Exemplo de como tratar erros da API de forma robusta com Node.js e Axios:

const axios = require('axios');

async function createCharge(token, chargeData) {
  try {
    const response = await axios.post(
      'https://api.pix.basspago.com.br/cob',
      chargeData,
      {
        headers: {
          Authorization: `Bearer ${token}`,
          'Content-Type': 'application/json',
        },
        httpsAgent: agent, // mTLS agent
      }
    );
    return response.data;
  } catch (error) {
    if (error.response) {
      const { status, data } = error.response;

      switch (status) {
        case 400:
          console.error('Validation error:', data.detail);
          if (data.violacoes) {
            data.violacoes.forEach((v) => {
              console.error(`  Field "${v.propriedade}": ${v.razao}`);
            });
          }
          break;
        case 401:
          console.error('Token expired — requesting new token...');
          // Implement token refresh logic
          break;
        case 403:
          console.error('Certificate error:', data.detail);
          break;
        case 429:
          const retryAfter = error.response.headers['retry-after'] || 60;
          console.error(`Rate limited. Retry after ${retryAfter}s`);
          break;
        case 500:
        case 503:
        case 504:
          console.error('Server error — retrying with backoff...');
          // Implement exponential backoff retry
          break;
        default:
          console.error(`Unexpected error ${status}:`, data);
      }
    } else {
      console.error('Network error:', error.message);
    }
    throw error;
  }
}
*
Sempre faça cache dos tokens de acesso e implemente lógica de retry com backoff exponencial para erros 5xx. Para erros 4xx, corrija a requisição antes de tentar novamente.