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 and get the matching track back with ISRC, artist, release, genre, and cross-platform IDs. One REST call, across 93M+ tracks.

1

Send the audio

POST the track as raw bytes, up to 100 MB in any common format, and we do the fingerprinting. One header, one body, no client-side tooling.

2

We match the acoustic fingerprint

Your clip is matched against an acoustic index spanning 93M+ 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})`);
}

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, priced at 10 credits + 1 credit per MB uploaded. You're billed on what you send, so a leaner upload is cheaper. See pricing, the full API reference, or what you can build with audio recognition.

Frequently asked questions

You send Sonovault the audio as raw bytes. We match it against an acoustic fingerprint index built over 93M+ 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, and you can't. Send the raw audio file (Content-Type: application/octet-stream) and we run the fingerprinting server-side. There is no client-side-fingerprint body; a JSON request returns 415. Recognition accuracy comes from machinery that needs the audio itself: a second independent matcher, cross-window voting, and a tempo cross-check. A compact one-way fingerprint cannot carry any of that, so we retired that route rather than serve two contracts with different answers.
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.
10 credits plus 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 keep the upload lean. 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.