Documentação API

Notificações
Carregando...
V
...

Início Rápido

Integre pagamentos PIX em 3 passos simples.

1
Crie sua conta

Registre-se em vexopay.com.br/register

2
Gere suas API Keys

Vá em API Keys e gere suas credenciais

3
Integre

Use ci e cs nos headers das requisições

Autenticação

Todas as requisições exigem as credenciais nos headers:

ci: vxp_ci_xxxxxxxxxxxxxxxx cs: vxp_cs_xxxxxxxxxxxxxxxx Content-Type: application/json
Base URL
https://www.vexopay.com.br/api

Criar Cobrança PIX

POST /gateway/pix-create

Parâmetros (body JSON)
CampoTipoDescrição
amount obrigatórionumberValor em reais (mín: 2.00)
payerName obrigatóriostringNome do pagador
payerDocument obrigatóriostringCPF (apenas números)
description opcionalstringDescrição da cobrança
curl -X POST https://www.vexopay.com.br/api/gateway/pix-create \ -H "Content-Type: application/json" \ -H "ci: vxp_ci_SEU_CLIENT_ID" \ -H "cs: vxp_cs_SEU_CLIENT_SECRET" \ -d '{ "amount": 50.00, "payerName": "João Silva", "payerDocument": "12345678909", "description": "Assinatura mensal" }'
const response = await fetch('https://www.vexopay.com.br/api/gateway/pix-create', { method: 'POST', headers: { 'Content-Type': 'application/json', 'ci': 'vxp_ci_SEU_CLIENT_ID', 'cs': 'vxp_cs_SEU_CLIENT_SECRET', }, body: JSON.stringify({ amount: 50.00, payerName: 'João Silva', payerDocument: '12345678909', description: 'Assinatura mensal', }), }); const data = await response.json(); console.log(data.data.qrCodeBase64); console.log(data.data.copyPaste); console.log(data.data.paymentLink);
import requests response = requests.post( 'https://www.vexopay.com.br/api/gateway/pix-create', headers={ 'ci': 'vxp_ci_SEU_CLIENT_ID', 'cs': 'vxp_cs_SEU_CLIENT_SECRET', }, json={ 'amount': 50.00, 'payerName': 'João Silva', 'payerDocument': '12345678909', } ) data = response.json() print(data['data']['copyPaste'])
$ch = curl_init('https://www.vexopay.com.br/api/gateway/pix-create'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'ci: vxp_ci_SEU_CLIENT_ID', 'cs: vxp_cs_SEU_CLIENT_SECRET', ], CURLOPT_POSTFIELDS => json_encode([ 'amount' => 50.00, 'payerName' => 'João Silva', 'payerDocument' => '12345678909', ]), ]); $response = curl_exec($ch); $data = json_decode($response, true); echo $data['data']['copyPaste'];
Resposta (201)
{ "success": true, "data": { "transactionId": "vxp_abc123def456...", "amount": 50.00, "fee": 1.50, "netAmount": 48.50, "status": "pending", "qrCodeBase64": "data:image/png;base64,...", "qrCodeUrl": "https://...", "copyPaste": "00020126...", "paymentLink": "https://...", "expiresAt": "2025-12-31T23:59:59Z" } }

Consultar Status

GET /gateway/pix-status?transactionId=vxp_xxx

curl https://www.vexopay.com.br/api/gateway/pix-status?transactionId=vxp_abc123 \ -H "ci: vxp_ci_SEU_CLIENT_ID" \ -H "cs: vxp_cs_SEU_CLIENT_SECRET"
Resposta
{ "success": true, "data": { "transactionId": "vxp_abc123...", "type": "pix_in", "amount": 50.00, "fee": 1.50, "netAmount": 48.50, "status": "paid", "payerName": "João Silva", "createdAt": "2025-01-15T14:30:00Z" } }
Possíveis Status
StatusDescrição
pendingAguardando pagamento
paidPagamento confirmado
failedPagamento falhou
expiredQR Code expirou
refundedPagamento estornado

Consultar Saldo

GET /gateway/balance

curl https://www.vexopay.com.br/api/gateway/balance \ -H "ci: vxp_ci_SEU_CLIENT_ID" \ -H "cs: vxp_cs_SEU_CLIENT_SECRET"
Resposta
{ "success": true, "data": { "balance": 1250.00, "totalReceived": 5000.00, "totalWithdrawn": 3500.00, "totalFees": 250.00, "transactionsCount": 42, "currency": "BRL" } }

Observação importante

Os campos payerName e payerDocument na criação do PIX não precisam ser verídicos. Eles servem apenas para preencher a cobrança. Os dados reais do pagador são capturados automaticamente após a confirmação do pagamento.

Solicitar Saque (Cash-out)

POST /merchant/cashout

Dois modos: sessão do painel (CSRF + PIN) ou server-to-server (ci/cs nos headers).

Parâmetros base
CampoTipoDescrição
withdrawalMethod obrigatóriostringPIX, INTERNAL ou CRYPTO
amount obrigatórionumberValor em reais
description opcionalstringDescrição da operação
PIX — parâmetros adicionais
CampoTipoDescrição
pixKeyType obrigatóriostringCPF, CNPJ, EMAIL, TELEFONE, CHAVE_ALEATORIA
pixKey obrigatóriostringChave PIX correspondente
INTERNAL — parâmetros adicionais
CampoTipoDescrição
targetAccount obrigatóriostringEmail, documento ou ID da conta destino
CRYPTO — parâmetros adicionais
CampoTipoDescrição
wallet obrigatóriostringCarteira BEP20 (0x + 40 hex)
curl -X POST https://www.vexopay.com.br/api/merchant/cashout \ -H "Content-Type: application/json" \ -H "ci: vxp_ci_SEU_CLIENT_ID" \ -H "cs: vxp_cs_SEU_CLIENT_SECRET" \ -d '{ "withdrawalMethod": "PIX", "amount": 100.00, "pixKeyType": "CPF", "pixKey": "12345678909" }'
Regras
TipoRegras
PIXMínimo dinâmico: maior entre R$ 1,00 e (taxa fixa + R$ 0,01)
INTERNALSem taxa. Liquidação imediata entre contas VexoPay
CRYPTOMínimo R$ 20 / Máximo R$ 3.000. Taxa plataforma + rede

Webhooks

Receba notificações em tempo real quando um pagamento for confirmado. Configure a URL no seu perfil.

Payload recebido
{ "event": "payment.completed", "data": { "transactionId": "vxp_abc123...", "amount": 50.00, "fee": 1.50, "netAmount": 48.50, "status": "paid", "payerName": "João Silva", "paidAt": "2025-01-15T14:35:00Z" } }
Eventos possíveis
EventoDescrição
payment.completedPagamento confirmado
payment.failedPagamento falhou
payment.expiredQR Code expirou
Cabeçalhos enviados
CabeçalhoDescrição
X-VexoPay-SignatureAssinatura HMAC-SHA256 no formato t=<timestamp>,v1=<hash>
X-VexoPay-EventNome do evento (ex.: payment.completed)
Para onde o webhook é enviado

Você pode configurar o webhook de duas formas, na página API Keys:

OpçãoOnde configurarQuando é usada
Webhook da conta Card Webhook, na página API Keys Padrão. Recebe os eventos de todas as chaves que não tiverem URL própria.
Webhook por chave Na tabela de chaves: Configurar webhook Só para cobranças criadas com aquela chave. Quando existe, substitui o da conta.

A URL é decidida no momento em que a cobrança é criada e fica gravada nela. Trocar a URL depois não muda para onde as cobranças que já existem serão entregues. Vale tanto para PIX quanto para cripto.

Verificando a assinatura

Cada entrega é assinada com o whsec_... correspondente à URL que recebeu o evento: se a cobrança usou o webhook de uma chave, a assinatura é feita com o segredo daquela chave; caso contrário, com o segredo da conta. Os dois ficam na página API Keys.

A verificação é opcional e não altera o corpo do webhook — se você já processa sem verificar, nada muda. Recomendamos ativar para garantir que a chamada veio mesmo da VexoPay.

A assinatura é o HMAC-SHA256 de timestamp + "." + corpo_bruto. Compare sempre sobre o corpo exato recebido (não re-serialize o JSON) e rejeite entregas com mais de 5 minutos para evitar replay.

// Node.js (Express) — use o corpo BRUTO, não o JSON já parseado const crypto = require('crypto'); const SECRET = process.env.VEXOPAY_WEBHOOK_SECRET; // whsec_... app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => { const body = req.body.toString('utf8'); const header = req.headers['x-vexopay-signature'] || ''; const parts = Object.fromEntries(header.split(',').map(p => p.split('='))); const age = Math.abs(Math.floor(Date.now()/1000) - Number(parts.t)); if (age > 300) return res.sendStatus(400); // replay const expected = crypto.createHmac('sha256', SECRET) .update(parts.t + '.' + body).digest('hex'); const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1 || '')); if (!ok) return res.sendStatus(401); const evento = JSON.parse(body); // ... processa o evento ... res.sendStatus(200); });
# PHP $secret = getenv('VEXOPAY_WEBHOOK_SECRET'); $body = file_get_contents('php://input'); parse_str(str_replace(',', '&', $_SERVER['HTTP_X_VEXOPAY_SIGNATURE']), $sig); if (abs(time() - intval($sig['t'])) > 300) http_response_code(400); $expected = hash_hmac('sha256', $sig['t'] . '.' . $body, $secret); if (!hash_equals($expected, $sig['v1'] ?? '')) http_response_code(401);
Reenvios e idempotência

A VexoPay considera a entrega bem-sucedida quando seu endpoint responde 2xx em até 10 segundos. Fora disso, a entrega é reenviada — então o mesmo evento pode chegar mais de uma vez. Trate o processamento como idempotente: use o transactionId como chave e ignore o que já processou.

Criar Cobrança Crypto

POST /gateway/crypto-create

Gera uma cobrança em USDT, USDC, BTC ou TRX com cotação Binance em tempo real.

Parâmetros (body JSON)
CampoTipoDescrição
amount obrigatórionumberValor em reais (mín R$ 5, máx R$ 50.000)
network obrigatóriostringTRC20, USDC_TRC20, BTC ou TRX
description opcionalstringIdentificador interno (máx 120 chars)
Exemplo
curl -X POST https://www.vexopay.com.br/api/gateway/crypto-create \ -H "Content-Type: application/json" \ -H "ci: vxp_ci_xxxxx" \ -H "cs: vxp_cs_xxxxx" \ -d '{ "amount": 100.00, "network": "TRC20", "description": "Pedido #1234" }'
Resposta
{ "success": true, "invoice": { "id": "5b3e...", "address": "TQPirdxgKdK2...", "amount": 18.180042, "amount_brl": 100.00, "fee_amount": 6.00, "net_amount": 94.00, "rate": 5.50, "asset": "USDT", "network": "TRC20", "expires_at": "2026-01-01T00:30:00Z", "status": "pending", "qr_payload": "tron:TQPir...?amount=18.180042&token=USDT" } }

O cliente deve enviar exatamente o amount retornado (com os últimos decimais únicos). Esse "amount tagging" é como identificamos o pagamento no endereço compartilhado.

Status Cobrança Crypto

GET /gateway/crypto-status?id=<invoice_id>

Consulta o estado da cobrança. Recomendado fazer polling a cada 30s até receber paid.

Estados possíveis
StatusSignificado
pendingAguardando depósito na blockchain
confirmingTransação detectada, aguardando confirmações
paidConfirmado e creditado no saldo do merchant
expired30 min sem pagamento — invoice fechada
Exemplo
curl https://www.vexopay.com.br/api/gateway/crypto-status?id=5b3e... \ -H "ci: vxp_ci_xxxxx" \ -H "cs: vxp_cs_xxxxx"

Taxas Crypto

GET /merchant/crypto-fees

Retorna taxa de plataforma, taxa de rede e cotação de referência.

Resposta
{ "success": true, "data": { "quote": { "brlPerUSD": 5.25, "networkFee": 3 }, "fees": { "platformFeePercentage": 3, "networkFee": 3 } } }

IP Whitelist

Restrinja o uso da API Key a IPs específicos. Configure na página API Keys.

ConfiguraçãoComportamento
Sem IPsAceita de qualquer IP (padrão)
Com IPsAceita apenas dos IPs listados
IP bloqueado (403)
{ "error": "IP não autorizado (203.0.113.50)" }

Códigos de Erro

Referência de todos os códigos HTTP retornados pela API.

HTTPSignificado
400Parâmetros inválidos ou ausentes
401Credenciais (ci/cs) inválidas
403Conta suspensa ou IP bloqueado
404Recurso não encontrado
409Conflito de estado
428Reautenticação obrigatória (PIN)
429Rate limit excedido
500Erro interno do servidor
502Erro com processador de pagamento