Documentação da API
Integre cobranças Pix ao seu sistema em minutos usando a API REST v1 do EletraPay. Gere QR Codes, consulte pagamentos e receba notificações via webhooks.
Base URL
https://eletrapay.com/api/v1
Esta é a URL base da API do EletraPay. Em ambiente de testes, use uma API key com prefixo sk_test_.
Autenticação
Todas as requisições devem incluir o header Authorization com sua API key no formato Bearer sk_live_... (produção) ou Bearer sk_test_... (sandbox). Gere suas chaves em Configurações → API Keys.
Authorization: Bearer sk_live_SUA_API_KEY
Criar cobrança Pix
/api/v1/paymentsCria uma cobrança Pix e retorna o QR Code (EMV payload + imagem base64) pronto para exibir ao seu cliente. A cobrança expira em 30 minutos por padrão.
Headers
| Header | Obrigatório | Descrição |
|---|---|---|
| Authorization | Sim | Bearer sk_live_... |
| Content-Type | Sim | application/json |
| Idempotency-Key | Recomendado | String única (até 200 chars). Evita cobranças duplicadas em retries. |
Body (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| amount_cents | integer | Sim | Valor em centavos. Ex: 1990 = R$19,90. Máx: R$100.000 |
| description | string | Sim | Descrição da cobrança (até 500 chars) |
| customer.name | string | Sim | Nome completo do pagador |
| customer.email | string | Sim | E-mail do pagador |
| customer.tax_id | string | Sim | CPF (11 dígitos) ou CNPJ (14 dígitos), só números |
| customer.phone | string | Não | Telefone do pagador (DDI+DDD+número, só números) |
| product_id | string | Não | ID de produto cadastrado no EletraPay |
| utm.source | string | Não | Origem do tráfego. Ex: facebook, google, instagram |
| utm.medium | string | Não | Mídia. Ex: cpc, email, organic |
| utm.campaign | string | Não | Nome da campanha |
| utm.term | string | Não | Termo de busca pago |
| utm.content | string | Não | Variante do anúncio (testes A/B) |
| customer_ip | string | Não | IP real do navegador do cliente. Obrigatório para UTMify funcionar em integrações server-to-server, sem ele o gateway registra o IP do seu servidor e a UTMify não consegue atribuir a venda à campanha. |
Exemplo de requisição
curl -X POST https://eletrapay.com/api/v1/payments \
-H "Authorization: Bearer sk_live_SUA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-12345" \
-d '{
"amount_cents": 9990,
"description": "Pedido #12345: Camiseta Premium",
"customer": {
"name": "João Silva",
"email": "joao@exemplo.com.br",
"tax_id": "12345678901"
},
"utm": {
"source": "facebook",
"medium": "cpc",
"campaign": "camiseta-verao",
"term": null,
"content": "banner-v2"
},
"customer_ip": "189.50.123.45"
}'Resposta de sucesso. HTTP 201
{
"id": "pay_abc123def456",
"amount_cents": 9990,
"status": "pending",
"pix": {
"txid": "TX123456789",
"emv_payload": "00020126580014br.gov.bcb.pix...",
"qr_code_data_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg..."
},
"expires_at": "2025-01-15T14:30:00.000Z",
"requires_review": false
}Campos da resposta
| Campo | Descrição |
|---|---|
| id | ID único da cobrança. Guarde para consultas e reconciliação. |
| status | Estado inicial: sempre "pending" |
| pix.emv_payload | String "copia e cola" do Pix. Exiba em texto para o cliente. |
| pix.qr_code_data_url | Imagem PNG do QR Code em base64. Use direto em <img src=...>. |
| expires_at | Quando a cobrança expira (ISO 8601 UTC). |
| requires_review | true se sinalizado pelo motor de risco. |
Consultar cobrança
/api/v1/payments/:idRetorna os detalhes e o status atual de uma cobrança. Use para verificar se o pagamento foi confirmado nos casos em que o webhook não for recebido.
Exemplo
curl https://eletrapay.com/api/v1/payments/pay_abc123def456 \ -H "Authorization: Bearer sk_live_SUA_API_KEY"
Resposta. HTTP 200
{
"id": "pay_abc123def456",
"amount_cents": 9990,
"net_cents": 9791,
"fee_cents": 199,
"status": "approved",
"created_at": "2025-01-15T14:00:00.000Z",
"paid_at": "2025-01-15T14:05:33.000Z",
"expires_at": "2025-01-15T14:30:00.000Z",
"pix": {
"txid": "TX123456789",
"emv_payload": "00020126580014br.gov.bcb.pix...",
"qr_code_data_url": "data:image/png;base64,..."
},
"requires_review": false,
"risk_score": 12,
"risk_decision": "approved"
}Status possíveis
| Status | Significado |
|---|---|
| pending | QR Code gerado, aguardando pagamento |
| approved | Pagamento confirmado, saldo creditado ao seller |
| expired | Prazo expirou sem pagamento |
| refused | Recusado pelo provider Pix |
| refunded | Pagamento estornado |
| charged_back | Chargeback recebido |
| canceled | Cancelado |
Listar cobranças
/api/v1/paymentsRetorna as cobranças da loja associada à API key, paginadas por offset.
Query params
| Param | Tipo | Default | Descrição |
|---|---|---|---|
| limit | integer | 20 | Quantidade de resultados (1–100) |
| offset | integer | 0 | Offset para paginação |
| status | string | , | Filtrar por status (opcional) |
Exemplo
curl "https://eletrapay.com/api/v1/payments?limit=10&status=approved" \ -H "Authorization: Bearer sk_live_SUA_API_KEY"
Resposta. HTTP 200
{
"data": [
{
"id": "pay_abc123def456",
"amount_cents": 9990,
"net_cents": 9791,
"fee_cents": 199,
"status": "approved",
"created_at": "2025-01-15T14:00:00.000Z",
"paid_at": "2025-01-15T14:05:33.000Z",
"requires_review": false
}
],
"pagination": {
"limit": 10,
"offset": 0,
"total": 1
}
}Webhooks
O EletraPay envia um POST para a URL configurada na sua loja sempre que o status de uma cobrança mudar. Configure a URL em Configurações → Webhooks no painel.
Payload do webhook
{
"event": "payment.approved",
"payment": {
"id": "pay_abc123def456",
"amount_cents": 9990,
"net_cents": 9791,
"status": "approved",
"paid_at": "2025-01-15T14:05:33.000Z"
}
}Eventos disponíveis
| Evento | Quando dispara |
|---|---|
| payment.approved | Pagamento Pix confirmado e saldo creditado |
| payment.expired | Cobrança expirou sem pagamento |
| payment.refunded | Pagamento estornado |
| payment.charged_back | Chargeback recebido |
Validando a assinatura
Cada request de webhook inclui o header X-EletraPay-Signature com um HMAC-SHA256 do body usando o segredo configurado no painel. Sempre valide antes de processar o evento.
// Node.js
const crypto = require("crypto");
function isValidSignature(rawBody, signature, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature, "hex"),
Buffer.from(expected, "hex")
);
}
// Express.js, exemplo completo
app.post("/webhook/EletraPay", express.raw({ type: "application/json" }), (req, res) => {
const sig = req.headers["x-EletraPay-Signature"];
if (!isValidSignature(req.body.toString(), sig, process.env.EletraPay_WEBHOOK_SECRET)) {
return res.status(401).json({ error: "invalid_signature" });
}
const { event, payment } = JSON.parse(req.body);
if (event === "payment.approved") {
// Liberar o pedido do cliente
await fulfillOrder(payment.id);
}
res.json({ ok: true });
});Códigos de erro
Erros retornam sempre o formato { "error": "<code>", "message": "<descricao>" }. Erros de validação incluem também o campo issues.
| HTTP | error | Descrição |
|---|---|---|
| 400 | validation_failed | Payload inválido, veja o campo issues |
| 400 | invalid_json | Body não é JSON válido |
| 400 | idempotency_key_too_long | Idempotency-Key excede 200 chars |
| 401 | unauthorized | API key inválida ou revogada |
| 404 | not_found | Cobrança não encontrada (ou não pertence à sua loja) |
| 409 | idempotency_conflict | Mesma Idempotency-Key reutilizada com payload diferente |
| 422 | store_inactive | Loja desativada |
| 422 | seller_not_approved | KYC do seller pendente |
| 422 | risk_blocked | Bloqueado pelo motor de risco |
| 429 | rate_limited | Muitas requisições, aguarde e tente novamente |
| 502 | provider_failed | Provider Pix indisponível temporariamente |
| 500 | internal | Erro interno, entre em contato com o suporte |
Exemplo de erro de validação
{
"error": "validation_failed",
"message": "Payload inválido.",
"issues": [
{ "path": "customer.tax_id", "message": "String must contain at least 11 character(s)" },
{ "path": "amount_cents", "message": "Expected number, received string" }
]
}Idempotência
Sempre envie o header Idempotency-Key em requisições de criação de cobrança. Se a requisição falhar por timeout ou erro de rede e você reenviar, o servidor retornará o mesmo resultado sem criar uma cobrança duplicada. Use qualquer string única por operação, o ID do pedido no seu sistema é uma boa escolha.
// Use o ID do pedido do seu sistema Idempotency-Key: pedido-12345 // Ou gere um UUID Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
A chave tem validade de 24 horas. Reusar a mesma chave com um payload diferente retorna 409 idempotency_conflict.