Skip to main content
Webhooks are HTTP 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:
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-signature is the hex HMAC-SHA256 of the raw request body. The key is your webhook secret, Base64-decoded.
  • x-urtentic-timestamp is when the request was sent, in Unix seconds. It is not part of the signature.
Compute the signature over the raw body bytes, before parsing the JSON. Re-serializing the parsed JSON can change the bytes and break the match. See Configuration for examples in several languages.

Delivery and retries

Your server has 30 seconds to respond to each request. A 2xx 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_completed event can arrive after verification_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.
An event can still be dropped, after a rejected 4xx or after all 5 attempts failed, so don’t rely on webhooks alone for anything you can’t afford to miss. If you haven’t received verification_completed when you expect it, check the verification with the status endpoint, GET /verifications/{verificationId}/status.

Best practices

  • Verify the signature on every request before trusting it.
  • Respond quickly. Return 2xx as 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 eventName plus the verification ID from resource (plus id for step_completed).
  • Use the right status code. 4xx stops retries for that event. Use 5xx or 429 when you want it sent again.
  • Use HTTPS. The dashboard only accepts https:// webhook URLs.