Async by default
Job-based analysis matches how audio processing really behaves, which makes your integration and UX more predictable.
Async-first audio analysis API
BPM, key, danceability, valence, LUFS, mood tags, genre suggestions, and section timing. Built around the actual Beatlyze flow: submit audio, get a job ID, poll or receive a webhook.
Submit
`POST /v1/analyze/upload` or `POST /v1/analyze/url`
Queue
Receive `job_id` with `status: "processing"`
Retrieve
Poll result endpoint or accept a webhook callback
{
"job_id": "8b7a5c17-b1a1-42fd-aab8-51d0c4ff3d2a",
"status": "completed",
"result": {
"bpm": 127.8,
"bpm_confidence": 0.94,
"key": "A",
"scale": "minor",
"key_notation": "Am",
"key_confidence": 0.88,
"energy": 0.86,
"danceability": 0.91,
"valence": 0.44,
"loudness_lufs": -8.1,
"mood_tags": ["energetic", "dark"],
"genre_suggestions": ["techno", "house"],
"duration_seconds": 247.3,
"time_signature": 4
}
}
Why teams switch
Job-based analysis matches how audio processing really behaves, which makes your integration and UX more predictable.
Clear auth, quickstart examples, structured JSON, and a machine-readable contract lower integration time.
Useful if you need a practical replacement path for missing Spotify audio features without OAuth or user-token flows.
Request flow
The examples below use the headers, routes, and async lifecycle your backend actually exposes today.
curl -X POST https://api.beatlyze.dev/v1/analyze/upload \
-H "X-API-Key: bz_your_api_key" \
-F "file=@track.mp3"
# -> { "job_id": "...", "status": "processing" }
curl https://api.beatlyze.dev/v1/analysis/JOB_ID \
-H "X-API-Key: bz_your_api_key"
import requests
import time
with open("track.mp3", "rb") as handle:
job = requests.post(
"https://api.beatlyze.dev/v1/analyze/upload",
headers={"X-API-Key": "bz_your_api_key"},
files={"file": handle},
).json()
while True:
res = requests.get(
f"https://api.beatlyze.dev/v1/analysis/{job['job_id']}",
headers={"X-API-Key": "bz_your_api_key"},
).json()
if res["status"] == "completed":
break
time.sleep(1)
import fs from "node:fs";
import FormData from "form-data";
import fetch from "node-fetch";
const form = new FormData();
form.append("file", fs.createReadStream("track.mp3"));
const job = await fetch(
"https://api.beatlyze.dev/v1/analyze/upload",
{
method: "POST",
headers: { "X-API-Key": "bz_your_api_key" },
body: form,
}
).then((r) => r.json());
Live onboarding
This is a real registration flow for the current API. Enter an email, submit `POST /v1/auth/register`, and the site will show the raw key once so you can copy it into your app or CLI immediately.
Feature surface
Tempo with confidence scoring for sorting, playlisting, and mix prep.
Useful harmonic metadata, including readable notation like `Am` and confidence.
Normalized behavior signals that help downstream ranking and UX.
Emotional descriptors for search, labeling, recommendation, and discovery.
Useful for normalization-aware workflows and production intelligence.
Top tags for rough categorization without requiring manual review first.
Structural timing with per-section loudness, energy, and key data.
Built-in visibility for monthly usage, limits, and paid-tier meter usage.
Use cases
Built for teams who need audio features in product workflows, but do not want to maintain their own analysis pipeline.
Enrich tracks with tempo, key, loudness, and mood for search, filtering, and metadata pipelines.
Power harmonic prep, energy sorting, and section-aware workflows without shipping your own DSP stack.
Use structured audio signals to improve ranking, clustering, playlist generation, and editorial tooling.
Plans
These tiers line up with the limits already modeled in the backend: free, starter, and pro.
Free
€0 / month
Starter
€19 / month
Pro
€49 / month
Start building
Read the docs, open the full reference, or create a key and start integrating right away.