SonoVault is in open beta — signups are live. Get your free API key →
Audio recognition

Identify any track
from audio

Send a clip — or a fingerprint — and get the matching track back with ISRC, artist, release, genre, and cross-platform IDs. One REST call, across 90M+ tracks.

1

Send audio or a fingerprint

POST a short audio clip as raw bytes and we fingerprint it for you — or generate a Chromaprint fingerprint locally and send the integer array as JSON.

2

We match the acoustic fingerprint

Your clip is matched against an acoustic index spanning 90M+ tracks — robust to bitrate, format, and encoding differences.

3

Get the track + full metadata

You get back the matching catalog track — same shape as a search result, with ISRC, release, label, genre, and platform IDs ready to use.

Server-side

The simplest call: send the raw audio file and we do the fingerprinting. Keep your API key on the server.

bash
# Send the raw audio file — we fingerprint it for you
curl -X POST https://api.sonovault.now/v1/tracks/identify \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/octet-stream" \
--data-binary @song.mp3
javascript
import { readFile } from "node:fs/promises";
const audio = await readFile("song.mp3");
const res = await fetch("https://api.sonovault.now/v1/tracks/identify", {
method: "POST",
headers: {
"x-api-key": process.env.SONOVAULT_API_KEY, // keep your key server-side
"Content-Type": "application/octet-stream",
},
body: audio,
});
const { matched, results } = await res.json();
if (matched) {
const track = results[0]; // results are plain tracks
console.log(`${track.artists[0].name}${track.title} (${track.isrc})`);
}

Prefer not to upload audio? Fingerprint locally with Chromaprint's fpcalc and send the integer array — ~1 KB instead of a file.

bash
# Or fingerprint locally with Chromaprint's fpcalc and send the raw int array
fpcalc -raw -length 30 song.mp3 # -> FINGERPRINT=1,2,3,...
curl -X POST https://api.sonovault.now/v1/tracks/identify \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fingerprint":[1,2,3,4,5]}'

In the browser

From a web app, let the user pick a file and send the bytes to your own backend, which adds the API key and forwards them to SonoVault. The browser never sees your key.

markup
<input type="file" accept="audio/*" id="audio" />
<script type="module">
document.getElementById("audio").addEventListener("change", async (e) => {
const file = e.target.files[0];
if (!file) return;
// POST the raw bytes to YOUR backend — never put your API key in the
// browser. Your backend forwards it to SonoVault (see the proxy below).
const res = await fetch("/api/identify", {
method: "POST",
headers: { "Content-Type": "application/octet-stream" },
body: file,
});
const { matched, results } = await res.json();
document.title = matched
? `${results[0].artists[0].name}${results[0].title}`
: "No match";
});
</script>
javascript
// Your backend route — adds the secret key and forwards the audio.
export async function POST(req) {
const audio = await req.arrayBuffer();
const res = await fetch("https://api.sonovault.now/v1/tracks/identify", {
method: "POST",
headers: {
"x-api-key": process.env.SONOVAULT_API_KEY,
"Content-Type": "application/octet-stream",
},
body: audio,
});
return new Response(res.body, { headers: { "Content-Type": "application/json" } });
}

The response

results is a ranked array of plain track objects — the same shape returned by track search — best match first. matched is false with an empty array when nothing matches.

json
{
"matched": true,
"results": [
{
"id": 121217599,
"title": "Harder, Better, Faster, Stronger",
"artists": [{ "id": 9001, "name": "Daft Punk", "is_primary": true }],
"releases": [
{ "id": 4242, "title": "Discovery", "release_date": "2001-03-12" }
],
"isrc": "GBDUW0000059",
"duration": 224,
"genre": ["Electronic"],
"subgenre": ["French House"]
}
],
"credits_charged": 10
}
No code needed

Identify tracks right in your dashboard

Logged-in users get an Identify tool in the dashboard — drop in an audio file and get the matching track back instantly. It runs the same recognition as the API, billed against your account's default key.

Audio recognition is a paid-plan feature. A fingerprint lookup is 10 credits; a raw-audio upload is 10 + 1 credit per MB uploaded. You're billed on what you send, so a short clip is cheapest. See pricing and the full API reference.

Frequently asked questions

You send SonoVault either a short audio clip (raw bytes) or a Chromaprint fingerprint you generated locally with fpcalc. We match it against an acoustic fingerprint index built over 90M+ tracks and return the best-matching catalog track with its full metadata — ISRC, artist credits, release, label, genre, duration, and cross-platform IDs. It's one REST call to POST /v1/tracks/identify.
No. Send the raw audio file (Content-Type: application/octet-stream) and we run the fingerprinting server-side. If you'd rather not upload audio — or want to save bandwidth — run Chromaprint's fpcalc locally and send the integer fingerprint array as JSON instead. Both hit the same endpoint and return the same shape.
A ~15–20 second clip is the sweet spot — it's as accurate as the whole track. About 10 seconds is the practical minimum. Sending a short clip instead of a full file also keeps your credit cost and bandwidth down, since audio uploads are billed per megabyte.
Anything ffmpeg can decode — mp3, flac, wav, m4a/mp4 (AAC), ogg, opus, aiff, and more. The format is detected from the file contents, so the extension and Content-Type don't matter for the raw-audio path.
A fingerprint lookup is 10 credits. A raw-audio upload is 10 + 1 credit per megabyte uploaded (so a ~3 MB clip is ~13 credits). You're billed on what you send, not the part we analyse — another reason to send a short clip. Audio recognition is a paid-plan feature. See the pricing page for plan details.
No. Uploaded audio is fingerprinted and discarded in the same request — it isn't written to disk or retained. Only the fingerprint is used for matching.
Yes. Logged-in users get an Identify tool in the dashboard — drop in an audio file and get the matching track back, no code required. It runs the exact same recognition as the API, billed against your account's default key.