Developer API: analyze and master audio over HTTP
Echoteka's analysis, AI-artifact cleanup and mastering engine is available as plain HTTP endpoints. Send a file, get a job id, poll the status and download the result. The endpoints below need no account and no key.
API keys (the X-API-Key header) are not available yet. Nothing on this page needs one.
Endpoints you can call without a key
Base address: https://echoteka.ai. Every endpoint below is public and anonymous.
| Endpoint | What it does | Cost |
|---|---|---|
POST /api/v2/analyze | Measures a file: integrated LUFS, peak, duration, sample rate and stereo correlation. With extended=true it also returns the spectrum, a loudness timeline and vectorscope points. | Free |
POST /api/v2/clean | Removes the marks AI generators leave in the audio, without mastering. Loudness and tone stay as they are. Returns a job, like mastering. | Free within a small quota |
POST /api/v2/multipreview | Masters a 24-second fragment from the middle of the track in 2 to 6 styles, so you can compare them by ear. Returns mp3 previews. | Free, 6 per day |
POST /api/v2/master | Masters one track and returns a job_id. | One free full master a day, then credits |
POST /api/v2/batch | Masters up to 10 files in one request with the same settings. album_mode=1 keeps the loudness balance between tracks. | One free run, then one credit per file |
GET /api/master/status/{job_id} | Progress from 0 to 100 and, once done, the loudness and true-peak figures. | Free |
GET /api/master/result/{job_id} | Downloads the finished file after the status reports done. | Free |
GET /api/v2/limits | What this caller can do right now: free masters left and when they reset, credit balance, upload cap. | Free |
GET /api/presets | Target loudness in LUFS for each platform preset, as a map from name to value. | Free |
Paid credit packs are on sale. The endpoints above are the only public ones.
Quick start with curl
Measure a track
The analysis answers at once, with no job to poll.
curl -X POST https://echoteka.ai/api/v2/analyze \
-F "file=@track.wav"
Master a track
Mastering starts a job. Poll its status until it reports done, then download the file.
curl -X POST https://echoteka.ai/api/v2/master \
-F "file=@track.wav" \
-F "style=standard" \
-F "target_lufs=-14" \
-F "out_format=wav"
# -> {"job_id": "..."}
curl https://echoteka.ai/api/master/status/JOB_ID
curl -o master.wav https://echoteka.ai/api/master/result/JOB_ID
Python
import time
import requests
API = "https://echoteka.ai"
with open("track.wav", "rb") as f:
r = requests.post(f"{API}/api/v2/master", files={"file": f},
data={"style": "standard", "target_lufs": -14, "out_format": "wav"})
r.raise_for_status()
job_id = r.json()["job_id"]
while True:
s = requests.get(f"{API}/api/master/status/{job_id}").json()
if s.get("error"):
raise RuntimeError(s["error"])
if s.get("status") == "done":
break
time.sleep(3)
audio = requests.get(f"{API}/api/master/result/{job_id}")
with open("master.wav", "wb") as out:
out.write(audio.content)
print(s.get("after_lufs"), s.get("true_peak_db"))
Parameters
style: one of 24 names: standard, edm, hiphop, house_basic, classical, podcast, lofi, dry_vocal, trap, pop, rock, metal, rnb, country, afrobeats, kpop, jazz, voice, audiobook, warm, bright, bass, unlimiter, big_room. An unknown name is replaced bystandardwithout an error, so check the spelling.target_lufs: integrated loudness target in LUFS, for example -14 for streaming or -9 for club. The platform values are listed at/api/presets.out_format:wav(default),wav24,mp3,flac,opusoraac.files(batch): send each track as a repeatedfilesfield. The free tier takes up to 10 files per request.album_mode(batch):1keeps the relative loudness of the tracks.styles(multipreview): a JSON array of 2 to 6 style names.extended(analyze):trueadds the spectrum, the loudness timeline and the vectorscope points.
Send WAV or MP3 for the safest result. The server checks the contents of the file, not only its name.
What the status returns
While a job runs, GET /api/master/status/{job_id} returns progress (0 to 100) and a message. When it is done, the response also carries before_lufs, after_lufs, true_peak_db, lra, target_lufs and duration_sec. An error field explains a failed job.
Limits
Call GET /api/v2/limits before you send a job. It tells you how many free masters are left, when the count resets and what the upload cap is, so you do not hit a limit after the upload. The terms are on the terms page.
Results are not kept for long. Download the file as soon as the job is done.
Use it from an AI assistant
The same engine is wrapped as nine MCP tools: get_service_info, list_presets, check_limits, analyze_track, clean_ai_trace, preview_styles, master_track, batch_master and get_job. The connection steps for Claude Code, Claude Desktop, Cursor and Codex are on the MCP page.
Questions
Do I need an API key?
No, not for the endpoints above. The X-API-Key header is not available yet, and we have no date for it.
Is my audio used to train models?
No. Echoteka downloads the file only to process it. See the privacy policy for the details.
Where do I get the facts an assistant needs?
The short fact sheet for language models is at /llms.txt.
Who do I contact?
Write to support@echoteka.ai.