PagzPayv1
Documentação da API · v1

Receba e envie pagamentos com a API PagzPay

Plataforma de pagamentos focada no mercado brasileiro. Cobranças PIX via QR Code, cartão de crédito (Pagar.me), transferências para qualquer chave, saldo em tempo real, split de pagamentos entre contas PagzPay e webhooks assinados — em uma API REST, sem SDK obrigatório.

Cobranças PIX com QR Code Cartão de crédito (Pagar.me) Transferências para qualquer chave Saldo em tempo real Split de pagamentos Webhooks assinados
Base URL
https://api.pagzpay.com
NotaAcesse o Dashboard e gere suas credenciais em Configurações → API Keys antes de começar.
Começando

Autenticação#

Gera um token JWT para autenticar as demais requisições. Concatene API Key:API Secret (gerados no Dashboard em Configurações → API Keys), codifique em Base64 e envie como Basic Auth. Esta rota não exige body — apenas o header Authorization. Body vazio com Content-Type: application/json (axios) ou application/x-www-form-urlencoded (PHP CURLOPT_POST) é aceito.

POST /api/auth

Como montar o header

HeaderValor
AuthorizationBasic base64(API Key:API Secret)

Resposta

CampoTipoDescrição
successbooleanIndica se a autenticação foi bem-sucedida.
tokenstringToken JWT usado nas demais requisições.
tokenTypestringSempre Bearer.
expiresInintegerValidade do token em milissegundos (60000).
Como usarUse o token retornado como Authorization: Bearer {token} em todas as chamadas seguintes.
credentials=$(echo -n "SUA_API_KEY:SEU_API_SECRET" | base64)

curl -X POST 'https://api.pagzpay.com/api/auth' \
  -H "Authorization: Basic $credentials"
const credentials = Buffer.from('SUA_API_KEY:SEU_API_SECRET').toString('base64')

const response = await fetch('https://api.pagzpay.com/api/auth', {
  method: 'POST',
  headers: {
    'Authorization': `Basic ${credentials}`
  }
})

const { token } = await response.json()
import requests
import base64

credentials = base64.b64encode(b'SUA_API_KEY:SEU_API_SECRET').decode()

response = requests.post(
    'https://api.pagzpay.com/api/auth',
    headers={'Authorization': f'Basic {credentials}'}
)

token = response.json()['token']
$credentials = base64_encode('SUA_API_KEY:SEU_API_SECRET');

$ch = curl_init('https://api.pagzpay.com/api/auth');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Basic ' . $credentials,
    'Accept: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = json_decode(curl_exec($ch), true);
$token = $response['token'];
response200 OK
{
  "success": true,
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "tokenType": "Bearer",
  "expiresIn": 60000
}
Começando

Valores monetários#

Todos os valores enviados e recebidos pela API são centavos, em inteiros — nunca reais fracionados. A única exceção é o endpoint de saldo, que retorna reais como string com duas casas decimais.

Valor em reaisEnviar na API
R$ 1,00100
R$ 10,501050
R$ 150,0015000
AtençãoNunca envie valores com ponto ou vírgula decimal. 10.50 será interpretado de forma incorreta — envie 1050.
exemploJSON
{
  "amountInCents": 15000
}
PIX IN · Receber

Criar QR Code#

Cria um QR Code PIX para receber um pagamento imediato. Retorna o código EMV (copia e cola) e a imagem do QR Code em Base64, prontos para exibir ao seu cliente.

POST /api/v1/pix/in/qrcode
Confirmação automáticaInforme postbackUrl e você recebe uma notificação assim que o pagamento for confirmado, sem precisar fazer polling.

Corpo da requisição

CampoTipoObrig.Descrição
amountInCentsintegerSimValor da cobrança em centavos (mínimo R$ 1,00).
customerobjectSimDados do pagador — documentType e document obrigatórios.
descriptionstringNãoAté 140 caracteres. Aparece no extrato do pagador.
postbackUrlstringNãoURL de confirmação do pagamento. Pode incluir UTMs na query — ver Rastreamento UTMs.
trackingParametersobjectNãoUTMs e click IDs para Utmify/atribuição. Obrigatório na prática se você usa API + Utmify. Ver Rastreamento UTMs.
itemsarrayNãoItens do pedido: title (nome real do produto), imageUrl (foto do produto), tangible, quantity, amountInCents.
salesSiteUrlstringNãoURL do site onde o produto é vendido — ver Dados do produto.
checkoutUrlstringNãoURL da página de checkout onde o pagamento foi feito — ver Dados do produto.
supportContactobjectNãoContato de suporte do vendedor: email, phone, whatsapp e/ou url — ver Dados do produto.
splitsarrayNãoDistribui o valor líquido para outras empresas PagzPay. Ver Split de pagamentos.

Objeto customer

CampoTipoObrig.Descrição
documentTypestringSimcpf ou cnpj.
documentstringSimApenas dígitos, sem pontuação.
namestringNãoNome completo do pagador.
emailstringNãoE-mail válido do pagador.
phonestringNãoTelefone de contato.
billingAddressobjectNãostreet, number, neighborhood, city, state, zipCode.
curl -X POST 'https://api.pagzpay.com/api/v1/pix/in/qrcode' \
  -H 'Authorization: Bearer SEU_TOKEN_AQUI' \
  -H 'Content-Type: application/json' \
  -d '{
    "amountInCents": 5000,
    "description": "Pagamento de serviços",
    "postbackUrl": "https://exemplo.com.br/webhook",
    "customer": {
      "name": "João Silva",
      "email": "joao@exemplo.com",
      "documentType": "cpf",
      "document": "11122233344",
      "phone": "(11) 91234-5678"
    },
    "trackingParameters": {
      "src": "facebook",
      "sck": "sck-exemplo",
      "utm_source": "meta",
      "utm_campaign": "campanha-exemplo",
      "utm_medium": "cpc",
      "utm_content": "criativo-1",
      "utm_term": "tenis",
      "fbclid": "fbclid-exemplo",
      "gclid": "gclid-exemplo",
      "ttclid": "ttclid-exemplo",
      "xcod": "xcod-exemplo"
    }
  }'
const response = await fetch('https://api.pagzpay.com/api/v1/pix/in/qrcode', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer SEU_TOKEN_AQUI',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    amountInCents: 5000,
    description: 'Pagamento de serviços',
    postbackUrl: 'https://exemplo.com.br/webhook',
    customer: {
      name: 'João Silva',
      email: 'joao@exemplo.com',
      documentType: 'cpf',
      document: '11122233344',
      phone: '(11) 91234-5678'
    },
    trackingParameters: {
      src: 'facebook',
      sck: 'sck-exemplo',
      utm_source: 'meta',
      utm_campaign: 'campanha-exemplo',
      utm_medium: 'cpc',
      utm_content: 'criativo-1',
      utm_term: 'tenis',
      fbclid: 'fbclid-exemplo',
      gclid: 'gclid-exemplo',
      ttclid: 'ttclid-exemplo',
      xcod: 'xcod-exemplo'
    }
  })
})

const { data } = await response.json()
console.log(data.pix.emv)    // código copia e cola
console.log(data.pix.qrCode) // imagem Base64
import requests

response = requests.post(
    'https://api.pagzpay.com/api/v1/pix/in/qrcode',
    headers={
        'Authorization': 'Bearer SEU_TOKEN_AQUI',
        'Content-Type': 'application/json'
    },
    json={
        'amountInCents': 5000,
        'description': 'Pagamento de servicos',
        'postbackUrl': 'https://exemplo.com.br/webhook',
        'customer': {
            'name': 'Joao Silva',
            'email': 'joao@exemplo.com',
            'documentType': 'cpf',
            'document': '11122233344',
            'phone': '(11) 91234-5678'
        },
        'trackingParameters': {
            'src': 'facebook',
            'sck': 'sck-exemplo',
            'utm_source': 'meta',
            'utm_campaign': 'campanha-exemplo',
            'utm_medium': 'cpc',
            'utm_content': 'criativo-1',
            'utm_term': 'tenis',
            'fbclid': 'fbclid-exemplo',
            'gclid': 'gclid-exemplo',
            'ttclid': 'ttclid-exemplo',
            'xcod': 'xcod-exemplo'
        }
    }
)

data = response.json()['data']
print(data['pix']['emv'])
$payload = json_encode([
    'amountInCents' => 5000,
    'description' => 'Pagamento de servicos',
    'postbackUrl' => 'https://exemplo.com.br/webhook',
    'customer' => [
        'name' => 'Joao Silva',
        'email' => 'joao@exemplo.com',
        'documentType' => 'cpf',
        'document' => '11122233344',
        'phone' => '(11) 91234-5678'
    ],
    'trackingParameters' => [
        'src' => 'facebook',
        'sck' => 'sck-exemplo',
        'utm_source' => 'meta',
        'utm_campaign' => 'campanha-exemplo',
        'utm_medium' => 'cpc',
        'utm_content' => 'criativo-1',
        'utm_term' => 'tenis',
        'fbclid' => 'fbclid-exemplo',
        'gclid' => 'gclid-exemplo',
        'ttclid' => 'ttclid-exemplo',
        'xcod' => 'xcod-exemplo'
    ]
]);

$ch = curl_init('https://api.pagzpay.com/api/v1/pix/in/qrcode');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = json_decode(curl_exec($ch), true);
response200 OK
{
  "success": true,
  "message": "Transação criada com sucesso",
  "data": {
    "id": "trx_1a2b3c4d5e6f7g8h9i0j",
    "pix": {
      "emv": "00020126580014br.gov.bcb.pix0136...",
      "qrCode": "iVBORw0KGgo..."
    },
    "status": "pending",
    "fees": 0
  }
}
PIX IN · Integrações

Rastreamento (UTMs / Utmify)#

Dois jeitos de receber PIX no PagzPay — checkout hospedado ou API. A Utmify recebe a venda nos dois casos, mas a forma de enviar UTMs é diferente. Escolha o fluxo que você usa e siga a configuração abaixo.

Passo 0 (os dois fluxos)No Dashboard → Integrações → Utmify: token da Utmify + integração ativa.

Qual fluxo é o seu?

Checkout hospedadoAPI PIX
PagamentoPágina PagzPay (link de checkout)Seu site/app gera QR via API
UTMsNa URL do checkoutObjeto trackingParameters no JSON
Automático?Sim — página captura query/cookiesNão — você monta o body
ReferênciaConfigurar checkout ↓Configurar API ↓
Funil com landing + checkoutUTMs só na landing (ex. seusite.com/?utm_...) não saltam sozinhas para outro domínio. No checkout: UTMs na URL do link PagzPay. Na API: trackingParameters no POST.
Fluxo 1

Checkout hospedado

Link criado no PagzPay — ex. https://checkout.pagzpay.com/{slug}/{token} ou domínio custom /checkout/{token}.

  1. Crie/copie o link em Checkout no dashboard.
  2. No redirect do funil (Skale, Meta, etc.), aponte para o checkout com query UTM:
    …/seu-token?utm_source=meta&utm_campaign=natal&utm_medium=cpc
  3. Cliente abre, paga PIX — a página PagzPay grava UTMs e envia à Utmify ao confirmar.
  4. Teste: abra o link do checkout já com ?utm_source=teste&utm_campaign=doc e confira a venda na Utmify.

Não precisa chamar POST /qrcode nem enviar trackingParameters manualmente neste fluxo.

Fluxo 2

API PIX

Sua aplicação chama POST /api/v1/pix/in/qrcode (ou /cob).

  1. Autentique com POST /api/auth (Bearer nas próximas chamadas).
  2. Inclua trackingParameters no body — não use tracking ou utms.
  3. Preencha a partir da URL do funil (front) ou sessão/query (back-end).
  4. Opcional: UTMs na query da postbackUrl (body tem prioridade).
  5. customer: documentType + document (não cpf).

Campos de trackingParameters

CampoDescrição
utm_*source, campaign, medium, content, term
src, sck, xcodUtmify
fbclid, gclid, ttclidClick IDs

Validar

Metadata da venda com trackingParameters · Dashboard → Integrações → Utmify → Reenviar (ID da transação).

API · Node.js
const q = new URLSearchParams(window.location.search)
const trackingParameters = {
  src: q.get('src'),
  sck: q.get('sck'),
  utm_source: q.get('utm_source'),
  utm_campaign: q.get('utm_campaign'),
  utm_medium: q.get('utm_medium'),
  utm_content: q.get('utm_content'),
  utm_term: q.get('utm_term'),
  fbclid: q.get('fbclid'),
  gclid: q.get('gclid'),
  ttclid: q.get('ttclid'),
  xcod: q.get('xcod'),
}

await fetch('https://api.pagzpay.com/api/v1/pix/in/qrcode', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    amountInCents: 3590,
    customer: {
      name: 'Cliente',
      documentType: 'cpf',
      document: '11122233344',
      email: 'cliente@exemplo.com',
    },
    trackingParameters,
  }),
})
PIX IN · Cartão

Dados do produto (compliance)#

A adquirente pede informações sobre o que está sendo vendido para análise de compliance. Na API esses campos são opcionais — a cobrança funciona sem eles —, mas recomendamos enviá-los sempre que possível. O PagzPay repassa tudo à adquirente junto com o pedido.

Campos

Valem para POST /api/v1/pix/in/qrcode e POST /api/v1/card.

CampoTipoDescrição
items[].titlestringNome real do produto.
items[].imageUrlstring (URL)URL pública da foto real do produto.
salesSiteUrlstring (URL)URL do site onde o produto é vendido.
checkoutUrlstring (URL)URL da página de checkout onde o pagamento foi feito.
supportContact.emailstringE-mail de suporte do vendedor.
supportContact.phonestringTelefone de suporte com DDD.
supportContact.whatsappstringWhatsApp de suporte com DDD.
supportContact.urlstring (URL)Site ou página de ajuda.

Em supportContact, envie os canais que preferir. URLs precisam ser completas (com https://) e a foto precisa estar acessível publicamente.

Checkout hospedado PagzPayNo checkout builder, nome do produto, foto do produto e ao menos um contato de suporte são obrigatórios. O contato aparece no rodapé do checkout, e esses dados, junto com a URL do checkout e a página de origem do comprador, são enviados automaticamente.
cURL · PIX com dados do produto
curl -X POST 'https://api.pagzpay.com/api/v1/pix/in/qrcode' \
  -H 'Authorization: Bearer SEU_TOKEN_AQUI' \
  -H 'Content-Type: application/json' \
  -d '{
    "amountInCents": 9790,
    "description": "Pedido #4321",
    "customer": {
      "name": "Ana Lima",
      "email": "ana@exemplo.com",
      "documentType": "cpf",
      "document": "12345678909"
    },
    "items": [
      {
        "title": "Tênis Corrida Pro",
        "imageUrl": "https://minhaloja.com.br/img/tenis-corrida-pro.jpg",
        "tangible": true,
        "quantity": 1,
        "amountInCents": 9790
      }
    ],
    "salesSiteUrl": "https://minhaloja.com.br",
    "checkoutUrl": "https://minhaloja.com.br/checkout/4321",
    "supportContact": {
      "email": "suporte@minhaloja.com.br",
      "whatsapp": "(11) 99999-0000"
    }
  }'
PIX IN · Receber

Consultar QR Code#

Consulta uma cobrança PIX criada anteriormente e retorna o EMV, a imagem do QR Code e o status atual.

GET /api/v1/pix/in/qrcode/:transactionId

Parâmetro de rota

ParâmetroTipoDescrição
transactionIdstringID da transação retornado na criação do QR Code.

Status possíveis

StatusSignificado
pendingCobrança criada, aguardando pagamento.
paidCobrança paga e liquidada.
canceledCobrança cancelada.
refundedCobrança devolvida ao pagador.
curl -X GET 'https://api.pagzpay.com/api/v1/pix/in/qrcode/trx_1a2b3c4d5e6f7g8h9i0j' \
  -H 'Authorization: Bearer SEU_TOKEN_AQUI'
const transactionId = 'trx_1a2b3c4d5e6f7g8h9i0j'

const response = await fetch(
  `https://api.pagzpay.com/api/v1/pix/in/qrcode/${transactionId}`,
  { headers: { 'Authorization': 'Bearer SEU_TOKEN_AQUI' } }
)

const { data } = await response.json()
console.log(data.pix.emv)
import requests

transaction_id = 'trx_1a2b3c4d5e6f7g8h9i0j'
response = requests.get(
    f'https://api.pagzpay.com/api/v1/pix/in/qrcode/{transaction_id}',
    headers={'Authorization': 'Bearer SEU_TOKEN_AQUI'}
)

data = response.json()['data']
print(data['pix']['emv'])
$transactionId = 'trx_1a2b3c4d5e6f7g8h9i0j';

$ch = curl_init("https://api.pagzpay.com/api/v1/pix/in/qrcode/{$transactionId}");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = json_decode(curl_exec($ch), true);
response200 OK
{
  "success": true,
  "message": "QR Code PIX encontrado com sucesso",
  "data": {
    "id": "trx_1a2b3c4d5e6f7g8h9i0j",
    "pix": {
      "emv": "00020126580014br.gov.bcb.pix0136...",
      "qrCode": "iVBORw0KGgo..."
    },
    "status": "pending",
    "fees": 0
  }
}
Cartão · PCI

Tokenização (Pagar.me)#

Na integração direta (POST /api/v1/card), não envie PAN/CVV para a PagzPay. Gere um token no browser (ou app) chamando a API da Pagar.me com a chave pública da conta.

Chave pública — Use a public key Pagar.me (pk_test_… / pk_…) vinculada à adquirente de cartão da sua empresa. No checkout hospedado, ela vem em paymentCapabilities.card.publicKey na carga pública do link.
POST https://api.pagar.me/core/v5/tokens?appId=PUBLIC_KEY

Body (JSON)

CampoDescrição
typeSempre card.
card.numberSó dígitos.
card.holder_nameNome impresso.
card.exp_month / exp_yearEx.: 12 e 28 (AA).
card.cvvCVV — nunca persista nem envie à PagzPay.

Resposta: { "id": "token_…" } — use em card.token no POST /api/v1/card.

request
curl -X POST 'https://api.pagar.me/core/v5/tokens?appId=pk_test_XXXX' \
  -H 'Content-Type: application/json' \
  -d '{
    "type": "card",
    "card": {
      "number": "4111111111111111",
      "holder_name": "JOAO SILVA",
      "exp_month": "12",
      "exp_year": "28",
      "cvv": "123"
    }
  }'
response200 OK
{
  "id": "token_xxxxxxxx",
  "type": "card",
  "created_at": "2026-01-15T12:00:00Z"
}
Cartão · Receber

Criar cobrança com cartão#

Cria uma cobrança com cartão de crédito via adquirente Pagar.me. Disponível quando a empresa tem adquirente de cartão configurada no admin (cardAdquirenceId).

POST /api/v1/card
Endereço obrigatórioO objeto customer.billingAddress é obrigatório (rua, número, bairro, cidade, UF, CEP).
PCIPrefira enviar card.token (token Pagar.me gerado no browser) em vez de PAN (number, cvv).

Corpo da requisição

CampoTipoObrig.Descrição
amountInCentsintegerSimValor em centavos (mínimo R$ 1,00).
customerobjectSimMesmo formato do PIX + billingAddress obrigatório.
cardobjectSimholderName, installments (1–12). Token ou PAN + validade + CVV.
descriptionstringNãoDescrição da cobrança.
postbackUrlstringNãoURL de callback quando o status mudar.
trackingParametersobjectNãoUTMs para Utmify — ver Rastreamento UTMs.
items, salesSiteUrl, checkoutUrl, supportContact—NãoDados do produto para compliance, mesmo formato do PIX — ver Dados do produto.

Status comuns na resposta

StatusSignificado
paidAprovado na adquirente.
pendingEm análise ou processamento.
refusedRecusado pelo emissor/adquirente.
curl -X POST 'https://api.pagzpay.com/api/v1/card' \
  -H 'Authorization: Bearer SEU_TOKEN_AQUI' \
  -H 'Content-Type: application/json' \
  -d '{
    "amountInCents": 5000,
    "postbackUrl": "https://exemplo.com.br/webhook",
    "customer": {
      "name": "João Silva",
      "email": "joao@exemplo.com",
      "documentType": "cpf",
      "document": "11122233344",
      "billingAddress": {
        "street": "Av. Paulista",
        "number": "1000",
        "neighborhood": "Bela Vista",
        "city": "São Paulo",
        "state": "SP",
        "zipCode": "01310100"
      }
    },
    "card": {
      "token": "tok_xxxxxxxx",
      "holderName": "JOAO SILVA",
      "installments": 1
    },
    "trackingParameters": {
      "src": "facebook",
      "sck": "sck-exemplo",
      "utm_source": "meta",
      "utm_campaign": "campanha-exemplo",
      "utm_medium": "cpc",
      "utm_content": "criativo-1",
      "utm_term": "tenis",
      "fbclid": "fbclid-exemplo",
      "gclid": "gclid-exemplo",
      "ttclid": "ttclid-exemplo",
      "xcod": "xcod-exemplo"
    }
  }'
const response = await fetch('https://api.pagzpay.com/api/v1/card', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer SEU_TOKEN_AQUI',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    amountInCents: 5000,
    customer: {
      name: 'João Silva',
      email: 'joao@exemplo.com',
      documentType: 'cpf',
      document: '11122233344',
      billingAddress: {
        street: 'Av. Paulista',
        number: '1000',
        neighborhood: 'Bela Vista',
        city: 'São Paulo',
        state: 'SP',
        zipCode: '01310100',
      },
    },
    card: { token: 'tok_xxxxxxxx', holderName: 'JOAO SILVA', installments: 1 },
    trackingParameters: {
      src: 'facebook',
      sck: 'sck-exemplo',
      utm_source: 'meta',
      utm_campaign: 'campanha-exemplo',
      utm_medium: 'cpc',
      utm_content: 'criativo-1',
      utm_term: 'tenis',
      fbclid: 'fbclid-exemplo',
      gclid: 'gclid-exemplo',
      ttclid: 'ttclid-exemplo',
      xcod: 'xcod-exemplo',
    },
  }),
})
response201 Created
{
  "success": true,
  "message": "Transação criada com sucesso",
  "data": {
    "id": "trx_1a2b3c4d5e6f7g8h9i0j",
    "card": {
      "token": "tok_xxxxxxxx",
      "brand": "visa",
      "last4": "4242"
    },
    "status": "paid",
    "fees": 150
  }
}
Cartão · Receber

Consultar cobrança#

Após POST /api/v1/card, use o id retornado para consultar status e detalhes (mesmo endpoint serve PIX e cartão).

GET /api/v1/transactions/transactionId
GET /api/v1/transactions/transactionId/status

Status comuns (cartão)

StatusSignificado
paidAprovado e confirmado.
pendingEm análise ou aguardando confirmação.
refusedRecusado pela adquirente.
refund / chargebackEstorno ou chargeback.

O endpoint /status retorna só { "success": true, "status": "paid" } — útil para polling leve.

consulta completa
curl -X GET 'https://api.pagzpay.com/api/v1/transactions/trx_abc123' \
  -H 'Authorization: Bearer SEU_TOKEN_AQUI'
response (trecho)200 OK
{
  "success": true,
  "data": {
    "id": "trx_abc123",
    "status": "paid",
    "paymentMethod": "credit_card",
    "amount": 5000,
    "fees": 150,
    "Card": {
      "brand": "visa",
      "last4": "1111"
    }
  }
}
Cartão · Checkout

Checkout hospedado com cartão#

Quando o cliente paga em um link de checkout PagzPay, você pode oferecer cartão junto com PIX — sem integrar a API de cartão no seu backend.

Como habilitar

  1. No admin PagzPay, configure o roteamento de cartão (global ou por empresa) para Pagar.me.
  2. No builder do checkout, marque Cartão de crédito em métodos aceitos.
  3. A página pública retorna paymentCapabilities.card (inclui publicKey para tokenização no browser).
  4. O comprador envia o pagamento; o front chama a rota abaixo (sem Bearer do lojista).

Rota de pagamento (pública)

POST /checkout/token/pay/card

Base URL: https://api.pagzpay.com (mesma API; rota pública do checkout).

Consultar status

GET /checkout/token/status/transactionId

Mesmo fluxo de polling usado para PIX no checkout hospedado.

UTMs no checkoutParâmetros na URL do link são capturados automaticamente — ver Rastreamento UTMs.
PIX OUT · Enviar

Enviar transferência#

Realiza uma transferência PIX para qualquer chave PIX.

POST /api/v1/pix/out/pixkey
IrreversívelA transferência não pode ser desfeita após processada. Verifique a chave PIX antes de enviar e sempre use o header x-idempotency-key — ver Idempotência.

Tipos de chave PIX aceitos

TipoFormatoExemplo
CPFApenas dígitos11122233344
CNPJApenas dígitos11222333000181
E-mailEmail válidodestino@email.com
TelefoneCom +55+5511999999999
Chave aleatóriaUUID123e4567-e89b-...

Headers

HeaderObrig.Descrição
x-idempotency-keySimUUID único por operação — evita transferências duplicadas em caso de retry.

Corpo da requisição

CampoTipoObrig.Descrição
pixKeystringSimChave PIX de destino.
amountintegerSimValor da transferência em centavos.
currencystringNãoMoeda — apenas BRL (padrão).
descriptionstringNãoAté 140 caracteres.
postbackUrlstringNãoURL para receber notificação de status da transferência.
curl -X POST 'https://api.pagzpay.com/api/v1/pix/out/pixkey' \
  -H 'Authorization: Bearer SEU_TOKEN_AQUI' \
  -H 'Content-Type: application/json' \
  -H 'x-idempotency-key: 550e8400-e29b-41d4-a716-446655440000' \
  -d '{
    "pixKey": "fornecedor@exemplo.com",
    "amount": 10000,
    "currency": "BRL",
    "description": "Pagamento de fornecedor",
    "postbackUrl": "https://exemplo.com.br/webhook/pix-out"
  }'
const { randomUUID } = require('crypto')

const response = await fetch('https://api.pagzpay.com/api/v1/pix/out/pixkey', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer SEU_TOKEN_AQUI',
    'Content-Type': 'application/json',
    'x-idempotency-key': randomUUID()
  },
  body: JSON.stringify({
    pixKey: 'fornecedor@exemplo.com',
    amount: 10000,
    currency: 'BRL',
    description: 'Pagamento de fornecedor',
    postbackUrl: 'https://exemplo.com.br/webhook/pix-out'
  })
})

const { data } = await response.json()
console.log(data.status) // 'pending'
import requests
import uuid

response = requests.post(
    'https://api.pagzpay.com/api/v1/pix/out/pixkey',
    headers={
        'Authorization': 'Bearer SEU_TOKEN_AQUI',
        'Content-Type': 'application/json',
        'x-idempotency-key': str(uuid.uuid4())
    },
    json={
        'pixKey': 'fornecedor@exemplo.com',
        'amount': 10000,
        'currency': 'BRL',
        'description': 'Pagamento de fornecedor',
        'postbackUrl': 'https://exemplo.com.br/webhook/pix-out'
    }
)

data = response.json()['data']
print(data['status'])
$payload = json_encode([
    'pixKey' => 'fornecedor@exemplo.com',
    'amount' => 10000,
    'currency' => 'BRL',
    'description' => 'Pagamento de fornecedor',
    'postbackUrl' => 'https://exemplo.com.br/webhook/pix-out'
]);

$ch = curl_init('https://api.pagzpay.com/api/v1/pix/out/pixkey');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI',
    'Content-Type: application/json',
    'x-idempotency-key: ' . bin2hex(random_bytes(16))
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = json_decode(curl_exec($ch), true);
response200 OK
{
  "success": true,
  "message": "Transferência criada com sucesso",
  "data": {
    "id": "transfer_abc123def456",
    "status": "pending",
    "amount": 10000,
    "netAmount": 10000,
    "fees": 0,
    "pixKey": "fornecedor@exemplo.com"
  }
}
PIX OUT · Enviar

Consultar transferência#

Consulta uma transferência PIX criada anteriormente e retorna o status atual.

GET /api/v1/pix/out/pixkey/:transferId

Status possíveis

StatusSignificado
queued / processingRecebida, aguardando processamento.
pending / pending_analysisEm análise antes do envio bancário.
banking_processingEnviada ao banco, aguardando confirmação.
manual_analysisRetida para revisão manual.
completedTransferência concluída com sucesso.
canceled / refusedCancelada ou recusada — não foi debitada.
banking_refused / banking_error / errorFalha no envio bancário.
curl -X GET 'https://api.pagzpay.com/api/v1/pix/out/pixkey/transfer_abc123def456' \
  -H 'Authorization: Bearer SEU_TOKEN_AQUI'
const transferId = 'transfer_abc123def456'

const response = await fetch(
  `https://api.pagzpay.com/api/v1/pix/out/pixkey/${transferId}`,
  { headers: { 'Authorization': 'Bearer SEU_TOKEN_AQUI' } }
)

const { data } = await response.json()
console.log(data.status)
import requests

transfer_id = 'transfer_abc123def456'
response = requests.get(
    f'https://api.pagzpay.com/api/v1/pix/out/pixkey/{transfer_id}',
    headers={'Authorization': 'Bearer SEU_TOKEN_AQUI'}
)

data = response.json()['data']
print(data['status'])
$transferId = 'transfer_abc123def456';

$ch = curl_init("https://api.pagzpay.com/api/v1/pix/out/pixkey/{$transferId}");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = json_decode(curl_exec($ch), true);
response200 OK
{
  "success": true,
  "data": {
    "id": "transfer_abc123def456",
    "status": "completed",
    "amount": 10000,
    "netAmount": 10000,
    "fees": 0,
    "pixKey": "fornecedor@exemplo.com",
    "endToEndId": "E1234567820241231000000000000002",
    "createdAt": "2026-01-15T13:44:25.838Z",
    "updatedAt": "2026-01-15T13:45:10.120Z",
    "processedAt": "2026-01-15T13:45:10.120Z"
  }
}
Conta

Consultar saldo#

Retorna os saldos atuais das carteiras da empresa autenticada. Os valores são retornados em reais, como string com 2 casas decimais (ex: "150.00") — a única exceção à regra de centavos da API.

GET /api/v1/balance

Carteiras retornadas

CampoDescrição
pix.balanceSaldo livre, disponível para uso e transferências.
pixBlocked.balanceSaldo bloqueado por cautelar ou MED (indisponível).
reserve.balanceValor em reserva, aguardando liquidação.
curl -X GET 'https://api.pagzpay.com/api/v1/balance' \
  -H 'Authorization: Bearer SEU_TOKEN_AQUI'
const response = await fetch('https://api.pagzpay.com/api/v1/balance', {
  headers: { 'Authorization': 'Bearer SEU_TOKEN_AQUI' }
})

const { data } = await response.json()
console.log('Saldo disponível: R$', data.pix.balance)
console.log('Bloqueado: R$',        data.pixBlocked.balance)
console.log('Reserva: R$',          data.reserve.balance)
import requests

response = requests.get(
    'https://api.pagzpay.com/api/v1/balance',
    headers={'Authorization': 'Bearer SEU_TOKEN_AQUI'}
)

data = response.json()['data']
print(f"Saldo disponivel: R$ {data['pix']['balance']}")
print(f"Bloqueado:        R$ {data['pixBlocked']['balance']}")
print(f"Reserva:          R$ {data['reserve']['balance']}")
$ch = curl_init('https://api.pagzpay.com/api/v1/balance');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = json_decode(curl_exec($ch), true);
$saldo = $response['data']['pix']['balance'];
echo "Saldo disponivel: R$ {$saldo}";
response200 OK
{
  "success": true,
  "data": {
    "pix": { "balance": "1250.00" },
    "pixBlocked": { "balance": "0.00" },
    "reserve": { "balance": "300.00" }
  }
}
Webhooks

Como funcionam#

Configure uma URL e escolha quais eventos deseja monitorar. O PagzPay envia um POST com o payload do evento para a URL configurada. Além dos webhooks cadastrados em /api/v1/webhook, quando uma cobrança ou transferência é criada com postbackUrl, o mesmo callback também é enviado para essa URL.

Eventos disponíveis

FluxoEventoQuando é enviado
PIX INtransaction_createdCobrança PIX criada.
PIX INtransaction_paidCobrança PIX paga.
PIX INtransaction_refundedCobrança PIX estornada.
PIX INtransaction_updatedCobrança PIX atualizada com outro status.
PIX INinfractionInfração/MED criada ou atualizada para uma cobrança.
PIX OUTtransfer_createdTransferência PIX criada.
PIX OUTtransfer_updatedTransferência PIX atualizada com outro status.
PIX OUTtransfer_completedTransferência PIX concluída.
PIX OUTtransfer_canceledTransferência PIX cancelada ou recusada.

Headers enviados no callback

HeaderValor
Content-Typeapplication/json
User-AgentPagzPay
PagzPay-SignatureHMAC-SHA256 no formato t={timestamp},v1={hash} — apenas quando o webhook possui signatureSecret.
ReentregaEm caso de falha na entrega, o mesmo evento pode ser reenviado. Processe de forma idempotente pelo id da transação, transferência ou disparo do webhook.
Webhooks

Listar webhooks#

Retorna todos os webhooks configurados na sua conta.

GET /api/v1/webhook

Objeto Webhook

CampoTipoDescrição
idintegerID único do webhook.
namestringNome do webhook, se definido.
urlstringURL que recebe as notificações.
eventsarrayEventos configurados.
isActivebooleanSe o webhook está ativo.
signatureSecretstringSecret para validar a assinatura HMAC dos callbacks.
curl -X GET 'https://api.pagzpay.com/api/v1/webhook' \
  -H 'Authorization: Bearer SEU_TOKEN_AQUI'
const response = await fetch('https://api.pagzpay.com/api/v1/webhook', {
  headers: { 'Authorization': 'Bearer SEU_TOKEN_AQUI' }
})
const { data } = await response.json()
const { webhooks } = data
import requests

response = requests.get(
    'https://api.pagzpay.com/api/v1/webhook',
    headers={'Authorization': 'Bearer SEU_TOKEN_AQUI'}
)
webhooks = response.json()['data']['webhooks']
$ch = curl_init('https://api.pagzpay.com/api/v1/webhook');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = json_decode(curl_exec($ch), true);
$webhooks = $response['data']['webhooks'];
response200 OK
{
  "success": true,
  "data": {
    "webhooks": [
      {
        "id": 123,
        "name": "Meu webhook",
        "url": "https://exemplo.com.br/webhook",
        "events": ["transaction_paid", "transfer_completed"],
        "isActive": true,
        "signatureSecret": "secret_abc123",
        "createdAt": "2024-12-31T12:00:00Z"
      }
    ],
    "pagination": {
      "offset": 0, "pageSize": 10, "totalCount": 1,
      "currentPage": 1, "totalPages": 1,
      "hasNext": false, "hasPrevious": false
    }
  }
}
Webhooks

Criar webhook#

Configura um novo endpoint de webhook para receber notificações de eventos.

POST /api/v1/webhook

Corpo da requisição

CampoTipoObrig.Descrição
urlstringSimURL HTTPS que receberá as notificações via POST.
eventsarraySimEventos que devem disparar a notificação (mín. 1).

Validando a assinatura

O PagzPay envia um signatureSecret na criação. Use-o para validar que as notificações são legítimas via HMAC-SHA256:

verificaçãoNode.js
const crypto = require('crypto')

function isValidPagzPayWebhook(payload, signature, secret) {
  const [timestampPart, signaturePart] = signature.split(',')
  const timestamp = timestampPart.replace('t=', '')
  const receivedSignature = signaturePart.replace('v1=', '')

  const expected = crypto
    .createHmac('sha256', secret)
    .update(`${timestamp}.${JSON.stringify(payload)}`)
    .digest('hex')

  return expected === receivedSignature
}
curl -X POST 'https://api.pagzpay.com/api/v1/webhook' \
  -H 'Authorization: Bearer SEU_TOKEN_AQUI' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://exemplo.com.br/webhook",
    "events": ["transaction_paid", "transfer_completed"]
  }'
const response = await fetch('https://api.pagzpay.com/api/v1/webhook', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer SEU_TOKEN_AQUI',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    url: 'https://exemplo.com.br/webhook',
    events: ['transaction_paid', 'transfer_completed']
  })
})

const webhook = await response.json()
import requests

response = requests.post(
    'https://api.pagzpay.com/api/v1/webhook',
    headers={
        'Authorization': 'Bearer SEU_TOKEN_AQUI',
        'Content-Type': 'application/json'
    },
    json={
        'url': 'https://exemplo.com.br/webhook',
        'events': ['transaction_paid', 'transfer_completed']
    }
)
$payload = json_encode([
    'url' => 'https://exemplo.com.br/webhook',
    'events' => ['transaction_paid', 'transfer_completed']
]);

$ch = curl_init('https://api.pagzpay.com/api/v1/webhook');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = json_decode(curl_exec($ch), true);
response201 Created
{
  "success": true,
  "data": {
    "id": 123,
    "name": "Meu webhook",
    "url": "https://exemplo.com.br/webhook",
    "events": ["transaction_paid", "transfer_completed"],
    "isActive": true,
    "signatureSecret": "secret_abc123",
    "createdAt": "2024-12-31T12:00:00Z"
  }
}
Webhooks

Remover webhook#

Remove um webhook permanentemente pelo seu ID.

DEL /api/v1/webhook/:id
IrreversívelO webhook deixará de receber notificações imediatamente.

Parâmetro de rota

ParâmetroTipoDescrição
idstringID do webhook a ser removido.
curl -X DELETE 'https://api.pagzpay.com/api/v1/webhook/webhook_abc123xyz' \
  -H 'Authorization: Bearer SEU_TOKEN_AQUI'
const webhookId = 'webhook_abc123xyz'

const response = await fetch(
  `https://api.pagzpay.com/api/v1/webhook/${webhookId}`,
  { method: 'DELETE', headers: { 'Authorization': 'Bearer SEU_TOKEN_AQUI' } }
)

if (response.status === 200) {
  console.log('Webhook removido com sucesso')
}
import requests

webhook_id = 'webhook_abc123xyz'

response = requests.delete(
    f'https://api.pagzpay.com/api/v1/webhook/{webhook_id}',
    headers={'Authorization': 'Bearer SEU_TOKEN_AQUI'}
)

if response.status_code == 200:
    print('Webhook removido com sucesso')
$webhookId = 'webhook_abc123xyz';

$ch = curl_init("https://api.pagzpay.com/api/v1/webhook/{$webhookId}");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode === 200) {
    echo 'Webhook removido com sucesso';
}
response200 OK
{ "success": true }
Webhooks · Formato

Formato: pagamento#

Enviado nos eventos transaction_created, transaction_paid, transaction_refunded e transaction_updated. Referência de formato — não é uma rota da API.

callbackPOST
{
  "id": "8d0f3b8f-5c2f-4a10-8dd6-8bbf5e9b1d11",
  "type": "transaction",
  "event": "transaction_paid",
  "scope": "user",
  "transaction": {
    "id": "transaction_abc123",
    "amount": 5000,
    "status": "paid",
    "pix": {
      "endToEndId": "E1234567820241231000000000000001",
      "payerInfo": {
        "name": "Joao Silva",
        "document": "11122233344"
      }
    }
  }
}
Webhooks · Formato

Formato: transferência#

Enviado nos eventos transfer_created, transfer_updated, transfer_completed e transfer_canceled. Referência de formato — não é uma rota da API.

callbackPOST
{
  "id": "5f9e0c94-60a4-4df8-bb81-7f6efc6f61b0",
  "type": "transfer",
  "event": "transfer_completed",
  "scope": "user",
  "transfer": {
    "id": "transfer_abc123",
    "amount": 10000,
    "status": "paid",
    "pix": {
      "endToEndId": "E1234567820241231000000000000002",
      "creditorAccount": {
        "name": "Fornecedor Exemplo",
        "document": "12345678000199"
      }
    }
  }
}
Webhooks · Formato

Formato: infração#

Enviado no evento infraction, quando uma infração ou MED é criada ou atualizada para uma cobrança PIX. Referência de formato — não é uma rota da API.

callbackPOST
{
  "id": "3db3ac40-a069-45e6-8cb8-6d55d09f516d",
  "type": "infraction",
  "event": "infraction",
  "scope": "user",
  "infraction": {
    "id": "infraction_abc123",
    "amount": 5000,
    "status": "OPEN",
    "pix": {
      "endToEndId": "E1234567820241231000000000000001"
    }
  },
  "transaction": {
    "id": "transaction_abc123",
    "amount": 5000,
    "status": "infraction",
    "pix": {
      "endToEndId": "E1234567820241231000000000000001",
      "payerInfo": {
        "name": "Joao Silva",
        "document": "11122233344"
      }
    }
  }
}
Infrações (MED)

Como funcionam#

O MED (Mecanismo Especial de Devolução) é o processo do Banco Central para contestar um PIX recebido — por suspeita de fraude ou pedido de devolução do pagador. Quando uma cobrança PIX IN da sua conta é contestada, o PagzPay registra uma infração, bloqueia o valor contestado e avisa pelo webhook infraction a cada mudança.

Tipos

TipoSignificado
FRAUDSuspeita de fraude na cobrança.
REFUND_REQUESTPedido de devolução feito pelo pagador.
REFUND_CANCELLEDPedido de devolução cancelado.

Status (infraction.status)

StatusSignificadoAceita defesa?
OPENInfração aberta. O valor fica bloqueado.Sim
ACKNOWLEDGEDInfração reconhecida pelo PSP; bloqueio mantido.Sim
WAITING_PSPAguardando o PSP; bloqueio mantido.Sim
DEFENDEDDefesa enviada, em análise.Não
ANSWERED · WAITING_ADJUSTMENTSEm andamento no PSP; bloqueio mantido.Não
CLOSEDFinal. Desfecho em transaction.status (veja abaixo).Não
CANCELLEDFinal. Infração cancelada; bloqueio liberado.Não

Efeito no saldo e na cobrança

Momentotransaction.statusSaldo
Infração aberta ou em andamentoinfractionO valor sai de pix.balance e aparece em pixBlocked.balance (Consultar saldo).
Encerrada a seu favor ou canceladapaidBloqueio liberado; o valor volta para pix.balance.
Encerrada a favor do pagadorrefundO valor é devolvido ao pagador e o bloqueio é encerrado.
Desfecho de um CLOSEDO payload não traz o resultado da análise. Use o transaction.status do mesmo evento: paid = valor liberado para você; refund = valor devolvido ao pagador.

Como se defender

OndePelo Dashboard, em Pagamentos → Infrações. Não há endpoint de defesa na API.
QuandoEnquanto o status for OPEN, ACKNOWLEDGED ou WAITING_PSP.
O quêUma descrição (mínimo de 5 caracteres) e, se quiser, arquivos de comprovação — nota fiscal, comprovante de entrega, conversa com o cliente.
LimiteUma defesa por infração. Depois do envio o status vira DEFENDED e não é possível editar.
Responda rápidoO MED tem prazos regulatórios. Envie a defesa assim que receber o webhook com OPEN — depois que o status avança, o envio deixa de ser aceito.

Tratando o webhook

Um evento por mudançaO evento infraction é reenviado a cada mudança de status da mesma infração. Use infraction.id + infraction.status para processar cada transição uma única vez.
handlerexemplo
function onInfraction({ infraction, transaction }) {
  const { status } = infraction

  if (['OPEN', 'ACKNOWLEDGED', 'WAITING_PSP'].includes(status)) {
    // Valor bloqueado: suspenda a entrega e envie a defesa pelo Dashboard
    return holdOrder(transaction.id)
  }

  if (status === 'CANCELLED' || (status === 'CLOSED' && transaction.status === 'paid')) {
    return releaseOrder(transaction.id) // valor liberado
  }

  if (status === 'CLOSED' && transaction.status === 'refund') {
    return cancelOrder(transaction.id) // valor devolvido ao pagador
  }
}
Referência

Split de pagamentos#

Distribui automaticamente parte do valor líquido de uma cobrança PIX IN (Criar QR Code) para outras empresas PagzPay — útil para marketplaces e plataformas com parceiros. O split é executado no momento em que o pagamento é confirmado.

Objeto splits[]

CampoTipoObrig.Descrição
emailstringSimE-mail da empresa PagzPay que recebe o split — precisa ter conta ativa.
percentagenumberSimDe 0,01 a 100. A soma de todos os splits não pode ultrapassar 100%.
LimiteA soma dos percentuais de splits não pode passar de 100% do valor líquido da cobrança.
splits + itemsopcional
{
  "amountInCents": 20000,
  "description": "Venda marketplace #5678",
  "customer": { "documentType": "cpf", "document": "33344455566" },
  "splits": [
    { "email": "parceiro1@empresa.com", "percentage": 30 },
    { "email": "parceiro2@empresa.com", "percentage": 15 }
  ]
}
Referência

Idempotência#

Para transferências PIX (PIX OUT), envie o header x-idempotency-key com um UUID único por operação para garantir que não haja duplicação em caso de retry.

SituaçãoComportamento
Mesma chave, retry de redeNenhuma transferência duplicada é criada.
Mesma chave reaproveitada com corpo diferente409 IDEMPOTENCY_CONFLICT.
Sem cabeçalhoA requisição é rejeitada — o header é obrigatório em PIX OUT.
headerexemplo
-H "x-idempotency-key: 550e8400-e29b-41d4-a716-446655440000"
Referência

Erros#

Erros sempre respondem em JSON com os campos error (código) e message (legível). Alguns também trazem details com informações adicionais.

StatusCódigoSignificado
400INVALID_REQUESTCorpo da requisição inválido — message aponta o campo.
401UNAUTHORIZEDToken ausente, inválido ou expirado.
404NOT_FOUNDRecurso não encontrado ou pertence a outra conta.
409IDEMPOTENCY_CONFLICTx-idempotency-key reaproveitada com corpo diferente.
429RATE_LIMITEDMuitas requisições — tente novamente em alguns minutos.
responseerro
{ "error": "NOT_FOUND", "message": "QR Code PIX não encontrado" }
Referência

Endpoints#

Referência rápida de todas as rotas disponíveis na API PagzPay.

PagzPay · Documentação da API v1
Plataforma de pagamentos para o mercado brasileiro.
Copiado