Skip to main content
Quando o PIX é confirmado, a gente faz POST na callbackUrl informada na criação. O nome do evento depende do recurso: O corpo é praticamente o mesmo. charge.paid traz alguns campos a mais, que vêm do banco.

Campos

string
required
payment.paid ou charge.paid.
string
required
Identificador do pagamento. É a chave para reconciliar do seu lado.
number
required
Valor em centavos. Confira contra o esperado antes de entregar.
string
required
Sempre paid neste evento.
string
required
Data e hora da confirmação, em ISO 8601.
object
name, email e externalId, como você informou na criação.
string
A string JSON que você mandou, devolvida sem alteração.
number
O mesmo valor em reais, decimal. Conveniência para exibição.
string
Descrição informada na criação.
string
O que foi entregue automaticamente, quando o produto tem entrega automática. Veja Entrega.
boolean
true quando o evento veio de um endpoint de simulação.

Dados do pagador (só em charge.paid)

string
Nome de quem pagou, como consta no banco.
string
Banco de origem, no formato código - nome.
string
Identificador end-to-end da transação no Bacen. Serve para conciliação bancária e para responder disputa.
string
txid da transação PIX.
Campo opcional é omitido quando não se aplica, e não enviado como null. Dado sensível (CPF, telefone, endereço) nunca vai em webhook.

Em sandbox

O simulate-paid sempre envia event: "payment.paid", inclusive ao simular uma cobrança psc_. O corpo é enxuto: event, paymentId, amountCents, status, paidAt, customer, metadata e sandbox: true.
Se o seu handler faz if (evento.event === "charge.paid") para cobranças, ele não vai disparar em sandbox. Trate os dois nomes no mesmo caminho.

Tratando

Pagou com cartão?

O evento é outro e a forma do corpo muda. Vale a leitura antes de escrever um handler genérico.