Skip to main content
Esta página fornece uma referência completa dos status de transações, códigos de erro HTTP e códigos de resposta específicos da API Vexy Bank.

Status de transações (PIX IN)

Estados do ciclo de vida

StatusDescriçãoTempo TípicoPróxima Ação
pendingAguardando pagamento0-12 horasMostrar QR Code para cliente
paidPago com sucessoInstantâneoLiberar produto/serviço
canceledCanceladoManualGerar novo QR Code se necessário
refundedEstornado1-3 dias úteisValor devolvido ao pagador
expiredExpirado12 horasGerar nova cobrança

Fluxo visual

Detalhes por status

Quando ocorre: QR Code foi gerado com sucesso
Duração: Até 12 horas ou até ser pago
Webhook: transaction_created
Ações recomendadas:
  • Exibir QR Code para o cliente
  • Iniciar polling de status ou aguardar webhook
  • Mostrar contador de tempo para expiração
{
  "id": "trx_1a2b3c4d5e6f7g8h9i0j",
  "status": "pending",
  "createdAt": "2024-01-20T10:30:00.000Z",
  "expiresAt": "2024-01-20T22:30:00.000Z"
}
Quando ocorre: Cancelamento manual ou automático
Duração: Permanente
Webhook: transaction_canceled
Ações recomendadas:
  • Informar cliente sobre cancelamento
  • Gerar novo QR Code se necessário
  • Limpar carrinho ou sessão
{
  "id": "trx_1a2b3c4d5e6f7g8h9i0j",
  "status": "canceled",
  "canceledAt": "2024-01-20T11:00:00.000Z",
  "reason": "Cancelado pelo usuário"
}
Quando ocorre: Estorno processado com sucesso
Duração: Permanente
Webhook: transaction_refunded
Ações recomendadas:
  • Cancelar entrega se ainda não enviada
  • Restaurar estoque
  • Notificar cliente sobre estorno
  • Atualizar sistemas financeiros
{
  "id": "trx_1a2b3c4d5e6f7g8h9i0j",
  "status": "refunded",
  "refund": {
    "amount": 29990,
    "refundedAt": "2024-01-22T14:20:00.000Z",
    "reason": "Solicitação do cliente"
  }
}

Status de transferências (PIX OUT)

Estados do ciclo de vida

StatusDescriçãoTempo TípicoPróxima Ação
createdCriada e validadaInstantâneoAguardar processamento
processingEm processamento1-10 segundosAguardar conclusão
completedConcluída com sucesso3-15 segundosTransferência realizada
canceledCancelada pelo sistema5-30 segundosVerificar motivo
refusedRecusada pela instituição10-60 segundosVerificar dados

Fluxo visual

Detalhes por status

Quando ocorre: Transferência foi aceita e validada
Duração: 1-3 segundos
Webhook: transfer_created
Características:
  • Dados validados com sucesso
  • Saldo verificado e reservado
  • Chave PIX validada
{
  "id": "transfer_abc123def456",
  "status": "created",
  "amount": 10000,
  "pixKey": "[email protected]",
  "createdAt": "2024-01-20T15:30:00.000Z"
}
Quando ocorre: Transferência sendo processada pelo sistema
Duração: 3-10 segundos
Webhook: transfer_updated
Características:
  • Comunicação com o SPI (Sistema de Pagamentos Instantâneos)
  • Verificação final de dados
  • Processamento da transferência
{
  "id": "transfer_abc123def456",
  "status": "processing",
  "amount": 10000,
  "processingAt": "2024-01-20T15:30:02.000Z"
}
Quando ocorre: Transferência PIX concluída com sucesso
Duração: Permanente
Webhook: transfer_completed
Características:
  • Dinheiro transferido com sucesso
  • End-to-End ID gerado
  • Comprovante disponível
{
  "id": "transfer_abc123def456",
  "status": "completed",
  "amount": 10000,
  "netAmount": 10000,
  "fees": 0,
  "completedAt": "2024-01-20T15:30:08.000Z",
  "pix": {
    "endToEndId": "E00000000202401011200000000000000"
  }
}
Quando ocorre: Transferência recusada pela instituição
Duração: Permanente
Webhook: transfer_refused
Motivos comuns:
  • Chave PIX não encontrada
  • Conta de destino inativa
  • Limites de recebimento excedidos
  • Problemas técnicos temporários
{
  "id": "transfer_abc123def456",
  "status": "refused",
  "amount": 10000,
  "refusedAt": "2024-01-20T15:30:15.000Z",
  "reason": "Chave PIX não encontrada"
}

❌ Códigos de Erro HTTP

Códigos de Sucesso (2xx)

CódigoDescriçãoUso Comum
200OKOperação bem-sucedida
201CreatedRecurso criado com sucesso
204No ContentOperação bem-sucedida sem conteúdo

Códigos de Erro do Cliente (4xx)

CódigoErroDescriçãoSolução
400Bad RequestDados inválidos na requisiçãoVerificar formato dos dados
401UnauthorizedToken inválido ou ausenteRenovar token de acesso
403ForbiddenSem permissão para a operaçãoVerificar permissões da API Key
404Not FoundRecurso não encontradoVerificar ID do recurso
409ConflictConflito na operaçãoVerificar estado do recurso
422Unprocessable EntityDados não processáveisVerificar regras de negócio
429Too Many RequestsRate limit excedidoAguardar e tentar novamente

Códigos de Erro do Servidor (5xx)

CódigoErroDescriçãoSolução
500Internal Server ErrorErro interno do servidorTentar novamente ou contatar suporte
502Bad GatewayErro de gatewayAguardar alguns minutos
503Service UnavailableServiço temporariamente indisponívelAguardar e tentar novamente
504Gateway TimeoutTimeout no gatewayTentar novamente

Códigos de erro específicos

Erros de Autenticação

CódigoMensagemCausaSolução
AUTH_001Token expiradoToken JWT expirouGerar novo token
AUTH_002Token inválidoToken malformadoVerificar formato do token
AUTH_003Credenciais inválidasAPI Key/Secret incorretosVerificar credenciais
AUTH_004Acesso negadoSem permissãoVerificar escopo da API Key

Erros de PIX IN

CódigoMensagemCausaSolução
PIX_IN_001Valor inválidoValor fora dos limitesVerificar valor mín/máx
PIX_IN_002CPF/CNPJ inválidoDocumento malformadoValidar documento
PIX_IN_003Email inválidoFormato de email incorretoVerificar email
PIX_IN_004QR Code expiradoTentativa de uso após expiraçãoGerar novo QR Code

Erros de PIX OUT

CódigoMensagemCausaSolução
PIX_OUT_001Saldo insuficienteNão há saldo na contaVerificar saldo
PIX_OUT_002Chave PIX inválidaFormato da chave incorretoValidar chave PIX
PIX_OUT_003Limite diário excedidoLimite de transferências atingidoAguardar próximo dia
PIX_OUT_004Destinatário indisponívelChave PIX não encontradaVerificar chave PIX

Erros de Webhook

CódigoMensagemCausaSolução
WEBHOOK_001URL inválidaFormato incorreto da URLVerificar URL
WEBHOOK_002URL não acessívelEndpoint não respondeVerificar conectividade
WEBHOOK_003Evento inválidoEvento não existeUsar eventos válidos
WEBHOOK_004Limite excedidoMuitos webhooks configuradosRemover webhooks antigos

Estrutura de resposta de erro

Formato Padrão

{
  "success": false,
  "error": {
    "code": "PIX_IN_001",
    "message": "Valor deve ser maior que R$ 0,01",
    "field": "amountInCents",
    "details": {
      "minimumValue": 1,
      "providedValue": 0
    }
  },
  "timestamp": "2024-01-20T10:30:00.000Z",
  "requestId": "req_abc123def456ghi789"
}

Campos da Resposta

CampoTipoDescrição
successbooleanSempre false para erros
error.codestringCódigo específico do erro
error.messagestringMensagem descritiva do erro
error.fieldstringCampo que causou o erro (opcional)
error.detailsobjectInformações adicionais (opcional)
timestampstringData/hora do erro
requestIdstringID único da requisição

Tratamento de erros

Exemplo de Implementação Robusta

class APIErrorHandler {
  static handle(error) {
    switch (error.status) {
      case 400:
        return this.handleBadRequest(error)
      case 401:
        return this.handleUnauthorized(error)
      case 403:
        return this.handleForbidden(error)
      case 404:
        return this.handleNotFound(error)
      case 422:
        return this.handleUnprocessableEntity(error)
      case 429:
        return this.handleRateLimit(error)
      case 500:
        return this.handleInternalError(error)
      default:
        return this.handleUnknownError(error)
    }
  }

  static handleBadRequest(error) {
    const errorCode = error.response?.data?.error?.code
    
    switch (errorCode) {
      case 'PIX_IN_001':
        throw new Error('Valor inválido. Verifique se o valor está dentro dos limites permitidos.')
      case 'PIX_IN_002':
        throw new Error('CPF/CNPJ inválido. Verifique o número do documento.')
      case 'PIX_OUT_002':
        throw new Error('Chave PIX inválida. Verifique o formato da chave.')
      default:
        throw new Error('Dados inválidos. Verifique os parâmetros enviados.')
    }
  }

  static async handleUnauthorized(error) {
    console.log('Token expirado, renovando...')
    
    // Tentar renovar token automaticamente
    try {
      await auth.renewToken()
      return { shouldRetry: true }
    } catch (renewError) {
      throw new Error('Falha na autenticação. Verifique suas credenciais.')
    }
  }

  static async handleRateLimit(error) {
    const retryAfter = error.response?.headers['retry-after'] || 60
    
    console.log(`Rate limit atingido. Aguardando ${retryAfter} segundos...`)
    
    return { 
      shouldRetry: true, 
      retryAfter: retryAfter * 1000 
    }
  }

  static handleInternalError(error) {
    const requestId = error.response?.data?.requestId
    
    throw new Error(
      `Erro interno do servidor. ` +
      `Entre em contato com o suporte informando o ID: ${requestId}`
    )
  }
}

// Uso
async function makeAPICall(apiFunction, ...args) {
  const maxRetries = 3
  let attempt = 0

  while (attempt < maxRetries) {
    try {
      return await apiFunction(...args)
    } catch (error) {
      attempt++
      
      const handled = APIErrorHandler.handle(error)
      
      if (handled?.shouldRetry && attempt < maxRetries) {
        if (handled.retryAfter) {
          await new Promise(resolve => setTimeout(resolve, handled.retryAfter))
        }
        continue
      }
      
      throw error
    }
  }
}

Rate Limiting Inteligente

class RateLimiter {
  constructor() {
    this.requests = new Map()
  }

  async waitIfNeeded(endpoint) {
    const now = Date.now()
    const requests = this.requests.get(endpoint) || []
    
    // Limpar requisições antigas (mais de 1 minuto)
    const recentRequests = requests.filter(time => now - time < 60000)
    
    // Verificar limite por endpoint
    const limits = {
      '/api/auth': 5,
      '/api/v1/pix/in/qrcode': 100,
      '/api/v1/pix/out/pixkey': 50,
      '/api/v1/webhook': 30
    }
    
    const limit = limits[endpoint] || 100
    
    if (recentRequests.length >= limit) {
      const oldestRequest = Math.min(...recentRequests)
      const waitTime = 60000 - (now - oldestRequest)
      
      console.log(`Rate limit atingido para ${endpoint}. Aguardando ${waitTime}ms...`)
      await new Promise(resolve => setTimeout(resolve, waitTime))
    }
    
    // Registrar nova requisição
    recentRequests.push(now)
    this.requests.set(endpoint, recentRequests)
  }
}

Próximos passos