Skip to content
@AudDMusic

AudD

AudD provides music recognition services with API

AudD

AudD — Music Recognition API

Identify songs from short audio clips, hours-long broadcast recordings, and live audio streams.

Get an API token · Full docs · Support


Quick Start

curl https://api.audd.io/ \
-F url='https://audd.tech/example.mp3' \
-F api_token='your-api-token'

Get your API token at dashboard.audd.io. The string "test" works for hello-worlds (capped at 10 requests/day).

The API is one HTTP POST and works from any HTTP client. Official SDKs are available for the 11 languages below — they add typed results, retries, and longpoll consumers, but they aren't required.

Available SDKs:Python · Node / TypeScript · Go · Rust · PHP · Swift · Kotlin · C# / .NET · Java · C · C++


API Endpoints

EndpointBest forLimitsResponse time
api.audd.io/Single short clip (Shazam-style)Short audio clip, max 10 MB~0.1–1.5s
enterprise.audd.io/Hours-long mixes, broadcast recordings, podcastsUnlimited lengthSeconds to minutes
api.audd.io/addStream/Live broadcasts, radio, Twitch, YouTube liveContinuousReal-time

Recognize a Song

Identify a single song from a short audio clip — works like Shazam.

Parameters:

ParameterRequiredDescription
api_tokenYour auth token from the Dashboard
urlone of url / fileURL of the audio file to recognize
fileone of url / fileAudio file via multipart/form-data
returnComma-separated metadata providers: apple_music, spotify, deezer, napster, musicbrainz. AudD identifies the song from your audio and, if matched, attaches metadata from each requested provider.
marketCountry code for Apple Music / Spotify links (default: us)

From a URL

Each language tab shows the raw HTTP form (no SDK), then the official SDK form for the same call.

cURL
curl https://api.audd.io/ \
-F url='https://audd.tech/example.mp3' \
-F return='apple_music,spotify' \
-F api_token='your-api-token'
Python

HTTP, no SDK:

importrequestsr=requests.post("https://api.audd.io/", data={
"url": "https://audd.tech/example.mp3",
"return": "apple_music,spotify",
"api_token": "your-api-token",
}).json()
ifr["status"] =="success"andr["result"]:
s=r["result"]
print(f"{s['artist']}{s['title']}")
print(s["apple_music"]["url"])

With the SDK (github, docs):

pip install audd
fromauddimportAudDaudd=AudD("your-api-token")
result=audd.recognize(
"https://audd.tech/example.mp3",
return_metadata=["apple_music", "spotify"],
)
print(f"{result.artist}{result.title}")
print(result.apple_music.url) # direct Apple Music linkprint(result.spotify.uri) # spotify:track:...
Node / TypeScript

HTTP, no SDK:

constres=awaitfetch("https://api.audd.io/",{method: "POST",body: newURLSearchParams({url: "https://audd.tech/example.mp3",return: "apple_music,spotify",api_token: "your-api-token",}),});const{ status, result }=awaitres.json();if(status==="success"&&result){console.log(`${result.artist}${result.title}`);console.log(result.apple_music.url);}

With the SDK (github, docs):

npm install @audd/sdk
import{AudD}from"@audd/sdk";constaudd=newAudD("your-api-token");constsong=awaitaudd.recognize("https://audd.tech/example.mp3",{returnMetadata: ["apple_music","spotify"],});if(song){console.log(`${song.artist}${song.title}`);console.log(song.appleMusic?.url);console.log(song.spotify?.uri);}
Go

HTTP, no SDK:

import (
"encoding/json""net/http""net/url""strings"
)
resp, _:=http.Post(
"https://api.audd.io/",
"application/x-www-form-urlencoded",
strings.NewReader(url.Values{
"url": {"https://audd.tech/example.mp3"},
"return": {"apple_music,spotify"},
"api_token": {"your-api-token"},
}.Encode()),
)
deferresp.Body.Close()
varbodystruct {
Result*struct {
Artist, TitlestringAppleMusicstruct{ URLstring } `json:"apple_music"`
}
}
json.NewDecoder(resp.Body).Decode(&body)
ifbody.Result!=nil {
fmt.Printf("%s — %s\n%s\n", body.Result.Artist, body.Result.Title, body.Result.AppleMusic.URL)
}

With the SDK (github, docs):

go get github.com/AudDMusic/audd-go
import audd "github.com/AudDMusic/audd-go"client:=audd.NewClient("your-api-token")
deferclient.Close()
result, err:=client.Recognize("https://audd.tech/example.mp3", &audd.RecognizeOptions{
ReturnMetadata: "apple_music,spotify",
})
iferr!=nil { log.Fatal(err) }
fmt.Printf("%s — %s\n", result.Artist, result.Title)
fmt.Println("Apple Music:", result.AppleMusic.URL)
fmt.Println("Spotify URI:", result.Spotify.URI)
Rust

HTTP, no SDK (using reqwest):

let r: serde_json::Value = reqwest::Client::new().post("https://api.audd.io/").form(&[("url","https://audd.tech/example.mp3"),("return","apple_music,spotify"),("api_token","your-api-token"),]).send().await?
.json().await?;ifletSome(s) = r["result"].as_object(){println!("{} — {}", s["artist"], s["title"]);println!("{}", s["apple_music"]["url"]);}

With the SDK (github, docs):

cargo add audd
use audd::{AudD,RecognizeOptions};let audd = AudD::new("your-api-token");let return_metadata = ["apple_music".into(),"spotify".into()];letSome(r) = audd
.recognize_with("https://audd.tech/example.mp3",RecognizeOptions{return_metadata:Some(&return_metadata), ..Default::default()},).await? else{returnOk(())};println!("{} — {}", r.artist, r.title);ifletSome(am) = r.apple_music.as_ref(){println!("Apple Music: {}", am.url.as_deref().unwrap_or(""));}
PHP

HTTP, no SDK:

$r = json_decode(file_get_contents(
'https://api.audd.io/',
false,
stream_context_create(['http' => [
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => http_build_query([
'url' => 'https://audd.tech/example.mp3',
'return' => 'apple_music,spotify',
'api_token' => 'your-api-token',
]),
]])
), true);
if ($r['status'] === 'success' && $r['result']) {
$s = $r['result'];
echo"{$s['artist']}{$s['title']}\n";
echo$s['apple_music']['url'] . "\n";
}

With the SDK (github, docs):

composer require audd/audd
useAudD\AudD;
$audd = newAudD('your-api-token');
$result = $audd->recognize(
'https://audd.tech/example.mp3',
returnMetadata: ['apple_music', 'spotify'],
);
echo"{$result->artist}{$result->title}\n";
echo$result->apple_music->url, "\n";
echo$result->spotify->uri, "\n";
Swift

HTTP, no SDK:

varreq=URLRequest(url:URL(string:"https://api.audd.io/")!)
req.httpMethod ="POST"
req.setValue("application/x-www-form-urlencoded", forHTTPHeaderField:"Content-Type")
req.httpBody ="url=https://audd.tech/example.mp3&return=apple_music,spotify&api_token=your-api-token".data(using:.utf8)let(data, _)=tryawaitURLSession.shared.data(for: req)letjson=tryJSONSerialization.jsonObject(with: data)as?[String:Any]iflet result =json?["result"]as?[String:Any]{print("\(result["artist"]!)\(result["title"]!)")}

With the SDK (github, docs):

// Package.swift: .package(url: "https://github.com/AudDMusic/audd-swift", from: "1.0.0")
import AudD
letaudd=tryAudD(apiToken:"your-api-token")guardlet result =tryawait audd.recognize("https://audd.tech/example.mp3",
returnMetadata:["apple_music","spotify"])else{return}print("\(result.artist ??"?")\(result.title ??"?")")print(result.appleMusic?.url ??"")print(result.spotify?.uri ??"")
Kotlin

HTTP, no SDK (using OkHttp):

val body =FormBody.Builder()
.add("url", "https://audd.tech/example.mp3")
.add("return", "apple_music,spotify")
.add("api_token", "your-api-token")
.build()
val response =OkHttpClient().newCall(
Request.Builder().url("https://api.audd.io/").post(body).build()
).execute()
println(response.body?.string())

With the SDK (github, docs):

// Gradle: implementation("io.audd:audd-kotlin:1.0.0")importio.audd.AudDval audd =AudD("your-api-token")
val result = audd.recognize(
"https://audd.tech/example.mp3",
returnMetadata =listOf("apple_music", "spotify"),
)
result?.let {
println("${it.artist}${it.title}")
println(it.appleMusic?.get("url"))
println(it.spotify?.get("uri"))
}
C# / .NET

HTTP, no SDK:

usingvarhttp=newHttpClient();varcontent=newFormUrlEncodedContent(newDictionary<string,string>{["url"]="https://audd.tech/example.mp3",["return"]="apple_music,spotify",["api_token"]="your-api-token",});varresponse=awaithttp.PostAsync("https://api.audd.io/",content);Console.WriteLine(awaitresponse.Content.ReadAsStringAsync());

With the SDK (github, docs):

dotnet add package AudD
usingAudD;awaitusingvaraudd=newAudD.AudD("your-api-token");varresult=awaitaudd.RecognizeAsync("https://audd.tech/example.mp3",returnMetadata:new[]{"apple_music","spotify"});Console.WriteLine($"{result?.Artist}{result?.Title}");Console.WriteLine(result?.AppleMusic?.Url);Console.WriteLine(result?.Spotify?.Uri);
Java

HTTP, no SDK (java.net.http):

varclient = HttpClient.newHttpClient();
varbody = "url=https://audd.tech/example.mp3&return=apple_music,spotify&api_token=your-api-token";
varreq = HttpRequest.newBuilder(URI.create("https://api.audd.io/"))
.header("Content-Type", "application/x-www-form-urlencoded")
.POST(BodyPublishers.ofString(body))
.build();
System.out.println(client.send(req, BodyHandlers.ofString()).body());

With the SDK (github, docs):

<!-- Maven -->
<dependency><groupId>io.audd</groupId><artifactId>audd</artifactId><version>1.0.0</version></dependency>
importio.audd.AudD;
importio.audd.RecognizeOptions;
varaudd = newAudD("your-api-token");
varr = audd.recognize(
"https://audd.tech/example.mp3",
RecognizeOptions.builder()
.returnMetadata("apple_music", "spotify")
.build()
);
System.out.println(r.artist() + " — " + r.title());
if (r.appleMusic() != null) System.out.println(r.appleMusic().url());
if (r.spotify() != null) System.out.println(r.spotify().uri());
C

HTTP, no SDK (using libcurl):

CURL*c=curl_easy_init();
curl_easy_setopt(c, CURLOPT_URL, "https://api.audd.io/");
curl_easy_setopt(c, CURLOPT_POSTFIELDS,
"url=https://audd.tech/example.mp3&return=apple_music,spotify&api_token=your-api-token");
curl_easy_perform(c); /* response goes to stdout by default */curl_easy_cleanup(c);

With the SDK (github, docs):

# CMakeadd_subdirectory(audd-c)
target_link_libraries(your_appPRIVATEaudd)
#include<audd.h>audd_client_t*client=audd_client_new("your-api-token", NULL);
constchar*want[] = { "apple_music", "spotify", NULL };
audd_recognize_options_topts= { .return_metadata=want };
audd_recognition_t*r=NULL;
if (audd_recognize(client, "https://audd.tech/example.mp3", &opts, &r) ==AUDD_OK&&r) {
printf("%s — %s\n", audd_recognition_artist(r), audd_recognition_title(r));
constaudd_apple_music_t*am=audd_recognition_apple_music(r);
constaudd_spotify_t*sp=audd_recognition_spotify(r);
if (am) printf("Apple Music: %s\n", audd_apple_music_get_url(am));
if (sp) printf("Spotify URI: %s\n", audd_spotify_get_uri(sp));
audd_recognition_free(r);
}
audd_client_free(client);
C++

HTTP, no SDK (using libcurl):

CURL *c = curl_easy_init();
curl_easy_setopt(c, CURLOPT_URL, "https://api.audd.io/");
curl_easy_setopt(c, CURLOPT_POSTFIELDS,
"url=https://audd.tech/example.mp3&return=apple_music,spotify&api_token=your-api-token");
curl_easy_perform(c);
curl_easy_cleanup(c);

With the SDK (github, docs):

# CMakeadd_subdirectory(audd-cpp)
target_link_libraries(your_appPRIVATEaudd::audd)
#include<audd/audd.hpp>
audd::AudD client("your-api-token");
audd::RecognizeOptions opts;
opts.return_metadata = {"apple_music", "spotify"};
if (auto result = client.recognize("https://audd.tech/example.mp3", opts)) {
std::cout << result->artist << "" << result->title << "\n";
if (result->apple_music) std::cout << "Apple Music: " << result->apple_music->url << "\n";
if (result->spotify) std::cout << "Spotify URI: " << result->spotify->uri << "\n";
}

From a local file

Same call, just point at a local path. SDKs that auto-detect treat strings as URL-or-path; SDKs that take an explicit Source accept a file variant.

cURL
curl https://api.audd.io/ \
-F file=@/path/to/audio.mp3 \
-F return='apple_music,spotify' \
-F api_token='your-api-token'
Python

HTTP, no SDK:

importrequestswithopen("audio.mp3", "rb") asf:
r=requests.post("https://api.audd.io/",
data={"return": "apple_music,spotify", "api_token": "your-api-token"},
files={"file": f},
).json()
ifr["status"] =="success"andr["result"]:
s=r["result"]
print(f"{s['artist']}{s['title']}")
print(s["apple_music"]["url"])

With the SDK (github, docs):

result=audd.recognize("audio.mp3", return_metadata=["apple_music", "spotify"])
print(f"{result.artist}{result.title}")
print(result.apple_music.url)
Node / TypeScript

HTTP, no SDK:

import{readFileSync}from"node:fs";constform=newFormData();form.append("file",newBlob([readFileSync("audio.mp3")]));form.append("return","apple_music,spotify");form.append("api_token","your-api-token");constres=awaitfetch("https://api.audd.io/",{method: "POST",body: form});const{ status, result }=awaitres.json();if(status==="success"&&result){console.log(`${result.artist}${result.title}`);console.log(result.apple_music.url);}

With the SDK (github, docs):

constsong=awaitaudd.recognize("./audio.mp3",{returnMetadata: ["apple_music","spotify"],});if(song)console.log(`${song.artist}${song.title}`,song.appleMusic?.url);
Go

HTTP, no SDK:

import (
"bytes""io""mime/multipart""net/http""os"
)
f, _:=os.Open("audio.mp3")
deferf.Close()
varbuf bytes.Bufferw:=multipart.NewWriter(&buf)
fw, _:=w.CreateFormFile("file", "audio.mp3")
io.Copy(fw, f)
w.WriteField("return", "apple_music,spotify")
w.WriteField("api_token", "your-api-token")
w.Close()
resp, _:=http.Post("https://api.audd.io/", w.FormDataContentType(), &buf)
deferresp.Body.Close()
// parse resp.Body as JSON, same shape as the URL example

With the SDK (github, docs):

result, _:=client.Recognize("/path/to/audio.mp3", &audd.RecognizeOptions{
ReturnMetadata: "apple_music,spotify",
})
fmt.Printf("%s — %s\n%s\n", result.Artist, result.Title, result.AppleMusic.URL)
Rust

HTTP, no SDK (reqwest multipart):

let part = reqwest::multipart::Part::file("audio.mp3").await?;let form = reqwest::multipart::Form::new().part("file", part).text("return","apple_music,spotify").text("api_token","your-api-token");let r: serde_json::Value = reqwest::Client::new().post("https://api.audd.io/").multipart(form).send().await?
.json().await?;

With the SDK (github, docs):

use audd::RecognizeOptions;let return_metadata = ["apple_music".into(),"spotify".into()];ifletSome(r) = audd
.recognize_with("audio.mp3",RecognizeOptions{return_metadata:Some(&return_metadata), ..Default::default()},).await?
{println!("{} — {}", r.artist, r.title);}
PHP

HTTP, no SDK (using cURL):

$ch = curl_init('https://api.audd.io/');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'file' => newCURLFile('audio.mp3'),
'return' => 'apple_music,spotify',
'api_token' => 'your-api-token',
],
]);
$r = json_decode(curl_exec($ch), true);
curl_close($ch);
if ($r['status'] === 'success' && $r['result']) {
echo"{$r['result']['artist']}{$r['result']['title']}\n";
echo$r['result']['apple_music']['url'] . "\n";
}

With the SDK (github, docs):

$result = $audd->recognize('audio.mp3', return_metadata: ['apple_music', 'spotify']);
echo"{$result->artist}{$result->title}\n";
echo$result->apple_music->url, "\n";
Swift

HTTP, no SDK — manual multipart with URLSession:

letboundary=UUID().uuidString
letcrlf="\r\n"letfileData=tryData(contentsOf:URL(fileURLWithPath:"audio.mp3"))varbody=Data()
body.append("--\(boundary)\(crlf)Content-Disposition: form-data; name=\"file\"; filename=\"audio.mp3\"\(crlf)Content-Type: audio/mpeg\(crlf)\(crlf)".data(using:.utf8)!)
body.append(fileData)
body.append("\(crlf)--\(boundary)\(crlf)Content-Disposition: form-data; name=\"return\"\(crlf)\(crlf)apple_music,spotify\(crlf)--\(boundary)\(crlf)Content-Disposition: form-data; name=\"api_token\"\(crlf)\(crlf)your-api-token\(crlf)--\(boundary)--\(crlf)".data(using:.utf8)!)varreq=URLRequest(url:URL(string:"https://api.audd.io/")!)
req.httpMethod ="POST"
req.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField:"Content-Type")let(data, _)=tryawaitURLSession.shared.upload(for: req, from: body)

With the SDK (github, docs):

letfile=URL(fileURLWithPath:"audio.mp3")guardlet result =tryawait audd.recognize(.file(file),
returnMetadata:["apple_music","spotify"])else{return}print("\(result.artist ??"?")\(result.title ??"?")")print(result.appleMusic?.url ??"")
Kotlin

HTTP, no SDK (OkHttp):

val body =MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(
"file", "audio.mp3",
File("audio.mp3").asRequestBody("audio/mpeg".toMediaType())
)
.addFormDataPart("return", "apple_music,spotify")
.addFormDataPart("api_token", "your-api-token")
.build()
val response =OkHttpClient().newCall(
Request.Builder().url("https://api.audd.io/").post(body).build()
).execute()
println(response.body?.string())

With the SDK (github, docs):

importio.audd.Sourceval result = audd.recognize(
Source.FilePath(File("audio.mp3")),
returnMetadata =listOf("apple_music", "spotify"),
)
result?.let { println("${it.artist}${it.title}${it.appleMusic?.get("url")}") }
C# / .NET

HTTP, no SDK:

usingvarhttp=newHttpClient();usingvarform=newMultipartFormDataContent();form.Add(newStreamContent(File.OpenRead("audio.mp3")),"file","audio.mp3");form.Add(newStringContent("apple_music,spotify"),"return");form.Add(newStringContent("your-api-token"),"api_token");varresponse=awaithttp.PostAsync("https://api.audd.io/",form);Console.WriteLine(awaitresponse.Content.ReadAsStringAsync());

With the SDK (github, docs):

varresult=awaitaudd.RecognizeAsync("/path/to/audio.mp3",returnMetadata:new[]{"apple_music","spotify"});Console.WriteLine($"{result?.Artist}{result?.Title}{result?.AppleMusic?.Url}");
Java

HTTP, no SDK (manual multipart with java.net.http):

varboundary = "----" + UUID.randomUUID();
varcrlf = "\r\n";
varfileBytes = Files.readAllBytes(Path.of("audio.mp3"));
varhead = ("--" + boundary + crlf
+ "Content-Disposition: form-data; name=\"file\"; filename=\"audio.mp3\"" + crlf
+ "Content-Type: audio/mpeg" + crlf + crlf).getBytes();
vartail = (crlf + "--" + boundary + crlf
+ "Content-Disposition: form-data; name=\"return\"" + crlf + crlf
+ "apple_music,spotify" + crlf
+ "--" + boundary + crlf
+ "Content-Disposition: form-data; name=\"api_token\"" + crlf + crlf
+ "your-api-token" + crlf
+ "--" + boundary + "--" + crlf).getBytes();
varbody = newByteArrayOutputStream();
body.write(head); body.write(fileBytes); body.write(tail);
varreq = HttpRequest.newBuilder(URI.create("https://api.audd.io/"))
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(BodyPublishers.ofByteArray(body.toByteArray()))
.build();
System.out.println(HttpClient.newHttpClient().send(req, BodyHandlers.ofString()).body());

With the SDK (github, docs):

importjava.nio.file.Path;
varr = audd.recognize(
Path.of("audio.mp3"),
RecognizeOptions.builder()
.returnMetadata("apple_music", "spotify")
.build()
);
System.out.println(r.artist() + " — " + r.title());
C

HTTP, no SDK (libcurl mime):

CURL*c=curl_easy_init();
curl_easy_setopt(c, CURLOPT_URL, "https://api.audd.io/");
curl_mime*form=curl_mime_init(c);
curl_mimepart*p;
p=curl_mime_addpart(form); curl_mime_name(p, "file"); curl_mime_filedata(p, "audio.mp3");
p=curl_mime_addpart(form); curl_mime_name(p, "return"); curl_mime_data(p, "apple_music,spotify", CURL_ZERO_TERMINATED);
p=curl_mime_addpart(form); curl_mime_name(p, "api_token"); curl_mime_data(p, "your-api-token", CURL_ZERO_TERMINATED);
curl_easy_setopt(c, CURLOPT_MIMEPOST, form);
curl_easy_perform(c);
curl_mime_free(form);
curl_easy_cleanup(c);

With the SDK (github, docs):

constchar*want[] = { "apple_music", "spotify", NULL };
audd_recognize_options_topts= { .return_metadata=want };
audd_recognition_t*r=NULL;
audd_recognize(client, "/path/to/audio.mp3", &opts, &r);
C++

HTTP, no SDK (libcurl mime):

CURL *c = curl_easy_init();
curl_easy_setopt(c, CURLOPT_URL, "https://api.audd.io/");
curl_mime *form = curl_mime_init(c);
auto *p = curl_mime_addpart(form);
curl_mime_name(p, "file");
curl_mime_filedata(p, "audio.mp3");
for (auto [name, value] : {
std::pair{"return", "apple_music,spotify"},
std::pair{"api_token", "your-api-token"},
}) {
p = curl_mime_addpart(form);
curl_mime_name(p, name);
curl_mime_data(p, value, CURL_ZERO_TERMINATED);
}
curl_easy_setopt(c, CURLOPT_MIMEPOST, form);
curl_easy_perform(c);
curl_mime_free(form);
curl_easy_cleanup(c);

With the SDK (github, docs):

audd::RecognizeOptions opts;
opts.return_metadata = {"apple_music", "spotify"};
auto result = client.recognize("/path/to/audio.mp3", opts);

Example response

{
"status": "success",
"result": {
"artist": "Imagine Dragons",
"title": "Warriors",
"album": "Warriors",
"release_date": "2014-09-18",
"label": "Universal Music",
"timecode": "02:32",
"song_link": "https://lis.tn/Warriors",
"apple_music": { "url": "https://music.apple.com/...", "previews": [...], "...": "..." },
"spotify": { "uri": "spotify:track:...", "external_urls": { "spotify": "https://open.spotify.com/..." }, "...": "..." }
}
}

When result is null, no match was found. The timecode field is the position within the original song where your clip was playing. The apple_music and spotify blocks are present only when included in return=.

WebSocket variant: Connect to wss://api.audd.io/ws/?api_token=[token] and stream multiple files (binary) without waiting for responses — useful for high-throughput pipelines.


Process Long Files (Enterprise)

The enterprise endpoint accepts files of any length — hours-long DJ mixes, full radio recordings, video files — and returns every recognized track with timestamps.

Requests are counted as 1 per 12 seconds of audio. Use skip and every to control cost.

Parameters:

ParameterRequiredDescription
api_tokenYour auth token
urlone of url / fileURL of the file (also accepts web pages containing audio/video)
fileone of url / fileFile via multipart/form-data
accurate_offsets"true" for precise start/end offsets
skipNumber of 12s chunks to skip after each scanned chunk
everyNumber of consecutive chunks to scan
skip_first_secondsSkip N seconds at the beginning
limitMax number of matches per chunk (recommended: 1 for cost control)

Cost example:skip=4&every=1 scans 12s then skips 48s → 1 request per minute of audio. skip=9&every=1 → 1 request per 2 minutes.

cURL
curl https://enterprise.audd.io/ \
-F url='https://audd.tech/djatwork_example.mp3' \
-F accurate_offsets='true' \
-F limit='1' \
-F api_token='your-api-token'
Python
r=requests.post("https://enterprise.audd.io/", data={
"url": "https://audd.tech/djatwork_example.mp3",
"accurate_offsets": "true",
"limit": "1",
"api_token": "your-api-token",
}).json()
forchunkinr.get("result", []):
forsonginchunk["songs"]:
print(f"[{chunk['offset']}] {song['artist']}{song['title']} (score: {song['score']})")

With the SDK:

formatchinaudd.recognize_enterprise(
"https://audd.tech/djatwork_example.mp3",
accurate_offsets=True, limit=1,
):
print(f"[{match.offset}] {match.artist}{match.title} ({match.score})")
Node / TypeScript
constr=awaitfetch("https://enterprise.audd.io/",{method: "POST",body: newURLSearchParams({url: "https://audd.tech/djatwork_example.mp3",accurate_offsets: "true",limit: "1",api_token: "your-api-token",}),}).then(r=>r.json());for(constchunkofr.result??[]){for(constsofchunk.songs){console.log(`[${chunk.offset}] ${s.artist}${s.title} (${s.score})`);}}

With the SDK:

constmatches=awaitaudd.recognizeEnterprise("https://audd.tech/djatwork_example.mp3",{accurateOffsets: true,limit: 1},);for(constmofmatches){console.log(`[${m.offset}] ${m.artist}${m.title}`);}

Every SDK exposes the same enterprise recognition under each language's naming conventions (recognize_enterprise, recognizeEnterprise, RecognizeEnterprise, etc.) — see the per-language docs.

Response shape

FieldMeaning
offsetPosition in your file where the 12s chunk starts (e.g. "04:48")
songs[].timecodePosition in the original song being played
songs[].scoreConfidence score (0–100)
songs[].start_offset / end_offsetMillisecond positions within the 12s chunk
songs[].isrc, upcTrack / album identifiers (Startup plan and above)

Monitor Live Streams

Monitor radio stations, Twitch broadcasts, YouTube live streams, and any audio stream in real time. You provide stream URLs, AudD monitors them continuously, and delivers recognition results via webhook callbacks or longpoll.

Pricing: $45/stream/month with AudD's catalog, or $25/stream/month with your own catalog only.

Setup

1. Set your callback URL:

curl https://api.audd.io/setCallbackUrl/ \
-F url='https://yourserver.com/audd-webhook' \
-F api_token='your-api-token'

If you don't have a server, use https://audd.tech/empty/ as the callback and pull results via longpoll instead.

2. Add streams:

# Radio / Icecast / HLS / DASH
curl https://api.audd.io/addStream/ \
-F url='https://npr-ice.streamguys1.com/live.mp3' \
-F radio_id='3249' \
-F api_token='your-api-token'# Twitch channel
curl https://api.audd.io/addStream/ \
-F url='twitch:monstercat' \
-F radio_id='5513' \
-F api_token='your-api-token'# YouTube live (video or channel)
curl https://api.audd.io/addStream/ \
-F url='youtube:5qap5aO4i9A' \
-F api_token='your-api-token'

3. Receive results at your callback URL:

{
"status": "success",
"result": {
"radio_id": 7,
"timestamp": "2020-04-13 10:31:43",
"play_length": 111,
"results": [{
"artist": "Alan Walker, A$AP Rocky",
"title": "Live Fast (PUBGM)",
"score": 100,
"song_link": "https://lis.tn/LiveFastPUBGM"
}]
}
}

By default callbacks fire when a song finishes playing. Pass callbacks=before on addStream to fire when a song starts instead.

Stream URL formats

PlatformFormat
Radio / Icecast / HLS / DASHhttps://stream-url.com/live.mp3
Twitchtwitch:channelname
YouTube (video)youtube:videoId
YouTube (channel)youtube-ch:channelId

Stream management

EndpointPurpose
POST /getStreams/List active streams
POST /setStreamUrl/Update a stream's URL
POST /deleteStream/Remove a stream
POST /getCallbackUrl/Read current callback URL

Longpoll & widget

As an alternative to callbacks, pull results via longpoll:

https://api.audd.io/longpoll/?category=[longpoll_category]&timeout=50&since_time=[timestamp]

Get longpoll_category from /getStreams/. Or embed a live now-playing widget:

https://widget.audd.tech/?ch=-[longpoll_category]&background&history&shadow

Every official SDK exposes a longpoll consumer that handles the timestamp bookkeeping for you — see the per-SDK docs.


Custom Catalog

Fingerprint your own tracks so future recognition calls match against them. Useful for proprietary catalogs, sound effects, voice samples, or audio you can't share with general-purpose music databases.

Access is granted per-account — email api@audd.io to request it. Once enabled, every SDK has a custom_catalog.add() (or equivalent) method for uploading tracks.


Common Errors

CodeDescription
#901No API token, or free quota reached — get a token
#900Invalid API token
#700No file received — check Content-Type: multipart/form-data and use https:// URLs
#600Couldn't download the audio URL
#500Invalid audio file format
#400File too large for api.audd.io/ (max 10 MB) — use enterprise
#300Fingerprinting error — clip is likely too short

Full error catalog at docs.audd.io.


Tips

  • Audio length: the standard endpoint expects a short clip — a few seconds is enough, longer is better than shorter. For files with multiple songs in them, use the enterprise endpoint instead.
  • Provider links: specify return=apple_music,spotify,deezer,napster,musicbrainz to attach those services' track URLs and IDs to the response.
  • Enterprise cost: use skip and every to sample long files instead of scanning every chunk; set limit=1 if you only need one match per chunk.

Resources


Support

Pinned Loading

  1. chrome-extensionchrome-extensionPublic

    AudD Chrome extension

    JavaScript 68 11

  2. audd-goaudd-goPublic

    AudD Golang API Library

    Go 54 6

  3. RedditBotRedditBotPublic

    Music recognition bot for Reddit powered by audd.io

    Go 421 10

  4. DiscordBotDiscordBotPublic

    AudD music recognition bot for Discord

    Go 36 9

Repositories

Showing 10 of 27 repositories

Top languages

Loading…

Most used topics

Loading…