Webhooks

Webhook events

Events sent to webhook endpoints.

We send events to your webhook endpoints as POST requests with a JSON body.

link The body

id is the delivery's id, type the event, and data.session the session object as it was when the attempt was made, without document.

link session.completed

A session ended with a decision you can act on straight away: clear or rejected, by the checks or by a reviewer.

link session.review_required

A session ended with consider: something needs a person to look at it. Review it in the dashboard under Verifications; when your team decides, you get session.completed with the decision.

link session.error

The checks couldn't run for a technical reason, after retrying for about 50 minutes. The session's status is error and it has no outcome: it says nothing about your customer. We look into these and run the checks again; you get session.completed or session.review_required when they finish.

link webhook.test

Sent from Developers → Webhooks to check an endpoint. data holds a message and no session.

link What to do with an event

Each event names the session it's about. Fetch that session from the API and act on its current state: that way a repeated or late event can never undo a newer decision. See Webhooks for answering, retries and checking signatures.

session.completed
{
  "id": "6c0e3b0a-3f0e-4b1f-9a52-2d7c1e8f4a10",
  "type": "session.completed",
  "created_at": "2026-10-15T12:15:20Z",
  "data": {
    "session": {
      "id": "a841ce23-0c9d-42a4-ba95-3e7e17a1407b",
      "reference": "user_1042",
      "status": "rejected",
      "outcome": "rejected",
      "reasons": ["DOC_MRZ_CHECKDIGIT_FAIL"],
      "reviewed": false,
      "review": null,
      "retry_session_id": null,
      "retry_of": null,
      "checks": {
        "document": {"result": "failed", "signals": [{"code": "DOC_MRZ_CHECKDIGIT_FAIL", "severity": "hard"}]},
        "liveness": {"result": "passed", "signals": []},
        "face_match": {"result": "passed", "signals": []},
        "fraud": {"result": "passed", "signals": []}
      },
      "document_type": "passport",
      "document_country": "GBR",
      "captures": {"doc_front": 1, "selfie_clip": 1, "selfie_keyframe": 3},
      "created_at": "2026-10-15T12:10:11Z",
      "expires_at": "2026-10-16T12:10:11Z",
      "submitted_at": "2026-10-15T12:14:52Z",
      "decided_at": "2026-10-15T12:15:20Z"
    }
  }
}
Was this page helpful?

Authorization

Your secret key stays in this tab: it is sent with this request only and never stored.

Body application/json

Response

Send the request to see the response.