Montagem básica
- Exponha uma rota
POST(ex.:/webhooks/upag) com TLS. - Crie o webhook com
POST /v1/webhooks, informandourleevents, e guarde osecret(whsec_...). - Valide a assinatura sobre o corpo bruto (Verificação e segurança), trate o JSON e responda 2xx.
Node.js SDK
Sandbox e produção
Usesk_test_... contra https://api.upag.dev/v1 e sk_live_... contra https://api.upag.io/v1. Cadastre webhooks separados em cada ambiente para não processar evento de teste como produção.
Envelope
Cada entrega é umPOST com corpo JSON:
Headers enviados em cada entrega:
Os
headers definidos no cadastro do webhook são aplicados por último: um header customizado com um desses nomes sobrescreve o nosso. Use nomes distintos.
data é um retrato do recurso no instante do evento, não uma leitura atual. Em charge.paid, por exemplo, status já é paid, mas splits ainda pode vir vazio; consulte a cobrança quando precisar do estado atual.
Assinar eventos
Informe emevents ao menos um evento ao criar ou atualizar o webhook. Um webhook só recebe os eventos listados e enquanto active for true. Um valor fora da lista abaixo é rejeitado com erro de validação.
Eventos
Uma mudança de status dispara dois eventos: o específico e o*.updated correspondente (por exemplo charge.paid e charge.updated). Assine só um deles, a menos que queira tratar os dois.
Cobranças
data: Payload cobrança.
Clientes
data: Payload cliente.
Transferências
data: Payload transferência.
Um Pix recebido direto numa das suas chaves, sem cobrança, vira uma transferência com
direction: "in": dispara transfer.created, transfer.completed e transfer.updated em sequência (sem transfer.processing). Só o Pix que quita uma cobrança sua dispara charge.paid. Para detectar entrada de dinheiro, assine também transfer.completed.Estornos
data: Payload estorno.
Contestações
data: Payload contestação.
Faturas
data: Payload fatura.
Assinaturas
data: Payload assinatura.
Sessões de checkout
data: Payload checkout.
Entrega e novas tentativas
- Cada evento gera uma tentativa de
POSTpor webhook ativo inscrito. Não há retentativa automática. - Qualquer status 2xx é sucesso. Outro status, timeout ou falha de conexão grava a tentativa como falha no log de entrega.
- Reenvie uma tentativa falha com Reprocessar log. O reenvio usa o mesmo
ide o mesmo corpo, assinado de novo com osecretatual, e grava um novo log. - Entregas são independentes: não há garantia de ordem entre eventos. Use
updatedAtemdatapara descartar retratos mais antigos.
Idempotência
Deduplique porid (ou pelo header X-Webhook-Id) antes de qualquer efeito colateral. Um reenvio reaproveita o id original.
- Devolva 2xx só depois de persistir ou enfileirar o trabalho; handlers lentos viram entregas falhas.
- Campos novos podem aparecer em
datasem aviso: leia só o que você usa.
Referência de payloads
Cobrança
Eventos
charge.*.Transferência
Eventos
transfer.*.Cliente
Eventos
customer.*.Estorno
Eventos
refund.*.Contestação
Eventos
dispute.*.Fatura
Eventos
invoice.*.Assinatura
Eventos
subscription.*.Checkout
Eventos
checkout-session.*.