Developer API

Verify audio and images from your own apps

Add AI-generated content detection to your product. Create an API key, send a file, and get a clear JSON result back.

You will be asked to log in or sign up before creating a key.

curl -X POST https://aiverification.com/api/v1/verify \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@recording.mp3"

Audio and images

One endpoint for both. Send a recording or a picture and get a verdict with a confidence score.

Simple REST and JSON

A single POST request with a file. Works from any language, with ready-made cURL, Python and Node.js samples.

Secure keys

Keys are stored hashed, always expire, and can be revoked instantly from your dashboard.

Documentation

Authentication, request format, response fields, errors and limits.

Quick start

Verify your first file in three steps.

  1. 1

    Create a key

    Open the dashboard, name your key and choose an expiry. Copy it right away, it is shown only once.

  2. 2

    Send a file

    POST the file as multipart/form-data to the verify endpoint with your key in the Authorization header.

  3. 3

    Read the verdict

    The JSON response tells you whether the file is AI-generated (is_ai_generated) and how confident the model is (overall_confidence).

curl -X POST https://aiverification.com/api/v1/verify \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@recording.mp3"

Authentication

Authenticate every request with your API key as a bearer token:

Authorization: Bearer sk_live_...
  • Keys always expire (between 7 days and 1 year). Create a replacement before the old key runs out.
  • You can have up to 5 active keys. Revoke a key at any time from the dashboard, and it stops working immediately.
  • A key is shown only once when you create it. If you lose it, create a new one.

Keep your key secret

Call the API from your backend only. Never put a key in a web page, a mobile app or a public repository, because anyone who finds it can spend your credits.

Verify endpoint

POSThttps://aiverification.com/api/v1/verify
ParameterTypeDescription
AuthorizationheaderBearer YOUR_API_KEY
filefile (multipart)The audio or image file to verify. Send exactly one file.

Supported files

  • Audio, up to 40MBaudio/wavaudio/mp3audio/oggaudio/mpegaudio/m4aaudio/x-m4a
  • Images, up to 20MBimage/jpegimage/pngimage/webp

Files are checked by MIME type, so make sure your HTTP client sends the correct Content-Type for the file part (for example audio/mpeg). The code samples above do this.

Response

Every response is JSON with a success flag. On success the result is in data. A finished analysis returns HTTP 200.

FieldTypeDescription
idstring (uuid)Unique id of this verification.
status"initialized" | "verifying" | "verified" | "failed"verified once the analysis has finished.
verification_type"audio" | "image"The kind of media that was analyzed.
is_ai_generatedbooleanThe verdict. true when the file is judged to be AI-generated.
overall_confidencenumber | nullHow confident the model is in the verdict, from 0 to 100.
overall_scorenumber | nullRaw model score. The scale differs between audio and images, so base decisions on is_ai_generated and overall_confidence.
total_chunksnumber | nullNumber of chunks analyzed for audio. null for images.
chunk_detailsarray | object | nullAudio: one entry per chunk. Image: a single analysis object. See below.
audio_lengthnumberLength of the audio in seconds. Ignore this field for images.
flagged_by"system" | "c2pa"What produced the verdict: our models (system) or C2PA content credentials found in the file (c2pa).
feedback"CORRECT" | "INCORRECT" | "NONE"Feedback state of this result. NONE when no feedback has been submitted.
created_atstring (ISO 8601)When the verification was created.
original_file_namestring | nullName of the file you uploaded.

chunk_details for audio

Audio is analyzed in chunks and listed in order, so you can see which part of a recording was flagged.

FieldTypeDescription
scorenumberRaw model score for this chunk.
thresholdnumberDecision threshold the score is compared against.
predictionstringResult for this chunk, for example Fake.
confidencenumberConfidence in the prediction, from 0 to 100.
chunk_sizenumberLength of the chunk in seconds.
model_namestringName of the model that analyzed the chunk.
time_secondsnumberTime the model took to analyze the chunk.

chunk_details for images

FieldTypeDescription
is_ai_generatedbooleanVerdict of the image analysis.
fake_probability_percentnumberProbability (0 to 100) that the image is fake.
real_probability_percentnumberProbability (0 to 100) that the image is real.
face_detectedbooleanWhether a face was found in the image.
face_countnumberNumber of faces found.
face_detectorstringFace detector that was used (informational).
routestringAnalysis route that was used (informational).
processing_msnumberProcessing time in milliseconds.

Example responses

{
  "success": true,
  "data": {
    "id": "3f2b8c1e-7a4d-4c1b-9e55-2d6f0a8b1c77",
    "status": "verified",
    "total_chunks": 2,
    "overall_score": 0.4837,
    "overall_confidence": 51.63,
    "is_ai_generated": true,
    "feedback": "NONE",
    "chunk_details": [
      {
        "score": 0.4837,
        "threshold": 0.5,
        "chunk_size": 30,
        "confidence": 51.63,
        "model_name": "AVI_AUDIO_V4",
        "prediction": "Fake",
        "time_seconds": 0.413
      },
      {
        "score": 0.4836,
        "threshold": 0.5,
        "chunk_size": 30,
        "confidence": 51.64,
        "model_name": "AVI_AUDIO_V4",
        "prediction": "Fake",
        "time_seconds": 0.336
      }
    ],
    "audio_length": 39.24,
    "created_at": "2026-10-22T02:22:45.20063+00:00",
    "verification_type": "audio",
    "flagged_by": "system",
    "original_file_name": "interview.mp3"
  }
}

How to read a result

  • Use is_ai_generated for the verdict and overall_confidence for how sure the model is.
  • Scores are raw model outputs. Do not compare them between audio and images.
  • Results are probabilistic. For important decisions, combine them with other evidence.

Errors

Failed requests return a non-2xx status and a message you can show or log:

{
  "success": false,
  "error": {
    "message": "Invalid, expired or revoked API key"
  }
}
StatusMeaningWhat to do
202Still processingAnalysis did not finish within the response timeout. The body holds the current state, and status is not verified.
400Invalid requestNo file, more than one file, an unsupported type, or a file that is too large. Fix the request and try again.
401UnauthorizedThe API key is missing, wrong, expired or revoked. Create a new key in the dashboard.
4xxRequest rejectedThe request was understood but refused, for example because your account has no credits left. Read error.message.
429Too many requestsYou exceeded the rate limit. Wait for the number of seconds in the Retry-After header.
500Server errorSomething went wrong on our side. Retry after a short delay.

Limits

LimitValueNotes
Rate limit30 requests / minuteApplied per API key. Exceeding it returns 429 with a Retry-After header.
Files per request1Send one file in the file field.
Audio file size40MBLarger files are rejected with 400.
Image file size20MBLarger files are rejected with 400.
Active keys5Per account. Revoked and expired keys do not count.
CreditsPer requestAPI requests use the same credits as the web app.

Ready to build?

Create your first API key in under a minute and make your first request.

Open the developer dashboard