kycert sends HMAC-SHA256 signed webhook events when bureau runs complete and customers change status. Configure endpoints in the dashboard and verify signatures to stay secure.
kycert sends real-time HTTP POST notifications to your configured endpoint when key events occur — most importantly when a bureau run finishes and a decision is ready. You receive the full result payload in the webhook body, so you don’t need to poll the API for run status. Every webhook payload is signed with HMAC-SHA256 using your webhook secret, so you can verify each delivery came from kycert and was not tampered with in transit.Typical delivery time from run creation to webhook receipt is 5 to 30 seconds.
In the kycert dashboard, navigate to Settings → Developer → Webhooks.
2
Click Add Endpoint
Click the Add Endpoint button to open the endpoint configuration form.
3
Enter your HTTPS URL
Provide the full HTTPS URL of your receiving endpoint, for example https://api.yourapp.com/webhooks/kycert. HTTP is accepted in sandbox only — production endpoints must use HTTPS.
4
Select events
Choose the events you want your endpoint to receive. You can subscribe to all events or only specific ones.
5
Copy the signing secret
After saving, copy the Webhook Secret (prefix whsec_). You need this to verify payload signatures. Store it as an environment variable — never in source code.
You can also override the dashboard-configured endpoint per request by passing webhook_url directly in the POST /bureau/runs body. This is useful for routing results from different run types to different services.
For run.failed events, the data object contains status: "failed", decision: null, and a failed_at timestamp instead of completed_at.The livemode field is true for production events and false for sandbox events. Use this to distinguish environments in a shared endpoint.
Compare your computed signature to v1 using a constant-time comparison.
Reject the event if the timestamp is more than 5 minutes from your server’s current time (replay attack protection).
Always verify the signature before processing any webhook event. Any server on the internet can POST to your endpoint. An unverified event could trigger compliance decisions based on forged data.Use the raw request body for verification — do not pass a parsed and re-serialized JSON object. Middleware like express.json() transforms the body before you can read it as a string, which will cause signature verification to fail. Use express.raw() or the equivalent in your framework.
If your endpoint does not return a 2xx status within 30 seconds, kycert retries the delivery with exponential backoff:
Attempt
Delay after previous attempt
1
5 minutes
2
15 minutes
3
30 minutes
4
1 hour
5
2 hours
6
6 hours
7
12 hours
After 7 failed attempts (approximately 24 hours total), the event is marked as failed and no further retries occur. The full attempt history is visible in the dashboard under Settings → Webhooks.
Never return a 4xx status for internal processing errors. A 4xx tells kycert the event was rejected — retries stop immediately. If your handler throws an error after receiving a valid event, return 200 and handle the failure internally (a dead-letter queue, an alert, etc.).
Because kycert retries failed deliveries, your endpoint may receive the same event more than once. Make your handler idempotent by storing processed event IDs:
Webhook events are delivered in sandbox exactly as in production. Use a tunneling tool like ngrok or an inspection service like webhook.site during local development to receive events on your machine. Sandbox events include livemode: false in the payload so you can distinguish them in a shared endpoint.