Skip to main content
Webhooks are how Ovra tells your systems that something happened. Every state-changing operation fires one. Deliveries are HMAC-SHA256-signed, retried on a plan-tier-aware backoff schedule, and SSRF-checked against private IPs and metadata endpoints.

Subscribe

Use ["*"] to subscribe to every event. URL constraints (isBlockedWebhookUrl):
  • HTTPS or HTTP (HTTPS strongly recommended in prod)
  • No localhost
  • No RFC 1918 (10.0.0.0/8, 172.16/12, 192.168/16)
  • No link-local (169.254.0.0/16) or metadata endpoints (169.254.169.254, metadata.google.internal)
  • DNS rebinding check at delivery time

Event catalog

There are ~50 event types across these categories. Source of truth: apps/api/src/services/webhook.ts WebhookEvent union.
intent.created · intent.approved · intent.denied · intent.expired · intent.cancelled · intent.matched (reserved) · intent.mismatched (reserved)
transaction.created · transaction.updated · transaction.authorization · transaction.settlement · transaction.settled · transaction.completed · transaction.declined · transaction.refunded
card.issued · card.activated · card.frozen · card.unfrozen · card.closed · card.rotated · card.funded · card.shipped · card.limits_changed · card.details_changed
card_limit_request.updated
wallet.created · wallet.funded · wallet.credited
transfer.completed · transfer.failed · transfer.split.completed
risk.agent_frozen · risk.review_required · risk.alert_created · risk.denied · risk.velocity_alert · risk.geo_impossible
agent.created · agent.frozen · agent.unfrozen
claim.request.created · claim.request.paid · claim.request.expired · claim.request.cancelled
dispute.created · dispute.updated · dispute.resolved
mpp.credential.minted · mpp.credential.consumed · mpp.credential.expired (reserved) · mpp.transaction.completed
verification.mismatch · mobile_wallet.updated · payment.updated · receipt.updated · bill.updated · cardholder.updated

Delivery format

Headers: Body:

Verify the signature

Retry policy (plan-tier-aware)

Background poller runs every 30s, claims rows via FOR UPDATE SKIP LOCKED so multi-instance API hosts never double-deliver.

Best practices

  • Verify signatures before processing — never trust the body unsigned.
  • Idempotent handlers — the same event may deliver more than once.
  • Acknowledge fast — return 2xx within 30s. Defer slow work to a queue.
  • Check the timestamp window to reject very old replays.

Next

Intelligence

Audit + decision logs supplement webhooks for forensics.

Sandbox

Test signature verification end-to-end.