For decision makers: TamperCheck connects to your existing systems via a simple API. Your engineering team can complete integration in a single sprint — no proprietary format to learn, no dashboard your compliance team must adopt, and no mandatory contract. The documentation below is for the engineers who will implement it.

API Documentation

TamperCheck.aiPrivacy-first · No document storage

Instant, automated fraud detection for any document — passports, pay stubs, bank statements, and 100+ more. Results in seconds. Your data never leaves your control.

Authentication

Send your TamperCheck API key as a Bearer token: Authorization: Bearer dt_.... Configure AI providers in the dashboard; the default verified provider is used for analysis.

Analyze endpoint

POST https://api.tampercheck.ai/api/v1/documents/

Request (multipart)

Upload the document as form field document (PDF, JPG, PNG, WEBP, BMP, TIFF; max 20 MB). You can optionally include document_identifier to correlate results with your system, and skip_ai (boolean) to run CV-only analysis.

curl -X POST "https://api.tampercheck.ai/api/v1/documents/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "document=@./document.pdf" \
  -F "document_identifier=loan-app-12345"

Response

On success (200), the body includes verdict (authentic or tampered), risk_score (0–100), findings, calibration, explanation, and timestamps.

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "completed",
  "original_filename": "statement.pdf",
  "document_identifier": "loan-app-12345",
  "document_type": "bank_statement",
  "verdict": "tampered",
  "risk_score": 42,
  "confidence": 0.78,
  "findings": [
    {
      "category": "font_inconsistency",
      "severity": "medium",
      "description": "Mixed font metrics in the totals row.",
      "confidence": 0.71
    }
  ],
  "ai_analysis": "…",
  "cv_metrics": {},
  "metadata_analysis": null,
  "processing_time_s": 3.2,
  "calibration": {
    "score_breakdown": {},
    "suppressed_count": 0,
    "calibration_notes": [],
    "calibrated_findings": []
  },
  "explanation": "Plain-language summary…",
  "human_summary": "…",
  "created_at": "2026-04-02T12:00:00Z",
  "completed_at": "2026-04-02T12:00:03Z"
}

Error responses

All error responses return a JSON body with error (machine-readable code) and detail (human-readable message). Some errors also include the job id and status.

StatusError codeMeaningAction
400validation_errorUnsupported file type, file too large (>20 MB), or empty/unreadable file.Check file format and size. Accepted: PDF, JPG, PNG, WEBP, BMP, TIFF.
401authentication_failedInvalid or missing API key.Verify your Authorization: Bearer dt_... header.
402insufficient_balanceWallet balance is too low to process this document.Add funds at Dashboard → Billing.
404not_foundDocument job ID does not exist or belongs to a different API key.Verify the job UUID and API key.
422processing_failedDocument could not be processed (corrupt image, unrenderable PDF, etc.). No charge applied.Verify the file is valid and try again.
503ai_service_unavailableThe AI analysis service is temporarily down. No charge applied.Retry after a short delay (e.g. exponential backoff).

Example error responses

402 — Insufficient balance

{
  "detail": "Insufficient wallet balance. Please top up at /dashboard/billing."
}

503 — AI service unavailable

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "failed",
  "error": "ai_service_unavailable",
  "detail": "The AI analysis service is temporarily unavailable. Your document was not charged. Please retry in a few moments."
}

422 — Processing failed

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "failed",
  "error": "processing_failed",
  "detail": "Could not decode image bytes"
}

With the same Authorization header: list jobs with GET /api/v1/documents/list/, fetch one job with GET /api/v1/documents/<uuid>/, and usage with GET /api/v1/usage/?since=&until=.

AI providers

Configure AI provider keys under Dashboard → Developers. The public API does not accept per-request provider headers.

MCP for Claude Code and Cursor

Subscribers can use the official TamperCheck MCP server so coding agents call the same document API without writing HTTP clients by hand. The server runs locally (stdio) and sends requests to https://api.tampercheck.aiusing the subscriber's API key from the environment.

  1. Create an API key under Dashboard → Developers (same key as REST).
  2. Install the package: pip install tampercheck-mcp (PyPI when published) into a Python 3.10+ environment.
  3. Claude Code: claude mcp add --transport stdio --env TAMPERCHECK_API_KEY="dt_..." tampercheck -- tampercheck-mcpThen run /mcp in Claude Code to verify the connection. Options must come before the server name; see the official Claude Code MCP docs.
  4. Cursor: add a server in mcp.json with command pointing at the tampercheck-mcp binary and env.TAMPERCHECK_API_KEY.

Treat the MCP package like any other dependency: pin versions for reproducibility, and remind subscribers to only install servers they trust. Full install notes and Cursor examples live in the tampercheck-mcp package README.

Claude Code and agent skills

Download the TamperCheck API skill as a Markdown file (YAML frontmatter + integration guide). Add it to Cursor, Claude Code, or any workflow that loads project skills so assistants help you integrate without guessing request shapes.

Download skill.md