Verification and authenticity

Cross-document verification and per-document authenticity reports.

Verification analyses documents that have already been processed. It does not re-process them: it reads the fraud detection and extraction data computed during the original upload, which is why it returns quickly and costs nothing extra.

There are two shapes:

  • Cross-document (POST /verify) compares 2 to 50 documents against each other, running 34 cross-checks including name consistency, income-to-deposit matching, employer verification and financial cross-references.
  • Single document (POST /verify/single) returns the full fraud and authenticity report for one document.

Reading the scores

Both reports score 0 to 100, and risk_level buckets that score:

risk_levelScore
low80 and above
medium50 to 79
highbelow 50

A score is evidence, not a verdict. signals carries the individual findings with a severity and a confidence, and status says whether each one reads as good or as a concern. Route on the signals you care about rather than on the headline number alone.

An authenticity signal is not proof of fraud

These checks surface documents worth a human look. Image and file properties can look edited for innocent reasons: a scan re-saved by a phone app, a PDF re-exported by a bank's own portal.

Custom cross-checks

Organizations with custom cross-check rules have those rules applied automatically, and they appear alongside the standard signals.

Workflow

Process the documents first, then verify them together.

from kita import KitaClient
import requests
 
client = KitaClient(api_key="kita_prod_...")
headers = {"Authorization": "Bearer kita_prod_..."}
 
# 1. Process each document and wait for extraction to finish.
bank = client.process("bank_statement.pdf", "bank_statement", wait=True)
payslip = client.process("payslip.pdf", "payslip", wait=True)
gov_id = client.process("id.pdf", "government_id", wait=True)
 
# 2. Cross-verify them against each other.
report = requests.post(
    "https://api.kita.ai/api/v1/verify",
    headers=headers,
    json={"document_ids": [bank.document_id, payslip.document_id, gov_id.document_id]},
).json()
 
print(f"Cross-doc score: {report['cross_doc_score']}/100")
for signal in report["signals"]:
    print(f"  [{signal['severity']}] {signal['reason']}")
 
# 3. Inspect any single document in full.
auth = requests.post(
    "https://api.kita.ai/api/v1/verify/single",
    headers=headers,
    json={"document_id": bank.document_id},
).json()
print(f"Bank statement: {auth['authenticity_score']}/100 ({auth['risk_level']})")

To keep a group of documents together across calls, see Applicants.

Endpoints

Full request and response detail, including every report field, is in the Verification reference.

On this page