Is this voice AI?
isAI detects whether a voice recording was AI-generated by ChatGPT, Claude, or Gemini. Send audio, get a verdict — AI detected, human review, or no AI detected — with a confidence level. On-device, zero egress, audio never stored.
Base URL
https://isai-501449824361.asia-south1.run.app
Content-Type: multipart/form-data
Authentication
Every /api/* call (except /api/health) requires your API key, sent as either header:
x-api-key: <your-key>
Authorization: Bearer <your-key>
Keys are per-customer and can be rotated or revoked. Keep them server-side — never ship a key in client code.
POST /api/isai
Classify one audio recording.
Request — multipart/form-data
| field | required | notes |
|---|---|---|
file | yes | the audio clip |
Formats: mp3 · wav · m4a · mp4 · ogg · flac · aac · webm
Input limits
| limit | value | behaviour |
|---|---|---|
| Min length | ≥ 0.5 s | shorter → 400. For a reliable verdict send ≥ 3–4 s of speech. |
| Max size | 50 MB | larger → 413. ≈ 20–50 min depending on bitrate. |
| Best range | under ~2 min | the whole clip is analysed, but the pass that detects AI spliced into part of a longer answer scans the first 120 s. |
Audio is resampled to 16 kHz mono internally. A candidate's spoken answer (≈30 s–2 min) sits comfortably in the ideal range.
Response — 200 application/json
{
"is_ai": false,
"confidence": "high",
"ai_score": 35,
"advisory": "No AI-generated voice detected.",
"explanation": "No AI-generated voice was detected in this recording.",
"mixed": false,
"filename": "answer.m4a"
}
| field | type | meaning |
|---|---|---|
is_ai | bool | true = an AI-generated voice (ChatGPT / Claude / Gemini) was detected |
confidence | string | high/medium/low when is_ai; review for borderline; high/low on a clear result (confidence that no AI-generated voice was detected) |
ai_score | int | 0–100 AI-likelihood score — ≥70 AI detected · 50–69 human review · <50 clear. Use it to rank results or set your own cutoff (see note below). |
advisory | string | one-line customer-facing summary |
explanation | string | short human-readable detail |
mixed | bool | AI speech spliced into an otherwise human answer |
filename | string | echo of the uploaded name |
Verdict guide
| what you see | meaning | suggested action |
|---|---|---|
AI DETECTED is_ai:true | AI-generated voice (ChatGPT / Claude / Gemini) | treat the answer as AI-assisted |
HUMAN REVIEW confidence:"review" | borderline, possible AI voice | route to a human reviewer |
| NO AI DETECTED clear | no AI-generated voice detected | none |
About ai_score
ai_score is a 0–100 indicator that always agrees with the verdict:
| ai_score | verdict |
|---|---|
| 70–100 | AI DETECTED |
| 50–69 | HUMAN REVIEW |
| 0–49 | NO AI DETECTED |
Use it to rank recordings or apply your own cutoff — e.g. escalate anything ≥ 60.
Errors
| status | when |
|---|---|
400 | no file, unsupported audio, or too short (< 0.5 s) |
401 | missing or invalid API key |
403 | license invalid/expired |
413 | file larger than 50 MB |
429 | rate limit exceeded — slow down and retry |
500 | internal error |
Rate limit: requests per key per minute (default 120). Retry a 429 after a short backoff.
GET /api/health
No auth. Returns service status, version, and license validity.
{ "status":"healthy", "service":"isai", "version":"1.4.2",
"auth_required":true, "egress":"none", "license":{ "valid":true } }
Example
curl -X POST \
-H "x-api-key: $ISAI_KEY" \
-F "file=@candidate-answer.m4a" \
https://isai-501449824361.asia-south1.run.app/api/isai
{ "is_ai": true, "confidence": "high",
"advisory": "Confirmed AI voice.",
"explanation": "Voice characteristics match AI-generated speech.",
"mixed": false, "filename": "candidate-answer.m4a" }