Analyze audio mixes programmatically. Free tier: 3 analyses per IP. Pro tier: unlimited.
curl -X POST https://mixdiagnose.com/api/analyze \
-F "file=@my-mix.wav" \
-H "Accept: application/json"
Upload an audio file and get a full mix analysis with Mix Score, LUFS, frequency balance, stereo width, and severity-graded recommendations.
| Parameter | Type | Required | Description |
|---|---|---|---|
file | multipart/form-data | Yes | Audio file — .wav, .mp3, .flac, .m4a, .aac, .ogg, .aiff, .au, .wma, or a video file (.mp4, .mov, .avi, .webm, .mkv). Max 50 MB. |
genre | query string | No | Force a genre profile (e.g. hiphop, rock, electronic). Omit to auto-detect. |
access_token | query string | No | A logged-in account token. Subscribers bypass the free limit. |
{
"session_id": "a1b2c3d4-...",
"analysis": {
"mix_score": 72,
"grade": "B",
"score_label": "Almost there",
"loudness": {
"lufs_integrated": -14.2,
"true_peak_dB": -1.3,
"crest_factor": 7.5
},
"frequency_balance": {
"sub_bass": "good",
"low_mid": "bad",
"midrange": "warn",
"high_mid": "good",
"high": "good",
"air": "good"
},
"stereo_width": {
"mean": 62.5,
"assessment": "moderate"
}
},
"severity_map": {
"Critical": 1,
"Moderate": 2,
"Minor": 3,
"Ideal": 6
},
"recommendations": [
{
"severity": "Critical",
"issue": "Low-mid buildup at 300 Hz",
"fix": "Cut 2-3 dB at 300 Hz on the mix bus or reduce the offending tracks"
}
],
"share_url": "/r/abc12345",
"report_card_url": "/api/report-card/session_id"
}
Retrieve a previously shared analysis as JSON.
curl https://mixdiagnose.com/api/shared/abc12345
Serve a shared analysis as an HTML page (for sharing links).
Create a shareable short URL for an analysis. Awards 3 bonus analyses to free users.
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id | string | Yes | Session ID from analyze response |
import requests
# Analyze a mix
with open("my-mix.wav", "rb") as f:
response = requests.post(
"https://mixdiagnose.com/api/analyze",
files={"file": ("my-mix.wav", f, "audio/wav")},
)
data = response.json()
analysis = data["analysis"]
print(f"Mix Score: {analysis['mix_score']}/100 (Grade {analysis['grade']})")
print(f"LUFS: {analysis['loudness']['lufs_integrated']}")
print(f"True Peak: {analysis['loudness']['true_peak_dBTP']} dBTP")
for rec in data.get("recommendations", []):
print(f"[{rec['severity']}] {rec['issue']}")
print(f" → {rec.get('fix_label', '')}")
const formData = new FormData();
formData.append("file", fileInput.files[0]);
const response = await fetch("https://mixdiagnose.com/api/analyze", {
method: "POST",
body: formData,
});
const data = await response.json();
console.log(`Mix Score: ${data.analysis.mix_score}/100`);
console.log(`Grade: ${data.analysis.grade}`);
There is no packaged CLI yet — a two-line script is the honest equivalent, and it works today:
for f in *.wav; do
curl -s -X POST https://mixdiagnose.com/api/analyze -F "file=@$f" \
| python -c "import sys,json; a=json.load(sys.stdin)['analysis']; print(a['mix_score'], a['grade'])"
done
| Tier | Limit | Price |
|---|---|---|
| Free / anonymous | 10 analyses per IP, per month | $0 |
| Starter Pack | 10 analyses, one-time | $5 |
| Producer | 50 analyses / month | $19/mo |
| Pro | Unlimited | $49/mo |
WAV, MP3, FLAC, M4A, AAC, OGG, AIFF, AU, WMA — plus video files, from which the audio track is extracted. For best results use WAV (16-bit or 24-bit). Max 50 MB.
The Mix Score (0-100) is calculated by scoring 12 metrics across frequency balance, loudness, dynamics, and stereo width. Each metric is scored as good (100), warn (60), or bad (25). The final score is the average minus 8 points per Critical issue.
| Grade | Score Range | Label |
|---|---|---|
| A | 85-100 | Release-ready |
| B | 70-84 | Almost there |
| C | 55-69 | Needs work |
| D | 40-54 | Major issues |
| F | 0-39 | Critical problems |
access_token bypasses the limit.