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 ouPATCH /api/v1/notification-channels/:id). - O shape v1 é congelado: nunca muda. Toda evolução de payload acontece na v2.
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.transaction.created
transaction.created
Disparado quando uma cobrança PIX é criada. Inclui
pixCode e expirationDate.transaction.paid
transaction.paid
Disparado quando um pagamento PIX é confirmado. Use para liberar o produto ou serviço ao cliente. Inclui
fee quando há taxa.transaction.expired
transaction.expired
Disparado quando uma transação expira sem pagamento. Use para notificar o cliente ou criar nova cobrança.
transaction.refunded
transaction.refunded
Disparado quando uma transação é estornada.
transaction.cancelled
transaction.cancelled
Disparado quando uma transação é cancelada manualmente.
transaction.failed
transaction.failed
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.
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 formatot=<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: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.