⌘K

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.

GET/api/v1/me

Consultar 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 }
  }
}
GET/api/v1/balance

Consultar 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âmetroTipoObrig.Descrição
include_subaccountsbooleannãotrue 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.

POST/api/v1/transactionsrequer KYC

Criar cobrança PIX

Cria uma transação PIX e retorna o QR Code (data URL) e o código copia-e-cola.

ParâmetroTipoObrig.Descrição
amountCentsintsimValor em centavos (mínimo 100). Opcional se mandar productId
descriptionstringnãoDescrição da cobrança
externalRefstringnãoSeu identificador (ex: id do pedido). Dá para buscar por ele em GET /transactions?externalRef=
productIdstringnãoCobra um produto seu: preço, nome e entrega vêm do cadastro
bumpProductIdsstring[]nãoOrder bumps: outros produtos seus somados à cobrança (até 6)
postbackUrlstringnãoWebhook só desta cobrança, além dos cadastrados no painel. Assinado com o segredo do webhook do painel Desenvolvedor
addressobjectnãoEndereço de entrega: street, number, complement, neighborhood, city, state, zipcode. Volta no webhook
splitsarraynãoDivide a venda: [{ recipient, percent }] ou [{ recipient, amountCents }] (até 5). Sem este campo, valem os splits cadastrados no painel
customer.namestringnãoNome do cliente. Exigido para gerar a cobrança
customer.emailstringnãoE-mail do cliente. Exigido para gerar a cobrança
customer.documentstringnãoCPF/CNPJ do cliente. Exigido para gerar a cobrança
customer.phonestringnãoTelefone com DDD. Exigido para gerar a cobrança
customer.ipstringnãoIP do cliente (recomendado — enviado à UTMify)
utm.source / medium / campaign / content / termstringnãoParâmetros de tracking (enviados à UTMify)
utm.src / utm.sckstringnãoParâ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"
}
GET/api/v1/transactions

Listar transações

Lista transações com filtros e paginação.

ParâmetroTipoObrig.Descrição
statusenumnãoPENDING, PAID, REFUSED, REFUNDED, CHARGEBACK, EXPIRED
methodenumnãoPIX, CREDIT_CARD, BOLETO
from / toISO datenãoPeríodo de criação
externalRefstringnãoO seu identificador, enviado na criação
limitintnãoMáx. 100 (padrão 20)
offsetintnãoPaginaçã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 }
}
GET/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", ... }
POST/api/v1/transactions/{id}/refundrequer KYC

Estornar 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.

GET/api/v1/products

Listar 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 } ] }
POST/api/v1/productsrequer KYC

Criar produto

Cria um produto com checkout hospedado.

ParâmetroTipoObrig.Descrição
namestringsimNome do produto
descriptionstringnãoDescrição exibida no checkout
priceCentsintsimPreço em centavos
imageUrlstringnãoURL da imagem de capa
methodsarraynã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", ... }

Saques

Solicite saques do saldo disponível via PIX. Saques passam por aprovação da plataforma.

GET/api/v1/withdrawals

Listar 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": "..." } ] }
POST/api/v1/withdrawalsrequer KYC

Solicitar 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âmetroTipoObrig.Descrição
amountCentsintsimValor em centavos (respeitando o mínimo)
pixKeystringsimChave PIX de destino
pixKeyTypeenumsimCPF, 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.