Skip to content
Sign in

/api

Live · self-serve keys

Audio analysis as an API.

Most teams script ffmpeg for loudness checks, or ship audio to a cloud they don’t control. AudioLab puts loudness, voice quality, and signal analysis behind one key, and it can run right in the browser, so the audio never has to leave the user’s device.

Drop your own file in the playground below and see the exact JSON response in seconds. No signup, nothing uploaded.

One key, three labs Runs client-side EU-hosted Checked against EBU Tech 3341
01 Why this, not the usual options

The same job, three ways. The difference is who hosts the audio, how many tools you wire together, and who maintains it.

the old way

Scripting ffmpeg yourself

Free, but you build and babysit the pipeline. It only does loudness, there is no voice or signal layer, and it lives in your infra.

the old way

A cloud audio API

Capable, but every file is uploaded to a server you do not control, usually US-hosted, and most vendors do exactly one thing.

the smart path

AudioLab

One key for loudness, voice and signal, EU-hosted, with the DSP checked against the EBU Tech 3341/3342 test cases and every case published on this page. The same engine also powers the in-browser labs, which analyse on your device and upload nothing — those need no key at all.

02 What you actually get back

Concrete numbers, not vibes. One file in, structured JSON out. Pick the lab that fits the problem.

MixLab

loudness + dynamics

Integrated LUFS, true-peak, loudness range, crest factor, stereo correlation, and a tonal-balance spectrum.

Know if a track hits −14 LUFS, clips, or has a boomy low-end, before it ships.

VoiceLab

speech quality

Speech/silence ratio, pacing, signal-to-noise, room echo, sibilance and clipping risk.

Catch a noisy, echoey, or clipped voice take automatically.

SignalLab

index + tags

Content type, tags, clipping and silence regions, brightness and dynamics buckets, file metadata.

Tag and triage a whole library: what is it, is it clean, where is the silence.

03 Built for teams who ship audio
Podcast & post platforms

LUFS-QC every episode before publish, without uploading unreleased audio.

Voice-AI teams

Loudness and clarity QC on generated speech, right in your pipeline.

Plugin & audio-software devs

Embed analysis without building or hosting the DSP yourself.

Mastering & distribution

Show creators their loudness and dynamics before they submit.

04 Loudness, measured against the standard

Don’t take the loudness numbers on faith. Here is the engine run against the canonical EBU Tech 3341/3342 and ITU-R BS.1770-4 reference signals, checked against the standard’s own tolerances. The signals are the standard’s own, not ours — you can synthesise them and hold any meter to the same expected values. Every case we run is below, including the one that falls outside tolerance.

5/5 compliance checks pass
EBU Tech 3341 / 3342 · ITU-R BS.1770-4 48 kHz · 2026-08-21

Extended observations

We measure what we claim. Per-task accuracy (scene, pitch, beat) and server-side research benchmarks aren’t claimed until the same kind of harness backs them.

05 See it on your own file

This is the API, running client-side. Drop a file, switch endpoints, and copy a request that returns the exact JSON you see. Nothing uploads; your file stays in the browser.

api · playground · runs in your browser

This playground runs the identical engine client-side, so the response below is exactly what the hosted API returns. Your file never leaves the browser. The hosted API is live with self-serve keys at audiolab.tools/v1/*.

Request
curl https://audiolab.tools/v1/mixlab/analyze \
  -H "Authorization: Bearer $AUDIOLAB_KEY" \
  -F file=@track.wav

Loudness, dynamics, spectrum

Response
Drop a file to see the responsematches public/openapi.yaml · /v1/mixlab/analyze
06 Your first call

From nothing to a real response in under two minutes. No account required to see the shape.

curl https://audiolab.tools/v1/mixlab/analyze \
  -H "Authorization: Bearer $AUDIOLAB_KEY" \
  -F file=@track.wav
07 Endpoints

Each takes a multipart audio file and returns structured JSON. Full schemas live in the OpenAPI spec.

Limits

What the API enforces today. These are ceilings, not quotas: see pricing for calls and data per month.

File sent directly in the request body150 MB
File via a signed upload URL, or read back by objectPath50 MB
Longest track for the analysis routes, at 48 kHz stereo. Lower sample rates and mono fit longer. The loudness routes (mixlab/*) do handle long files.~7.7 min
Items in one /v1/batch call20
08 Response schema

Every field each endpoint returns, mirrored 1:1 from the engine types via the OpenAPI contract, so this reference can’t drift from what the API actually sends.

MixLab · analyze POST /v1/mixlab/analyze 28 fields
Field Type Notes
durationSec* number
sampleRate* integer
channels* integer
integratedLufs* number Integrated loudness (LUFS), BS.1770-4.
reportUrl string Shareable numbers-only report page for this analysis (https://audiolab.tools/r/<id>). Present on every metered analysis response.
shortTermLufsMax number
loudnessRange number LRA (LU).
truePeakDb* number True peak (dBTP).
peakDb number
rmsDb number
crestFactorDb number
stereoWidth number
stereoCorrelation number
monoCompatible boolean
spectralCentroidHz number
spectralRolloffHz number
spectralFlatness number
bandEnergy Band
harshness.score number
harshness.label string Low | Medium | High
harshness.band string
muddiness.score number
muddiness.label string Low | Medium | High
spectrum.freqs number[]
spectrum.mags number[]
waveform number[] Downsampled waveform peaks.
shortTermLufs number[]
fileName string
MixLab · check-target POST /v1/mixlab/check-target 10 fields
Field Type Notes
pass* boolean True only if both LUFS within ±0.5 LU of target and true-peak ≤ target+0.5 dB.
target.lufs number Target integrated loudness (LUFS).
target.tp number Target maximum true-peak (dBTP).
target.label string Human-readable target name (e.g. "Spotify").
measurements.integratedLufs number
measurements.truePeakDb number
measurements.lufsDelta number measured - target.
measurements.tpDelta number measured - target.
issues* object[]
ffmpegFix string ffmpeg loudnorm one-liner to fix when failing; null when passing.
MixLab · timeseries POST /v1/mixlab/timeseries 8 fields
Field Type Notes
durationSec* number
sampleRate integer
loudnessOverTime* SeriesArray
waveformOverTime* SeriesArray
summary.integratedLufs number
summary.shortTermLufsMax number
summary.loudnessRange number
summary.truePeakDb number
MixLab · spectrum POST /v1/mixlab/spectrum 8 fields
Field Type Notes
sampleRate* integer
spectralCentroidHz number
spectralRolloffHz number
spectralFlatness number
bandEnergy* Band
spectrum.freqs number[]
spectrum.mags number[]
spectrum.count integer
VoiceLab · qa POST /v1/voicelab/qa 23 fields
Field Type Notes
durationSec* number
sampleRate* integer
speechSec number
silenceSec number
speechRatio* number
segments VoiceSegment[]
estimatedSyllableRate number
speakingRateLabel string Slow | Normal | Fast | Variable
longSilences number
peakDb number
averageSpeechRms number
averageSpeechRmsDb number
noiseFloorDb number
signalToNoiseDb number
clipping.count integer
clipping.severity string None | Low | Medium | High
brightness number
roomEchoScore number
roomEchoLabel string Dry | Tight | Live | Reverberant
sibilanceRisk string Low | Medium | High
rmsEnvelope number[]
voicedMask boolean[]
fileName string
VoiceLab · segments POST /v1/voicelab/segments 6 fields
Field Type Notes
durationSec* number
speechSec number
silenceSec number
speechRatio* number 0..1 fraction of audio that is voiced.
longSilences number Count of unusually long silences (e.g. potential dead air).
segments* SpeechSegment[]
SignalLab · index POST /v1/signallab 25 fields
Field Type Notes
fileName* string
fileSizeKb number
format string
durationSec* number
sampleRate* integer
channels* integer
bitDepthGuess string
peakDb number
rmsDb number
noiseFloorDb number
dcOffset number
hasClipping boolean
clippingRegions integer
silenceRegions integer
silenceTotalSec number
contentTypeGuess* string voice | music | mixed | noise | silence
contentConfidence number
brightnessBucket string Dark | Balanced | Bright | Very bright
dynamicsBucket string Flat | Compressed | Modern | Dynamic
dominantBand string
monophonicProbability number
regions TimelineRegion[]
energyEnvelope number[]
centroidEnvelope number[]
tags string[]
Shared types Band · VoiceSegment · TimelineRegion · SeriesArray · SpeechSegment
Band
sub number
bass number
lowMid number
mid number
highMid number
presence number
air number
VoiceSegment
startSec number
endSec number
meanRms number
TimelineRegion
startSec number
endSec number
kind string voice | silence | music | noise | clipping
confidence number
SeriesArray
intervalSec number Seconds between samples.
count integer Number of samples.
samples number[]
unit string Unit of measurement (e.g. "LUFS", "peak (-1..1)").
SpeechSegment
startSec number
endSec number
durationSec number
meanRmsDb number Mean RMS of the segment in dBFS.

* required · generated from the OpenAPI spec (public/openapi.yaml)

09 Authentication

The hosted API uses a bearer key in the Authorization header, generated from your dashboard. Keys are self-serve and live, with a free tier of 1,000 calls and 2 GB a month, no card. The playground below still needs no key at all: it runs the engine in your browser and your audio never leaves the device.

Authorization: Bearer al_live_xxx

issued from the dashboard · preview

10 Use it from an AI agent

AudioLab ships an MCP server + a Claude Code plugin so any AI agent (Claude Code, Claude Desktop, Cursor) can analyze audio (ten tools, one install), plus AI-native docs so an agent can read the engine without scraping marketing.

Building on audio? Get a key.

The hosted API is live at audiolab.tools/v1/*. Self-serve keys with a free tier, live now. Add it to Claude or any agent in one page, or call the REST API directly. Building something bigger? Email partners@audiolab.tools.