Skip to main content
Alert webhooks send your team’s alerts to an HTTPS endpoint you own. Use them to feed an on-call tool, a ticket queue or your own operations dashboard. Alert webhooks are separate from verification webhooks. Verification webhooks send session, entity and transaction results to your application. Alert webhooks tell your team that something needs attention: a verification waiting for review, a failed payment, a service incident. They have their own payload, signing secret, signature and retry schedule.

Set up a destination

You configure alert webhooks in the Business Console, not through the API. Members who can manage organization settings can add, change and test destinations.
1

Add the destination

In Organization settings > Team notifications, add an Alert webhook destination with your endpoint’s URL. The URL must use https:// and resolve to a public address.
2

Store the signing secret

Didit shows the full signing secret, which starts with whsec_, only once. Store it now: afterwards the console shows only its last four characters.
3

Route alerts to it

Adding a destination does not send anything to it yet. Add the destination to the routing rules of the alerts you want it to receive.
4

Send a test

Click Send test to send an alert.test alert, and check that your endpoint accepts it.
An organization can have up to 25 destinations in Team notifications. Only live activity reaches a destination. Alerts about sandbox verifications, business verifications, transactions and AML hits are never sent to it.

Alert types

Payload

Every alert is a POST with a JSON body. Didit sends the body as compact JSON with its keys sorted. This example is formatted for reading:
data always contains:
  • event: the event key, for example session_in_review.
  • label and value: what the alert is about, for example Session and #1042.
Some alert types add keys to data:
  • alert.billing.autorefill_failed adds paused, a boolean that is true when auto-refill is now paused until you update the card.
  • alert.service.degraded and alert.service.recovered add service, status, incident_id, service_name, state, affected, country_name, started_at, resolved_at, duration_minutes, title and body. status is degraded or down on alert.service.degraded, and recovered on alert.service.recovered. service uses the service keys of GET /v3/status/, and incident_id matches an incident id there.
Alerts never include end-user personal data or document data. They identify a session, transaction or other item by its number and link to it in the console. Ignore webhook_type values and data keys you do not recognize, so new ones do not break your endpoint.

Request headers

Verify the signature

X-Signature-V2 is the hex-encoded HMAC-SHA256 of the string <X-Timestamp>.<raw body>, keyed with your destination’s signing secret.
  • Use the full secret exactly as Didit showed it, including the whsec_ prefix.
  • Sign the raw request bytes as you received them. Parsing the JSON and serializing it again can change the bytes and break the check.
  • Compare the signatures in constant time.
  • Reject a request whose X-Timestamp is more than 5 minutes away from your clock. Didit signs every attempt, including each retry, with a fresh timestamp, so this window never rejects a genuine retry.
  • Answer a failed check with 400. A 401, 403, 404 or 410 response marks the destination for reconnection (see Retries).
Alert webhooks are not signed like verification webhooks. The header is also called X-Signature-V2, but the signed string is different, and alert webhooks send no X-Signature or X-Signature-Simple. Do not reuse your verification webhook verifier.

Node.js (Express)

Python (Flask)

Rotate the signing secret

You rotate the secret on the destination in Team notifications. Didit shows the new secret once and signs every later attempt with it, including retries of alerts created before the rotation. The old secret stops working at once. There is no overlap period, and no header carries a signature made with the previous secret. Deploy the new secret to your endpoint as soon as you rotate it.

Retries

Didit treats any 2xx response as delivered. Each attempt waits up to 5 seconds for your response and does not follow redirects. Didit retries an alert after a timeout, a connection failure, a 5xx response, or a 408, 425 or 429 response. It retries up to 5 times, over about 24 hours: Every other response is final, including 3xx and any other 4xx. A test sent with Send test gets a single attempt and is never retried. A 401, 403, 404 or 410 response also marks the destination for reconnection: the console shows it with a Reconnect status. So does a URL that resolves to a private or otherwise blocked address when Didit sends. Didit keeps sending new alerts to the destination, and it becomes active again after the next successful delivery or when you update its URL. Recent notifications in Team notifications lists each delivery with its result, and you can retry a failed delivery from there.