curl -X GET 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/events/?limit=50' \
-H 'x-api-key: YOUR_API_KEY'import os
import requests
session_id = '11111111-2222-3333-4444-555555555555'
resp = requests.get(
f'https://verification.didit.me/v3/session/{session_id}/events/',
headers={'x-api-key': os.environ['DIDIT_API_KEY']},
params={'limit': 50},
timeout=10,
)
resp.raise_for_status()
for event in resp.json()['results']:
print(event['sent_at'], event['event_type'], event['step'])const sessionId = '11111111-2222-3333-4444-555555555555';
const resp = await fetch(`https://verification.didit.me/v3/session/${sessionId}/events/?limit=50`, {
headers: { 'x-api-key': process.env.DIDIT_API_KEY },
});
if (!resp.ok) throw new Error(`Request failed: ${resp.status}`);
const page = await resp.json();
for (const event of page.results) console.log(event.sent_at, event.event_type, event.step);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/session/{sessionId}/events/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/session/{sessionId}/events/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://verification.didit.me/v3/session/{sessionId}/events/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/session/{sessionId}/events/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"uuid": "aaaaaaaa-1111-2222-3333-444444444444",
"event_type": "SESSION_STATUS_CHANGED",
"created_at": "2026-09-14T10:02:13.904512Z",
"component": null,
"feature_step": null,
"step": null,
"details": {
"old_status": "In Progress",
"current_status": "Approved"
},
"ip_address": null,
"user_agent": null,
"device_info": null,
"file_url": null,
"sent_at": 1789380131482
},
{
"uuid": "bbbbbbbb-1111-2222-3333-444444444444",
"event_type": "FEATURE_STEP_CHANGED",
"created_at": "2026-09-14T10:01:49.210377Z",
"component": null,
"feature_step": null,
"step": null,
"details": {
"old_feature_step": "OCR",
"current_feature_step": "LIVENESS"
},
"ip_address": null,
"user_agent": null,
"device_info": null,
"file_url": null,
"sent_at": 1789380107103
},
{
"uuid": "cccccccc-1111-2222-3333-444444444444",
"event_type": "STEP_RENDERED",
"created_at": "2026-09-14T10:01:00.581930Z",
"component": "DocumentCapture",
"feature_step": "OCR",
"step": "DOCUMENT_CAPTURE_FRONT",
"details": {},
"ip_address": "203.0.113.24",
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1",
"device_info": {
"device_model": "iPhone"
},
"file_url": null,
"sent_at": 1789380058776
}
]
}List Session Events
Read the event timeline of a verification session: device-reported steps, status changes and workflow routing, newest first and paginated.
curl -X GET 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/events/?limit=50' \
-H 'x-api-key: YOUR_API_KEY'import os
import requests
session_id = '11111111-2222-3333-4444-555555555555'
resp = requests.get(
f'https://verification.didit.me/v3/session/{session_id}/events/',
headers={'x-api-key': os.environ['DIDIT_API_KEY']},
params={'limit': 50},
timeout=10,
)
resp.raise_for_status()
for event in resp.json()['results']:
print(event['sent_at'], event['event_type'], event['step'])const sessionId = '11111111-2222-3333-4444-555555555555';
const resp = await fetch(`https://verification.didit.me/v3/session/${sessionId}/events/?limit=50`, {
headers: { 'x-api-key': process.env.DIDIT_API_KEY },
});
if (!resp.ok) throw new Error(`Request failed: ${resp.status}`);
const page = await resp.json();
for (const event of page.results) console.log(event.sent_at, event.event_type, event.step);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/session/{sessionId}/events/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/session/{sessionId}/events/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://verification.didit.me/v3/session/{sessionId}/events/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/session/{sessionId}/events/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"uuid": "aaaaaaaa-1111-2222-3333-444444444444",
"event_type": "SESSION_STATUS_CHANGED",
"created_at": "2026-09-14T10:02:13.904512Z",
"component": null,
"feature_step": null,
"step": null,
"details": {
"old_status": "In Progress",
"current_status": "Approved"
},
"ip_address": null,
"user_agent": null,
"device_info": null,
"file_url": null,
"sent_at": 1789380131482
},
{
"uuid": "bbbbbbbb-1111-2222-3333-444444444444",
"event_type": "FEATURE_STEP_CHANGED",
"created_at": "2026-09-14T10:01:49.210377Z",
"component": null,
"feature_step": null,
"step": null,
"details": {
"old_feature_step": "OCR",
"current_feature_step": "LIVENESS"
},
"ip_address": null,
"user_agent": null,
"device_info": null,
"file_url": null,
"sent_at": 1789380107103
},
{
"uuid": "cccccccc-1111-2222-3333-444444444444",
"event_type": "STEP_RENDERED",
"created_at": "2026-09-14T10:01:00.581930Z",
"component": "DocumentCapture",
"feature_step": "OCR",
"step": "DOCUMENT_CAPTURE_FRONT",
"details": {},
"ip_address": "203.0.113.24",
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1",
"device_info": {
"device_model": "iPhone"
},
"file_url": null,
"sent_at": 1789380058776
}
]
}WORKFLOW_BRANCH_EVALUATED, WORKFLOW_STATUS_NODE_REACHED) and their details are described in Retrieve session, which can also return the timeline of a User Verification (KYC) session inside its decision with ?include=events.Authorizations
Your application's API key, from Developers -> API keys in the Business Console. The primary key has full access. A named key can be scoped: none, read or write per resource, limited to some workflows or to approved sessions, to a list of IP addresses, and to an expiry date. 401 means the key is missing, wrong, revoked or expired; 403 means the key has no access to this resource or action, or the request came from an address outside its IP list; 404 on a session route means the session is outside the key's workflows or statuses. A key without media access receives image, video and PDF URLs as null, and a key without sessions write receives session links and tokens as null. See https://docs.didit.me/console/api-keys.
Path Parameters
UUID of the verification session (the session_id returned by POST /v3/session/). Accepts both User Verification (KYC) and Business Verification (KYB) session IDs: the server resolves the ID across both session types. Must be a well-formed UUID; a malformed value does not match the route and returns an HTML 404.
"11111111-2222-3333-4444-555555555555"
Query Parameters
Maximum number of events per page. Defaults to 50. A value below 1 or a non-numeric value falls back to 50; a value above 1,000,000 returns 400.
1 <= x <= 100000050
Number of results to skip before the first returned one. Defaults to 0; a negative or non-numeric value falls back to 0, a value above 1,000,000 returns 400. Prefer following the next and previous URLs.
0 <= x <= 10000000
Optional sort override. The default order is -sent_at. Pass a result field name (for example sent_at, created_at, event_type, feature_step or step) to sort ascending, prefix it with - to sort descending, and separate several fields with commas. Unknown fields are ignored.
"sent_at"
Response
One page of the session's events, newest first.