How it works
A run checks a file that is already stored in your workspace, identified by itsfile_id, so there is no upload in the request. Each result appears under forensics.<key> once that detector has reported, and the file checks appear under checks.<key>.
1
Start a run
POST /v1/forensics returns 202 with a run_id, status: "queued" and a poll_url. Runs started at upload with enabledProducts: ["FILE_FORENSICS"] run all 55 checks; read them with GET /v1/forensics/files/{file_id}.2
Poll
GET /v1/forensics/runs/{run_id} until status is complete or error. Web presence can take up to about 180 seconds.3
Retry if stuck
A run still
queued or running after about 6 minutes is stuck. POST /v1/forensics/runs/{run_id}/retry re-runs the same file and spec_filter under a new run_id, which is the one to poll. The original run then reports error.4
Clean up
DELETE /v1/forensics/runs/{run_id} once you have the result. The file itself is not affected.GET /v1/jobs/{job_id} and have no callback. See Async jobs for how they compare with other async work.
Endpoints
Request
spec_filter is required so that a detector added later cannot silently change what an existing integration runs.
Response
Run status
Detector status
Every detector result has astatus, and usually a one-line value. Route on each detector’s status, not the run’s: a complete run can still contain an issue.
Detectors
The MCP tool
run_file_forensics accepts the same keys. See MCP tools.
File checks
File checks describe the file rather than judge it. They come back underchecks.<key> on every run whose spec_filter includes at least one forensic check, using the same statuses. Most report found when there is something to describe, or none when there isn’t. A few report issue when something is worth a look, such as blank pages, skewed or low-resolution scans, or timestamps that disagree.
Integrity questions
document_integrity_decisions asks 17 fixed questions about whether the content holds together. Each answer is under decisions, with a class of signal, no_signal or insufficient_evidence.
final_decision combines the answers and sets the detector’s result:
A question can go unanswered, for example when the file has no page images or no signature. Its
class is then insufficient_evidence, or null when no answer came back.
When the integrity questions aren’t enabled, document_integrity_decisions reports skip, and its value says the check is disabled.
Errors
See Errors for the response format.
Related
Forensics quickstart
Run your first check end to end.
KYC checks
Choose detectors per document and route on the result.
Uploads
Store a file and get its
fileId.MCP tools
Run fileForensics from an AI assistant.