Beta founding offer: lock in 50% off any plan for life, before the beta ends. Claim founding pricing →
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, in the 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, the full API reference, or what you can build with audio recognition.

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.
Cost tracks the megabytes you upload, which is duration times quality. On duration, send the whole track: the part that matches our reference can sit anywhere, so a short clip is cheaper but can miss. On quality, a 320 kbps whole track gives the best result, 128 kbps is the best value, and lossless is no better than 320 while costing more. To shrink the upload, downsample to 16 kHz mono and no lower; downsampling saves credits but costs some accuracy. About 10 seconds is the practical minimum.
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, which is 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.