ScamAI raised $2.6M to combat AI-powered scams
scam.ai

~/docs cat detect-image.md

Detect an image

Checks a photo or a still image for AI generation and editing, and answers with one verdict and one score for the whole image.

Send the file

curl
curl -X POST "https://api.scam.ai/v1/detections" \
  -H "x-api-key: <YOUR_API_KEY>" \
  -F "file=@/path/to/photo.jpg"

Images are sent as a file. Links are fetched for video only; see Detect from a link.

Parameters

Request parameters
FieldTypeMeaning
filebinaryThe media file. JPEG, PNG, WEBP, GIF or BMP; HEIC is not accepted, at most 10 MB.
save"true" | "false"Keep a history row and the file. Default "true". With "false" nothing is stored and the run cannot be retrieved later.

The response

idstring
The detection id. Pass it to GET /v1/detections/{id} to read the run back.
statusstring
Always "completed". The answer arrives in the same request.
created_atstring
When the run finished. RFC 3339, millisecond precision, always Z.
mediaobject
What was checked: type (image, video, audio or document), filename, mime_type and bytes. The last three can be null when they were not known. mime_type is what the upload declared, so a client that sends no content type sees application/octet-stream here; type comes from the bytes themselves.
modelstring
The model that answered, "Eva V1.6".
verdictstring
LIKELY_REAL, ALERT or LIKELY_AI. Branch on this.
scorenumber | null
0 to 1, the probability the media is AI-made or manipulated. null when nothing could be scored.
summarystring
One sentence a person can read, matching the verdict.
credits_usednumber
What this run cost, an integer. 0 on a sandbox key, or when the same file was sent byte for byte from this account within 30 days.
zero_charge_reasonstring
Only when credits_used is 0: "sandbox" or "duplicate".
response · 200
{
  "id": "6f1c2a3e-9b7d-4e5f-8a21-3c4d5e6f7a8b",
  "status": "completed",
  "created_at": "2026-09-15T10:12:33.123Z",
  "media": {
    "type": "image",
    "filename": "photo.jpg",
    "mime_type": "image/jpeg",
    "bytes": 248113
  },
  "model": "Eva V1.6",
  "verdict": "LIKELY_AI",
  "score": 0.92,
  "summary": "This image shows strong signs of being AI-generated or edited.",
  "credits_used": 1
}

Questions

Why did I get a 422 instead of a verdict?
The platform looked and could not judge: the bytes did not decode, or there was nothing to assess. The body carries a stable error.code and, when the platform declined, reasons[] such as no_face. Show it to your user; do not retry the same file. Nothing is charged. See Errors.
Do you keep the image?
With save="true" (the default) the file and a history row are kept and the run can be read back by id. With save="false" nothing is stored. Retention is covered by the privacy policy and DPA.