Document fraud detection API
Document fraud detection API for PDF and Word files.
Check PDF and Word files for edits, forgery and AI-written text in two API calls. Findings and a verifiable report cost US$5.99 per document.
Free start: 5 image or document checks and 5,000 text characters. No card, no subscription.
- Endpoints
- POST /v1/files, POST /v1/analyses
- Model
- fvdoc-3 · FVDOC V3
- Accepted files
- PDF, DOCX, DOC, RTF, ODT, PPTX, TXT
- Maximum size
- Up to 50 MB and 100 pages
- Result
- Wait for it in the same request, or receive a webhook
- Price
- US$5.99 per document check
Last updated
What it checks
What the document check examines.
Each signal is part of the same report you get in the Console. The response field column tells you where to read it.
| Signal | What is examined | Response field |
|---|---|---|
| Edit history and file structure | Saved revisions, changed and added pages, and how the file was put together. | structure |
| Signatures and file records | Digital signatures, creation and modification records, and the software named in the file. | provenance |
| Embedded photos | Photos inside the document, each examined for AI generation and local edits. | images |
| AI-written text | A verdict for the document's text, with the AI-written passages marked by page. | text |
| Findings and next step | The findings behind the risk level, how strong each one is and a recommended action. | findings, level, action |
Request and response
Two calls and one report.
Upload the file, then create the check with the model fvdoc-3. Send Prefer: wait to hold the request until the report is ready. Documents can be queued, so a check may answer 202 with status processing. Fetch it later or receive a webhook.
FILE_ID=$(curl -s https://api.fileverity.com/v1/files \ -H "Authorization: Bearer $FILEVERITY_API_KEY" \ -F file=@contract.pdf | jq -r .id) curl https://api.fileverity.com/v1/analyses \ -H "Authorization: Bearer $FILEVERITY_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Prefer: wait=60" \ -d "{\"model\": \"fvdoc-3\", \"file\": \"$FILE_ID\"}"import { readFile } from "node:fs/promises"; const headers = { Authorization: "Bearer " + process.env.FILEVERITY_API_KEY }; const form = new FormData();form.append("file", new Blob([await readFile("contract.pdf")], { type: "application/pdf" }), "contract.pdf");const file = await (await fetch("https://api.fileverity.com/v1/files", { method: "POST", headers, body: form })).json(); const response = await fetch("https://api.fileverity.com/v1/analyses", { method: "POST", headers: { ...headers, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID(), Prefer: "wait=60" }, body: JSON.stringify({ model: "fvdoc-3", file: file.id }),});const analysis = await response.json();console.log(analysis.status, analysis.summary, analysis.report_url);import osimport uuidimport requests headers = {"Authorization": "Bearer " + os.environ["FILEVERITY_API_KEY"]} file = requests.post("https://api.fileverity.com/v1/files", headers=headers, files={"file": open("contract.pdf", "rb")}).json() response = requests.post( "https://api.fileverity.com/v1/analyses", headers={**headers, "Idempotency-Key": str(uuid.uuid4()), "Prefer": "wait=60"}, json={"model": "fvdoc-3", "file": file["id"]},)analysis = response.json()print(analysis["status"], analysis["summary"], analysis["report_url"]){ "id": "an_Zc4vB7nP1sK8tL3wR6yQm2Xa", "object": "analysis", "created": 1793700300, "model": "fvdoc-3-2026-11-03", "livemode": true, "status": "succeeded", "file": { "name": "contract.pdf", "bytes": 18874368, "format": "pdf" }, "report_id": "FV-3PXH-6WQ2-8NDC", "report_url": "https://fileverity.com/verify/FV-3PXH-6WQ2-8NDC", "summary": { "kind": "docpro", "level": "L3", "action": "review", "reason": null, "findings": [], "pages": 12, "images": 3, "text": "human" }, "result": { "report": { "schema": "fileverity.docpro/1", "id": "FV-3PXH-6WQ2-8NDC" }, "stamped_at": 1793700340 }, "error": null, "progress": null, "usage": { "amount": 599, "currency": "usd", "funding": "balance" }, "metadata": null, "completed_at": 1793700341, "expires_at": 1794305141}Where it fits
Put it where a file becomes a decision.
The API returns a risk level and a recommended action. Your reviewers keep the final call.
Lending and income documents
- You send
- Pay stubs, bank statements and employer letters from an application.
- You get back
- A risk level, a recommended action and the findings behind them, with the pages involved.
- Then your team
- Route files that need a closer look to an underwriter, with the report attached.
Insurance claims
- You send
- Invoices, repair estimates, receipts and statements submitted with a claim.
- You get back
- Findings on edits, embedded photos and AI-written passages, plus a report ID for the claim file.
- Then your team
- Attach the report ID to the claim and ask for the original document when the findings call for it.
Accounts payable and invoices
- You send
- Supplier invoices and letters that change bank details, before a payment run.
- You get back
- Edit history, file records and a finding when something changed after the file was created.
- Then your team
- Confirm changed amounts or payee details with the supplier before paying.
Vendor, tenant and HR onboarding
- You send
- Certificates, diplomas, reference letters and proof-of-address documents.
- You get back
- A report on the file itself: edits, signatures, embedded photos and AI-written text.
- Then your team
- Verify the credential with its issuer when the report advises a review.
Limits
What it does not do.
A clean result narrows a review. It does not replace one.
- It does not read identity documents, match faces or run liveness checks. Use it next to an identity verification provider.
- A result without findings is not proof that a document is authentic or that what it says is true.
- It checks the file, not the facts. It cannot confirm that an amount, a payee or an issuer is correct, so keep verifying those at the source.
- Some content cannot be examined, such as scanned pages without text or very short passages. The report states what was not examined.
- Photos and screenshots of documents are images, not documents. Check them with the image API.
Evidence
Evidence you can keep.
Every check leaves a record you can store, share and check again later, not only a verdict.
Report ID
A report ID in the form FV-XXXX-XXXX-XXXX. Store it next to your own case or customer record.
Fingerprints and timestamp
SHA-256 fingerprints of the file and the report, and an RFC 3161 timestamp, are recorded with every report.
Public verification page
Anyone you share the report ID with can confirm it on the verification page, without an account.
Files deleted, results kept
Uploaded files are deleted after the check and never used to train models. The result stays available through the API for 7 days.
Integrate
Build it into your workflow.
Image and document checks follow the same pattern, so one integration covers both.
- Wait for the result with Prefer: wait, or receive a signed webhook when the check finishes. Handle both a finished response and a processing response.
- Send an Idempotency-Key on every POST request, so a retry never runs a check twice.
- Build against fv_test_ keys first. They return fixed sample results and are never charged.
- Failed checks are not charged. A busy service answers 503 with a retry-after header, and you retry with the same key.
- Webhooks are signed and follow the Standard Webhooks specification.
- Files up to 4 MB go in one multipart request. Larger files use a pre-signed upload URL, up to the model's limit.
- Requests are limited to 120 per minute per key.
Pricing
Pay for each check.
One prepaid workspace balance covers image, document and text checks. Top up from US$19. There is no subscription and nothing renews.
| Check | Billed per | Price |
|---|---|---|
| Image checkBilled per image | image | US$1.99 |
| Document checkBilled per document | document | US$5.99 |
| Text checkBilled per 1,000 characters | 1,000 characters | US$0.14 |
Text is rounded up to the next 1,000 characters for each request. Text checks need at least 100 words.
Free start
Try it before you add funds.
Your first workspace starts with 5 free image or document checks and 5,000 free text characters.
No card is needed to start. One free start per person, and a limited number per company email domain. Teammates should join through an invitation.
Frequently asked questions
How do I detect a forged PDF by API?
Upload the PDF with POST /v1/files, then create a check with POST /v1/analyses and the model fvdoc-3. The response carries findings from the file's edit history, signatures, embedded photos and text, a risk level and a recommended action, plus a report ID that anyone can verify.
Can it detect AI-generated documents?
It detects AI-written text: the check marks AI-written passages by page and says when text could not be evaluated, for example on scanned pages without text. It also examines embedded photos for AI generation. Treat the result as evidence for a review, not as proof.
Does it verify IDs or passports?
No. It does not read identity documents, match faces or run liveness checks. It examines the document file, not the person presenting it, so use it next to an identity verification provider.
How much does a document check cost?
US$5.99 per document check, paid from a prepaid workspace balance that you top up from US$19. There is no subscription. Failed checks are not charged, and test keys are never charged.
Can I try it for free, and is there a test mode?
Your first workspace starts with 5 free image or document checks and 5,000 free text characters, with no card needed. There is one free start per person and a limited number per company email domain. Keys that start with fv_test_ return fixed sample results and are never charged.
Which file formats and sizes are accepted?
Accepted formats: PDF, DOCX, DOC, RTF, ODT, PPTX, TXT. The limits are 50 MB and 100 pages per file. Files up to 4 MB go in one multipart request; larger files use a pre-signed upload URL. A JPEG, PNG or WebP photo of a document is an image check instead.
How long are files and results kept?
Uploaded files are deleted after the check. The result is kept for 7 days so you can fetch it again, and the public verification page confirms the report ID, the file fingerprint and the timestamp.
Guides
Practical guidance for review teams.
What each check establishes, where it stops and which evidence to request next.
Documents
Document Fraud Detection: AI-Generated and Altered Files
Spot fake utility bills, pay stubs and bank statements, then confirm with the issuer. Compare document verification services and see where deepfake fraud fits.
21 min read ·
Documents
How to Check If a PDF Has Been Edited
Check a PDF with trusted copies, signature validation and metadata. Learn how to view PDF and Word metadata and what each field can and cannot prove.
16 min read ·
Documents
How to Verify an Invoice Before Payment: Changed Amounts, Payees and Supporting Records
Verify invoice amounts, receipts, revisions and payee changes before payment, and catch duplicate invoices. Includes a worked accounts payable case.
19 min read ·
Evaluating detection
How to Choose an AI Detection API: Ten Checks Before You Integrate
A buyer's checklist for AI detection APIs: input limits, sync or async results, webhooks, evidence output, data retention, test mode and pricing.
17 min read ·
Make your first check in minutes.
Open the Console, use your free start and send a test request. Add funds only when you are ready for live results.