Skip to main content
Registre URLs para receber eventos de cobranças, clientes, transferências, estornos, contestações, faturas, assinaturas e sessões de checkout. Cadastre inscrições pela API (Criar webhook); falhas de entrega aparecem em Logs de entrega.

Montagem básica

  1. Exponha uma rota POST (ex.: /webhooks/upag) com TLS.
  2. Crie o webhook com POST /v1/webhooks, informando url e events, e guarde o secret (whsec_...).
  3. 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

Use sk_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 é um POST 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 em events 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.
A API aceita em events alguns nomes que não são emitidos hoje: charge.pending, invoice.updated, invoice.drafted, subscription.updated, checkout-session.opened, checkout-session.updated, além dos prefixos legados payment.*, product.* e price.*. Inscrever-se neles não gera entregas. Não dependa deles.

Entrega e novas tentativas

  • Cada evento gera uma tentativa de POST por 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 id e o mesmo corpo, assinado de novo com o secret atual, e grava um novo log.
  • Entregas são independentes: não há garantia de ordem entre eventos. Use updatedAt em data para descartar retratos mais antigos.

Idempotência

Deduplique por id (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 data sem 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.*.
Objeto webhook na API: Referência. Validação no SDK: SDK servidor.