HomeVoice Detection › API

The voice detection API.

Send an audio file, get an AI-likelihood score and a human-versus-synthetic verdict back as JSON. It is one synchronous POST with an sk_live_ key, it is included from the Amplify voice plan up, and it draws on your voice quota rather than the text API quota — voice is a separate product, so a Starter or Pro text subscription neither grants nor blocks it.

Try it in the browser first Endpoint reference ↓
Included from Amplify up Audio never stored
Known issue with the current detector — please read before acting on a result. The engine running in production over-flags genuine recordings: real human speech, especially compressed audio such as phone calls and messaging-app voice notes, can come back as high-confidence “AI-generated”. A replacement engine is in acceptance testing. Until it is live, treat a synthetic verdict on a recording you believe is real as unproven, and rely on verifying the speaker directly — calling back on a number you look up yourself settles it in a way no detector currently can.
Quick start

One POST, one JSON reply.

Everything you need to make the first call.

# Check an audio file. Key from /api-keys — needs the `scan` scope.
curl -X POST https://api.textsight.ai/v2/voice/detect \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -F "file=@clip.mp3"

The key also works as x-api-key: sk_live_… if you prefer a plain header. A successful call returns:

{
  "ai_probability": 0.94,
  "ai_score": 94,
  "human_score": 6,
  "verdict": "ai",
  "segments": [],
  "duration_sec": null,
  "detector": "…",
  "filename": "clip.mp3",
  "file_size": 148213,
  "cached": false,
  "quota": { "source": "plan", "remaining": 9873 },
  "scan_id": "…",
  "report_url": "/api/scan/…/report.pdf",
  "request_id": "req_…"
}
Read verdict, not just ai_score. When the detector has a calibrated uncertainty band it states its own verdict, and "mixed" means genuinely undecided rather than “leaning human”. Deriving your own verdict from the score alone will turn an abstain into a confident answer the detector did not give.
Reference

Endpoint reference.

FieldValue
EndpointPOST https://api.textsight.ai/v2/voice/detect
Bodymultipart/form-data with the audio in the file field
AuthAuthorization: Bearer sk_live_… or x-api-key: sk_live_…
Scopescan — the default on a new key
PlanAmplify, Broadcast or Enterprise. Free, Echo and text plans return 403 VOICE_API_NOT_ENTITLED
FormatsMP3, WAV, M4A, OGG, FLAC. Opus is rejected — convert WhatsApp voice notes first
Max size10 MB, enforced server-side
Throughput60 requests/minute on Amplify, 120 on Broadcast, negotiated on Enterprise — per account rather than per key
QuotaVoice plan month → Soundbites credits → free daily. Never the text API quota

Errors

Every error uses the standard { "error": { "code", "message" } } envelope shared with the rest of the API.

StatusCodeMeans
400invalid_requestNo file, an unsupported format, or bytes that are not really audio
401unauthorizedKey missing, invalid or expired
403VOICE_API_NOT_ENTITLEDNo Amplify, Broadcast or Enterprise plan on the account
429quota_exceededVoice quota exhausted for the period
429rate_limitedOver 120 requests/minute
502detector_errorOur detection engine failed. Retryable
503detector_unavailableDetector temporarily down. Retryable
Behaviour

Things worth knowing before you build.

Each of these will otherwise surprise you in production.

Repeat checks of an identical file are free

Results are cached on the file bytes. A repeat upload returns cached: true and does not consume quota or spend a credit — but because no scan row is written, it also returns no scan_id or report_url. If you need a persisted record for every call, deduplicate on your side rather than relying on ours.

segments is often empty

A per-window timeline is not produced by the engine running today: segments always returns an empty array and duration_sec returns null. We would rather return an honest empty array than fabricate segmentation, so treat both fields as optional in your client.

There is no engine attribution

Nothing in the response names ElevenLabs, OpenAI or any other generator, because source attribution is a much harder problem than telling synthetic from real and we do not return a guess. detector identifies our engine, not the one that made the audio.

No live-stream detection

This runs on a complete recorded file. There is no streaming or real-time endpoint, and we would be sceptical of anyone offering one at consumer scale. For live call protection, the process controls in our fraud-team guide do more than any detector.

Phone and messaging audio scores less confidently

Call codecs and voice-note compression strip out much of the detail detection relies on. Expect lower confidence on that material, and treat an uncertain result as genuinely uncertain rather than as a soft yes. What moves reliability is covered here.

Not forensic-grade. A TextSight voice result is a triage signal, not proof, and it must never be the sole basis for a disciplinary, employment, financial or legal decision. Our full position on what a result is worth is here.
Access

Getting a key, and the rest of the API.

API access is included from Amplify up ($59/mo, 2,000 voice checks a month; Broadcast $199 for 10,000; Enterprise $599 for 100,000). Create a key at /api-keys — a voice plan qualifies on its own, so you do not need a paid text plan as well. Keys are shown once; store them somewhere safe.

Voice checks draw on the voice quota and never touch the text API's monthly call allowance. The two products are billed and metered independently.

The rest of the API

The same key works against the text endpoints, subject to your text plan and the key's scopes:

  • POST /v2/detect — AI detection on text, with per-sentence scores
  • POST /v2/score — the same engine, scores only, lighter payload
  • POST /v2/rewrite — humanize text (scope: humanize)

GET /v2 lists the current surface without authentication, and full parameters live in the API documentation.

Not offered: asynchronous or bulk audio submission, live-stream detection, and engine attribution. If you need volume beyond Enterprise's monthly allowance, get in touch with your file volume, typical duration and where the audio comes from — telephony is the hardest case and it changes what is honestly achievable.
FAQ

API questions.

Is there a TextSight voice detection API?
Yes. POST an audio file as multipart/form-data to https://api.textsight.ai/v2/voice/detect with an sk_live_ API key. It is included from the Amplify voice plan up and returns an AI-likelihood score and a human-versus-synthetic verdict as JSON.
Which plan includes API access?
Amplify, at $59 a month with 2,000 voice checks included. Accounts on Free or Echo get 403 VOICE_API_NOT_ENTITLED. Because voice is a separate product, a Pro or Business text subscription does not grant voice API access — and equally, you do not need one alongside a voice plan.
Does a voice call use my text API quota?
No. Voice checks are metered against the voice plan — monthly plan allowance first, then Soundbites credits, then the free daily allowance. The text API's monthly call quota is entirely separate and is untouched by voice calls.
What audio formats and size does it accept?
MP3, WAV, M4A, OGG and FLAC, up to 10 MB per file, enforced server-side. Opus is rejected, so WhatsApp voice notes must be converted to MP3 or M4A first. Files whose bytes do not look like audio are rejected with 400 even if the extension is right.
Why is the segments array empty?
A per-window timeline is not produced by the engine running today: segments always returns an empty array and duration_sec returns null. We would rather return an honest empty array than fabricate segmentation, so treat the field as optional.
Can the API tell me which AI tool generated a voice?
No. Source attribution is substantially harder than binary detection and we do not return a guess. The detector field names our own engine, not the generator that produced the audio.
Is there a streaming or real-time endpoint?
No. Detection runs on a complete recorded file. There is no streaming endpoint, and claims of consumer-scale live-call detection are worth interrogating closely. For live protection, process controls such as out-of-band callback are more effective than any detector.
Do repeat checks of the same file cost quota?
No. Results are cached on the file bytes, so an identical re-upload returns cached: true without consuming quota or spending a credit. It also returns no scan_id or report_url, because no new scan row is written.
Related

More voice detection guides.

Further reading

Test a clip in the browser, then wire it up.

Your first check is free with no signup — 3 a day with a free account. Your audio is never stored.

Open the voice detector All voice guides
POST /v2/voice/detect · multipart `file` · MP3 · WAV · M4A · OGG · FLAC · up to 10 MB