Skip to content

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
MethodGET
Path paramscaseId (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 account

A 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.

LevelWhere it appearsCheckscheckedEntityId
CasechecksKYC, AML, Financial vulnerability, Automated document verification, Document comparisonNot set
Documentdocuments[].checksDocument intelligence extraction, Content validation, Anomaly detectionThe document ID
Document assetdocuments[].assetChecksTamper detection, Tamper liteSee Asset checks
Bank accountbankAccounts[].checksBank account verificationThe 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 stateMeaning
NeedsToRunThe check hasn't run, or its last result is out of date. See When a check needs to run again.
InProgressThe check has been started and hasn't finished yet.
CompletedThe 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.
AwaitingDocumentExtractionThe check depends on data extracted from a document, and that extraction hasn't finished yet. It will be able to run once extraction completes.
ErrorThe 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 NeedsToRun when 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:

FieldDescription
lastRunThe most recent run of the check, whatever its outcome. This might still be in progress or might have errored.
lastCompletedRunThe 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 ​

FieldTypeDescription
taskIdintegerIdentifier of this run.
operationIdintegerIdentifier of the check result, when the run produced one.
snapshotIdintegerThe case snapshot the run was performed against. Compare it with currentSnapshotId to see whether the run used the latest case details.
statestringThe 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.
createdTsstring (date-time)When the run was started.
riskIndicatorsarrayThe risk indicators the run raised. See Risk indicators.
alertsarrayThe alerts the run raised. See Alerts.
rulesarrayDocument comparison only. See Document comparison rules.
documentRulesarrayContent validation only. See Content validation rules.

Risk indicators ​

FieldTypeDescription
idintegerIdentifier of the risk indicator.
riskFactorIdintegerIdentifier of the risk factor that was assessed.
riskFactorNamestringName of the risk factor, e.g. Date of birth mismatch.
ratingstringThe current rating according to your risk configuration, e.g. Low, Medium, High. Unrated if it hasn't been rated.
remediationobjectOnly present if someone manually changed the rating. See below.

Remediation

FieldTypeDescription
remediatedAtstring (date-time)When the rating was changed.
ratingBeforeRemediationstringThe rating the check originally gave.
reasonstringThe reason given for the change, if any.
remediatedByUserIdintegerThe user who changed the rating.
remediatedByNamestringThat user's name.

Alerts ​

FieldTypeDescription
idintegerIdentifier of the alert.
riskIndicatorIdintegerThe risk indicator that raised this alert.
textstringDescription of the alert.
resolutionobjectOnly present if the alert has been resolved. See below.

Resolution

FieldTypeDescription
resolutionTypeIdintegerIdentifier of the resolution type.
resolutionTypeNamestringName of the resolution type.
resolvedTsstring (date-time)When the alert was resolved.
resolvedByUserIdintegerThe user who resolved it.
notesstringNotes 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.

FieldTypeDescription
caseIdintegerThe case that was validated.
processIdstringThe check that was validated.
bankAccountIdintegerBank account verification only: the bank account that was validated.
isValidbooleantrue if the check can be run now.
issuesarrayWhat's stopping the check from running. Empty when isValid is true.

Issue

FieldTypeDescription
processIdstringThe check the issue relates to.
handlerIdstringThe provider the issue relates to.
typestringMissingField, InvalidField, NoSnapshot, NoPerson, NoEntity, or NoBankAccount.
fieldstringThe field the issue is about, for MissingField and InvalidField.
messagestringA 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.

FieldTypeDescription
accumulatedResults.riskIndicatorsarrayEvery AML risk indicator on the case.
accumulatedResults.alertsarrayEvery AML alert on the case.

Document comparison rules ​

Document comparison runs include rules: the result of each comparison rule across the case's documents.

FieldTypeDescription
ruleIdintegerIdentifier of the rule.
ruleNamestringName of the rule.
overallResultstringOk, Flagged, Failed, or NotRan.
entriesarrayOne entry per pair of documents compared.
entries[].docAIdintegerThe first document compared.
entries[].docBIdintegerThe second document compared.
entries[].resultstringOk, Flagged, Failed, or NotRan.
entries[].checkTextstringDetails of the comparison.

Content validation rules ​

Content validation runs include documentRules: the result of each rule checked against the document.

FieldTypeDescription
ruleIdintegerIdentifier of the rule.
ruleNamestringName of the rule.
resultstringOk, Flagged, Failed, or NotRan.
checkTextstringDetails 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:

FieldTypeDescription
processIdintegerIdentifier of the check type.
processNamestringName of the check type.
handlerIdintegerIdentifier of the provider performing the check.
labelstringDisplay name of the check.
descriptionstringWhat the check does.
documentIdintegerThe document the check belongs to.
enabledbooleanWhether the check is enabled on your account.
lastRunPerAssetarrayThe most recent run for each asset.
lastCompletedRunPerAssetarrayThe 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

FieldTypeDescription
documentAssetIdintegerThe asset this run was for.
taskIdintegerIdentifier of this run.
operationIdintegerIdentifier of the check result, when the run produced one.
statestringInProgress, Completed, Error, or Skipped.
createdTsstring (date-time)When the run was started, or when it was skipped.
riskIndicatorsarraySee Risk indicators.
alertsarraySee Alerts.
checksarrayTamper lite only: the result of each individual check. See below.

Tamper lite check

FieldTypeDescription
checkIdintegerIdentifier of the check.
checkNamestringName of the check.
resultstringOk, Flagged, Failed, or NotRan.
checkTextstringDetails of the result.
riskIndicatorIdintegerThe risk indicator this check raised, if it was flagged.

Response schema ​

CaseProgress ​

FieldTypeDescription
caseIdintegerThe case.
currentSnapshotIdintegerThe latest snapshot of the case's details. See When a check needs to run again.
checksarrayCase-level checks.
documentsarrayThe case's documents, each with its own checks.
bankAccountsarrayThe case's bank accounts, each with its own checks.

Check ​

Used for case, document, and bank account checks.

FieldTypeDescription
processIdintegerIdentifier of the check type.
processNamestringName of the check type, e.g. KYC, ReputationalRisk (AML), CaseDocumentChecks.
handlerIdintegerIdentifier of the provider used to perform the check.
labelstringDisplay name of the check, e.g. eKYC.
descriptionstringOne-sentence explanation of what the check does.
checkedEntityIdintegerThe document or bank account being checked. Not set for case-level checks.
enabledbooleanWhether the check is enabled on your account.
runStatestringSee Run states. Not set for disabled checks.
validationobjectSee Validation.
lastRunobjectSee Runs.
lastCompletedRunobjectSee Runs.
accumulatedResultsobjectAML only. See AML.

Document ​

FieldTypeDescription
documentIdintegerIdentifier of the document.
namestringDisplay name, e.g. Payslip #2.
typestringThe document type.
uploadDatestring (date-time)When the document was uploaded.
summarystringAn AI-generated summary of the document and its check results, if one has been generated.
summaryOutOfDatebooleantrue 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.
checksarrayDocument-level checks.
assetChecksarrayAsset checks.

Bank account ​

FieldTypeDescription
bankAccountIdintegerIdentifier of the bank account.
bankNamestringName of the bank, if known.
fieldsarrayThe bank account's details, masked (e.g. ****5678). Each has fieldKey, displayName, displayOrder, and maskedValue.
checksarrayBank-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 ​

StatusDescription
403 ForbiddenThe case doesn't belong to your account.
404 Not FoundThe case doesn't exist.