AI image detection API
AI image detection API with tamper forensics.
Check images for AI generation and local edits in two API calls. Findings, marked regions and a verifiable report cost US$1.99 per image.
Free start: 5 image or document checks and 5,000 text characters. No card, no subscription.
- Endpoints
- POST /v1/files, POST /v1/analyses
- Model
- fvimg-2 · FVIMG V2
- Accepted files
- JPEG, PNG, WEBP
- Maximum size
- Up to 10 MB and 40 megapixels
- Result
- Wait for it in the same request, or receive a webhook
- Price
- US$1.99 per image check
Last updated
What it checks
What the image check answers.
Was the whole image generated? Was part of it edited? What do the file's own records say? One report answers all three, and the response field column tells you where to read each answer.
| Question | What is examined | Response field |
|---|---|---|
| AI generation | Whether the image looks generated, with a likelihood and, where supported, the likely generator. | questions.ai, generator |
| Local edits | Whether part of the image was changed, with the marked regions in pixels. | questions.edit, regions |
| Content Credentials, watermarks and AI labels | What the file's own records claim about its origin, and whether those claims hold up. | questions.source, provenance |
| File metadata | The camera, software and capture time named in the file's records. | provenance |
| Verdict and confidence | A risk level, a recommended action and how much this file allows the check to establish. | summary, confidence |
Request and response
Two calls and one report.
Upload the image, then create the check with the model fvimg-2. Send Prefer: wait to hold the request until the report is ready. If the wait runs out first, the check answers 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=@claim-photo.jpg | 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\": \"fvimg-2\", \"file\": \"$FILE_ID\", \"metadata\": {\"order_id\": \"A-10492\"}}"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("claim-photo.jpg")], { type: "image/jpeg" }), "claim-photo.jpg");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: "fvimg-2", file: file.id, metadata: { order_id: "A-10492" } }),});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("claim-photo.jpg", "rb")}).json() response = requests.post( "https://api.fileverity.com/v1/analyses", headers={**headers, "Idempotency-Key": str(uuid.uuid4()), "Prefer": "wait=60"}, json={"model": "fvimg-2", "file": file["id"], "metadata": {"order_id": "A-10492"}},)analysis = response.json()print(analysis["status"], analysis["summary"], analysis["report_url"]){ "id": "an_8Hk2pQ4vN9sL1xR7cW3mY6zB", "object": "analysis", "created": 1793700120, "model": "fvimg-2-2026-10-30", "livemode": true, "status": "succeeded", "file": { "name": "claim-photo.jpg", "bytes": 2481920, "format": "jpeg" }, "report_id": "FV-7K2M-9QXD-4T8R", "report_url": "https://fileverity.com/verify/FV-7K2M-9QXD-4T8R", "summary": { "level": "L2", "assessment": "authentic_untouched", "action": "accept", "ai": "very_low", "edit": "none" }, "result": { "report": { "schema": "fileverity.report/1", "id": "FV-7K2M-9QXD-4T8R" }, "stamped_at": 1793700130 }, "error": null, "progress": null, "usage": { "amount": 199, "currency": "usd", "funding": "balance" }, "metadata": { "order_id": "A-10492" }, "completed_at": 1793700131, "expires_at": 1794304931}Where it fits
Put it where an image becomes evidence.
The API returns a risk level and a recommended action. Your reviewers keep the final call.
Claims and insurance photos
- You send
- Damage, vehicle and property photos submitted with a claim.
- You get back
- Findings on AI generation and local edits, marked regions and a report ID.
- Then your team
- Ask for the original file or another photo when the report flags the image.
Returns and refund claims
- You send
- Product photos that customers upload to support a refund.
- You get back
- A verdict and a recommended action in the response, with the edited regions marked.
- Then your team
- Hold the refund for review when an image is flagged and pay the rest as usual.
Marketplaces and listings
- You send
- Listing photos and profile pictures at the point of upload.
- You get back
- A risk level and recommended action from a single check.
- Then your team
- Label, limit or review flagged uploads under your own policy.
Disputes and investigations
- You send
- Photos submitted as evidence in a dispute or an investigation.
- You get back
- A report with fingerprints and an RFC 3161 timestamp that can be verified later.
- Then your team
- Store the report ID with the case and share the verification page when needed.
Limits
What it does not do.
A clean result narrows a review. It does not replace one.
- It checks still images only. It does not analyze video or audio, and it does not identify people or match faces.
- A result without findings is not proof that an image is authentic. Recapturing, screenshots and re-encoding remove evidence.
- Screenshots, heavy compression and small images limit what can be established. The report states how much a file allowed.
- Missing Content Credentials or watermarks prove nothing either way, because metadata is often stripped when images are shared.
- Detection results vary by generator and by image. Read the report as evidence for a review, not as a verdict.
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 AI-generated images by API?
Upload the image with POST /v1/files, then create a check with POST /v1/analyses and the model fvimg-2. The response carries the finding on AI generation, any edited regions, the state of Content Credentials and a report ID that anyone can verify.
Does it find edited parts of a photo?
Yes. The check answers whether part of the image was changed and marks the regions in pixels, so a reviewer can look at exactly what was flagged. Local edits and whole-image AI generation are reported separately.
Can it tell which generator made an image?
Where supported, the report names the likely generator and how it was identified. Many images give no generator, and a missing name does not mean the image is authentic.
Does it read Content Credentials and watermarks?
Yes. It reads Content Credentials, watermarks and AI labels recorded in the file and reports their state. Their absence is not evidence of authenticity, because metadata is often stripped when images are shared.
Do screenshots and compressed images work?
You can submit them, but screenshots, heavy compression and resizing remove evidence. The report states how much the file allowed the check to establish, so treat low-confidence results with care.
How much does an image check cost?
US$1.99 per image check, paid from a prepaid workspace balance that you top up from US$19. Your first workspace starts with 5 free image or document checks, and test keys are never charged. Failed checks are not charged.
Which image formats and sizes are accepted?
Accepted formats: JPEG, PNG, WEBP. The limits are 10 MB and 40 megapixels per image. Files up to 4 MB go in one multipart request; larger files use a pre-signed upload URL.
Does it check video, audio or faces?
No. It checks still images only and does not match faces or identify people. For documents, use the document fraud detection API.
Guides
Practical guidance for review teams.
What each check establishes, where it stops and which evidence to request next.
Images
How to Tell If an Image Is AI-Generated
Was this image generated by AI? Check its source, Content Credentials, watermarks and visual clues, then run a detector. Includes AI art, a worked example and a checklist.
19 min read ·
Images
Can AI Detectors Check Screenshots and Compressed Images?
Learn what screenshots and compression change, which file to submit, how to interpret limited results, and when to request an original or independent evidence.
17 min read ·
Claims and refunds
AI Insurance Fraud: A Practical Claim Photo Review Workflow
Where photo review fits in claims fraud detection and claims automation: an evidence workflow for claim photos, a worked example and an audit record.
18 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.