Skip to main content
Whenever a liveness submission reaches a terminal state, WaaS Core fires a signed, fire-and-forget webhook to the organization’s configured webhook URL (set in the merchant/back-office webhook settings). This is the push-based alternative to polling §3’s “Get liveness status” endpoint. It fires from every code path that can resolve a liveness verdict: the HyperVerge inbound webhook handler, the reconciliation poller, and the staging/dev mock flow — so you get exactly one delivery attempt-sequence per terminal transition regardless of how the verdict arrived. If the organization has no webhook URL configured, the event is silently skipped (logged server-side, no error surfaced to you) — nothing to poll for; use GET /api/v1/customers/kyc/liveliness/output instead.

Events

in_progress never fires a webhook — only terminal transitions do.

Delivery

  • Signature: HMACSHA512(key = your webhook secret, message = raw request body bytes), hex-encoded, lowercase. Recompute it over the exact bytes received (before any re-serialization) and compare to the x-embedly-signature header to verify authenticity.
  • Timeout: 10 seconds per attempt.
  • Retries: up to 5 attempts total on non-2xx response or timeout. Production backoff: 5 min → 5 min → 60 min → 240 min after attempts 1–4 (attempt 5 is final — no further retry). Staging/Development use a flat 2-minute delay between every retry. After the 5th failed attempt the event is marked Failed and not retried again.
  • Delivery is at-least-once — treat handlers as idempotent; use data.submissionId + event to dedupe if you log deliveries on your side.

Payload

For customer.liveness.declined / customer.liveness.needs_review, failureReason is populated when HyperVerge supplied one: