Introdução
A API da Zuno Pay permite criar cobranças PIX, produtos, links de pagamento e saques de forma programática. Todas as respostas são em JSON. Valores monetários são sempre em CENTAVOS (ex: R$ 197,00 = 19700). A base URL é https://zunopags.com.br/api/v1.
Autenticação
Todas as rotas exigem o header x-api-key com a sua chave de API. Crie chaves nomeadas em Dashboard → Configurações → Chaves de API (a chave completa só é exibida na criação — guarde-a com segurança). Emitir uma chave exige KYC aprovado, assim como as operações financeiras (criar cobrança, produto, link, saque, estorno).
curl https://zunopags.com.br/api/v1/me -H "x-api-key: SUA_API_KEY"
Idempotência
Mande o header Idempotency-Key (um UUID por operação) em POST /transactions e POST /withdrawals. Se a sua requisição der timeout e você reenviar com a MESMA chave e o MESMO corpo, a API devolve a resposta da primeira vez (com o header Idempotent-Replayed: true) e não cria uma segunda cobrança nem um segundo saque. A chave vale por 24 horas. Reusar a chave com outro corpo devolve 422 (idempotency_key_reused); reenviar enquanto a primeira ainda está rodando devolve 409 (idempotency_in_progress), e basta tentar de novo em instantes.
curl -X POST https://zunopags.com.br/api/v1/transactions -H "x-api-key: SUA_API_KEY" -H "Idempotency-Key: 5f1c2e9a-8b7d-4c3e-9f10-2a6b7c8d9e01" -H "Content-Type: application/json" -d '{"amountCents":19700}'Erros
Erros retornam status HTTP 4xx/5xx com o corpo { "error": { "code": string, "message": string } }. Códigos comuns: unauthorized (401, API key inválida), kyc_required (403, verificação pendente), account_blocked (403), invalid_request (400), insufficient_balance (400), amount_below_minimum (400), invalid_state (400), not_found (404).
Conta
Consulte os dados da sua conta, status do KYC e taxas vigentes.
/api/v1/meConsultar conta
Retorna dados cadastrais, status do KYC e as taxas aplicadas à sua conta (personalizadas ou globais).
Exemplo (curl)
curl "https://zunopags.com.br/api/v1/me" -H "x-api-key: SUA_API_KEY"
Resposta
{
"id": "cms93...",
"businessName": "Minha Loja LTDA",
"status": "ACTIVE",
"kycStatus": "APPROVED",
"fees": {
"pix": { "percent": 1.99, "fixedCents": 0, "releaseDays": 0 },
"creditCard": { "percent": 4.99, "fixedCents": 100, "releaseDays": 14 },
"boleto": { "percent": 2.49, "fixedCents": 349, "releaseDays": 2 },
"withdrawal": { "feeCents": 367, "minCents": 5000 }
}
}/api/v1/balanceConsultar saldo
Saldo disponível para saque, a liberar e retido (infração aberta e saque em cripto esperando envio). Com ?include_subaccounts=true, soma também as outras contas do mesmo dono.
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| include_subaccounts | boolean | não | true soma as outras contas do mesmo login, listadas à parte |
Exemplo (curl)
curl "https://zunopags.com.br/api/v1/balance" -H "x-api-key: SUA_API_KEY"
Resposta
{
"availableCents": 779494,
"pendingCents": 232374,
"retainedCents": 19700,
"totalCents": 1031568,
"currency": "BRL"
}Transações (PIX)
Crie cobranças PIX e acompanhe o status. A confirmação chega via webhook (evento transaction.paid) ou consultando a transação.
/api/v1/transactionsrequer KYCCriar cobrança PIX
Cria uma transação PIX e retorna o QR Code (data URL) e o código copia-e-cola.
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| amountCents | int | sim | Valor em centavos (mínimo 100). Opcional se mandar productId |
| description | string | não | Descrição da cobrança |
| externalRef | string | não | Seu identificador (ex: id do pedido). Dá para buscar por ele em GET /transactions?externalRef= |
| productId | string | não | Cobra um produto seu: preço, nome e entrega vêm do cadastro |
| bumpProductIds | string[] | não | Order bumps: outros produtos seus somados à cobrança (até 6) |
| postbackUrl | string | não | Webhook só desta cobrança, além dos cadastrados no painel. Assinado com o segredo do webhook do painel Desenvolvedor |
| address | object | não | Endereço de entrega: street, number, complement, neighborhood, city, state, zipcode. Volta no webhook |
| splits | array | não | Divide a venda: [{ recipient, percent }] ou [{ recipient, amountCents }] (até 5). Sem este campo, valem os splits cadastrados no painel |
| customer.name | string | não | Nome do cliente. Exigido para gerar a cobrança |
| customer.email | string | não | E-mail do cliente. Exigido para gerar a cobrança |
| customer.document | string | não | CPF/CNPJ do cliente. Exigido para gerar a cobrança |
| customer.phone | string | não | Telefone com DDD. Exigido para gerar a cobrança |
| customer.ip | string | não | IP do cliente (recomendado — enviado à UTMify) |
| utm.source / medium / campaign / content / term | string | não | Parâmetros de tracking (enviados à UTMify) |
| utm.src / utm.sck | string | não | Parâmetros src e sck da URL (enviados à UTMify) |
Exemplo (curl)
curl -X POST "https://zunopags.com.br/api/v1/transactions" \
-H "Content-Type: application/json" \
-H "x-api-key: SUA_API_KEY" \
-d '{ "amountCents": 19700, "description": "Curso Tráfego Pago", "externalRef": "pedido-123", "postbackUrl": "https://sualoja.com/webhooks/pagamento", "customer": { "name": "Ana Souza", "email": "ana@email.com" }, "splits": [ { "recipient": "@parceiro", "amountCents": 2000 } ], "utm": { "source": "facebook", "campaign": "lancamento" } }'Resposta
{
"id": "cms94...",
"status": "PENDING",
"method": "PIX",
"amountCents": 19700,
"feeCents": 392,
"netCents": 19308,
"pix": { "code": "000201...", "qrCodeDataUrl": "data:image/png;base64,..." },
"createdAt": "2026-07-31T13:00:00.000Z"
}/api/v1/transactionsListar transações
Lista transações com filtros e paginação.
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| status | enum | não | PENDING, PAID, REFUSED, REFUNDED, CHARGEBACK, EXPIRED |
| method | enum | não | PIX, CREDIT_CARD, BOLETO |
| from / to | ISO date | não | Período de criação |
| externalRef | string | não | O seu identificador, enviado na criação |
| limit | int | não | Máx. 100 (padrão 20) |
| offset | int | não | Paginação (padrão 0) |
Exemplo (curl)
curl "https://zunopags.com.br/api/v1/transactions" -H "x-api-key: SUA_API_KEY"
Resposta
{
"data": [ { "id": "...", "status": "PAID", "amountCents": 19700, ... } ],
"pagination": { "total": 71, "limit": 20, "offset": 0, "hasMore": true }
}/api/v1/transactions/{id}Consultar transação
Retorna uma transação específica, incluindo o código PIX.
Exemplo (curl)
curl "https://zunopags.com.br/api/v1/transactions/{id}" -H "x-api-key: SUA_API_KEY"Resposta
{ "id": "...", "status": "PAID", "paidAt": "2026-07-31T13:05:00.000Z", ... }/api/v1/transactions/{id}/refundrequer KYCEstornar transação
Estorna uma transação paga. O valor líquido é debitado do seu saldo.
Exemplo (curl)
curl -X POST "https://zunopags.com.br/api/v1/transactions/{id}/refund" \
-H "Content-Type: application/json" \
-H "x-api-key: SUA_API_KEY"Resposta
{ "id": "...", "status": "REFUNDED", "refundedNetCents": 19308 }Split de pagamentos
Divida uma venda entre a sua conta e outras contas da plataforma (sócio, co-produtor, gestor de tráfego, afiliado). Cada fatia cai direto no saldo de quem recebe, no mesmo prazo de liberação da venda, quando o pagamento é confirmado.
Duas formas de medir a fatia: percent (percentual do valor BRUTO da venda) ou amountCents (valor fixo em centavos). Use uma das duas em cada destinatário.
Quem paga a taxa: a taxa da plataforma sai da parte de quem vendeu. Numa venda de R$ 100 com taxa de R$ 5 e split de 20% para um parceiro, o parceiro recebe R$ 20 cheios e você fica com R$ 75.
Destinatário: @username, e-mail do dono ou id da conta. A conta precisa estar ativa e não pode ser a sua. Até 5 destinatários por venda, cada um uma vez só.
Duas maneiras de configurar:
1. Na própria cobrança, com o campo splits em POST /transactions. Vale só para ela.
2. No painel, em Financeiro → Split de pagamentos. O acordo vale para toda venda da conta (inclusive as da API) ou só para um produto ou link. Se a cobrança da API vier SEM o campo splits, os acordos do painel se aplicam sozinhos; se vier COM, vale só o que foi enviado (para não pagar o mesmo parceiro duas vezes).
Regras: o valor de cada fatia é calculado e congelado na criação da cobrança; mudar um acordo depois não altera vendas já feitas. Pela API, se a soma das fatias não couber na venda depois da taxa, a cobrança é recusada com invalid_split antes de ser criada. Nos acordos do painel, a venda passa sem split nesse caso, para o comprador não ser prejudicado por uma configuração. O netCents devolvido já vem sem a parte dos parceiros, e o webhook traz o splitCents.
// POST /api/v1/transactions com split
{
"amountCents": 19700,
"description": "Mentoria",
"splits": [
{ "recipient": "@socio", "percent": 30 },
{ "recipient": "gestor@email.com", "amountCents": 2000 }
]
}
// Resposta (trecho)
{
"amountCents": 19700,
"feeCents": 392,
"netCents": 11398,
"splitCents": 7910,
"splits": [
{ "recipient": "Sócio LTDA", "percent": 30, "amountCents": 5910 },
{ "recipient": "Gestor de Tráfego", "percent": 10.15, "amountCents": 2000 }
]
}
// Erro quando o split não cabe
{ "error": { "code": "invalid_split", "message": "O split não cabe na venda: ..." } }Produtos
Produtos têm um checkout hospedado próprio (https://zunopags.com.br/p/SLUG) com imagem, descrição e captura automática de UTMs.
/api/v1/productsListar produtos
Lista seus produtos com a URL de checkout.
Exemplo (curl)
curl "https://zunopags.com.br/api/v1/products" -H "x-api-key: SUA_API_KEY"
Resposta
{ "data": [ { "id": "...", "name": "Curso X", "priceCents": 19700, "checkoutUrl": "https://zunopags.com.br/p/curso-x-ab12c", "active": true } ] }/api/v1/productsrequer KYCCriar produto
Cria um produto com checkout hospedado.
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| name | string | sim | Nome do produto |
| description | string | não | Descrição exibida no checkout |
| priceCents | int | sim | Preço em centavos |
| imageUrl | string | não | URL da imagem de capa |
| methods | array | não | ["PIX"] e/ou ["CREDIT_CARD"] (padrão ["PIX"]) |
Exemplo (curl)
curl -X POST "https://zunopags.com.br/api/v1/products" \
-H "Content-Type: application/json" \
-H "x-api-key: SUA_API_KEY" \
-d '{ "name": "Curso Tráfego Pago", "priceCents": 19700, "methods": ["PIX", "CREDIT_CARD"] }'Resposta
{ "id": "...", "slug": "curso-trafego-pago-x1y2z", "checkoutUrl": "https://zunopags.com.br/p/curso-trafego-pago-x1y2z", ... }Links de pagamento
Links de pagamento são checkouts simples de valor fixo (https://zunopags.com.br/pay/SLUG), sem página de produto.
/api/v1/payment-linksListar links
Lista seus links de pagamento.
Exemplo (curl)
curl "https://zunopags.com.br/api/v1/payment-links" -H "x-api-key: SUA_API_KEY"
Resposta
{ "data": [ { "id": "...", "title": "Consultoria", "amountCents": 50000, "url": "https://zunopags.com.br/pay/consultoria-ab1cd", "active": true } ] }/api/v1/payment-linksrequer KYCCriar link
Cria um link de pagamento.
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| title | string | sim | Nome exibido no checkout |
| description | string | não | Descrição |
| amountCents | int | sim | Valor em centavos |
| methods | array | não | ["PIX"] e/ou ["CREDIT_CARD"] |
Exemplo (curl)
curl -X POST "https://zunopags.com.br/api/v1/payment-links" \
-H "Content-Type: application/json" \
-H "x-api-key: SUA_API_KEY" \
-d '{ "title": "Consultoria 1h", "amountCents": 50000, "methods": ["PIX"] }'Resposta
{ "id": "...", "slug": "consultoria-1h-ab1cd", "url": "https://zunopags.com.br/pay/consultoria-1h-ab1cd", ... }Saques
Solicite saques do saldo disponível via PIX. Saques passam por aprovação da plataforma.
/api/v1/withdrawalsListar saques
Histórico de saques com status (PENDING, APPROVED, PAID, REJECTED).
Exemplo (curl)
curl "https://zunopags.com.br/api/v1/withdrawals" -H "x-api-key: SUA_API_KEY"
Resposta
{ "data": [ { "id": "...", "amountCents": 150000, "feeCents": 367, "status": "PAID", "processedAt": "..." } ] }/api/v1/withdrawalsrequer KYCSolicitar saque
Cria uma solicitação de saque via PIX. O valor mais a tarifa sai do saldo imediatamente. Use Idempotency-Key: um reenvio por timeout não abre um segundo saque.
| Parâmetro | Tipo | Obrig. | Descrição |
|---|---|---|---|
| amountCents | int | sim | Valor em centavos (respeitando o mínimo) |
| pixKey | string | sim | Chave PIX de destino |
| pixKeyType | enum | sim | CPF, CNPJ, EMAIL, PHONE ou RANDOM |
Exemplo (curl)
curl -X POST "https://zunopags.com.br/api/v1/withdrawals" \
-H "Content-Type: application/json" \
-H "x-api-key: SUA_API_KEY" \
-d '{ "amountCents": 50000, "pixKey": "12345678900", "pixKeyType": "CPF" }'Resposta
{
"id": "...",
"amountCents": 50000,
"feeCents": 367,
"totalDebitedCents": 50367,
"status": "PENDING",
"remainingBalanceCents": 729127,
"createdAt": "..."
}Webhooks
Crie webhooks personalizados em Dashboard → Configurações → Webhooks, escolhendo os eventos que quer receber: transaction.created (PIX gerado), transaction.paid (compra aprovada) e transaction.refunded (reembolso). Cada webhook tem seu próprio secret. Enviamos POST JSON com os headers x-webhook-event (nome do evento), x-webhook-signature (HMAC SHA-256 do corpo, usando o secret do webhook), x-webhook-delivery (id da entrega) e x-webhook-attempt (número da tentativa). Valide a assinatura antes de processar. Webhooks criados antes de 18/09/2026 também recebem os nomes antigos (x-nivus-*) até você trocar para cabeçalhos neutros no painel.
// Exemplo de payload (transaction.paid)
{
"event": "transaction.paid",
"data": {
"id": "cms94...",
"status": "PAID",
"method": "PIX",
"amountCents": 19700,
"feeCents": 392,
"netCents": 19308,
"customer": { "name": "Ana Souza", "email": "ana@email.com" },
"paidAt": "2026-07-31T13:05:00.000Z"
}
}
// Validação em Node.js
const crypto = require("crypto");
const expected = crypto.createHmac("sha256", WEBHOOK_SECRET).update(rawBody).digest("hex");
const valid = expected === req.headers["x-webhook-signature"];Integração UTMify
Com a UTMify conectada (Dashboard → Integrações), todo pedido é enviado automaticamente para a UTMify seguindo a documentação oficial: o pedido entra como waiting_payment quando o PIX é gerado e é atualizado para paid/refunded conforme o status muda. Enviamos os trackingParameters (utm_source, utm_medium, utm_campaign, utm_content, utm_term, src e sck), valores, comissões, país e IP do cliente. Nos checkouts hospedados tudo é capturado da URL automaticamente; na API, envie os campos utm e customer.ip ao criar a transação.