Skip to content

Checks

Endpoints for interacting with EyeDP checks

Get case checks

Returns all the checks performed on a case.

Endpoint/api/cases/{caseId}/checks
MethodGET

Response

json

[
    {
        "id": 206,
        "createTs": "2025-08-20T15:51:17.303",
        "checkName": "financial-vulnerability",
        "documentIds": []
    },
    {
        "id": 205,
        "createTs": "2025-08-20T15:51:17.243",
        "checkName": "kyc",
        "documentIds": []
    },
    {
        "id": 204,
        "createTs": "2025-08-20T15:49:41.987",
        "checkName": "content-validation",
        "documentIds": []
    }
]

Details

FieldDescription
IdId of the check used to get the check results
CreateTsTimestamp of the check
Check nameName of the check
documentIdsIf a check is on any of the case documents they will show up here

Check: Tamper detection

Returns tamper detection check results for a document. This check is triggered as soon as a document is uploaded to EyeDP.

Endpoint/api/cases/{caseId}/checks/{checkId}
MethodGET

Response

json

{
    "id": 1234,
    "checkName": "tamper-detection",
    "checkLabel": "Tamper Detection",
    "checkDescription": "Tamper analysis on a provided document.",
    "createTs": "2026-01-26T11:13:05.8",
    "tamperDetectionResponse": {
        "riskRating": "High",
        "riskRatingLabel": "Pdf processed by editor",
        "riskRatingDescription": "Document was processed using editing software",
        "results": [
            {
                "title": "Declared document language is English (United Kingdom)",
                "description": "The creator of this document declared English (United Kingdom) as the language of the document's content."
            },
            {
                "title": "Saved in Microsoft Word",
                "description": "The document was processed and saved in Microsoft Word - document tool from Microsoft."
            },
            {
                "title": "No difference between creation and modification date",
                "description": "The creation and modification dates in this document's metadata are the same, suggesting no updates were made after the file was first created."
            }
        ]
    }
}

The tamper detection response contains an overall risk rating with details stored in the results section. The following table describes the fields in more depth.

FieldDescription
Risk RatingThis is the overall risk rating of the check. It is determined by your risk configuration set in the EyeDP portal. It can be the following values: Low, Medium, High or Informational
Risk LabelThe label given to the risk
Risk DescriptionA brief high level explaination of the risk

A full list of the possible risk labels can be found in the EyeDP portal config page.

Results

Tamper detection runs a lot of different check on the document. The results section give more details on the findings.

FieldDescription
TitleShort title of the tamper check
DescriptionDetailed description with more information of the tamper check

Extra Metadata

There is extra metadata available when a query parameter of includeMetaData with a value of true is provided.

e.g. /api/cases/123/checks/123?includeMetaData=true

Enabling the metadata returns Document quality, document metadata and metadata on the tamper detection results.

Quality

Quality of the document resolution has three possible values: HIGH_QUALITY, LOW_QUALITY or NOT_RELEVANT_DOCUMENT

json
"quality": "HIGH_QUALITY"

Document metadata

json
"documentMetadata": {
    "producer": "Adobe PDF library 11.00",
    "creator": "Adobe Illustrator CC 2014 (Macintosh)",
    "creationDate": "2019-06-01T10:35:36-04:00",
    "modificationDate": "2019-06-01T10:35:36-04:00"
}

Bounding boxes

Bounding boxes are available for results such as Suspected Content Tampering. These are to show locations where tampering is suspected.

json
{
    "title": "Suspected content tampering",
    "description": "Some characters in the image differ from the typical visual patterns found elsewhere in the document. This may indicate digital manipulation or tampering.",
    "code": "grp_content_tampering_suspected",
    "type": "RISK",
    "category": "modification",
    "boundingBoxes": [
        {
            "pageId": 0,
            "x": 405,
            "y": 103,
            "width": 4,
            "height": 7
        },
        {
            "pageId": 0,
            "x": 446,
            "y": 103,
            "width": 5,
            "height": 7
        }
    ]
}

Results Metadata

Some results such as 'Document has unexpected metadata' includes specific metadata to help explanations.

json
{
    "title": "Document has unexpected metadata for this issuer",
    "description": "The metadata, such as the document's creator, producer, or PDF version, differs from what is typically seen in documents from this issuer.",
    "code": "anomalous_metadata",
    "type": "RISK",
    "category": "anomalous_metadata",
    "boundingBoxes": [],
    "resultData": [
        {
            "columnNames": [
                "Key",
                "Value"
            ],
            "data": [
                "PDFVersion",
                "PDF-1.7"
            ]
        }
    ]
}

Check: Content validation

This type of check runs a set of rules against the contents of uploaded documents and the case itself. This check is triggered as soon as a document is uploaded to EyeDP.

Rules will either compare the data on a document with the case, or compare each document on the case with the other documents for consistency. We call these "Doc V Doc" rules.

The endpoint is the same, but the response will adapt depending on the type of check.

The rules enabled in your setup can be accessed through the Portal: https://portal.eyedp.com

Endpoint/api/cases/{caseId}/checks/{checkId}
MethodGET

Response - Rules

If any of the rules fail the endpoint will return the rules with the status as 'Failed':

json

{
    "id": 230,
    "createTs": "2025-08-22T13:45:25.01",
    "contentValidationResponse": {
        "rules": [
            {
                "status": "Failed",
                "name": "Name",
                "riskRating":"High",
                "description": "Checks document name against Case name",
                "documentIds": [
                    960
                ]
            },
            {
                "status": "Failed",
                "name": "Date of Birth",
                "riskRating":"High",
                "description": "Checks the document date of birth against Case date of birth",
                "documentIds": [
                    960
                ]
            }
        ]
    }
}

Passed rules will return a status of 'Passed':

json
{
    "id": 230,
    "createTs": "2025-08-22T13:45:25.01",
    "contentValidationResponse": {
        "rules": [
            {
                "status": "Passed",
                "name": "Joint account",
                "description": "The platform will flag an alert if the document is in joint names",
                "documentIds": [
                    960
                ]
            }
        ]
    }
}

Details - Rules

The rules of the check contains the following fields

FieldDescription
StatusStatus can be one of 3 options: Pending, Passed or Failed. Pending only appears while the rule is executing. Generally this is very quick so you probably won't see it. You're most likely to see it as either Passed or Failed which are the results of the rule.
NameShort name of the rule
RiskRatingThe risk rating according to your risk configuration. Possible values are: Low, Medium or High
DescriptionLonger more detailed description of the rule
DocumentIdsThe documents involved in the rule. Rules that compare document contents like a Name against the case will only show a single Id. If the rule is looking at trends across documents all the document ids will be included.

Response - Doc V Doc Rules

json
{
    "id": 6808,
    "checkName": "content-validation",
    "checkLabel": "Content Validation",
    "checkDescription": "Check the information contained within a document against public sources and other documents stored in the case.",
    "createTs": "2026-03-05T14:14:54.453",
    "contentValidationResponse": {
    "docVDocRules": [
        {
            "id": 11,
            "snapshotId": 1508,
            "ruleId": 2,
            "resultId": 3,
            "operationId": 6808,
            "checkText": "Different Date of Births were found across the documents",
            "rule": {
            "id": 2,
            "name": "Date of Birth",
            "shortDescription": "Compares the Date of Birth across documents",
            "description": "Compares the Date of Birth across documents",
            "riskFactorId": 73,
            "documentTypes": [
                "Passport",
                "Driving Licence",
                "Other"
            ]
            },
            "result": "Flagged",
            "riskRating": "Medium",
            "entries": [
                {
                    "id": 448,
                    "docAId": 2098,
                    "docBId": 2102,
                    "docAType": "Driving Licence",
                    "docBType": "Driving Licence",
                    "resultId": 3,
                    "result": "Flagged",
                    "checkText": "Compared 29/01/1981 to 05/01/1964"
                },
                {
                    "id": 449,
                    "docAId": 2098,
                    "docBId": 2103,
                    "docAType": "Driving Licence",
                    "docBType": "Passport",
                    "resultId": 3,
                    "result": "Flagged",
                    "checkText": "Compared 29/01/1981 to 18/01/1963"
                },
                {
                    "id": 450,
                    "docAId": 2098,
                    "docBId": 2106,
                    "docAType": "Driving Licence",
                    "docBType": "Driving Licence",
                    "resultId": 2,
                    "result": "Matched",
                    "checkText": "Compared 29/01/1981 to 29/01/1981"
                },
                ...
            ]
        },
        ...
    }
]

Details - Doc V Doc Rules

FieldDescription
IdThe ID of the rule execution
CheckTextDetailed summary of the result
EntriesA collection of comparisons performed when running the rule. See the Doc V Doc Rule Entries section
OperationIdThe ID of the associated operation for this rule exeution
ResultIdThe internal ID of the result. A text version is in Result
ResultA text version of the result.
RiskRatingThe risk rating according to your risk configuration. Possible values are: Low, Medium or High
RuleIdThe ID of the Doc V Doc Rule that this resultset belongs to
RuleThe Doc V Doc Rule this resultset ran against. See the Doc V Doc Rule section
SnapshotIdThe Snapshot ID of the case that the rule was executed against

Doc V Doc Rule

FieldDescription
IdThe ID of the rule
DescriptionLonger more detailed description of the rule
NameThe name of the rule
ShortDescriptionA short description of the rule
RiskFactorIdThe ID of the Risk Factor that this rule raises when flagged
DocumentTypesA list of the Document Types that this rule runs against

Doc V Doc Rule Entry

FieldDescription
IdThe ID of the rule run entry
DocAIdThe ID of Doc A
DocBIdThe ID of Doc B
DocATypeThe type of Document A
DocBTypeThe type of Document B
ResultIdThe internal ID of the result. A text version is in Result
ResultA text version of the result
CheckTextDetailed summary of this entry

Check: KYC

Returns KYC check results for a case.

Case requirements

PropertyNotes
DobDOB is required to run eKYC (all three, DOBDay, DOBMonth, DOBYear)
FullnameFullname will work if supplied, the check separates into first & last name splitting on space
GivenNames & SurnameIf Fullname isn't supplied a minimum of GivenNames has to be supplied
AddressHas to be split address cannot use FullAddress
CaseTypeHas to be Individual

This check is only triggered through executing workflows. Please see the workflows page.

Endpoint/api/cases/{caseId}/checks/{checkId}
MethodGET

Response

json

{
    "id": 241,
    "createTs": "2025-08-22T15:40:21.55",
    "kycResponse": {
        "decision": "Pass",
        "rules": [
            {
                "ruleId": "7603",
                "ruleName": "V_EId_2PSNAx",
                "ruleScore": 1,
                "ruleText": "2+ Primary or Secondary Name and Address (DoB agnostic)"
            },
            {
                "ruleId": "6710",
                "ruleName": "V_EId_1ScNAx",
                "ruleScore": 1,
                "ruleText": "At least one Primary or Secondary Data Source, with a name and address"
            }
        ],
        "matches": [
            {
                "matchType": "Name Only",
                "matchKeyValues": [
                    {
                        "key": "Primary",
                        "value": 0
                    },
                    {
                        "key": "Secondary",
                        "value": 0
                    }
                ]
            },
            {
                "matchType": "Name and DOB",
                "matchKeyValues": [
                    {
                        "key": "Primary",
                        "value": 0
                    },
                    {
                        "key": "Secondary",
                        "value": 0
                    }
                ]
            },
            {
                "matchType": "Name and DOB",
                "matchKeyValues": [
                    {
                        "key": "Primary",
                        "value": 0
                    },
                    {
                        "key": "Secondary",
                        "value": 0
                    }
                ]
            },
            {
                "matchType": "Name and Address",
                "matchKeyValues": [
                    {
                        "key": "Primary",
                        "value": 1
                    },
                    {
                        "key": "Secondary",
                        "value": 0
                    }
                ]
            },
            {
                "matchType": "Name, Address and DOB",
                "matchKeyValues": [
                    {
                        "key": "Primary",
                        "value": 5
                    },
                    {
                        "key": "Secondary",
                        "value": 1
                    }
                ]
            }
        ]
    }
}

Response breakdown

Decision

The overall decision of the KYC check. Possible values are:

ResultDescription
PassWe've been able to verify the individual's identity successfully
ReferWe've only been to partially verify the individual's identity. Further review is required.
FailNo verification of the person's identity could be found.

Rules

Rules are ran on the matches found in the search. The outcome of the rules determines the overall KYC decision. A rule score of 1 means the conditions of the rule has been matched. A score of 0 means the conditions have not been matched.

EyeDP does have a standard ruleset. However, the exact rules you have will different depending on configuration.

The standard config is:

ResultConditions
Pass2+ Name+Address matches found from Primary or Secondary sources
ReferAt least one Name+Address match from a Primary or Secondary source

Matches

The number of matches found in each data source category. They're broken down by match type such as 'Name and DOB' where the individual's name and dob have been found on a data source together. Or 'Name, Address and DOB' where every searched part of the individual has been found.

Primary match

These are authoritative, direct, and often government-verified records that provide a high level of confidence in an individual's identity. Examples are Electoral Register and Credit/Financial information.

Secondary match

These are generally less authoritative or easily obtained records that support or corroborate the information found in primary sources. Examples are Mobile phone data or utility records.

Check: Financial vulnerability

Returns Financial Vulnerability check results for a case.

Case requirements

PropertyNotes
DobDOB is required to run FinVul (all three, DOBDay, DOBMonth, DOBYear)
FullnameFullname will work if supplied, the check separates into first & last name splitting on space
GivenNames & SurnameIf Fullname isn't supplied a minimum of GivenNames has to be supplied
AddressHas to be split address cannot use FullAddress
CaseTypeHas to be Individual

This check is only triggered through executing workflows. Please see the workflows page.

Endpoint/api/cases/{caseId}/checks/{checkId}
MethodGET

Response

json

{
    "id": 242,
    "createTs": "2025-08-22T15:40:22.69",
    "finvulResponse": {
        "decision": "Fail",
        "rules": [
            {
                "ruleId": "C6506",
                "ruleName": "V_PI_CCJ_5000",
                "ruleScore": 0,
                "ruleText": "One or more active CCJs with a total value over £5000 found"
            }
        ]
    }
}

Check: Bank account verification

Returns Bank account verification check results for a case.

This check is triggered as soon as a document is uploaded to EyeDP.

Endpoint/api/cases/{caseId}/checks/{checkId}
MethodGET

Response

json

{
    "id": 223,
    "createTs": "2025-08-22T13:45:24.37",
    "bavResponse": {
        "decision": "Pass",
        "rules": [
            {
                "ruleId": "CNS1004",
                "ruleName": "BAV_Acc_Age_0_30_Days",
                "ruleScore": 0,
                "ruleText": "Data has been found to indicate that the account was opened in the last 30 days"
            }
        ]
    }
}

Check: AML

The AML check searches the case against watchlist, sanctions, politically exposed people and adverse media datasets.

The check includes the Name, DOB and Country of the case in the search.

The check is synchronous and can be executed through the AML workflow

Request options

Options can be provided when executing the workflow.

NameDescription
enableOngoingMonitoringBoolean to enable on going monitoring (ongoing screening) of the case against the AML dataset

ExternalReference parameter

The request includes an optional parameter called ExternalReference. This can be used to store your own internal identifier or reference number against the check.

If included, this value will act as an idempotency key. If a check exists against the same case with the same ExternalReference, the result from the previous run will be returned instead of a new check being performed.

Example

json
// Workflow request example with AML options

{
    "caseId":"123",
    "workFlowName":"aml",
    "workflowOptions":{
        "enableOngoingMonitoring":"true"
    },
    "externalReference":"123456789"
}

AML workflow execution response

See below for example responses for the AML workflow - check the Swagger definition for the full schema: https://api-sandbox.eyedp.com/swagger

This example shows an individual match found with a PEP, Sanction, Enforcement and Adverse Media entry:

json
// RESPONSE from /api/workflows/execute (200)
{
    "checkId": 2006, 
    "amlResponse": {
        "matches": [ 
            {
                "riskId": 3228,
                "riskRating": "High",
                "isOverridden": false,
                "entityId": "WX0012050221",
                "type": "Individual",
                "name": "Maria Elena Santos", 
                "status": "Alive",
                "datesOfBirth": [
                    "1965-03-15"
                ],
                "placesOfBirth": [
                    "Place 1",
                    "Place 2"
                ],
                "nationalities": [
                    "Natioinality 1",
                    "Natioinality 2",
                ],
                "citizenships": [
                    "Citizenship 1",
                    "Citizenship 2"
                ],
                "relationships": [
                    {
                        "group": "Associations",
                        "type": "Friend",
                        "entityId": 1253678,
                        "dateModified": "2001-01-01T01:01:01+00:00",
                        "entityName": "Name of associate",
                        "ownershipPercentage": 0.0,
                        "segments": "Enforcement,PEP,Sanction"
                    },
                    {
                        "group": "Family",
                        "type": "Ex-Wife",
                        "entityId": 23456789,
                        "dateModified": "2001-01-01T01:01:01+00:00",
                        "entityName": "Family name",
                        "ownershipPercentage": 0.0,
                        "segments": "PEP,Sanction"
                    },
                    {
                        "group": "Companies",
                        "type": "Affiliated Company",
                        "entityId": 34567890,
                        "dateModified": "2001-01-01T01:01:01+00:00",
                        "entityName": "Company name",
                        "ownershipPercentage": 0.0,
                        "segments": "Sanction"
                    },
                ],
                "addresses": [ 
                    {
                        "value": "BR",
                        "type": "Current"
                    }
                ],
                "watchlistEntries": [ 
                    {
                        "key": 1, 
                        "type": "Pep",
                        "source": "Government Records",
                        "dateModified": "2001-01-01T01:01:01+00:00",
                        "subCategories": [
                            "Executive Branch",
                            "Finance"
                        ]
                    },
                    {
                        "key": 2,
                        "type": "Sanctions",
                        "source": "Market authority",
                        "dateModified": "2001-01-01T01:01:01+00:00",
                        "subCategories": [
                            "Sanction List"
                        ]
                    },
                    {
                        "key": 3,
                        "type": "AdverseMedia",
                        "dateModified": "2001-01-01T01:01:01+00:00",
                        "subCategories": [
                            "Money Laundering"
                        ]
                    },
                    {
                        "key": 4,
                        "type": "Enforcements",
                        "source": "Country or origin",
                        "dateModified": "2001-01-01T01:01:01+00:00",
                        "subCategories": [
                            "War Crimes"
                        ]
                    },
                ],
                "watchlistEntriesInfo": { 
                    "sanctions": [
                        {
                            "key": 5,
                            "source": "Ministry of country XYZ",
                            "dateModified": "2022-03-01T01:44:03+00:00",
                            "subCategories": [
                                "Sanction List"
                            ],
                            "country": "Country"
                        }
                    ],
                    "peps": [
                        {
                        "key": 6, 
                        "source": "Government Records",
                        "dateModified": "2023-06-15T10:30:00+00:00",
                        "subCategories": [
                            "Executive Branch",
                            "Finance"
                        ],
                        "country": "BR",
                        "status": "Inactive",
                        "isPrimary": true,
                        "governingInstitution": "Ministry of Finance",
                        "governingRole": "Minister",
                        "effectiveDate": "2010-01-15",
                        "effectiveDateType": "Appointed",
                        "expirationDate": "2014-12-31",
                        "expirationDateType": "Official"
                        }
                    ],
                    "adverseMedias": [
                        {
                            "key": 7,
                            "dateModified": "2001-01-01T01:01:01+00:00",
                            "subCategories": [
                                "Money Laundering"
                            ],
                            "description": "Incident"
                        }
                    ],
                    "sourceItems": [
                        {
                            "key": 8,
                            "sourceURI": "https:// example",
                            "dateModified": "2022-01-01T01:01:01+00:00"
                        }
                    ],
                    "enforcements": [
                        {
                            "key": 9,
                            "country": "International",
                            "source": "International Criminal Court",
                            "subCategories": [
                                "War Crimes"
                            ],
                            "dateModified": "2001-01-01T01:01:01+00:00",
                        }
                    ]
                },
                "comments": "comment text will be here",
                "matchConfidenceScore": 100,
                "aliases": [
                    {
                        "category": "None",
                        "type": "AKA",
                        "scriptType": "Basic Latin",
                        "firstName": "abc",
                        "lastName": "abc",
                        "middleName": "abc",
                        "fullName": "abc"
                    },
                ],
                "gender": "Female"
            }
        ]
    }
}

And here is one for an business match found with a Sanction, Enforcement and SOE entry:

json
// RESPONSE from /api/workflows/execute (200)
{
    "checkId": 8083, 
    "amlResponse": {
        "matches": [ 
             {
                "riskId": 22585,
                "riskRating": "High",
                "isOverridden": true,
                "entityId": "WX0005513308",
                "type": "Business",
                "name": "Company Name",
                "status": "NotApplicable",
                "datesOfBirth": [],
                "placesOfBirth": [],
                "nationalities": [],
                "citizenships": [],
                "relationships": [
                    {
                        "group": "Companies",
                        "type": "Affiliated Company",
                        "entityId": 9191930,
                        "dateModified": "2018-07-06T01:41:09+00:00",
                        "entityName": "Company Name",
                        "ownershipPercentage": 0.0,
                        "segments": "Other,SOE"
                    }
                ],
                "addresses": [
                    {
                        "city": "City Name",
                        "country": "Country Name",
                        "category": "Associated",
                        "type": "Unknown"
                    },
                    {
                        "city": "City Name",
                        "country": "Country Name",
                        "postalCode": "Postal Code",
                        "category": "Business",
                        "type": "Unknown"
                    }
                ],
                "watchlistEntries": [
                    {
                        "key": 1,
                        "type": "Sanctions",
                        "source": "Source Name",
                        "dateModified": "2022-02-25T01:48:27+00:00",
                        "subCategories": [
                            "Sanction List"
                        ]
                    },
                    {
                        "key": 236,
                        "type": "Enforcements",
                        "source": "Source Name",
                        "dateModified": "2017-08-28T09:10:35+00:00",
                        "subCategories": [
                            "Excluded Party"
                        ]
                    }
                ],
                "watchlistEntriesInfo": {
                    "sanctions": [
                        {
                            "key": 1,
                            "source": "Source Name",
                            "dateModified": "2022-02-25T01:48:27+00:00",
                            "subCategories": [
                                "Sanction List"
                            ],
                            "country": "Country Name"
                        }
                    ],
                    "peps": [],
                    "adverseMedias": [],
                    "sourceItems": [
                        {
                            "key": 8,
                            "sourceURI": "Source URL",
                            "dateModified": "2022-03-07T03:27:37+00:00"
                        }
                    ],
                    "enforcements": [
                        {
                            "key": 236,
                            "country": "Country Name",
                            "source": "Source Name",
                            "subCategories": [
                                "Excluded Party"
                            ],
                            "dateModified": "2017-08-28T09:10:35+00:00"
                        }
                    ]
                },
                "comments": "AML check comments",
                "matchConfidenceScore": 100,
                "aliases": [
                    {
                        "category": "None",
                        "type": "AKA",
                        "scriptType": "Basic Latin",
                        "lastName": "Company Name",
                        "fullName": "Company Name"
                    }
                ],
                "soes": [
                    {
                        "isActive": true,
                        "countryAssociations": [
                            {
                                "type": "Ownership",
                                "country": "Country 1",
                                "ownershipPercentage": 50.23
                            },
                            {
                                "type": "Ownership",
                                "country": "Country 2",
                                "ownershipPercentage": 0.86
                            }
                        ],
                        "dateModified": "2017-07-03T07:39:35+00:00"
                    }
                ]
            },
        ]
    }
}

Sandbox environment

When integrating with the sandbox environment, the following cases will produce the following results:

NameDOBCountryResult Type
Maria Elena Santos1965-03-15BRSingle PEP
Viktor Mikhailovich Petrov1972-08-22RUSingle Sanctions
John Michael Patterson1980-11-05GBSingle Adverse Media
Ahmed Hassan Al-Masri1968-05-30EG2 PEPs + 1 Sanctions
Carlos Eduardo Mendez1975-02-14VE1 Sanctions + 3 Adverse Media
Li Wei Zhang1963-07-18CN2 Sanctions
Nikolai Ivanov1970-04-12BY2 separate matches
• 1 PEP
• 1 Sanctions
Isabella Rodriguez1978-09-25MX2 separate matches
• 1 Adverse Media
• 2 PEPs + 1 Sanctions
Omar Al-Rahman1969-12-03SY2 separate matches
• 1 Sanctions + 3 Adverse Media
• 2 Sanctions

Create cases that contain these names (the names can be partial) and DOBs and perform the workflow execution.

Check: Anomaly Detection

Anomaly detection looks for discrepancies in the document's content that could indicate that it's been modified.

This check is triggered as soon as a document is uploaded to EyeDP.

Examples of discrepancies

  • Duplicate transactions within a bank statement.
  • Unusually long expiration dates on passports or driving licences.
  • Bill amounts that don't add up on utility bills.
  • Obviously fake account numbers like '123456789'

All of these would be found and highlighted by this check.

Response

The anomaly detection response contains a list of all checks completed on the document content.

  • Every check has a name and category to classify the check.
  • The result can be one of two values: 'Pass' or 'Fail'
  • A description is added only when the check fails. This gives information on why it has failed.
json
{
    "id": 123,
    "checkName": "anomaly-detection",
    "checkLabel": "Anomaly detection",
    "checkDescription": "Checks for anomalies within the documents content",
    "createTs": "2026-05-14T09:13:19.463",
    "anomalyDetectionResponse": {
        "checks": [
            {
                "name": "person_name",
                "version": "1.0",
                "category": "Placeholder_data",
                "result": "Pass"
            },
            {
                "name": "bill_number",
                "version": "1.0",
                "category": "Placeholder_data",
                "result": "Fail",
                "description": "Potential sample or dummy bill number detected: '00000000/0'."
            },
            {
                "name": "provider_vat_reg_number",
                "version": "1.0",
                "category": "Placeholder_data",
                "result": "Fail",
                "description": "Potential sample or dummy provider VAT reg number detected: '000 0000 00'."
            },
            {
                "name": "bill_date_after_period_end_date",
                "version": "1.0",
                "category": "Date_coverage",
                "result": "Pass"
            },
            {
                "name": "due_date_after_period_end_date",
                "version": "1.0",
                "category": "Date_coverage",
                "result": "Pass"
            },
            {
                "name": "period_end_after_period_start",
                "version": "1.0",
                "category": "Date_coverage",
                "result": "Pass"
            },
            {
                "name": "period_length_less_than_one_year",
                "version": "1.0",
                "category": "Date_coverage",
                "result": "Pass"
            },
            {
                "name": "total_amount_consistent_with_charges_and_usage",
                "version": "1.0",
                "category": "Internal_consistency",
                "result": "Pass"
            },
            {
                "name": "Required fields present",
                "version": "1.0",
                "category": "AI",
                "result": "Pass"
            },
            {
                "name": "Billing and due dates logical",
                "version": "1.0",
                "category": "AI",
                "result": "Pass"
            },
            {
                "name": "Billing period within bill date",
                "version": "1.0",
                "category": "AI",
                "result": "Pass"
            },
            {
                "name": "Monetary reconciliation (charges, VAT, total, amount due)",
                "version": "1.0",
                "category": "AI",
                "result": "Pass"
            },
            {
                "name": "Account/reference consistency between bill and payment slip",
                "version": "1.0",
                "category": "AI",
                "result": "Pass"
            },
            {
                "name": "Invoice / VAT / Bill number plausibility",
                "version": "1.0",
                "category": "AI",
                "result": "Fail",
                "description": "Several identifier fields appear to be placeholder or all zeros rather than plausible values: 'Bill number: 00000000/0', 'VAT registration number 000 0000 00'. These look like non-unique placeholders and are unexpected on a VAT invoice."
            },
            {
                "name": "Supply identifier / meter reference presence",
                "version": "1.0",
                "category": "AI",
                "result": "Fail",
                "description": "Typical business electricity bills include a supply identifier (MPAN/MPRN) or meter number. No meter number, MPAN, or MPRN is present in the extracted content. The bill does mention 'based on ESTIMATED readings' but does not provide an explicit meter or supply ID to tie consumption to a supply."
            },
            {
                "name": "Contact/phone number plausibility",
                "version": "1.0",
                "category": "AI",
                "result": "Fail",
                "description": "A contact phone number is extracted as '0000 000 0000' (and elsewhere '0330 100 005' also appears). The '0000 000 0000' string is almost certainly a placeholder and not a valid customer contact number; presence of both a realistic number and a zero-placeholder increases inconsistency."
            }
        ]
    }
}