Skip to main content

Request

Send the image one of three ways. The original bytes are scored as sent; don’t resize or re-encode first.
  • multipart/form-data with a file field
  • JSON {"image_url": "https://…"}: we fetch it (http/https, public addresses only)
  • JSON {"image_b64": "…"}: standard base64 of the original file
Accepted: JPEG, PNG, WebP, AVIF, GIF (first frame), BMP and TIFF, up to 20 MB.
Images under 256 px on the shorter side, or JPEGs below about quality 50, are refused with a reason and aren’t metered.
To keep the image, add store=true. See Image storage.

Response

200 response
boolean
The verdict: true is AI, false is “No AI detected”. false is not proof the image is untouched: the detectors miss some AI images.
string[]
Which detectors crossed their threshold: full_image_specialist (whole image) and/or face_specialist (face analysis), plus content_credentials when the file carries signed Content Credentials that record AI.
string
One line explaining the verdict, written for people.
object
The C2PA manifest embedded in the file, if any: { found, signer, verified, ai }. verified means the signer chains to the C2PA trust list and the image is unchanged since signing; only verified manifests can make the verdict ai. { found: false } is normal: most sites strip manifests, so it says nothing either way.
object
Each detector’s raw score, 0 to 1. They’re on different scales, so don’t average or compare them; use is_ai and fired. face_specialist is null when no face of at least 64 px was found. Both are null when verified Content Credentials record AI: that decides the verdict, so the detectors aren’t run.
number[] | null
[x, y, w, h] of the face checked, in original pixels, or null.
string
The detector model. Store it and bands_version with the result; verdicts can change when either changes.
string
The version of the thresholds used for this verdict.
boolean
true when this image is being kept. See Image storage.
“No AI detected” isn’t proof an image is real: the detectors can miss some AI images.