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
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
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.
| Status | Error code | Meaning | Action |
|---|---|---|---|
400 | validation_error | Unsupported file type, file too large (>20 MB), or empty/unreadable file. | Check file format and size. Accepted: PDF, JPG, PNG, WEBP, BMP, TIFF. |
401 | authentication_failed | Invalid or missing API key. | Verify your Authorization: Bearer dt_... header. |
402 | insufficient_balance | Wallet balance is too low to process this document. | Add funds at Dashboard → Billing. |
404 | not_found | Document job ID does not exist or belongs to a different API key. | Verify the job UUID and API key. |
422 | processing_failed | Document could not be processed (corrupt image, unrenderable PDF, etc.). No charge applied. | Verify the file is valid and try again. |
503 | ai_service_unavailable | The 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"
}Related endpoints
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.
- Create an API key under Dashboard → Developers (same key as REST).
- Install the package:
pip install tampercheck-mcp(PyPI when published) into a Python 3.10+ environment. - Claude Code:
claude mcp add --transport stdio --env TAMPERCHECK_API_KEY="dt_..." tampercheck -- tampercheck-mcpThen run/mcpin Claude Code to verify the connection. Options must come before the server name; see the official Claude Code MCP docs. - Cursor: add a server in
mcp.jsonwithcommandpointing at thetampercheck-mcpbinary andenv.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