Checks and reports

AI Tools

Session retrieval requires a session ID, this is generated from the create a session endpoint. Below is a basic example of what retrieving a session looks like:

// Returns a session result idvClient.getSession(sessionId).then(session => { const sessionId = session.getSessionId(); const clientSessionTokenTtl = session.getClientSessionTokenTtl(); const clientSessionToken = session.getClientSessionToken(); const userTrackingId = session.getUserTrackingId(); // Returns the session state const state = session.getState(); // Returns session resources const resources = session.getResources(); // Returns all checks on the session const checks = session.getChecks(); // Return specific check types const authenticityChecks = session.getAuthenticityChecks(); const faceMatchChecks = session.getFaceMatchChecks(); const textDataChecks = session.getTextDataChecks(); const livenessChecks = session.getLivenessChecks(); const watchlistScreeningChecks = session.getWatchlistScreeningChecks(); const watchlistAdvancedCaChecks = session.getWatchlistAdvancedCaChecks(); // Returns biometric consent timestamp const biometricConsent = session.getBiometricConsentTimestamp(); }).catch(error => { // handle error })
// Returns a session result GetSessionResult sessionResult = docScanClient.getSession(sessionId); Long clientSessionTokenttl = sessionResult.getClientSessionTokenTtl(); String clientSessionToken = sessionResult.getClientSessionToken(); String userTrackingId = sessionResult.getUserTrackingId(); // Returns the session state String state = sessionResult.getState(); // Returns session resources ResourceContainer resources = sessionResult.getResources(); // Returns all checks on the session List<? extends CheckResponse> checks = sessionResult.getChecks(); // Return specific check types List<AuthenticityCheckResponse> authenticityChecks = sessionResult.getAuthenticityChecks(); List<FaceMatchCheckResponse> faceMatchChecks = sessionResult.getFaceMatchChecks(); List<TextDataCheckResponse> textDataChecks = sessionResult.getTextDataChecks(); List<LivenessCheckResponse> livenessChecks = sessionResult.getLivenessChecks(); List<WatchlistScreeningCheckResponse> watchlistScreeningChecks = getSessionResult.getWatchlistScreeningChecks(); List<WatchlistAdvancedCaCheckResponse> watchlistAdvancedCaChecks = getSessionResult.getWatchlistAdvancedCaChecks(); // Returns biometric consent timestamp String biometricConsent = sessionResult.getBiometricConsentTimestamp();
<?php // Returns a session result $sessionResult = $docScanClient->getSession($sessionId); $sessionId = $sessionResult->getSessionId(); $userTrackingId = $sessionResult->getUserTrackingId(); $clientSessionToken = $sessionResult->getClientSessionToken(); $clientSessionTokenTtl = $sessionResult->getClientSessionTokenTtl(); // Returns the session state $state = $sessionResult->getState(); // Returns session resources $resources = $sessionResult->getResources(); // Returns all checks on the session $checks = $sessionResult->getChecks(); // Return specific check types $authenticityChecks = $sessionResult->getAuthenticityChecks(); $faceMatchChecks = $sessionResult->getFaceMatchChecks(); $textDataChecks = $sessionResult->getTextDataChecks(); $livenessChecks = $sessionResult->getLivenessChecks(); $watchlistScreeningChecks = $sessionResult->getWatchlistScreeningChecks(); $watchlistAdvancedCaChecks = $sessionResult->getWatchlistAdvancedCaChecks(); // Returns biometric consent timestamp $biometricConsent = $sessionResult->getBiometricConsentTimestamp();
# Returns a session result session_result = doc_scan_client.get_session(session_id) client_session_token_ttl = session_result.client_session_token_ttl client_session_token = session_result.client_session_token user_tracking_id = session_result.user_tracking_id # Returns the session state state = session_result.state # Returns session resources resources = session_result.resources # Returns all checks on the session checks = session_result.checks # Return specific check types authenticity_checks = session_result.authenticity_checks face_match_checks = session_result.face_match_checks text_data_checks = session_result.text_data_checks liveness_checks = session_result.liveness_checks # Returns biometric consent timestamp biometric_consent = session_result.biometric_consent_timestamp
// Returns a session result GetSessionResult sessionResult = docScanClient.GetSession(sessionId); int clientSessionTokenTtl = sessionResult.ClientSessionTokenTtl; string clientSessionToken = sessionResult.ClientSessionToken; string user_tracking_id = sessionResult.UserTrackingId; // Returns the session state string state = sessionResult.State; // Returns session resources ResourceContainer resources = sessionResult.Resources; // Returns all checks on the session List<CheckResponse> checks = sessionResult.Checks; // Return specific check types List<AuthenticityCheckResponse> authenticityChecks = sessionResult.GetAuthenticityChecks(); List<FaceMatchCheckResponse> faceMatchChecks = sessionResult.GetFaceMatchChecks(); List<TextDataCheckResponse> textDataChecks = sessionResult.GetTextDataChecks(); List<LivenessCheckResponse> livenessChecks = sessionResult.GetLivenessChecks(); // Returns biometric consent timestamp DateTime biometricConsent = sessionResult.BiometricConsentTimestamp();
var sessionResults *retrieve.GetSessionResult sessionResults, err = client.GetSession(sessionId) if err != nil { panic(err) } clientSessionTokenTtl := sessionResults.ClientSessionTokenTTL clientSessionToken := sessionResults.ClientSessionToken userTrackingId := sessionResults.UserTrackingID state := sessionResults.State resources := sessionResults.Resources checks := sessionResults.Checks authenticityChecks := sessionResults.AuthenticityChecks faceMatchChecks := sessionResults.FaceMatchChecks textDataChecks := sessionResults.TextDataChecks livenessChecks := sessionResults.LivenessChecks watchlistScreeningChecks := sessionResults.WatchlistScreeningChecks watchlistAdvancedCaChecks := sessionResults.WatchlistAdvancedCaChecks biometricConsent := sessionResults.BiometricConsentTimestamp
{ "client_session_token_ttl": 8766, "session_id": "54813b93-5854-4e0b-bc63-454621b6f32c", "state": "COMPLETED", "digital_id_shares": [], "resources": { "id_documents": [ { "id": "4425510e-2e01-48f1-8049-ce2efd5a7912", "tasks": [ { "type": "ID_DOCUMENT_TEXT_DATA_EXTRACTION", "id": "28f299f4-f251-48c7-b0aa-b7169af87129", "state": "DONE", "created": "2026-08-06T08:36:21Z", "last_updated": "2026-08-06T08:36:47Z", "generated_media": [ { "id": "d7fbbeed-2d3d-43a6-a45d-3803955d2806", "type": "JSON" } ], "recommendation": { "value": "PROGRESS" }, "generated_checks": [] } ], "source": { "type": "END_USER" }, "created_at": "2026-08-06T08:36:21Z", "last_updated": "2026-08-06T08:36:47Z", "document_type": "DRIVING_LICENCE", "issuing_country": "GBR", "pages": [ { "capture_method": "CAMERA", "media": { "id": "88afe4ab-0a6e-4e6c-a9a1-112fb748e4ad", "type": "IMAGE", "created": "2026-08-06T08:36:42Z", "last_updated": "2026-08-06T08:36:42Z" }, "frames": [ { "media": { "id": "51975b31-a1f7-4e7a-8a9c-335b6a064162", "type": "IMAGE", "created": "2026-08-06T08:36:43Z", "last_updated": "2026-08-06T08:36:43Z" } }, { "media": { "id": "1e2f4647-7277-4e36-8f9a-358fbd0795f6", "type": "IMAGE", "created": "2026-08-06T08:36:43Z", "last_updated": "2026-08-06T08:36:43Z" } } ], "extraction_image_ids": [ "88afe4ab-0a6e-4e6c-a9a1-112fb748e4ad" ] }, { "capture_method": "CAMERA", "media": { "id": "d3d9f749-404f-49d9-8670-8d4f0c2c78bd", "type": "IMAGE", "created": "2026-08-06T08:36:42Z", "last_updated": "2026-08-06T08:36:42Z" }, "frames": [ { "media": { "id": "075d9349-2c56-4630-b536-08b0760b693b", "type": "IMAGE", "created": "2026-08-06T08:36:43Z", "last_updated": "2026-08-06T08:36:43Z" } }, { "media": { "id": "a254e594-7a87-4e07-a8cc-d3aa9a65fef9", "type": "IMAGE", "created": "2026-08-06T08:36:43Z", "last_updated": "2026-08-06T08:36:43Z" } } ], "extraction_image_ids": [ "d3d9f749-404f-49d9-8670-8d4f0c2c78bd" ] } ], "document_fields": { "media": { "id": "d7fbbeed-2d3d-43a6-a45d-3803955d2806", "type": "JSON", "created": "2026-08-06T08:36:47Z", "last_updated": "2026-08-06T08:36:47Z" } }, "document_id_photo": { "media": { "id": "884cf1fe-ffe3-4990-bd13-85e75ad4dfc1", "type": "IMAGE", "created": "2026-08-06T08:36:47Z", "last_updated": "2026-08-06T08:36:47Z" } } } ], "supplementary_documents": [], "liveness_capture": [ { "id": "135ba24b-8900-4307-984a-88e6fbe244a1", "tasks": [], "source": { "type": "END_USER" }, "created_at": "2026-08-06T08:37:40Z", "last_updated": "2026-08-06T08:37:59Z", "frames": [ { "media": { "id": "5f3b6c6e-ae8e-42b3-8bec-67aee1d102e5", "type": "IMAGE", "created": "2026-08-06T08:37:58Z", "last_updated": "2026-08-06T08:37:58Z" } }, { "media": { "id": "40ee57d8-2ee4-4b90-bcf8-2b0bd3e8303f", "type": "IMAGE", "created": "2026-08-06T08:37:58Z", "last_updated": "2026-08-06T08:37:58Z" } }, { "media": { "id": "0e0a4781-33a5-4c79-8af1-7f70eae0ed7d", "type": "IMAGE", "created": "2026-08-06T08:37:58Z", "last_updated": "2026-08-06T08:37:58Z" } }, { }, { }, { }, { } ], "liveness_type": "ZOOM", "facemap": { "media": { "id": "f3baa8dc-612b-4d59-8090-b298d37461fa", "type": "BINARY", "created": "2026-08-06T08:37:59Z", "last_updated": "2026-08-06T08:37:59Z" } } } ], "face_capture": [], "applicant_profiles": [], "share_codes": [] }, "checks": [ { "type": "ID_DOCUMENT_AUTHENTICITY", "id": "202117c7-4009-4083-9e9f-29c7a9b3bbf7", "state": "DONE", "resources_used": [ "4425510e-2e01-48f1-8049-ce2efd5a7912", "135ba24b-8900-4307-984a-88e6fbe244a1" ], "generated_media": [], "report": { "recommendation": { "value": "APPROVE" }, "breakdown": [ { "sub_check": "age_estimation_dob_comparison", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "doc_number_validation", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "document_in_date", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "document_recognition", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "fraud_list_check", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "physical_document_captured", "result": "PASS", "details": [ { "name": "screen_replay_trust_score", "value": "1.00" }, { "name": "screen_replay", "value": "VERY_UNLIKELY" }, { "name": "printed_copy_trust_score", "value": "0.94" }, { "name": "printed_copy", "value": "VERY_UNLIKELY" } ], "process": "AUTOMATED" }, { "sub_check": "portrait_integrity", "result": "PASS", "details": [ { "name": "portrait_substitution_trust_score", "value": "0.99" }, { "name": "portrait_substitution", "value": "VERY_UNLIKELY" } ], "process": "AUTOMATED" }, { "sub_check": "yoti_fraud_list_check", "result": "PASS", "details": [ { "name": "provider_org", "value": "Yoti Ltd" } ], "process": "AUTOMATED" }, { "sub_check": "yoti_fraud_selfie_check", "result": "PASS", "details": [ { "name": "provider_org", "value": "Yoti Ltd" } ], "process": "AUTOMATED" } ] }, "created": "2026-08-06T08:38:02Z", "last_updated": "2026-08-06T08:38:06Z" }, { "type": "LIVENESS", "id": "44863d82-1004-411b-af7a-1c873b0f46ed", "state": "DONE", "resources_used": [ "135ba24b-8900-4307-984a-88e6fbe244a1" ], "generated_media": [], "report": { "recommendation": { "value": "APPROVE" }, "breakdown": [ { "sub_check": "liveness_auth", "result": "PASS", "details": [], "process": "AUTOMATED" } ] }, "created": "2026-08-06T08:37:59Z", "last_updated": "2026-08-06T08:38:01Z" }, { "type": "ID_DOCUMENT_FACE_MATCH", "id": "42fe90c9-ad05-42d1-b441-ad4e22726af9", "state": "DONE", "resources_used": [ "4425510e-2e01-48f1-8049-ce2efd5a7912", "135ba24b-8900-4307-984a-88e6fbe244a1" ], "generated_media": [], "report": { "recommendation": { "value": "APPROVE" }, "breakdown": [ { "sub_check": "ai_face_match", "result": "PASS", "details": [ { "name": "confidence_score", "value": "0.80" } ], "process": "AUTOMATED" } ] }, "created": "2026-08-06T08:38:02Z", "last_updated": "2026-08-06T08:38:03Z" }, { "type": "WATCHLIST_SCREENING", "id": "9f89499a-d788-4306-9eb7-d9f8d7c8569b", "state": "DONE", "resources_used": [ "4425510e-2e01-48f1-8049-ce2efd5a7912" ], "generated_media": [ { "id": "56936993-0d13-4c8c-bf49-3102be6925a8", "type": "JSON" } ], "report": { "recommendation": { "value": "APPROVE" }, "breakdown": [ { "sub_check": "adverse_media", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "fitness_probity", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "pep", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "sanction", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "warning", "result": "PASS", "details": [], "process": "AUTOMATED" } ], "watchlist_summary": { "total_hits": 0, "search_config": { "categories": [ "ADVERSE-MEDIA", "SANCTIONS" ] }, "raw_results": { "media": { "id": "f869f902-fc7c-45b2-8582-7000a75344ad", "type": "JSON", "created": "2026-08-06T08:38:03Z", "last_updated": "2026-08-06T08:38:03Z" } }, "associated_country_codes": [ "GBR" ] } }, "created": "2026-08-06T08:38:02Z", "last_updated": "2026-08-06T08:38:03Z", "generated_profile": { "media": { "id": "56936993-0d13-4c8c-bf49-3102be6925a8", "type": "JSON", "created": "2026-08-06T08:38:03Z", "last_updated": "2026-08-06T08:38:03Z" } } } ], "biometric_consent": "2026-08-06T08:37:38Z" }

The following are present in every session result:

Parameter

Value

Description

Session ID

uuid

Unique identifier for a identity verification session.

Client session token

uuid

Unique identifier, Used to authenticate the session.

Client session token ttl

integer

Returns the time left in seconds until the the session expires.

User tracking ID

uuid

The user ID you set in your backend.

State

ONGOING COMPLETED EXPIRED

The current state of the session. It provides the overall state of the session. You can search through session results prior to the session being completed, but some checks may not have been processed yet.

Resources

Object

A container of all ID documents and liveness captures for this session. A new resource is created on each attempt at a document or liveness submission.

Checks

Object

A container of all checks performed for this session.


Results of checks

Basic examples of how to get the results of each check can be found below.

A recommendation reason will only be provided if the value isn't 'APPROVE'. The recommended approach for processing a session is to ensure that each check value is APPROVE.

We will use the check container to iterate through all of the checks that have been completed as part of the session. The checks object will only contain information once the user has completed all events in the session.

Document Authenticity

The document authenticity check can be fully automated or have a manual check. This can alter the sub checks that have been performed.

idvClient.getSession(sessionId).then(session => { // Returns a collection of authenticity checks const authenticityChecks = session.getAuthenticityChecks(); authenticityChecks.map(check => { // Returns the id of the check const id = check.getId(); // Returns the state of the check const state = check.getState(); // Returns an array of resources used in the check const resourcesUsed = check.getResourcesUsed(); // Returns the report for the check const report = check.getReport(); // Returns the recommendation value const recommendation = report.getRecommendation().getValue(); // Returns the report breakdown including sub-checks const breakdown = report.getBreakdown(); breakdown.forEach(function(breakdown) { // Returns the sub-check const subCheck = breakdown.getSubCheck(); // Returns the sub-check result const subCheckResult = breakdown.getResult(); }); }) }).catch(error => { // handle error })
GetSessionResult sessionResult = docScanClient.getSession(sessionId); // Returns a collection of authenticity checks List<? extends CheckResponse> authenticityChecks = sessionResult.getAuthenticityChecks(); for (CheckResponse check: authenticityChecks) { // Returns the id of the check String id = check.getId(); // Returns the state of the check String state = check.getState(); // Returns a list of resources used in the check List<String> resourcesUsed = check.getResourcesUsed(); // Returns the report for the check ReportResponse report = check.getReport(); // Returns the recommendation value, either APPROVE, NOT_AVAILABLE or REJECT String recommendationValue = report.getRecommendation().getValue(); // Returns the report breakdown including sub-checks List<? extends BreakdownResponse> breakdown = report.getBreakdown(); for (BreakdownResponse breakdown: breakdown) { // Returns the sub-check String subCheck = breakdown.getSubCheck(); // Returns the sub-check result String subCheckResult = breakdown.getResult(); } }
<?php $sessionResult = $docScanClient->getSession($sessionId); // Returns a collection of authenticity checks $authenticityChecks = $sessionResult->getAuthenticityChecks(); foreach($authenticityChecks as $check) { // Returns the id of the check $id = $check->getId(); // Returns the state of the check $state = $check->getState(); // Returns an array of resources used in the check $resourcesUsed = $check->getResourcesUsed(); // Returns the report for the check $report = $check->getReport(); // Returns the recommendation value, either APPROVE, NOT_AVAILABLE or REJECT $recommendationValue = $report->getRecommendation()->getValue(); // Returns the report breakdown including sub-checks $breakdown = $report->getBreakdown(); foreach($breakdown as $breakdown) { // Returns the sub-check $subCheck = $breakdown->getSubCheck(); // Returns the sub-check result $subCheckResult = $breakdown->getResult(); } }
session_result = doc_scan_client.get_session(session_id) # Returns a collection of checks checks = session_result.authenticity_checks for check in checks: # Returns the id of the check check_id = check.id # Returns the state of the check check_state = check.state # Returns an array of resources used in this check resources_used = check.resources_used # Returns tje report for the check report = check.report # Returns the recommendation value, either APPROVE, NOT_AVAILABLE or REJECT recommendation_value = report.recommendation.value # Returns the report breakdown including sub-checks breakdown = report.breakdown for breakdown in breakdown: # Returns the sub-check subCheck = breakdown.sub_check # Returns the sub-check result subCheckResult = breakdown.result
GetSessionResult sessionResult = docScanClient.GetSession(sessionId); // Returns a collection of checks List<CheckResponse> authenticityChecks = sessionResult.GetAuthenticityChecks(); foreach (CheckResponse check in authenticityChecks) { // Returns the id of the check string id = check.Id; // Returns the state of the check string state = check.State; // Returns an array of resources used in this check List<String> resourcesUsed = check.ResourcesUsed; // Returns the report for the check ReportResponse report = check.Report; // Returns the recommendation value, either APPROVE, NOT_AVAILABLE or REJECT string recommendationValue = report.Recommendation.Value; // Returns the report breakdown including sub-checks List<BreakdownResponse> breakdown = report.Breakdown; foreach (BreakdownResponse breakdown in breakdown) { // Returns the sub-check string subCheck = breakdown.SubCheck; // Returns the sub-check result string subCheckResult = breakdown.Result; } }
// COMING SOON
{ "type": "ID_DOCUMENT_AUTHENTICITY", "id": "202117c7-4009-4083-9e9f-29c7a9b3bbf7", "state": "DONE", "resources_used": [ "4425510e-2e01-48f1-8049-ce2efd5a7912", "135ba24b-8900-4307-984a-88e6fbe244a1" ], "generated_media": [], "report": { "recommendation": { "value": "APPROVE" }, "breakdown": [ { "sub_check": "age_estimation_dob_comparison", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "doc_number_validation", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "document_in_date", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "document_recognition", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "fraud_list_check", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "physical_document_captured", "result": "PASS", "details": [ { "name": "screen_replay_trust_score", "value": "1.00" }, { "name": "screen_replay", "value": "VERY_UNLIKELY" }, { "name": "printed_copy_trust_score", "value": "0.94" }, { "name": "printed_copy", "value": "VERY_UNLIKELY" } ], "process": "AUTOMATED" }, { "sub_check": "portrait_integrity", "result": "PASS", "details": [ { "name": "portrait_substitution_trust_score", "value": "0.99" }, { "name": "portrait_substitution", "value": "VERY_UNLIKELY" } ], "process": "AUTOMATED" }, { "sub_check": "yoti_fraud_list_check", "result": "PASS", "details": [ { "name": "provider_org", "value": "Yoti Ltd" } ], "process": "AUTOMATED" }, { "sub_check": "yoti_fraud_selfie_check", "result": "PASS", "details": [ { "name": "provider_org", "value": "Yoti Ltd" } ], "process": "AUTOMATED" } ] }, "created": "2026-08-06T08:38:02Z", "last_updated": "2026-08-06T08:38:06Z" },

Liveness

The liveness response is available immediately. The user may have multiple attempts of liveness and It's possible for some of these attempts to be rejected.

// change to async idvClient.getSession(sessionId).then(session => { // Returns a collection of liveness checks const livenessChecks = session.getLivenessChecks(); livenessChecks.map(check => { // Returns the id of the check const id = check.getId(); // Returns the state of the check const state = check.getState(); // Returns an array of resources used in the check const resourcesUsed = check.getResourcesUsed(); // Returns the report for the check const report = check.getReport(); // Returns the recommendation value const recommendation = report.getRecommendation().getValue(); // Returns the report breakdown including sub-checks const breakdown = report.getBreakdown(); breakdown.forEach(function(breakdown) { // Returns the sub-check const subCheck = breakdown.getSubCheck(); // Returns the sub-check result const subCheckResult = breakdown.getResult(); }); }) }).catch(error => { // handle error })
GetSessionResult sessionResult = docScanClient.getSession(sessionId); // Returns a collection of liveness checks List<? extends CheckResponse> livenessChecks = sessionResult.getLivenessChecks(); for (CheckResponse check: livenessChecks) { // Returns the id of the check String id = check.getId(); // Returns the state of the check String state = check.getState(); // Returns a list of resources used in the check List<String> resourcesUsed = check.getResourcesUsed(); // Returns the report for the check ReportResponse report = check.getReport(); // Returns the recommendation value, either APPROVE, NOT_AVAILABLE or REJECT String recommendationValue = report.getRecommendation().getValue(); // Returns the report breakdown including sub-checks List<? extends BreakdownResponse> breakdown = report.getBreakdown(); for (BreakdownResponse breakdown: breakdown) { // Returns the sub-check String subCheck = breakdown.getSubCheck(); // Returns the sub-check result String subCheckResult = breakdown.getResult(); } }
<?php $sessionResult = $docScanClient->getSession($sessionId); // Returns a collection of liveness checks $livenessChecks = $sessionResult->getLivenessChecks(); foreach($livenessChecks as $check) { // Returns the id of the check $id = $check->getId(); // Returns the state of the check $state = $check->getState(); // Returns an array of resources used in the check $resourcesUsed = $check->getResourcesUsed(); // Returns the report for the check $report = $check->getReport(); // Returns the recommendation value, either APPROVE, NOT_AVAILABLE or REJECT $recommendationValue = $report->getRecommendation()->getValue(); // Returns the report breakdown including sub-checks $breakdown = $report->getBreakdown(); foreach($breakdown as $breakdown) { // Returns the sub-check $subCheck = $breakdown->getSubCheck(); // Returns the sub-check result $subCheckResult = $breakdown->getResult(); } }
session_result = doc_scan_client.get_session(session_id) # Returns a collection of checks checks = session_result.liveness_checks for check in checks: # Returns the id of the check check_id = check.id # Returns the state of the check check_state = check.state # Returns an array of resources used in this check resources_used = check.resources_used # Returns tje report for the check report = check.report # Returns the recommendation value, either APPROVE, NOT_AVAILABLE or REJECT recommendation_value = report.recommendation.value # Returns the report breakdown including sub-checks breakdown = report.breakdown for breakdown in breakdown: # Returns the sub-check subCheck = breakdown.sub_check # Returns the sub-check result subCheckResult = breakdown.result
// change to async idvClient.getSession(sessionId).then(session => { // Returns a collection of liveness checks const livenessChecks = session.getLivenessChecks(); livenessChecks.map(check => { // Returns the id of the check const id = check.getId(); // Returns the state of the check const state = check.getState(); // Returns an array of resources used in the check const resourcesUsed = check.getResourcesUsed(); // Returns the report for the check const report = check.getReport(); // Returns the recommendation value const recommendation = report.getRecommendation().getValue(); // Returns the report breakdown including sub-checks const breakdown = report.getBreakdown(); breakdown.forEach(function(breakdown) { // Returns the sub-check const subCheck = breakdown.getSubCheck(); // Returns the sub-check result const subCheckResult = breakdown.getResult(); }); }) }).catch(error => { // handle error })
// COMING SOON
{ "type": "LIVENESS", "id": "44863d82-1004-411b-af7a-1c873b0f46ed", "state": "DONE", "resources_used": [ "135ba24b-8900-4307-984a-88e6fbe244a1" ], "generated_media": [], "report": { "recommendation": { "value": "APPROVE" }, "breakdown": [ { "sub_check": "liveness_auth", "result": "PASS", "details": [], "process": "AUTOMATED" } ] }, "created": "2026-08-06T08:37:59Z", "last_updated": "2026-08-06T08:38:01Z" },

Face Match

The face match check can be fully automated or have a manual check. This can alter the sub checks that have been performed.

idvClient.getSession(sessionId).then(session => { // Returns a collection of liveness checks const faceMatchChecks = session.getFaceMatchChecks(); faceMatchChecks.map(check => { // Returns the id of the check const id = check.getId(); // Returns the state of the check const state = check.getState(); // Returns an array of resources used in the check const resourcesUsed = check.getResourcesUsed(); // Returns the report for the check const report = check.getReport(); // Returns the recommendation value const recommendation = report.getRecommendation().getValue(); }) }).catch(error => { // handle error })
// Click to edit code
// Click to edit code
// Click to edit code
GetSessionResult sessionResult = docScanClient.GetSession(sessionId); // Returns a collection of checks List<CheckResponse> faceMatchChecks = sessionResult.GettFaceMatchChecks(); foreach (CheckResponse check in faceMatchChecks) { // Returns the id of the check string id = check.Id; // Returns the state of the check string state = check.State; // Returns an array of resources used in this check List<String> resourcesUsed = check.ResourcesUsed; // Returns the report for the check ReportResponse report = check.Report; // Returns the recommendation value, either APPROVE, NOT_AVAILABLE or REJECT string recommendationValue = report.Recommendation.Value; }
// COMING SOON
{ "type": "ID_DOCUMENT_FACE_MATCH", "id": "42fe90c9-ad05-42d1-b441-ad4e22726af9", "state": "DONE", "resources_used": [ "4425510e-2e01-48f1-8049-ce2efd5a7912", "135ba24b-8900-4307-984a-88e6fbe244a1" ], "generated_media": [], "report": { "recommendation": { "value": "APPROVE" }, "breakdown": [ { "sub_check": "ai_face_match", "result": "PASS", "details": [ { "name": "confidence_score", "value": "0.80" } ], "process": "AUTOMATED" } ] }, "created": "2026-08-06T08:38:02Z", "last_updated": "2026-08-06T08:38:03Z" },

AML

There are two different types of AML checks that can be configured, In addition to the normal check report, AML watchlist checks will also return a WatchlistSummary object.

Watchlist Check:

const watchlistScreeningChecks = session.getWatchlistScreeningChecks(); const report = watchlistScreeningChecks[0].getReport(); // Watchlist Screening summary const watchlistSummary = report.getWatchlistSummary(); const associatedCountryCodes = watchlistSummary.getAssociatedCountryCodes(); const rawResults = watchlistSummary.getRawResults(); const totalHits = watchlistSummary.getTotalHits(); // Search config used const searchConfig = watchlistSummary.getSearchConfig(); const categories = searchConfig.getCategories();
List<WatchlistScreeningCheckResponse> watchlistScreeningChecks = getSessionResult.getWatchlistScreeningChecks(); WatchlistScreeningCheckResponse watchlistScreeningCheckResponse = watchlistScreeningChecks.get(0); WatchlistScreeningReportResponse report = watchlistScreeningCheckResponse.getReport(); // Watchlist Screening summary WatchlistScreeningSummaryResponse watchlistSummary = report.getWatchlistSummary(); List<String> associatedCountryCodes = watchlistSummary.getAssociatedCountryCodes(); RawResultsResponse rawResults = watchlistSummary.getRawResults(); int totalHits = watchlistSummary.getTotalHits(); // Search config used WatchlistScreeningSearchConfigResponse searchConfig = watchlistSummary.getSearchConfig(); List<String> categories = searchConfig.getCategories();
$watchlistScreeningChecks = $session->getWatchlistScreeningChecks(); $report = $watchlistScreeningChecks[0]->getReport(); // Watchlist Screening summary $watchlistSummary = $report->getWatchlistSummary(); $associatedCountryCodes = $watchlistSummary->getAssociatedCountryCodes(); $rawResults = $watchlistSummary->getRawResults(); $totalHits = $watchlistSummary->getTotalHits(); // Search config used $searchConfig = $watchlistSummary->getSearchConfig(); $categories = $searchConfig->getCategories();
# COMING SOON
GetSessionResult getSessionResult = docScanClient.GetSession(sessionId); List<WatchlistScreeningCheckResponse> watchlistScreeningChecks = getSessionResult.GetWatchlistScreeningChecks(); ReportResponse reportResponse = watchlistScreeningChecks[0].Report; ReportResponseWithSummary reportResponseWithSummary = (ReportResponseWithSummary)reportResponse; string recommendationValue = reportResponseWithSummary.Recommendation.Value; string recommendationReason = reportResponseWithSummary.Recommendation.Reason; List<BreakdownResponse> breakdowns = reportResponseWithSummary.Breakdown;
// COMING SOON
{ "type": "WATCHLIST_SCREENING", "id": "9f89499a-d788-4306-9eb7-d9f8d7c8569b", "state": "DONE", "resources_used": [ "4425510e-2e01-48f1-8049-ce2efd5a7912" ], "generated_media": [ { "id": "56936993-0d13-4c8c-bf49-3102be6925a8", "type": "JSON" } ], "report": { "recommendation": { "value": "APPROVE" }, "breakdown": [ { "sub_check": "adverse_media", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "fitness_probity", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "pep", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "sanction", "result": "PASS", "details": [], "process": "AUTOMATED" }, { "sub_check": "warning", "result": "PASS", "details": [], "process": "AUTOMATED" } ], "watchlist_summary": { "total_hits": 0, "search_config": { "categories": [ "ADVERSE-MEDIA", "SANCTIONS" ] }, "raw_results": { "media": { "id": "f869f902-fc7c-45b2-8582-7000a75344ad", "type": "JSON", "created": "2026-08-06T08:38:03Z", "last_updated": "2026-08-06T08:38:03Z" } }, "associated_country_codes": [ "GBR" ] } },

Advanced Watchlist Check:

const watchlistAdvancedCaChecks = session.getWatchlistAdvancedCaChecks(); const report = watchlistScreeningChecks[0].getReport(); // Watchlist summary const watchlistSummary = report.getWatchlistSummary(); const associatedCountryCodes = watchlistSummary.getAssociatedCountryCodes(); const rawResults = watchlistSummary.getRawResults(); const totalHits = watchlistSummary.getTotalHits(); // Search config const searchConfig = watchlistSummary.getSearchConfig(); const removeDeceased = searchConfig.isRemoveDeceased(); const shareUrl = searchConfig.isShareUrl(); const sources = searchConfig.getSources(); const matchingStrategy = searchConfig.getMatchingStrategy();
List<WatchlistAdvancedCaCheckResponse> watchlistAdvancedCaChecks = getSessionResult.getWatchlistAdvancedCaChecks(); WatchlistAdvancedCaCheckResponse watchlistAdvancedCaCheckResponse = watchlistAdvancedCaChecks.get(0); WatchlistAdvancedCaReportResponse report = watchlistAdvancedCaCheckResponse.getReport(); // Watchlist summary WatchlistAdvancedCaSummaryResponse watchlistSummary = report.getWatchlistSummary(); List<String> associatedCountryCodes = watchlistSummary.getAssociatedCountryCodes(); RawResultsResponse rawResults = watchlistSummary.getRawResults(); int totalHits = watchlistSummary.getTotalHits(); // Search config WatchlistAdvancedCaSearchConfigResponse searchConfig = watchlistSummary.getSearchConfig(); boolean removeDeceased = searchConfig.isRemoveDeceased(); boolean shareUrl = searchConfig.isShareUrl(); CaSourcesResponse sources = searchConfig.getSources(); CaMatchingStrategyResponse matchingStrategy = searchConfig.getMatchingStrategy(); if (searchConfig instanceof CustomAccountWatchlistCaSearchConfigResponse) { CustomAccountWatchlistCaSearchConfigResponse customConfigResponse = (CustomAccountWatchlistCaSearchConfigResponse) searchConfig; String apiKey = customConfigResponse.getApiKey(); String clientRef = customConfigResponse.getClientRef(); Map<String, String> tags = customConfigResponse.getTags(); boolean monitoring = customConfigResponse.isMonitoring(); }
$watchlistAdvancedCaChecks = $session->getWatchlistAdvancedCaChecks(); $report = $watchlistScreeningChecks[0]->getReport(); // Watchlist Screening summary $watchlistSummary = $report->getWatchlistSummary(); $associatedCountryCodes = $watchlistSummary->getAssociatedCountryCodes(); $rawResults = $watchlistSummary->getRawResults(); $totalHits = $watchlistSummary->getTotalHits(); // Search config used $searchConfig = $watchlistSummary->getSearchConfig(); $removeDeceased = $searchConfig->isRemoveDeceased(); $shareUrl = $searchConfig->isShareUrl(); $sources = $searchConfig->getSources(); $matchingStrategy = $searchConfig->getMatchingStrategy();
# COMING SOON
GetSessionResult getSessionResult = docScanClient.GetSession(sessionId); List<WatchlistAdvancedCaCheckResponse> advancedWatchlistScreeningChecks = getSessionResult.GetWatchlistAdvancedCaChecks(); ReportResponse reportResponse = advancedWatchlistScreeningChecks[0].Report; ReportResponseWithSummary reportResponseWithSummary = (ReportResponseWithSummary)reportResponse; string recommendationValue = reportResponseWithSummary.Recommendation.Value; string recommendationReason = reportResponseWithSummary.Recommendation.Reason; List<BreakdownResponse> breakdowns = reportResponseWithSummary.Breakdown;
// COMING SOON
{ "checks": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "type": "WATCHLIST_ADVANCED_CA", "state": "CREATED", "resources_used": [ "3fa85f64-5717-4562-b3fc-2c963f66afa6" ], "generated_media": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "type": "JSON" } ], "generated_profile": { "media": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "type": "JSON", "created": "2021-06-11T11:39:24Z", "last_updated": "2021-06-11T11:39:24Z" } }, "report": { "recommendation": { "value": "APPROVE" }, "breakdown": [ { "sub_check": "string", "result": "PASS", "details": [] } ], "watchlist_summary": { "total_hits": 0, "search_config": { "categories": [ "ADVERSE-MEDIA" ] }, "raw_results": { "media": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "type": "JSON", "created": "2021-06-11T11:39:24Z", "last_updated": "2021-06-11T11:39:24Z" } }, "associated_country_codes": [ "GBR", "USA" ] } }, "created": "2021-06-11T11:39:24Z", "last_updated": "2021-06-11T11:39:24Z" } ] }

AML raw

You have the ability to extract the raw results from the comply advantage API, as well as a link to a comply advantage page displaying the hits (if any) by using the raw_results media ID.

idvClient.getMediaContent(sessionId, rawResultsId).then(media => { const content = media.getContent(); const buffer = content.toBuffer(); const jsonData = JSON.parse(buffer); }).catch(error => { console.log(error) // handle error })
Media media = docScanClient.getMediaContent(sessionId, rawResultsId);
<?php $media = $docScanClient->getMediaContent($sessionId, $rawResultsId); $data = json_decode($media->getContent());
// COMING SOON
WatchlistSummary watchlistSummary = reportResponseWithSummary.WatchlistSummary; string rawResultsId = watchlistSummary.RawResults.Media.Id; MediaValue media = docScanClient.GetMediaContent(sessionId, rawResultsId);
[ { "provider": "Comply Advantage", "search_types": [ "sanction", "warning", "fitness-probity", "pep", "adverse-media" ], "search_id": "616943686", "search_ref": "1629902969-04sjnJ47", "url": "", "raw_output": "base64_encoded_string" } ]

Field

Description

provider

The third party provider used for our AML check.

search_types

The watchlist types that are searched against in the session.

search_id

Unique id related to the AML search conducted.

search_ref

Unique reference id related to the AML search conducted.

url

A public URL that will display the results of the search that can be reviewed.

raw_output

The JSON payload returned from our AML provider, It is base64 encode so will need to be decoded to access the JSON.


Reports of checks

Below are examples to get the report recommendation and breakdown for each session check.

// Get the report recommendation reportRecommendation = report.getRecommendation(); // Get the report recommendation value reportRecommendationValue = reportRecommendation.getValue(); // Get the report recommendation reason reportRecommendationReason = reportRecommendation.getReason(); //Get the report recommendation recovery suggestion reportRecommendationRecoverySuggestion = reportRecommendation.getRecoverySuggestion(); reportBreakdown = report.getBreakdown(); // Get result of each sub check from breakdown reportBreakdown.forEach((breakdown) => { // Get the report breakdown sub check subcheck = breakdown.getSubCheck(); // Get the report breakdown result result = breakdown.getResult(); // Get the report breakdown details details = breakdown.getDetails(); //Get the report Process process = breakdown.getProcess(); });
// Get the report recommendation RecommendationResponse reportRecommendation = report.getRecommendation(); // Get the report recommendation value String reportRecommendationValue = reportRecommendation.getValue(); // Get the report recommendation reason String reportRecommendationReason = reportRecommendation.getReason(); // Get the report recommendation recovery suggestion String reportRecommendationRecoverySuggestion = reportRecommendation.getRecoverySuggestion(); List<? extends BreakdownResponse> reportBreakdown = report.getBreakdown(); // Get result of each sub check from breakdown for (BreakdownResponse breakdown : reportBreakdown) { // Get the report breakdown sub check String subcheck = breakdown.getSubCheck(); // Get the report breakdown result String result = breakdown.getResult(); // Get the report breakdown details List<? extends DetailsResponse> details = breakdown.getDetails(); //Get the report breakdown process String process = breakdown.getProcess(); }
<?php // Get the report recommendation $reportRecommendation = $report->getRecommendation(); // Get the report recommendation value $reportRecommendationValue = $reportRecommendation->getValue(); // Get the report recommendation reason $reportRecommendationReason = $reportRecommendation->getReason(); //Get the report recommendation recovery suggestion $reportRecommendationRecoverySuggestion = $reportRecommendation->getRecoverySuggestion(); $reportBreakdown = $report->getBreakdown(); // Get result of each sub check from breakdown foreach ($reportBreakdown as $breakdown) { // Get the report breakdown sub check $subcheck = $breakdown->getSubCheck(); // Get the report breakdown result $result = $breakdown->getResult(); // Get the report breakdown details $details = $breakdown->getDetails();
# Returns report recommendation report_recommendation = report.recommendation # Returns report recommendation value report_recommendation_value = report_recommendation.value # Returns report recommendation reason report_recommendation_reason = report_recommendation.reason # Returns report recommendation recovery suggestion report_recommendation_recovery_suggestion = report_recommendation.recovery_suggestion # Returns report breakdown report_breakdown = report.breakdown # Return result of each sub check from breakdown for breakdown in report_breakdown: # Returns report breakdown sub check subcheck = breakdown.sub_check # Returns report breakdown result result = breakdown.result # Returns report breakdown details details = breakdown.details
// Returns the report recommendation RecommendationResponse reportRecommendation = report.Recommendation; // Returns the report recommendation value String reportRecommendationValue = reportRecommendation.Value; // Returns the report recommendation reason String reportRecommendationReason = reportRecommendation.Reason; // Returns the report recommendation recovery suggestion String reportRecommendationRecoverySuggestion = reportRecommendation.RecoverySuggestion; List <BreakdownResponse> reportBreakdown = report.Breakdown; // Returns result of each sub check from breakdown foreach (BreakdownResponse breakdown in reportBreakdown) { // Returns the report breakdown sub check String subcheck = breakdown.SubCheck; // Returns the report breakdown result String result = breakdown.Result; // Returns the report breakdown details List <DetailsResponse> details = breakdown.Details; }

Object

Response

Description

Report recommendation

N/A

A recommendation value, and recovery suggestion.

Report recommendation value

e.g. REJECT

Returns only the recommendation value.

Report recommendation reason

e.g. PHOTO_TOO_BLURRY

Returns only the reason of the value. If approved the value will be null.

Report recommendation recovery suggestion

N/A

Returns only the recovery suggestion. If approved the value will be null.

Report breakdown

N/A

A breakdown report on the session that has been completed including, sub-checks, results and details.

Report breakdown sub check

e.g. data_in_correct_position

The completed sub-check.

Report breakdown result

e.g PASS

The result of the sub-check completed.

Report breakdown details

N/A

Extra information on the check if relevant.

Report breakdown process

EXPERT_REVIEW, AUTOMATED

Indicates whether the sub-check was completed through automation or by a human reviewer.