Deepfake Detection API

Detect AI-generated images, video, audio, and text — programmatically

The Sealed Rose Detection API puts the same forensic engine behind our free verification tools at your fingertips over a simple REST interface. Send an image, a video, an audio clip, or a block of text and get back a structured verdict — whether it is AI-generated or manipulated, a confidence score, the model we attribute it to, and a per-detector breakdown. Authenticate with a Bearer token, receive JSON, and pay only for the checks you run with prepaid credits.

Quickstart

Three steps to your first detection call.

  1. Step 1
    Sign in

    Sign in to your Sealed Rose account, or create one if you do not have it yet.

  2. Step 2
    Create a key

    Open /api-keys and create a key. Live keys are prefixed sr_live_ and shown once — store it as a secret.

  3. Step 3
    First call

    Send the key as a Bearer token to any detection endpoint. The image example below returns a verdict in one request.

Your first request

curl — detect an image
curl -X POST https://sealedrose.com/api/v1/detect/image \
  -H "Authorization: Bearer sr_live_your_key_here" \
  -H "Content-Type: image/jpeg" \
  --data-binary @photo.jpg

Every request carries an Authorization: Bearer sr_live_… header. Optionally add an Idempotency-Key: <your-id> header so a retried request is charged at most once.

Authentication

The API authenticates with a Bearer token. Create and manage keys at /api-keys — sign in, create a key, and copy it once. Send it on every request:

Authorization header
Authorization: Bearer sr_live_your_key_here

A missing or invalid key returns 401 invalid_key. Keep keys server-side; never ship sr_live_ keys in client code.

Endpoint reference

All endpoints are POST and return JSON. Base URL: https://sealedrose.com.

POST/api/v1/detect/image

Detect image

Input: Raw image bytes (--data-binary @photo.jpg), or a multipart form with a file field. Up to 32 MB.

Example request
curl -X POST https://sealedrose.com/api/v1/detect/image \
  -H "Authorization: Bearer sr_live_your_key_here" \
  -H "Content-Type: image/jpeg" \
  --data-binary @photo.jpg
Example response
{
  "tool": "image",
  "aiGenerated": true,
  "confidence": 0.97,
  "detectedModel": "Midjourney",
  "aiScore": 0.97,
  "deepfakeScore": 0.12,
  "sources": [
    { "model": "hive", "score": 0.97 },
    { "model": "sightengine", "score": 0.94 }
  ],
  "checkId": "chk_8f2a1c",
  "cost": 1,
  "creditsRemaining": 99
}
POST/api/v1/detect/video

Detect video

Input: Raw video bytes (--data-binary @clip.mp4), or a multipart form with a file field. Up to 32 MB. Analyzed frame by frame.

Example request
curl -X POST https://sealedrose.com/api/v1/detect/video \
  -H "Authorization: Bearer sr_live_your_key_here" \
  -H "Content-Type: video/mp4" \
  --data-binary @clip.mp4
Example response
{
  "tool": "video",
  "aiGenerated": true,
  "confidence": 0.91,
  "detectedModel": "Sora",
  "sources": [
    { "model": "hive", "score": 0.91 }
  ],
  "checkId": "chk_5d1b90",
  "cost": 12,
  "creditsRemaining": 87
}
POST/api/v1/detect/audio

Detect audio

Input: Raw audio bytes (--data-binary @voice.mp3), or a multipart form with a file field. Up to 32 MB.

Example request
curl -X POST https://sealedrose.com/api/v1/detect/audio \
  -H "Authorization: Bearer sr_live_your_key_here" \
  -H "Content-Type: audio/mpeg" \
  --data-binary @voice.mp3
Example response
{
  "tool": "audio",
  "aiGenerated": false,
  "confidence": 0.88,
  "detectedModel": null,
  "aiScore": 0.09,
  "deepfakeScore": 0.11,
  "sources": [
    { "model": "hive", "score": 0.11 }
  ],
  "checkId": "chk_a3f7e2",
  "cost": 1,
  "creditsRemaining": 96
}
POST/api/v1/detect/text

Detect text

Input: A JSON body { "text": "…" }. Up to 25,000 characters.

Example request
curl -X POST https://sealedrose.com/api/v1/detect/text \
  -H "Authorization: Bearer sr_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{ "text": "The message you want to score for AI authorship." }'
Example response
{
  "tool": "text",
  "aiGenerated": true,
  "confidence": 0.96,
  "detectedModel": null,
  "sources": [
    { "model": "sapling", "score": 0.96 }
  ],
  "checkId": "chk_20c4de",
  "cost": 1,
  "creditsRemaining": 95
}

Response & errors

A successful detection returns a 200 with the fields below. Image and audio checks add aiScore and deepfakeScore.

FieldTypeDescription
toolstringWhich detector ran: image, video, audio, or text.
aiGeneratedbooleanThe verdict — true if the media is judged AI-generated or manipulated.
confidencenumber (0–1)Confidence in the verdict, from 0 (uncertain) to 1 (certain).
detectedModelstring | nullThe generator we attribute the media to (e.g. "Sora"), or null when none is identified.
sourcesarrayPer-model breakdown: an array of { model, score } objects from the underlying detectors.
aiScorenumber (0–1)Image & audio only — likelihood the media is fully AI-generated.
deepfakeScorenumber (0–1)Image & audio only — likelihood of a face-swap / manipulation.
checkIdstringUnique id for this check — keep it for your records and support requests.
costnumberCredits debited for this call (1 for image/audio/text, 12 for video).
creditsRemainingnumberYour balance after this call was billed.

Error envelope

Errors return a non-2xx status and a consistent envelope:

Error shape
{
  "error": {
    "code": "insufficient_credits",
    "message": "Your balance cannot cover this check."
  }
}
StatusCodeMeaning
400bad_inputThe request body was missing, malformed, or the wrong media type.
401invalid_keyThe Authorization header is missing or the API key is not valid.
402insufficient_creditsYour balance cannot cover this check. Top up at /api-keys.
413too_largeMedia exceeds the 32 MB limit, or text exceeds the 25,000-character limit.
422partial_streamThe video was too short to analyze — supply a longer clip.
500internal_errorSomething failed on our side. Retry with an Idempotency-Key so you are not double-charged.

Pricing

Pricing is credit-based and prepaid. You buy credits up front and each call debits your balance — about $0.02–$0.03 per credit depending on pack size. Image, audio, and text checks cost 1 credit; video is 12 (Hive bills video per sampled frame). No subscription and no per-seat fee — you pay only for the checks you run.

Cost per check

DetectorEndpointCost
Image/api/v1/detect/image1 credit
Audio/api/v1/detect/audio1 credit
Text/api/v1/detect/text1 credit
Video/api/v1/detect/video12 credits

Credit packs

Bigger packs lower the per-credit price. Need higher volume or a custom plan? Contact us.

500 credits
$15
2,000 credits
$50
Most popular
10,000 credits
$200
Best value

API FAQ

5 questions
Is my data stored?
Uploaded media is processed to produce a result and is not retained for training. We keep the check metadata (the checkId, tool, verdict, and cost) tied to your account for billing and audit, but the raw image, video, or audio is discarded after analysis. Send text over TLS like any other request; it is used only to score the submission.
Are there rate limits?
The API is metered by credits rather than a hard request quota — each call debits your prepaid balance, and a 402 insufficient_credits is returned when the balance runs out. If you send a large burst you may see brief 429-style backpressure; retry with exponential backoff and an Idempotency-Key. Need a higher sustained throughput? Contact us and we will provision it.
How does the Idempotency-Key work?
Send an Idempotency-Key header with a unique id of your choosing on any request. If the same key is seen again (for example after a network timeout and retry), we return the original result instead of running — and charging for — a second check. Use a fresh key for each distinct check, and reuse the same key when retrying that exact check.
Which models does it detect?
The API runs the same forensic engine as our free tools, aggregating multiple upstream detectors. Video and image checks flag modern generators such as Sora, Kling, Runway, and Google Veo as well as face-swap manipulation; audio checks target synthetic-voice and voice-clone models; text checks score AI-written prose. The detectedModel field names the attributed generator when one is identified, and the sources array shows each contributing model with its score.
How do I get an API key?
Sign in to your Sealed Rose account, open /api-keys, and create a key. Live keys are prefixed sr_live_ and are shown once — copy it into your secret store. Send it on every request as an Authorization: Bearer sr_live_… header.

Ready to build?

Create a key, buy a starter pack of credits, and make your first detection call in minutes. The same forensic engine that powers our free tools, now in your stack.