REST API: KYC

KYC session status

Read a session back: status, steps and results.

Purpose

Use this call to read a session after the user has finished the widget, or to poll while it runs. You can also receive the SESSION_COMPLETE webhook and call this method once with the identifier the event carries. Database check verdicts, such as AML screening, are not part of this answer: read them with database check results.

Request

POST <API_BASE_URL>/kyc/session/status. All calls are POST under your API address. Replace <API_BASE_URL> with the API address provided with your access.

Send a permanent API token in the token field of the body, or a user token in the token header. See authentication.

Content type: application/json.

FieldTypeRequiredDescription
tokenstring (uuid)if no headerYour permanent API token. Required unless you send a user token in the token header.
sessionIdstringone of twoThe session identifier. A questionnaire record is accepted here too: pass the questionnaireSessionId that the QUESTIONNAIRE_COMPLETE event carried.
clientKeystringone of twoYour client key, for regular sessions only. A client key always resolves a regular session, never a questionnaire record.

Send either sessionId or clientKey. When both are sent, sessionId identifies the session.

Response

HTTP 200. The body is either the session object or, when you passed a questionnaire identifier, the questionnaire record.

FieldTypeDescription
statusstringThe session status: idle, processing, success, failed, exception, expired or suspicious. A running session answers processing and an expired one expired. Never read it as the ok or error of an envelope.
sessionIdstring (uuid)The session identifier.
resultsarray of objectOne entry per step, each with its own status. See the session object.
errorsarray of stringSession-level error codes.
secondsToLivenumberSeconds left before the session expires.

The questionnaire branch. A questionnaire record is recognized by type of questionnaire. Its status is idle or success only, and success means that the form was filled in and committed. It never means that checks came back clean. See two-stage questionnaire, then KYC.

Errors

  • 400: The body failed validation. The answer has status of error and a details list with one entry per offending field (path, expected, actual).
  • 401: The token is missing, expired or unknown.
  • 500: An unexpected internal failure. The answer has status of error and the fixed text internal error; nothing in the body helps you branch beyond the code.

A refusal can also come before the operation runs: an address outside your IP allowlist, a token bound to another address, or a body that is not valid JSON. See response format and errors.

Example

Request:

curl -X POST "<API_BASE_URL>/kyc/session/status" \
  -H "Content-Type: application/json" \
  -d '{
    "token": "<your permanent API token>",
    "sessionId": "00000000-0000-0000-0000-000000000000"
  }'

Response:

{
  "sessionId": "00000000-0000-0000-0000-000000000000",
  "status": "success",
  "schemaId": "<your scenario id>",
  "clientKey": "<your identifier for the person>",
  "secondsToLive": 0,
  "createdAt": "2026-01-01T10:00:00.000Z",
  "errors": [],
  "results": [
    {
      "type": "document",
      "status": "success"
    },
    {
      "type": "selfie",
      "status": "success"
    },
    {
      "type": "liveness",
      "status": "success"
    },
    {
      "type": "faces",
      "status": "success"
    }
  ]
}

Questions while integrating?

Write to us with the details and we will help.

Talk to us