Skip to main content
Webhooks permitem que sua aplicação seja notificada automaticamente quando eventos ocorrem — como um pagamento confirmado ou uma transação expirada. Em vez de fazer polling, a Bob Payments avisa você.

Configurando um webhook

1

Acesse o Dashboard

Vá em Webhooks → Adicionar webhook no seu projeto.
2

Informe a URL

Insira a URL HTTPS da sua aplicação que receberá os eventos (ex: https://suaapi.com/webhooks/bob).
3

Copie o secret

Um secret é gerado automaticamente. Guarde-o para verificar a autenticidade das requisições.
Webhooks funcionam normalmente no sandbox. Use-os para testar o fluxo completo antes de ir a produção.

Versões do payload (v1 e v2)

O payload de webhook é versionado. A versão é fixada por canal (webhooks do dashboard) ou por sessão (checkout):
  • Canais novos criados no dashboard nascem em v2.
  • Canais existentes permanecem em v1 até você migrar — quando seu consumidor estiver pronto, atualize o canal com webhookApiVersion: "v2" (via dashboard ou PATCH /api/v1/notification-channels/:id).
  • O shape v1 é congelado: nunca muda. Toda evolução de payload acontece na v2.
Exemplo de transaction.paid na v2 (repare em apiVersion e amountCents):

Eventos disponíveis

Os exemplos abaixo mostram o formato v1 (legado). Na v2, a única diferença de dados é que data.amount (reais) é substituído por data.amountCents (centavos) e o envelope ganha apiVersion: "v2" — os demais campos são idênticos.
Disparado quando uma cobrança PIX é criada. Inclui pixCode e expirationDate.
Disparado quando um pagamento PIX é confirmado. Use para liberar o produto ou serviço ao cliente. Inclui fee quando há taxa.
Disparado quando uma transação expira sem pagamento. Use para notificar o cliente ou criar nova cobrança.
Disparado quando uma transação é estornada.
Disparado quando uma transação é cancelada manualmente.
Disparado quando uma transação falha no processamento.

Verificando a assinatura

Cada requisição inclui dois headers de segurança: Verifique a assinatura sempre para garantir que a requisição veio da Bob Payments.
Use sempre o corpo bruto (raw body) da requisição para calcular o HMAC. Se o framework parsear o JSON e você re-serializar, a assinatura pode não conferir.

Com o SDK Node.js (recomendado)

O SDK detecta automaticamente o formato (v1 ou v2), compara em tempo constante e aplica a proteção anti-replay:

Assinatura v2 (anti-replay)

Na v2, o header tem o formato t=<unix>,v1=<hex>. O HMAC cobre timestamp + "." + corpo, então um webhook capturado não pode ser reenviado depois — rejeite eventos com t fora de uma janela de tolerância (recomendado: 5 minutos).

Assinatura v1 (legado)

Na v1, o header é o HMAC-SHA256 hex do corpo, sem timestamp:
Retorne HTTP 200 imediatamente e processe o evento de forma assíncrona para evitar timeouts. Entregas podem se repetir em retry — processe de forma idempotente.

Próximos passos

Idempotência

Trate entregas repetidas sem liberar o pedido duas vezes.

Testar no sandbox

Dispare transaction.paid e transaction.expired sem dinheiro real.