curl -X GET 'https://verification.didit.me/v3/users/?limit=50' \
-H 'x-api-key: YOUR_API_KEY'import requests
resp = requests.get(
'https://verification.didit.me/v3/users/',
headers={'x-api-key': 'YOUR_API_KEY'},
params={'limit': 50},
)
resp.raise_for_status()
page = resp.json()
for user in page['results']:
print(user['vendor_data'], user['status'])const url = new URL('https://verification.didit.me/v3/users/');
url.searchParams.set('limit', '50');
const page = await fetch(url, {
headers: { 'x-api-key': process.env.DIDIT_API_KEY },
}).then((r) => r.json());
console.log(page.count, page.results.length);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/users/",
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/users/"
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/users/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/users/")
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": 2,
"next": null,
"previous": null,
"results": [
{
"didit_internal_id": "f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418",
"vendor_data": "user-abc-123",
"display_name": null,
"full_name": "John Michael Doe",
"date_of_birth": "1990-05-15",
"effective_name": "John Michael Doe",
"status": "ACTIVE",
"portrait_image_url": "https://<media-host>/...",
"session_count": 3,
"approved_count": 2,
"declined_count": 0,
"in_review_count": 1,
"issuing_states": [
"USA"
],
"approved_emails": [
"john@example.com"
],
"approved_phones": [
"+14155551234"
],
"features": {
"ID_VERIFICATION": "Approved",
"LIVENESS": "Approved",
"FACE_MATCH": "Approved",
"AML": "Approved"
},
"features_list": [
{
"feature": "ID_VERIFICATION",
"status": "Approved"
},
{
"feature": "LIVENESS",
"status": "Approved"
},
{
"feature": "FACE_MATCH",
"status": "Approved"
},
{
"feature": "AML",
"status": "Approved"
}
],
"last_session_at": "2025-06-15T10:30:00Z",
"last_activity_at": "2025-06-15T10:30:00Z",
"first_session_at": "2025-06-01T08:00:00Z",
"tags": [
{
"uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"name": "VIP",
"color": "#2567FF"
}
],
"created_at": "2025-06-01T08:00:00Z"
},
{
"didit_internal_id": "6ed99d53-e8f5-4cf8-9ac1-4a506cb40f6b",
"vendor_data": null,
"display_name": "Jane S.",
"full_name": "Jane Elizabeth Smith",
"date_of_birth": "1985-11-22",
"effective_name": "Jane S.",
"status": "FLAGGED",
"portrait_image_url": null,
"session_count": 1,
"approved_count": 0,
"declined_count": 0,
"in_review_count": 1,
"issuing_states": [],
"approved_emails": [],
"approved_phones": [],
"features": {
"ID_VERIFICATION": "In Review"
},
"features_list": [
{
"feature": "ID_VERIFICATION",
"status": "In Review"
}
],
"last_session_at": "2025-06-20T14:00:00Z",
"last_activity_at": "2025-06-20T14:05:00Z",
"first_session_at": "2025-06-20T14:00:00Z",
"tags": [],
"created_at": "2025-06-20T14:00:00Z"
}
]
}{
"detail": "You must be authenticated with a valid access token to access this endpoint."
}{
"detail": "You do not have permission to perform this action."
}{
"detail": "Request was throttled. Expected available in 30 seconds."
}List Users
List users Didit assembles from KYC sessions sharing the same vendor_data (free-form string, NOT a UUID), plus users created via the API. Paginated, ordered by last_session_at desc. This endpoint does not support filtering or search parameters — fetch pages and filter client-side.
curl -X GET 'https://verification.didit.me/v3/users/?limit=50' \
-H 'x-api-key: YOUR_API_KEY'import requests
resp = requests.get(
'https://verification.didit.me/v3/users/',
headers={'x-api-key': 'YOUR_API_KEY'},
params={'limit': 50},
)
resp.raise_for_status()
page = resp.json()
for user in page['results']:
print(user['vendor_data'], user['status'])const url = new URL('https://verification.didit.me/v3/users/');
url.searchParams.set('limit', '50');
const page = await fetch(url, {
headers: { 'x-api-key': process.env.DIDIT_API_KEY },
}).then((r) => r.json());
console.log(page.count, page.results.length);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/users/",
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/users/"
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/users/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/users/")
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": 2,
"next": null,
"previous": null,
"results": [
{
"didit_internal_id": "f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418",
"vendor_data": "user-abc-123",
"display_name": null,
"full_name": "John Michael Doe",
"date_of_birth": "1990-05-15",
"effective_name": "John Michael Doe",
"status": "ACTIVE",
"portrait_image_url": "https://<media-host>/...",
"session_count": 3,
"approved_count": 2,
"declined_count": 0,
"in_review_count": 1,
"issuing_states": [
"USA"
],
"approved_emails": [
"john@example.com"
],
"approved_phones": [
"+14155551234"
],
"features": {
"ID_VERIFICATION": "Approved",
"LIVENESS": "Approved",
"FACE_MATCH": "Approved",
"AML": "Approved"
},
"features_list": [
{
"feature": "ID_VERIFICATION",
"status": "Approved"
},
{
"feature": "LIVENESS",
"status": "Approved"
},
{
"feature": "FACE_MATCH",
"status": "Approved"
},
{
"feature": "AML",
"status": "Approved"
}
],
"last_session_at": "2025-06-15T10:30:00Z",
"last_activity_at": "2025-06-15T10:30:00Z",
"first_session_at": "2025-06-01T08:00:00Z",
"tags": [
{
"uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"name": "VIP",
"color": "#2567FF"
}
],
"created_at": "2025-06-01T08:00:00Z"
},
{
"didit_internal_id": "6ed99d53-e8f5-4cf8-9ac1-4a506cb40f6b",
"vendor_data": null,
"display_name": "Jane S.",
"full_name": "Jane Elizabeth Smith",
"date_of_birth": "1985-11-22",
"effective_name": "Jane S.",
"status": "FLAGGED",
"portrait_image_url": null,
"session_count": 1,
"approved_count": 0,
"declined_count": 0,
"in_review_count": 1,
"issuing_states": [],
"approved_emails": [],
"approved_phones": [],
"features": {
"ID_VERIFICATION": "In Review"
},
"features_list": [
{
"feature": "ID_VERIFICATION",
"status": "In Review"
}
],
"last_session_at": "2025-06-20T14:00:00Z",
"last_activity_at": "2025-06-20T14:05:00Z",
"first_session_at": "2025-06-20T14:00:00Z",
"tags": [],
"created_at": "2025-06-20T14:00:00Z"
}
]
}{
"detail": "You must be authenticated with a valid access token to access this endpoint."
}{
"detail": "You do not have permission to perform this action."
}{
"detail": "Request was throttled. Expected available in 30 seconds."
}Overview
Returns a paginated list of User entities for the authenticated application. Use this to sync users to your warehouse, find users needing analyst attention, or search by display name.When to use it
- Periodic sync of your user table to an external BI or warehouse.
- Analyst queues — filter by
status=FLAGGEDor stalelast_activity_atto drive a review inbox. - Search users by
display_name,full_name, orvendor_data.
Filters and pagination
| Query parameter | Description |
|---|---|
status | Filter by ACTIVE, FLAGGED, or BLOCKED. |
search | Substring match on vendor_data, display_name, full_name, emails, phones. |
country_code | Filter by issuing_states (ISO 3166-1 alpha-3). |
created_after, created_before | Creation date window (ISO 8601). |
last_activity_after, last_activity_before | Activity window. |
page_size | 1–200. Default: 50. |
cursor | Pagination cursor returned in the previous response. |
Notes
- Each response item includes
didit_internal_id.vendor_datamay benullwhen the original session or transaction did not provide one. - This endpoint paginates via cursor — persist the
nextcursor between calls and stop whennextis empty. - See the User data model for all fields on a user row.
Permissions
Any active API key of the application can call this endpoint. Didit API keys are application-scoped, not role-scoped: the Console’s roles and permissions (list:users and the rest) decide what a person can do in the Console, and are not evaluated
for Management API traffic. Control who can call this endpoint by controlling who can read
the application’s API key.
Related
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.
Query Parameters
Page size. Defaults to 50 when omitted. There is no enforced maximum, but keep pages small for latency.
x >= 1Zero-based offset of the first record to return. Prefer following the next URL from the previous page over computing this by hand.
x >= 0Response
Paginated list of users with verification status, session counts, and feature breakdown.
Number of matching rows — exact up to 100, capped at 100 beyond that for performance. Do not use it to detect the last page; rely on next being null instead.
Absolute URL of the next page, or null on the last page.
Absolute URL of the previous page, or null on the first page.
Show child attributes
Show child attributes