The engine behind Off the Record, for files. You get back a recording people can still understand, while AI transcription gets little or nothing usable from it.
The base URL is https://api.weirdmachines.ai/v1. Every response is JSON, except a successful /v1/protect, which is the audio itself.
Authentication
Pass your key as a bearer token on every request. Keys start with wm_live_. Create, name and revoke them in the console; a key is shown once, when you create it.
Authorization: Bearer wm_live_…
Keep keys on your server. Anyone with a key can spend its account’s credits.
POST/v1/detect
Tells whether the voice in a recording is a person or AI. The recording is scored in overlapping 3-second windows; the verdict weighs every window that has a voice in it.
Request
Send the file as multipart/form-data in a field named file, or as the raw request body with any Content-Type.
"ai", "human", or "no_voice" when no speech was found (music, noise, silence).
confidence
0–1: how strongly the recording leans toward the verdict. null for no_voice.
scores.ai, scores.human
The AI and human shares of the voiced windows, adding up to 1.
audio
duration and voice_seconds in seconds, plus the input’s sample_rate and channels.
timeline[]
One entry per window, a second apart: start, end, voice (0–1, how likely there’s a voice) and ai (0–1, null when the window is silent).
credits
Credits used by this request and remaining on the account.
Detection can make mistakes. Use it as one signal among others, and don’t base decisions that matter on it alone.
POST/v1/protect
Returns the recording protected from AI transcription. Sound quality drops somewhat, but people can still understand what’s said; transcription services get little or nothing usable from it.
Request
Parameter
Description
file
The recording, as with /v1/detect.
strength
Optional, as a query or form field: balanced (default), strong or max. Stronger levels cost more sound quality.
A 16-bit mono WAV (audio/wav) at the input’s sample rate (up to 48 kHz), the same length as the input. Details come in headers:
Header
Description
X-Request-Id
The request’s id, for support.
X-Audio-Duration
Length in seconds.
X-Audio-Sample-Rate
The WAV’s sample rate.
X-Credits-Used, X-Credits-Remaining
Credits for this request, and what’s left.
Protection makes recordings much harder to transcribe; it isn’t a guarantee against every system. Heavy re-encoding, like low-bitrate phone codecs, weakens it.
New accounts start with 1,000 free credits, once. Credits never expire, and free ones are used before bought ones.
Errors
Errors are JSON with a stable type and a message you can show to people.
{ "error": { "type": "insufficient_credits", "message": "This needs 94 credits and you have 12. Buy more in the console", "credits_needed": 94, "credits_remaining": 12 } }
Status
Type
Meaning
400
invalid_request
Missing file or a bad parameter.
401
unauthorized
Missing, wrong or revoked key.
402
insufficient_credits
Not enough credits; nothing was charged.
413
file_too_large, audio_too_long
Over 25 MB, or longer than the endpoint takes.
415
unsupported_audio
The file couldn’t be read as audio.
422
no_audio
The file has no audio in it.
429
rate_limited
Over 60 requests a minute for this key.
5xx
internal_error
Our side. Retry with backoff; you weren’t charged.
Limits & formats
Formats: WAV, MP3, M4A/AAC, FLAC, OGG Vorbis, and the audio track of MP4 and MOV files. Stereo is mixed down to mono.
Size: up to 25 MB per request.
Length: up to 30 minutes for /v1/detect, 5 minutes for /v1/protect.
Rate: 60 requests a minute per key. Need more? Ask us.
Billing: per started second of audio, at least 1 second. Failed requests are free.
Privacy
Audio is decoded and processed in memory, then discarded. We never store it, listen to it, or train on it. For each request we keep only its kind, length, cost and, for detection, the verdict, so you can see your usage; that’s deleted after 90 days.
Your first 1,000 credits are on us.
Sign in with your email, create a key, and make your first call in a minute.