Appearance
Case Progress
Case progress gives you a single view of every check that applies to a case: whether each one has run, is running, needs to run, or can't run yet, along with the risk indicators and alerts from its most recent runs.
Use it to track a case through its checks, or to build a progress view of a case in your own system.
Get case progress
Returns the progress of every check on a case.
| Endpoint | /api/cases/{caseId}/progress |
|---|---|
| Method | GET |
| Path params | caseId (integer) |
Overview
The response is grouped by the scope of the check. Some checks look at the case as a whole (e.g. KYC), some at each document (e.g. Content validation), some at each file that makes up a document (e.g. Tamper detection), and some at each bank account (e.g. BAV).
CaseProgress
├── checks[] checks on the case as a whole
├── documents[] one entry per document on the case
│ ├── checks[] checks on that document
│ └── assetChecks[] checks on each file (asset) that makes up that document
└── bankAccounts[] one entry per bank account on the case
└── checks[] checks on that bank accountA check that could apply to several documents or bank accounts appears once per document or bank account. For example, a case with two documents has a Content validation check under each document.
Every check your account can use is included, even if it hasn't run yet. Checks that aren't enabled on your account are also included, with enabled: false. See Disabled checks.
Check levels
For checks that apply to documents, document assets, or bank accounts, the ID of the checked entity is returned as checkedEntityId.
| Level | Where it appears | Checks | checkedEntityId |
|---|---|---|---|
| Case | checks | KYC, AML, Financial vulnerability, Automated document verification, Document comparison | Not set |
| Document | documents[].checks | Document intelligence extraction, Content validation, Anomaly detection | The document ID |
| Document asset | documents[].assetChecks | Tamper detection, Tamper lite | See Asset checks |
| Bank account | bankAccounts[].checks | Bank account verification | The bank account ID |
Document comparison is only included once the case has at least two documents of a type it can compare. With fewer than two, there's nothing for it to compare.
Run states
Case, document, and bank account checks each have a runState, which tells you where that check is right now.
| Run state | Meaning |
|---|---|
NeedsToRun | The check hasn't run, or its last result is out of date. See When a check needs to run again. |
InProgress | The check has been started and hasn't finished yet. |
Completed | The check has finished, and its result is up to date. A completed check can still have flagged risks; Completed only means the check finished running. |
AwaitingDocumentExtraction | The check depends on data extracted from a document, and that extraction hasn't finished yet. It will be able to run once extraction completes. |
Error | The most recent run hit a technical error and didn't produce a result. |
When a check needs to run again
A check that has already completed can go back to NeedsToRun when its result no longer reflects the case.
- Case details have changed. Each time a case's details (name, date of birth, address, and so on) are updated, these checks reset to
NeedsToRun. This applies to KYC, AML, Financial vulnerability, and Content validation, which all use the case's details. - New documents have been added. Document comparison becomes
NeedsToRunwhen a new document has finished extraction since it last ran.
The other checks (document intelligence extraction, anomaly detection, automated document verification, and bank account verification) don't depend on the case's details, so their result stays Completed once they've run.
Awaiting document extraction
Document content needs to be extracted for some checks. Until extraction finishes, those checks show AwaitingDocumentExtraction rather than NeedsToRun:
- Content validation and Anomaly detection, for the document that's still being extracted.
- Document comparison, while any document on the case is still being extracted.
You can see how extraction itself is going from the Document intelligence extraction check on each document.
Runs
For each check, information is given on its last run and its last completed run:
| Field | Description |
|---|---|
lastRun | The most recent run of the check, whatever its outcome. This might still be in progress or might have errored. |
lastCompletedRun | The most recent run that produced a result. |
These are often the same run. They differ when a newer run is in progress or failed. In that case, lastCompletedRun still gives you the last result, which is usually still useful.
If a check has never run, both are left out.
Run fields
| Field | Type | Description |
|---|---|---|
taskId | integer | Identifier of this run. |
operationId | integer | Identifier of the check result, when the run produced one. |
snapshotId | integer | The case snapshot the run was performed against. Compare it with currentSnapshotId to see whether the run used the latest case details. |
state | string | The state of the run: Scheduled, Processing, AwaitingResult, FetchingResult, Completed, or Failed. Failed means the run hit a technical error, not that the check found a problem. |
createdTs | string (date-time) | When the run was started. |
riskIndicators | array | The risk indicators the run raised. See Risk indicators. |
alerts | array | The alerts the run raised. See Alerts. |
rules | array | Document comparison only. See Document comparison rules. |
documentRules | array | Content validation only. See Content validation rules. |
Risk indicators
| Field | Type | Description |
|---|---|---|
id | integer | Identifier of the risk indicator. |
riskFactorId | integer | Identifier of the risk factor that was assessed. |
riskFactorName | string | Name of the risk factor, e.g. Date of birth mismatch. |
rating | string | The current rating according to your risk configuration, e.g. Low, Medium, High. Unrated if it hasn't been rated. |
remediation | object | Only present if someone manually changed the rating. See below. |
Remediation
| Field | Type | Description |
|---|---|---|
remediatedAt | string (date-time) | When the rating was changed. |
ratingBeforeRemediation | string | The rating the check originally gave. |
reason | string | The reason given for the change, if any. |
remediatedByUserId | integer | The user who changed the rating. |
remediatedByName | string | That user's name. |
Alerts
| Field | Type | Description |
|---|---|---|
id | integer | Identifier of the alert. |
riskIndicatorId | integer | The risk indicator that raised this alert. |
text | string | Description of the alert. |
resolution | object | Only present if the alert has been resolved. See below. |
Resolution
| Field | Type | Description |
|---|---|---|
resolutionTypeId | integer | Identifier of the resolution type. |
resolutionTypeName | string | Name of the resolution type. |
resolvedTs | string (date-time) | When the alert was resolved. |
resolvedByUserId | integer | The user who resolved it. |
notes | string | Notes added when resolving it. |
Validation
Checks that don't run automatically also include a validation object when they're NeedsToRun. It tells you whether the case currently has enough information for the check to run, and what's missing if not.
| Field | Type | Description |
|---|---|---|
caseId | integer | The case that was validated. |
processId | string | The check that was validated. |
bankAccountId | integer | Bank account verification only: the bank account that was validated. |
isValid | boolean | true if the check can be run now. |
issues | array | What's stopping the check from running. Empty when isValid is true. |
Issue
| Field | Type | Description |
|---|---|---|
processId | string | The check the issue relates to. |
handlerId | string | The provider the issue relates to. |
type | string | MissingField, InvalidField, NoSnapshot, NoPerson, NoEntity, or NoBankAccount. |
field | string | The field the issue is about, for MissingField and InvalidField. |
message | string | A human-readable description of the issue, safe to show to users. |
Disabled checks
Checks that aren't enabled on your account are marked with enabled: false, at every level they would apply to. They only carry the check's name and description. Speak to your account manager if you need to enable a check.
Checks with a different shape
The following checks include extra data on top of what's described above:
AML
AML screening can be ongoing, so repeated runs will only report on new matches since the last run. That means a single AML run can correctly find nothing new, even though earlier runs found matches that still apply.
So as well as lastRun and lastCompletedRun, the AML check includes accumulatedResults: every risk indicator and alert raised across all AML runs on the case. Use this, rather than a single run, to see the case's current AML risk.
| Field | Type | Description |
|---|---|---|
accumulatedResults.riskIndicators | array | Every AML risk indicator on the case. |
accumulatedResults.alerts | array | Every AML alert on the case. |
Document comparison rules
Document comparison runs include rules: the result of each comparison rule across the case's documents.
| Field | Type | Description |
|---|---|---|
ruleId | integer | Identifier of the rule. |
ruleName | string | Name of the rule. |
overallResult | string | Ok, Flagged, Failed, or NotRan. |
entries | array | One entry per pair of documents compared. |
entries[].docAId | integer | The first document compared. |
entries[].docBId | integer | The second document compared. |
entries[].result | string | Ok, Flagged, Failed, or NotRan. |
entries[].checkText | string | Details of the comparison. |
Content validation rules
Content validation runs include documentRules: the result of each rule checked against the document.
| Field | Type | Description |
|---|---|---|
ruleId | integer | Identifier of the rule. |
ruleName | string | Name of the rule. |
result | string | Ok, Flagged, Failed, or NotRan. |
checkText | string | Details of the result. |
Asset checks
A document can be made up of more than one file, called an asset. Tamper detection and Tamper lite check each asset separately, so they appear in documents[].assetChecks with a different shape:
| Field | Type | Description |
|---|---|---|
processId | integer | Identifier of the check type. |
processName | string | Name of the check type. |
handlerId | integer | Identifier of the provider performing the check. |
label | string | Display name of the check. |
description | string | What the check does. |
documentId | integer | The document the check belongs to. |
enabled | boolean | Whether the check is enabled on your account. |
lastRunPerAsset | array | The most recent run for each asset. |
lastCompletedRunPerAsset | array | The most recent run with a result for each asset. |
Asset checks don't have a runState of their own. Each asset run has a state instead, which is InProgress, Completed, Error, or Skipped. If neither array has any entries, the check hasn't run on that document yet.
Skipped means the run was deliberately not performed, so nothing is outstanding. At the moment only Tamper detection is skipped, on an asset where Tamper Lite raised a risk and you've chosen to skip Tamper Detection in that case. A skipped run has no operationId and no results, so it's never in lastCompletedRunPerAsset.
Asset run
| Field | Type | Description |
|---|---|---|
documentAssetId | integer | The asset this run was for. |
taskId | integer | Identifier of this run. |
operationId | integer | Identifier of the check result, when the run produced one. |
state | string | InProgress, Completed, Error, or Skipped. |
createdTs | string (date-time) | When the run was started, or when it was skipped. |
riskIndicators | array | See Risk indicators. |
alerts | array | See Alerts. |
checks | array | Tamper lite only: the result of each individual check. See below. |
Tamper lite check
| Field | Type | Description |
|---|---|---|
checkId | integer | Identifier of the check. |
checkName | string | Name of the check. |
result | string | Ok, Flagged, Failed, or NotRan. |
checkText | string | Details of the result. |
riskIndicatorId | integer | The risk indicator this check raised, if it was flagged. |
Response schema
CaseProgress
| Field | Type | Description |
|---|---|---|
caseId | integer | The case. |
currentSnapshotId | integer | The latest snapshot of the case's details. See When a check needs to run again. |
checks | array | Case-level checks. |
documents | array | The case's documents, each with its own checks. |
bankAccounts | array | The case's bank accounts, each with its own checks. |
Check
Used for case, document, and bank account checks.
| Field | Type | Description |
|---|---|---|
processId | integer | Identifier of the check type. |
processName | string | Name of the check type, e.g. KYC, ReputationalRisk (AML), CaseDocumentChecks. |
handlerId | integer | Identifier of the provider used to perform the check. |
label | string | Display name of the check, e.g. eKYC. |
description | string | One-sentence explanation of what the check does. |
checkedEntityId | integer | The document or bank account being checked. Not set for case-level checks. |
enabled | boolean | Whether the check is enabled on your account. |
runState | string | See Run states. Not set for disabled checks. |
validation | object | See Validation. |
lastRun | object | See Runs. |
lastCompletedRun | object | See Runs. |
accumulatedResults | object | AML only. See AML. |
Document
| Field | Type | Description |
|---|---|---|
documentId | integer | Identifier of the document. |
name | string | Display name, e.g. Payslip #2. |
type | string | The document type. |
uploadDate | string (date-time) | When the document was uploaded. |
summary | string | An AI-generated summary of the document and its check results, if one has been generated. |
summaryOutOfDate | boolean | true if there's no summary, or if a relevant check has run on this document (or its linked bank accounts) since the summary was generated. |
checks | array | Document-level checks. |
assetChecks | array | Asset checks. |
Bank account
| Field | Type | Description |
|---|---|---|
bankAccountId | integer | Identifier of the bank account. |
bankName | string | Name of the bank, if known. |
fields | array | The bank account's details, masked (e.g. ****5678). Each has fieldKey, displayName, displayOrder, and maskedValue. |
checks | array | Bank-account-level checks. |
Example response
json
{
"caseId": 229,
"currentSnapshotId": 1510,
"checks": [
{
"processId": 13,
"processName": "KYC",
"handlerId": 12,
"label": "eKYC",
"description": "Verify case name, address and date of birth against credit bureau data.",
"enabled": true,
"runState": "NeedsToRun",
"validation": {
"caseId": 229,
"processId": "KYC",
"isValid": false,
"issues": [
{
"processId": "KYC",
"handlerId": "ExperianKYC",
"type": "MissingField",
"field": "DateOfBirth",
"message": "Date of birth is required for KYC."
}
]
},
"lastRun": {
"taskId": 88120,
"operationId": 40211,
"snapshotId": 1508,
"state": "Completed",
"createdTs": "2026-09-01T10:14:03Z",
"riskIndicators": [],
"alerts": []
},
"lastCompletedRun": {
"taskId": 88120,
"operationId": 40211,
"snapshotId": 1508,
"state": "Completed",
"createdTs": "2026-09-01T10:14:03Z",
"riskIndicators": [],
"alerts": []
}
},
{
"processId": 9,
"processName": "ReputationalRisk",
"handlerId": 16,
"label": "AML",
"description": "Check case name against PEP, sanctions, and adverse media datasets.",
"enabled": true,
"runState": "Completed",
"lastRun": {
"taskId": 88342,
"operationId": 40390,
"snapshotId": 1510,
"state": "Completed",
"createdTs": "2026-09-10T08:00:00Z",
"riskIndicators": [],
"alerts": []
},
"lastCompletedRun": {
"taskId": 88342,
"operationId": 40390,
"snapshotId": 1510,
"state": "Completed",
"createdTs": "2026-09-10T08:00:00Z",
"riskIndicators": [],
"alerts": []
},
"accumulatedResults": {
"riskIndicators": [
{
"id": 5521,
"riskFactorId": 31,
"riskFactorName": "PEP match",
"rating": "Low",
"remediation": {
"remediatedAt": "2026-09-02T15:30:00Z",
"ratingBeforeRemediation": "High",
"reason": "Confirmed not the same person",
"remediatedByUserId": 17,
"remediatedByName": "Warren Russell"
}
}
],
"alerts": [
{
"id": 1203,
"riskIndicatorId": 5521,
"text": "Possible PEP match",
"resolution": {
"resolutionTypeId": 2,
"resolutionTypeName": "False positive",
"resolvedTs": "2026-09-02T15:31:00Z",
"resolvedByUserId": 17,
"notes": "Different date of birth"
}
}
]
}
},
{
"processId": 14,
"processName": "FinancialVulnerability",
"handlerId": 13,
"label": "Financial Vulnerability",
"description": "Check case details against sources linked to financial vulnerability.",
"enabled": false
}
],
"documents": [
{
"documentId": 1012,
"name": "Payslip #1",
"type": "Payslip",
"uploadDate": "2026-09-01T10:02:44Z",
"summaryOutOfDate": true,
"checks": [
{
"processId": 10,
"processName": "DocumentExtraction",
"handlerId": 9,
"label": "Document Intelligence Extraction Engine",
"description": "Extract information from the document for use by further checks.",
"checkedEntityId": 1012,
"enabled": true,
"runState": "InProgress",
"lastRun": {
"taskId": 88400,
"state": "Processing",
"createdTs": "2026-09-01T10:02:45Z",
"riskIndicators": [],
"alerts": []
}
},
{
"processId": 8,
"processName": "CaseDocumentChecks",
"handlerId": 7,
"label": "Content Validation",
"description": "Check information on a document for risks related to the case.",
"checkedEntityId": 1012,
"enabled": true,
"runState": "AwaitingDocumentExtraction"
}
],
"assetChecks": [
{
"processId": 1,
"processName": "DocumentRisk",
"handlerId": 1,
"label": "Tamper Detection",
"description": "Analyze a document in depth to detect signs of tampering.",
"documentId": 1012,
"enabled": true,
"lastRunPerAsset": [
{
"documentAssetId": 2044,
"taskId": 88401,
"operationId": 40402,
"state": "Completed",
"createdTs": "2026-09-01T10:02:45Z",
"riskIndicators": [
{
"id": 5530,
"riskFactorId": 4,
"riskFactorName": "Pdf processed by editor",
"rating": "High"
}
],
"alerts": []
}
],
"lastCompletedRunPerAsset": [
{
"documentAssetId": 2044,
"taskId": 88401,
"operationId": 40402,
"state": "Completed",
"createdTs": "2026-09-01T10:02:45Z",
"riskIndicators": [
{
"id": 5530,
"riskFactorId": 4,
"riskFactorName": "Pdf processed by editor",
"rating": "High"
}
],
"alerts": []
}
]
}
]
}
],
"bankAccounts": [
{
"bankAccountId": 456,
"bankName": "Barclays",
"fields": [
{ "fieldKey": "sort_code", "displayName": "Sort code", "displayOrder": 1, "maskedValue": "***456" },
{ "fieldKey": "account_number", "displayName": "Account number", "displayOrder": 2, "maskedValue": "****5678" }
],
"checks": [
{
"processId": 15,
"processName": "BankAccountVerification",
"handlerId": 14,
"label": "Bank Account Verification",
"description": "Verify bank account ownership through authorised records.",
"checkedEntityId": 456,
"enabled": true,
"runState": "NeedsToRun",
"validation": {
"caseId": 229,
"processId": "BankAccountVerification",
"bankAccountId": 456,
"isValid": true,
"issues": []
}
}
]
}
]
}Error responses
| Status | Description |
|---|---|
403 Forbidden | The case doesn't belong to your account. |
404 Not Found | The case doesn't exist. |

