POST requests that Urtentic sends to your server when something happens to a verification: it starts, the person submits their inputs, a check finishes, or the verification reaches its final status. Your server receives the event as soon as it happens instead of polling the API.
To set up the URL and secret Urtentic uses, see Configuration.
How webhooks work
1
Something happens to a verification
For example, a check finishes or the verification reaches its final status.
2
Urtentic signs the event
The JSON payload is signed with your webhook secret (HMAC-SHA256).
3
Urtentic sends it to your URL
One
POST request goes to the webhook URL of the verification’s workflow, or to your organization’s default URL.4
Your server verifies and handles it
Check the signature, process the event, and respond with a
2xx status.Events
Every event is sent. You can’t choose a subset, so ignore the ones you don’t need.Payloads
Every event has these fields:- verification_completed
- step_completed
- Other events
verificationStatus is SUCCESS, REJECTED or NEEDS_REVIEW. verification_data_updated has the same shape.metadata is yours to define. Put your own user ID or reference in it when you start the verification, and use it to match events to your records.Signatures
Every request carries two headers:x-urtentic-signatureis the hex HMAC-SHA256 of the raw request body. The key is your webhook secret, Base64-decoded.x-urtentic-timestampis when the request was sent, in Unix seconds. It is not part of the signature.
Delivery and retries
Your server has 30 seconds to respond to each request. A2xx response means the event was delivered.
If delivery fails, Urtentic tries again, up to 5 attempts in total:
All attempts happen within 10 minutes of the event. After the last failed attempt, the event is dropped.
Whether a failure is retried depends on what went wrong:
Respond with a
4xx only when you never want that event again. If your server is temporarily unable to process events, respond with 503 or 429 so they’re retried.
Every attempt carries the same body and the same x-urtentic-signature. Only x-urtentic-timestamp changes.
- Events are sent independently, so they can arrive out of order. A
step_completedevent can arrive afterverification_completed. - A retry can deliver an event your server already processed, for example when it handled the request but responded after the 30-second timeout.
- If neither the workflow nor your organization has a webhook URL, no events are sent.
Best practices
- Verify the signature on every request before trusting it.
- Respond quickly. Return
2xxas soon as you’ve stored the event, and do slow work afterwards. A response after 30 seconds counts as a failure and the event is sent again. - Make handling idempotent. Retries can deliver the same event twice, and events have no ID of their own, so deduplicate on
eventNameplus the verification ID fromresource(plusidforstep_completed). - Use the right status code.
4xxstops retries for that event. Use5xxor429when you want it sent again. - Use HTTPS. The dashboard only accepts
https://webhook URLs.