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 Verified against ffmpeg
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. It can run client-side, so the audio can stay on the user device. EU-hosted, DSP verified against reference tools.

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. Reproduce it: node scripts/loudness-benchmark.mjs.

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

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.

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 29 fields
Field Type Notes
durationSec* number
sampleRate* integer
channels* integer
integratedLufs* number Integrated loudness (LUFS), BS.1770-4.
shortTermLufsMax number
loudnessRange number LRA (LU).
truePeakDb* number True peak (dBTP).
peakDb number
rmsDb number
crestFactorDb number
stereoWidth number
midSideRatio number
stereoCorrelation number
monoCompatible boolean
spectralCentroidHz number
spectralRolloffHz number
spectralFlatness number
lowEndDensity 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 25 fields
Field Type Notes
durationSec* number
sampleRate* integer
speechSec number
silenceSec number
speechRatio* number
segments VoiceSegment[]
estimatedSyllableRate number
speakingRateLabel string Slow | Normal | Fast | Variable
pacingVariance number
longSilences number
burstiness 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/index 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 will use a bearer key in the Authorization header, issued from your dashboard. Keys and billing open once VAT registration clears. Until then the playground needs no key, and your audio never leaves the browser.

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 (eight 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.