Webhooks
Receive and process VOVE ID webhooks with Svix signature verification.
VOVE ID sends HTTPS webhook requests when verification, KYB, or AML resources change. Verify every request before parsing or processing it.
Configure an endpoint
Open Webhooks in the matching Sandbox or Production dashboard.
Add a publicly reachable HTTPS endpoint.
Select the event types required by your integration.
Store the generated signing secret in your server secret manager.
Send or replay a fictional Sandbox event.
Sandbox and Production endpoints use separate signing secrets.
Request headers
svix-id
string
Unique delivery identifier; use it for idempotency
svix-timestamp
string
Signed delivery timestamp
svix-signature
string
One or more versioned signatures
content-type
string
application/json
Header names are case-insensitive. Frameworks commonly expose them in lowercase.
Representative KYC event
Deprecated:
userIdis retained only for backward compatibility and will be removed in a future version. UserefIdto identify and correlate users.
Verify the raw request body
Install the official Svix package:
Node.js and Express
The verifier must receive the original bytes. express.json() changes the body representation, which makes signature verification fail.
Python and Flask
Processing contract
Read the unmodified request bytes.
Verify the timestamp and signature with the official library.
Deduplicate on
svix-idusing durable storage and a unique constraint.Store the verified event and enqueue work in one transaction where possible.
Return
200or204quickly.Process asynchronously.
Tolerate duplicates and out-of-order delivery.
Retrieve the current API resource before applying a consequential decision.
Do not deduplicate on refId because one subject can produce multiple legitimate events.
Event payload types
See Statuses and KYB webhooks for exact event mappings.
Retries and ordering
Webhook delivery can be retried and replayed. Your handler must be safe when:
The same delivery arrives more than once.
A newer resource state arrives before an older event.
Your worker fails after the endpoint has acknowledged the request.
The endpoint times out after persisting the event.
Do not depend on a fixed retry schedule. Use the delivery log for diagnosis and retrieve the current API resource during reconciliation.
Test the endpoint
Test all of these cases in Sandbox:
Valid event
200 or 204 and one queued action
Altered body
400
Missing or invalid signature
400
Same svix-id twice
One business action
Worker failure
Event remains available for retry
Out-of-order status
Current API resource wins
For local testing, expose the server through an HTTPS tunnel, register the temporary URL in Sandbox, and use the dashboard's send or replay function. Never use a Production signing secret in local tooling.
Safe logging
Log event type, svix-id, refId, processing result, latency, and your correlation ID. Do not log the signing secret, signature, session token, raw payload, documents, biometrics, or unredacted personal or match data.
Troubleshooting
Every signature fails
Body parsed before verification
Configure a raw-body route before JSON middleware
Some signatures fail
Wrong environment secret or altered proxy body
Check endpoint configuration and proxy behavior
Repeated deliveries
Non-2xx response or timeout
Acknowledge after durable enqueueing
Duplicate business action
No durable svix-id uniqueness
Add a unique constraint and transactional enqueue
Status appears to go backwards
Out-of-order delivery
Retrieve the current resource and compare timestamps/state
Last updated