Pix ProcessamentoPix Processamento Docs

Webhooks

O sistema de webhooks da Pix Processamento envia notificações em tempo real sobre mudanças de status das suas transações. Quando você cria uma transação e fornece um callbackUrl, nosso sistema envia atualizações para essa URL toda vez que houver mudança de status.

O que é um webhook (callback)

Um webhook (também chamado de callback) é uma requisição POST que a Pix Processamento envia para o seu servidor quando algo acontece. Ao contrário da API normal (onde você chama a Pix Processamento), aqui é o oposto: a Pix Processamento chama você.

Pensa numa cobrança Pix. Você criou ela, exibiu o QR ao cliente, e agora precisa saber quando o cliente paga. Duas opções:

  1. Polling, ficar perguntando a cada X segundos "já pagou? já pagou?" (custoso, lento, desnecessário).
  2. Webhook, deixar a Pix Processamento te avisar assim que o pagamento entrar (instantâneo, eficiente, recomendado).

Duas formas de receber

FormaComo configuraAssinaturaFiltro por evento
callbackUrl na transaçãoCampo no body de cada POSTNãoNão, recebe toda mudança
Webhook cadastradoUma vez, em POST /user/webhooksHMAC SHA-256Sim, pelo campo events

As duas convivem. Se a transação tem callbackUrl e a conta tem webhook ativo, os dois recebem o mesmo payload.

Modo 1: callbackUrl na transação

A URL é informada a cada transação criada, no campo callbackUrl do body:

{
  "amount": 99.90,
  "callbackUrl": "https://seusite.com.br/webhooks/pix",
  "clientReference": "pedido-2025-001"
}

A Pix Processamento vai enviar o callback para essa URL toda vez que aquela transação mudar de status (PENDING → COMPLETED, COMPLETED → REFUNDED, etc).

Crie um endpoint público no seu servidor

Algum lugar acessível pela internet que aceite POST com JSON. Exemplos: https://seusite.com.br/webhooks/pix, https://api.suaempresa.com/pix/callback.

Durante desenvolvimento local, use túneis como ngrok ou Cloudflare Tunnel pra expor o localhost.

Passe a URL ao criar a transação

Em todo POST /pix, POST /withdraw, POST /internal-transfer, inclua o campo callbackUrl. Pode ser a mesma URL pra todos.

Implemente o handler

Receba o POST, leia o JSON, processe e responda 2xx em até 5 segundos. Veja exemplos em Receber Pix · passo 3.

Modo 2: webhook cadastrado

Registre a URL uma vez, escolha os eventos e ganhe assinatura HMAC. Não precisa repetir callbackUrl em cada transação.

Cadastre a URL

curl -X POST https://api.exemplo.processamento.com/v1/user/webhooks \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://seusite.com.br/webhooks/pix",
    "events": ["TRANSACTION_COMPLETED", "TRANSACTION_REFUNDED"],
    "generateSecret": true
  }'

A resposta traz o id e o secret. O secret aparece só nessa resposta, guarde num cofre de segredos.

Verifique a assinatura no handler

Todo disparo de webhook cadastrado chega com X-Callback-Event e, quando há secret, com X-Callback-Signature. Confira a assinatura antes de processar, veja Assinatura HMAC.

Limite de 5 webhooks ativos por conta. Acima disso, criar ou reativar devolve 409 Conflict. A referência dos 8 endpoints está em Endpoints · Webhooks.

Eventos

Vale só para webhook cadastrado. Enviar events: [], ou omitir o campo, assina todos.

EventoQuando dispara
TRANSACTION_PENDINGTransação criada e aguardando pagamento
TRANSACTION_COMPLETEDTransação liquidada
TRANSACTION_CANCELEDTransação cancelada
TRANSACTION_WAITING_FOR_REFUNDEstorno solicitado, aguardando processamento
TRANSACTION_REFUNDEDEstorno concluído
TRANSACTION_EXPIREDCobrança expirou sem pagamento
TRANSACTION_ERRORTransação terminou em erro
TRANSACTION_SUSPECTED_FRAUDTransação marcada como suspeita de fraude
TRANSACTION_SUSPECTED_FRAUD_REVERSALMarcação de suspeita de fraude revertida
INFRACTION_CHANGEDInfração (MED) ligada a uma transação mudou de status

Headers do disparo

HeaderQuandoValor
Content-Typesempreapplication/json
X-Callback-Attemptsemprenúmero da tentativa, começando em 1
X-Callback-Eventsó em webhook cadastradoo evento, ex. TRANSACTION_COMPLETED
X-Callback-Signaturesó em webhook cadastrado que tem secrett=<unix>, v1=<hmac-sha256-hex>

Assinatura HMAC

O valor de X-Callback-Signature tem duas partes: t, o timestamp Unix em segundos, e v1, o HMAC SHA-256 em hexadecimal calculado sobre a string <t>.<corpo cru da requisição> usando o secret como chave.

X-Callback-Signature: t=1746540312, v1=6f2c0e...9ab1

Use o corpo cru (a string recebida), não o objeto reserializado: qualquer mudança de espaçamento ou de ordem de chaves muda o hash.

Node.js (Express)
import crypto from 'node:crypto';

app.post(
  '/webhooks/pix',
  express.raw({ type: 'application/json' }),
  (req, res) => {
    const header = req.get('X-Callback-Signature') ?? '';
    const parts = Object.fromEntries(
      header.split(',').map((part) => part.trim().split('=')),
    );
    const expected = crypto
      .createHmac('sha256', process.env.PIX_WEBHOOK_SECRET)
      .update(`${parts.t}.${req.body.toString('utf8')}`)
      .digest('hex');

    const ok =
      parts.v1?.length === expected.length &&
      crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));

    if (!ok) return res.sendStatus(401);

    res.sendStatus(200);
    enqueue(JSON.parse(req.body.toString('utf8')), req.get('X-Callback-Event'));
  },
);
Python (Flask)
import hashlib, hmac, os
from flask import request, abort

@app.post("/webhooks/pix")
def pix_webhook():
    header = request.headers.get("X-Callback-Signature", "")
    parts = dict(p.strip().split("=", 1) for p in header.split(",") if "=" in p)
    expected = hmac.new(
        os.environ["PIX_WEBHOOK_SECRET"].encode(),
        f'{parts.get("t", "")}.{request.get_data(as_text=True)}'.encode(),
        hashlib.sha256,
    ).hexdigest()

    if not hmac.compare_digest(parts.get("v1", ""), expected):
        abort(401)

    enqueue(request.get_json(), request.headers.get("X-Callback-Event"))
    return "", 200

Compare com função de tempo constante (timingSafeEqual, hmac.compare_digest). Rejeite também disparos com t muito antigo, uma janela de 5 minutos é um bom padrão contra replay.

Sistema de retry

Os webhooks da Pix Processamento têm um sistema robusto de retentativa que garante a entrega mesmo em falhas temporárias. A Pix Processamento reenvia até 72 vezes o mesmo callback com backoff exponencial e jitter, distribuindo melhor a carga e evitando picos de requisições.

Tempo de resposta: o webhook deve responder com HTTP 200 OK em até 5 segundos. Se exceder esse tempo, o sistema considera timeout e inicia o processo de retentativa.

Segurança

Para garantir integridade e segurança, restrinja o acesso ao seu endpoint de webhook. Solicite o IP oficial da Pix Processamento ao suporte e aceite callbacks apenas dessa origem.

Com webhook cadastrado, some a isso a assinatura HMAC: o IP diz de onde veio, a assinatura prova que o corpo não foi adulterado. Se o secret vazar, rotacione em POST /user/webhooks/{id}/rotate-secret e faça o deploy do novo valor antes, porque o anterior é invalidado na hora.

Campos do payload

Identificação

CampoTipoDescrição
idstringID da transação
clientReferencestringReferência externa que você forneceu
virtualAccountstringSubconta virtual (até 50 caracteres). Volta no callback para correlacionar lojas, filiais, marketplaces.
callbackUrlstringURL configurada para receber este webhook

Status e valores

CampoTipoDescrição
statusstringPENDING, COMPLETED, CANCELED, WAITING_FOR_REFUND, REFUNDED, EXPIRED, ERROR
typestringDEPOSIT, WITHDRAW
methodstringPIX, BANK_SLIP, INTERNAL_TRANSFER
amountnumberValor em BRL
serviceFeeChargednumberTarifa cobrada

Cobrança gerada (depósito)

CampoTipoDescrição
qrCodeTextstringCódigo Pix copia-e-cola
qrCodeUrlstringURL da imagem do QR Code
qrCodeBase64stringImagem do QR Code em formato Base64
generatedNamestringNome de referência
generatedDocumentstringCPF ou CNPJ
generatedEmailstringEmail vinculado à transação

Pagador

CampoTipoDescrição
payerNamestringNome do pagador
payerDocumentstringDocumento do pagador
payerInstitutionIspbstringISPB do banco do pagador
payerInstitutionNamestringNome do banco do pagador
payerAccountNumberstringConta Pix Processamento do pagador (6 dígitos). Preenchida quando a conta Pix Processamento é quem paga: saques e transferências internas.

Recebedor

CampoTipoDescrição
receiverNamestringNome do destinatário
receiverDocumentstringDocumento do destinatário
receiverInstitutionIspbstringISPB do banco do destinatário
receiverInstitutionNamestringNome do banco do destinatário
receiverAccountNumberstringConta Pix Processamento do destinatário (6 dígitos). Preenchida quando a conta Pix Processamento é quem recebe: depósitos e transferências internas.

Em saques, os demais campos payer* descrevem a conta de liquidação do provedor, enquanto payerAccountNumber é a conta Pix Processamento que originou o saque. Para identificar uma transferência interna, use method: INTERNAL_TRANSFER, não a presença desses campos.

Saque via chave Pix

CampoTipoDescrição
withdrawPixKeystringChave Pix usada no saque
withdrawPixTypestringcpf, cnpj, phone, email, evp

Liquidação e estorno

CampoTipoDescrição
endToEndIdstringEndToEnd ID do Pix
paidAtstringTimestamp do pagamento (ISO 8601)
cancellationReasonstringMotivo do cancelamento
refundEndToEndIdstringEndToEnd ID do estorno
refundAmountstringValor estornado
refundStatusstringPENDING, COMPLETED, CANCELED
refundReasonstringMotivo do estorno
refundDescriptionstringDescrição do estorno
refundedAtstringTimestamp do estorno (ISO 8601)

Timestamps

CampoTipoDescrição
createdAtstringTimestamp de criação (ISO 8601)
updatedAtstringTimestamp de atualização (ISO 8601)

Infração (disputa Pix)

CampoTipoDescrição
infractionobjectDetalhes da infração quando aberta (ver MED)

Boas práticas

  • Responda rápido: devolva 2xx em menos de 5s. Processe pesado em fila/worker, não no handler.
  • Idempotência: armazene id + status para deduplicar. O mesmo callback pode chegar mais de uma vez (retentativa, mudanças sucessivas).
  • Use clientReference: passe um identificador externo na criação da transação. Volta no callback e facilita correlacionar com seu pedido.
  • Restrinja por IP: aceite callbacks apenas do IP oficial da Pix Processamento.
  • Valide a assinatura: em webhook cadastrado, rejeite com 401 todo disparo cuja X-Callback-Signature não bater.

Inspeção e reenvio

A API expõe a lista completa de callbacks enviados:

Para webhook cadastrado há ainda a contagem e o detalhe do disparo:

Nesta página