curl -s 'https://verification.didit.me/v3/sessions/8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d/reviews/?limit=50' \
-H 'x-api-key: YOUR_API_KEY'import os, requests
session_id = "8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d"
url = f"https://verification.didit.me/v3/sessions/{session_id}/reviews/"
while url: # walk every page of the feed
resp = requests.get(url, headers={"x-api-key": os.environ["DIDIT_API_KEY"]}, timeout=10)
resp.raise_for_status()
page = resp.json()
for entry in page["results"]:
print(entry["created_at"], entry["activity_type"], entry["actor_display"], entry.get("new_status"))
url = page["next"]const sessionId = "8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d";
const res = await fetch(
`https://verification.didit.me/v3/sessions/${sessionId}/reviews/`,
{ headers: { 'x-api-key': 'YOUR_API_KEY' } },
);
if (!res.ok) throw new Error(`Didit ${res.status}`);
const { count, results } = await res.json();
console.log(`${count} feed entries`);
for (const entry of results) {
console.log(entry.created_at, entry.activity_type, entry.actor_display, entry.new_status ?? "");
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/sessions/{session_id}/reviews/",
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/sessions/{session_id}/reviews/"
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/sessions/{session_id}/reviews/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/sessions/{session_id}/reviews/")
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": "de0561bc-5583-4409-9171-1a31a4c8a5f4",
"activity_type": "STATUS_UPDATED",
"actor_display": "API Client",
"actor_email": null,
"actor_type": "API_KEY",
"new_status": "Approved",
"previous_status": "In Review",
"comment": "Document re-checked manually; address matches.",
"mentioned_emails": [],
"previous_value": {
"status": "In Review"
},
"new_value": {
"status": "Approved"
},
"changed_fields": [
"status"
],
"metadata": null,
"created_at": "2026-06-12T00:19:31.918735Z"
},
{
"uuid": "35370f58-5098-44ee-8a06-8c9af80b2455",
"activity_type": "STATUS_UPDATED",
"actor_display": "Unknown",
"actor_email": null,
"actor_type": "CONSOLE_USER",
"new_status": null,
"previous_status": null,
"comment": "Note without status.",
"mentioned_emails": [],
"previous_value": null,
"new_value": null,
"changed_fields": [],
"metadata": null,
"created_at": "2026-06-12T00:18:44.504157Z"
},
{
"uuid": "00338f82-f1c5-4f57-8614-c49bb258af1a",
"activity_type": "STATUS_UPDATED",
"actor_display": "Unknown",
"actor_email": null,
"actor_type": "CONSOLE_USER",
"new_status": "In Review",
"previous_status": null,
"comment": "Flagging for manual document re-check.",
"mentioned_emails": [],
"previous_value": null,
"new_value": null,
"changed_fields": [],
"metadata": null,
"created_at": "2026-06-12T00:18:44.466537Z"
}
]
}List Session Reviews
Return the audit trail / activity feed for a User Verification (KYC) session, newest first, in a paginated envelope (count / next / previous / results, 50 entries per page by default).
Feed entries are written by every actor that touches the session: manual decisions made through PATCH /v3/session/{session_id}/update-status/ (which records previous_status → new_status), Console reviewer activity (comments with @email mentions, KYC/POA data edits, file uploads/removals, tag changes, detail-page views), AML ongoing-monitoring matches, and notes appended via POST on this same path. Reading this feed is the API-side equivalent of the Activity panel in the Didit Console session view.
Only User Verification (KYC) sessions are addressable here; Business Verification (KYB) session IDs return 404.
curl -s 'https://verification.didit.me/v3/sessions/8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d/reviews/?limit=50' \
-H 'x-api-key: YOUR_API_KEY'import os, requests
session_id = "8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d"
url = f"https://verification.didit.me/v3/sessions/{session_id}/reviews/"
while url: # walk every page of the feed
resp = requests.get(url, headers={"x-api-key": os.environ["DIDIT_API_KEY"]}, timeout=10)
resp.raise_for_status()
page = resp.json()
for entry in page["results"]:
print(entry["created_at"], entry["activity_type"], entry["actor_display"], entry.get("new_status"))
url = page["next"]const sessionId = "8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d";
const res = await fetch(
`https://verification.didit.me/v3/sessions/${sessionId}/reviews/`,
{ headers: { 'x-api-key': 'YOUR_API_KEY' } },
);
if (!res.ok) throw new Error(`Didit ${res.status}`);
const { count, results } = await res.json();
console.log(`${count} feed entries`);
for (const entry of results) {
console.log(entry.created_at, entry.activity_type, entry.actor_display, entry.new_status ?? "");
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/sessions/{session_id}/reviews/",
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/sessions/{session_id}/reviews/"
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/sessions/{session_id}/reviews/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/sessions/{session_id}/reviews/")
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": "de0561bc-5583-4409-9171-1a31a4c8a5f4",
"activity_type": "STATUS_UPDATED",
"actor_display": "API Client",
"actor_email": null,
"actor_type": "API_KEY",
"new_status": "Approved",
"previous_status": "In Review",
"comment": "Document re-checked manually; address matches.",
"mentioned_emails": [],
"previous_value": {
"status": "In Review"
},
"new_value": {
"status": "Approved"
},
"changed_fields": [
"status"
],
"metadata": null,
"created_at": "2026-06-12T00:19:31.918735Z"
},
{
"uuid": "35370f58-5098-44ee-8a06-8c9af80b2455",
"activity_type": "STATUS_UPDATED",
"actor_display": "Unknown",
"actor_email": null,
"actor_type": "CONSOLE_USER",
"new_status": null,
"previous_status": null,
"comment": "Note without status.",
"mentioned_emails": [],
"previous_value": null,
"new_value": null,
"changed_fields": [],
"metadata": null,
"created_at": "2026-06-12T00:18:44.504157Z"
},
{
"uuid": "00338f82-f1c5-4f57-8614-c49bb258af1a",
"activity_type": "STATUS_UPDATED",
"actor_display": "Unknown",
"actor_email": null,
"actor_type": "CONSOLE_USER",
"new_status": "In Review",
"previous_status": null,
"comment": "Flagging for manual document re-check.",
"mentioned_emails": [],
"previous_value": null,
"new_value": null,
"changed_fields": [],
"metadata": null,
"created_at": "2026-06-12T00:18:44.466537Z"
}
]
}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 User Verification (KYC) session. Must belong to the same application as the API key — cross-application UUIDs, deleted sessions, and Business Verification (KYB) session IDs all return 404.
"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d"
Query Parameters
Page size. Defaults to 50.
50
Number of entries to skip from the start of the (ordered) feed. Defaults to 0. The next / previous URLs in the response carry the right values for walking the feed.
0
Sort order. The feed defaults to newest first (-created_at); pass created_at to read it oldest first. Unknown values are silently ignored (default order is used); other serializer field names are also accepted.
"created_at"
Response
Paginated activity feed, newest first by default. count is the total number of entries; next / previous are ready-made page URLs (null at the ends). A count of 0 with empty results means no activity has been recorded yet.
Total number of feed entries for this session (across all pages).
3
URL of the next page, or null on the last page.
null
URL of the previous page, or null on the first page.
null
Feed entries for this page.
Show child attributes
Show child attributes