POST nela quando um evento ocorre.
Registrar
POST /v1/webhooks
secret (whsec_…) uma única vez — use-o para validar a assinatura.
Omita events para receber todos.
Eventos
Depósitos —deposit.pending · deposit.paid · deposit.expired
Saques — payout.pending · payout.processing · payout.paid · payout.failed · payout.canceled
MED (chargeback) — med.opened · med.under_analysis · med.won · med.lost
Verificar a assinatura
Cada entrega traz dois headers:HMAC-SHA256(secret, "{timestamp}.{corpo cru}"). Valide sobre o corpo cru
(não re-serialize o JSON) e rejeite timestamps com mais de 5 minutos (anti-replay):
Entrega e idempotência
- Responda
2xxem até 7s. Falhas são re-tentadas (2 tentativas imediatas + redelivery por até 24h). - O mesmo evento pode chegar mais de uma vez — implemente idempotência por
data.id+event. GET /v1/webhooks/:id/deliveriesmostra o log de entregas (status, latência, tentativas).POST /v1/webhooks/:id/testdispara um evento de exemplo assinado.
Formato compatível (ZyroPay)
O webhook tem dois formatos, escolhidos por como você registra:- Nativo (acima) — registrado por
POST /v1/webhooks. Payload{ event, data }+ assinatura HMAC. - Compat ZyroPay — registrado por
PUT /compat/zyropay/cli/client/update/notification-url(veja Integração de corretora). O payload sai no formato do conector (status: CONFIRMED,type: PixIn/PixOut,externalId,paymentId,movId,amount,securityParaphrase) — a plataforma que já consumia a ZyroPay recebe sem mudar nada.
status ∈ PENDING|CONFIRMED|EXPIRED|FAILED):
deposit.pending, payout.pending, payout.processing) e as categorias MED/conversão/
estorno não são enviados no modo compat — são exclusivos do formato nativo (mais rico). No compat, só chegam
os estados terminais que o conector ZyroPay espera.