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

~/docs cat create-detection.md

Create a detection

POST /v1/detections — run a detection on one file. The server infers image, video, or audio, runs the right detectors, and answers with one envelope. Synchronous.

Request (multipart/form-data):

request fields
file    binary   the media — image ≤ 10 MB, video ≤ 25 MB, audio ≤ 25 MB
url     string   a video link, as an alternative to file
save    string   "true" | "false" — persist history + file (default "true")

Idempotency-Key: <key>   optional header — a resend within 24 h replays the
                         stored answer instead of re-billing
curl
curl -X POST "https://api.scam.ai/v1/detections" \
  -H "x-api-key: <YOUR_API_KEY>" \
  -F "file=@/path/to/media.mp4"
response fields
id             string   detection id (null when save="false")
object         string   always "detection"
status         string   always "completed"
created_at     string   ISO timestamp
media          object   { type: "image" | "video" | "audio",
                          filename, mime_type, bytes }
model          string   the public model name, e.g. "Eva V1.6"
verdict        string   "LIKELY_AUTHENTIC" | "SUSPICIOUS" | "LIKELY_AI_MANIPULATED"
confidence     float    P(manipulated), 0.0–1.0 (nullable). 0 = certainly
                        real, 1 = certainly manipulated. NOT certainty in
                        the verdict — an authentic result is a LOW number
summary        string   one human-readable sentence (nullable)
credits_used   number   credits actually debited — prefer this over any quote

Video and audio add their own fields on top of the base above:

video adds
frames_metered   number   frames billed
sampling_rate    null     the platform samples on its own grid, not a set rate
frames_analyzed  number   how many frames were scored
threshold_used   number   the line the verdict was decided against
frames           array    per-frame [{ index, timestamp_s, confidence_score, thumbnail_b64 }]
audio adds
duration_ms   number   clip length — audio is billed by length
segments      array    per-window [{ start_ms, end_ms, value, status }]
                       value = P(synthetic), null for a window with no speech

verdict is the same three-value enum for every media type.