Overview
Base URL: https://lufsready.com/api/v1. All responses are JSON. Jobs are processed asynchronously: you upload a file, then poll the job until its status is done or failed, then download the master. Jobs use minutes from your balance exactly like files uploaded in the dashboard, and failed jobs are refunded automatically.
Authentication
Create a key in Settings → API keys. Keys look like lr_live_ followed by 40 hexadecimal characters and are shown once. Send the key as a bearer token:
Authorization: Bearer lr_live_0123456789abcdef0123456789abcdef01234567
Keep keys secret and on your server; never put them in browser code. Revoke a key at any time from Settings.
Create a job
POST /api/v1/jobs. Send the file as the raw request body (not multipart) and pass the file name and settings as query parameters.
curl -X POST "https://lufsready.com/api/v1/jobs?name=episode-42.wav&preset=podcast" \
-H "Authorization: Bearer $LUFSREADY_KEY" \
-H "Content-Type: application/octet-stream" \
--data-binary @episode-42.wav
Response 201 Created:
{
"job": {
"id": "job_4f1c0e9a2b7d3c5e8a1f",
"status": "queued",
"file": "episode-42.wav",
"preset": "podcast",
"durationSeconds": 2530.4,
"minutesCharged": 43,
"filesExpireAt": "2026-10-30T12:00:00.000Z"
},
"balance": 557
}
The name parameter is required and its extension must be one of: wav, mp3, m4a, aac, flac, ogg, oga, opus, aif, aiff, wma, webm, mp4, mov, mkv.
Job status and report
GET /api/v1/jobs/{id} returns the job. While processing, status is queued or processing and phase shows the current stage. When status is done, report contains the measurements of the original and the delivered file, every check with its target and result, and the processing steps. Poll every few seconds.
curl "https://lufsready.com/api/v1/jobs/job_4f1c0e9a2b7d3c5e8a1f" -H "Authorization: Bearer $LUFSREADY_KEY"
{
"job": {
"id": "job_4f1c0e9a2b7d3c5e8a1f",
"status": "done",
"report": {
"passed": true,
"target": { "metric": "lufs", "value": -16, "tolerance": 1 },
"input": { "integrated": -27.4, "truePeak": -0.2, "lra": 14.8, "rms": -31.0, "noiseFloor": -58.1 },
"output": { "integrated": -16.1, "truePeak": -1.6, "lra": 6.9, "rms": -20.3, "format": "mp3", "bitrate": 192 },
"checks": [
{ "id": "integrated", "target": "-16 LUFS (±1)", "value": -16.1, "pass": true },
{ "id": "truePeak", "target": "≤ -1 dBTP", "value": -1.6, "pass": true }
],
"steps": ["Rumble filter (80 Hz high-pass) …", "…"]
}
}
}
The values above illustrate the format; your report contains the values measured on your file.
Download the master
GET /api/v1/jobs/{id}/download streams the mastered file (only when status is done and files have not expired).
curl -L -o episode-42-mastered.mp3 "https://lufsready.com/api/v1/jobs/job_4f1c0e9a2b7d3c5e8a1f/download" \
-H "Authorization: Bearer $LUFSREADY_KEY"
Files are deleted 7 days after upload. Download them promptly.
List and delete jobs
GET /api/v1/jobs: your 50 most recent jobs.DELETE /api/v1/jobs/{id}: deletes the job's files now. A queued job is cancelled and its minutes are returned.
Account balance
GET /api/v1/me returns your email and minute balance.
{ "email": "you@example.com", "balanceMinutes": 557 }
Presets and options
GET /api/v1/presets lists presets and their defaults. Query parameters accepted by POST /api/v1/jobs:
| Parameter | Values | Default |
|---|---|---|
name | Original file name with extension (required) | — |
preset | podcast, podcast-mono, acx, video, ebu-r128, atsc-a85, custom | required |
targetLufs, truePeak | Custom preset only: -30 to -9 LUFS; -6 to -0.1 dBTP | — |
noise | off, light, medium, strong | Preset default |
rumble, deess, level, gate | 1 or 0 | Preset default |
format | mp3, m4a, wav, flac (ACX: mp3 only) | Preset default |
bitrate | MP3: 96, 128, 160, 192, 256, 320; M4A: 128, 160, 192, 256 (kbps) | Preset default |
bitDepth, sampleRate | WAV/FLAC: 16 or 24; 44100 or 48000 | 24 / preset |
channels | keep, mono, stereo | Preset default |
notify | 1 to receive an email when the job finishes | 0 |
Errors and limits
Errors return a non-2xx status with { "error": "message" }.
| Status | Meaning |
|---|---|
| 400 | Invalid parameter |
| 401 | Missing or invalid API key |
| 402 | Not enough minutes for this file |
| 403 | API access not included in your packs |
| 404 | Job not found (or not yours) |
| 410 | Files expired and were deleted |
| 413 | File larger than 95 MB |
| 415 | Unsupported file type |
| 422 | File unreadable, has no audio, or is shorter than 3 seconds / longer than 4 hours |
| 429 | Too many requests, or 5 jobs already in progress |
Need help integrating? Contact support.