API Docs for the enterprise endpoint
This is a separate endpoint with enterprise features and the ability to handle large files. You can send hours- or even days-long audio to this endpoint and receive highly detailed metadata in response.
To identify music from shorter audio clips and retreive rich metadata, including the detailed composition data Spotify, Apple Music, Musicbrainz and other hold (and not just links), use our main API endpoint. For industry-leading broadcast monitoring, see Streams.
The API is very easy to integrate directly; however, we maintain SDKs for 11 languages.
We count requests to the enterprise endpoint as 1 request per 12 seconds of audio.
When you upload a file, our servers consider it to be a group of 12-second-long audio chunks. If you don't want every one of these chunks to be recognized and counted as the requests, there are two parameters that you can use: skip and every.
skip- the number of 12-second-long audio chunks to skip after the ones that are scanned;every- the number of chunks to scan in a row.
So if you want to identify music playing in the first 12 seconds, then skip 48 seconds, then scan 12 seconds again, skip 48 seconds again, etc., these parameters should be skip=4 and every=1. If you want to skip 108 seconds, to have 1 request per 120 seconds of audio, send skip=9 and every=1.
Where to get a token
You can get a token from our API Dashboard.
The first 300 requests are free; our subscription options start at $2 per 1000 requests. We use Stripe for secure payments; we can also accept US domestic and international bank transfers from enterprise customers.
How to send files
There are two ways to send files to the API:
- Provide a URL of the file. Our server will download and recognize music from the file. Send the URL in the
urlparameter. (You can also send a URL of a web page that contains audio or video instead of the URL of the actual audio file) - Post the file using multipart/form-data in the usual way the files are uploaded via the browser. Send the file in the
fileparameter, by POST. This method is useful if the file is not available by a URL.
You can try to send a file from a browser here (or here for csv results instead of json).
post Send a file
https://enterprise.audd.io/
- Request
- Response
- Code examples
stringstringbinarystringintegerintegerintegerintegerstringHere's an example of a response you can get from the recognition of this hour-long mix. It's a real response (shown here as its first three of 63 chunks), and we replaced the duplicate song results with '...' so it's a bit easier to scroll.
{
"status": "success",
"result": [
{
"songs": [
{
"score": 100,
"artist": "Ali Angel",
"title": "Tou patou II",
"album": "Notre histoire",
"release_date": "2002-06-05",
"label": "BELIEVE - Pastel Productions",
"timecode": "00:11",
"isrc": "FR6V81099777",
"upc": "3760009882294",
"song_link": "https://lis.tn/TouPatouII",
"start_offset": 1,
"end_offset": 8680
},
{
"score": 100,
"artist": "Future Shock",
"title": "Dance Floor",
"album": "Beyond Forever",
"release_date": "2020-03-20",
"label": "Sportn' Life Music Group",
"timecode": "00:11",
"isrc": "QM4TX2035991",
"upc": "194491888015",
"song_link": "https://lis.tn/uxRpGN",
"start_offset": 1,
"end_offset": 8840
},
{
"score": 100,
"artist": "Anthony Acosta",
"title": "The Way She Moves",
"album": "The Way She Moves",
"release_date": "2008-06-01",
"label": "2254767 Records DK",
"timecode": "00:33",
"isrc": "QZHN32178577",
"upc": "196164729410",
"song_link": "https://lis.tn/HgiZkK",
"start_offset": 1,
"end_offset": 7820
}
],
"offset": "00:00"
},
{
"songs": [
{
"score": 100,
"artist": "Barely Alive",
"title": "Keyboard Killer",
"album": "Lost in the Internet EP",
"release_date": "2014-03-10",
"label": "Disciple Recordings",
"timecode": "00:41",
"isrc": "FR4GL1069639",
"upc": "3610154900148",
"song_link": "https://lis.tn/KeyboardKiller",
"start_offset": 1,
"end_offset": 9660
}
],
"offset": "00:48"
},
{
"songs": [
{
"score": 100,
"artist": "Barely Alive",
"title": "Keyboard Killer",
"album": "Lost in the Internet EP",
"release_date": "2014-03-10",
"label": "Disciple Recordings",
"timecode": "01:31",
"isrc": "FR4GL1069639",
"upc": "3610154900148",
"song_link": "https://lis.tn/KeyboardKiller",
"start_offset": 1,
"end_offset": 8440
}
],
"offset": "01:36"
}
],
"execution_time": "38.335355495s"
}
- Send a file URL
- Send a local file
- Python
- Node
- Go
- Rust
- PHP
- Swift
- Kotlin
- C#
- Java
- C
- C++
- curl
Plain HTTP, no SDK:
curl https://enterprise.audd.io/ \
-F api_token='your api token' \
-F url='https://audd.tech/djatwork_example.mp3' \
-F accurate_offsets='true' \
-F skip='3' \
-F every='1'
With the SDK:
pip install audd
from audd import AudD
audd = AudD("your-api-token")
matches = audd.recognize_enterprise("https://example.com/full-show.mp3", limit=10)
for m in matches:
print(f"{m.timecode} {m.artist} — {m.title}")
Or send the request yourself, without the SDK:
import requests
data = {
'api_token': 'your api token',
'url': 'https://audd.tech/djatwork_example.mp3',
'accurate_offsets': 'true',
'skip': '3',
'every': '1',
}
result = requests.post('https://enterprise.audd.io/', data=data)
print(result.text)
With the SDK:
npm install @audd/sdk
import { AudD } from "@audd/sdk";
const audd = new AudD("your-api-token");
const matches = await audd.recognizeEnterprise("https://example.com/full-show.mp3", { limit: 10 });
for (const m of matches) console.log(`${m.timecode} ${m.artist} — ${m.title}`);
Or send the request yourself, without the SDK:
var axios = require("axios");
var data = {
'api_token': 'your api token',
'url': 'https://audd.tech/djatwork_example.mp3',
'accurate_offsets': 'true',
'skip': '3',
'every': '1',
};
axios({
method: 'post',
url: 'https://enterprise.audd.io/',
data: data,
headers: { 'Content-Type': 'multipart/form-data' },
})
.then((response) => {
console.log(response);
})
.catch((error) => {
console.log(error);
});
With the SDK:
go get github.com/AudDMusic/audd-go
package main
import (
"fmt"
"log"
audd "github.com/AudDMusic/audd-go"
)
func main() {
client := audd.NewClient("your api token")
defer client.Close()
skip := 3
every := 1
accurate := true
matches, err := client.RecognizeEnterprise("https://audd.tech/djatwork_example.mp3", &audd.EnterpriseOptions{
Skip: &skip,
Every: &every,
AccurateOffsets: &accurate,
})
if err != nil {
log.Fatal(err)
}
for _, m := range matches {
fmt.Printf("%s %s — %s\n", m.Timecode, m.Artist, m.Title)
}
}
With the SDK:
cargo add audd
use audd::EnterpriseOptions;
let client = audd::Client::builder().api_token("your-api-token").build()?;
let matches = client.recognize_enterprise(
"https://example.com/full-show.mp3",
EnterpriseOptions { limit: Some(10), ..Default::default() },
).await?;
for m in matches { println!("{} {} — {}", m.timecode, m.artist, m.title); }
With the SDK:
composer require audd/audd
<?php
$audd = new AudD\AudD('your-api-token');
$matches = $audd->recognizeEnterprise('https://example.com/full-show.mp3', ['limit' => 10]);
foreach ($matches as $m) {
echo "{$m->timecode} {$m->artist} — {$m->title}\n";
}
Or send the request yourself, without the SDK:
<?php
$data = [
'api_token' => 'your api token',
'url' => 'https://audd.tech/djatwork_example.mp3',
'accurate_offsets' => 'true',
'skip' => '3',
'every' => '1',
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, 'https://enterprise.audd.io/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
With the SDK:
// Package.swift, in dependencies:
.package(url: "https://github.com/AudDMusic/audd-swift", from: "1.5.19"),
let audd = try AudD(apiToken: "your-api-token")
let matches = try await audd.recognizeEnterprise(
"https://example.com/full-show.mp3",
options: .init(limit: 10)
)
for m in matches { print("\(m.timecode) \(m.artist) — \(m.title)") }
With the SDK:
// build.gradle.kts
implementation("io.audd:audd-kotlin:1.5.16")
val audd = AudD("your-api-token")
val matches = audd.recognizeEnterprise(
Source.Url("https://example.com/full-show.mp3"),
limit = 10,
)
for (m in matches) println("${m.timecode} ${m.artist} — ${m.title}")
With the SDK:
dotnet add package AudD
using var audd = new AudD("your-api-token");
var matches = await audd.RecognizeEnterpriseAsync(
"https://example.com/full-show.mp3",
new EnterpriseOptions { Limit = 10 });
foreach (var m in matches) Console.WriteLine($"{m.Timecode} {m.Artist} — {m.Title}");
With the SDK:
<!-- pom.xml -->
<dependency>
<groupId>io.audd</groupId>
<artifactId>audd</artifactId>
<version>1.5.16</version>
</dependency>
try (AudD audd = new AudD("your-api-token")) {
var opts = new EnterpriseOptions.Builder().limit(10).build();
List<EnterpriseMatch> matches = audd.recognizeEnterprise(
"https://example.com/full-show.mp3", opts);
for (var m : matches) {
System.out.println(m.timecode() + " " + m.artist() + " — " + m.title());
}
}
Or send the request yourself, without the SDK:
// requires OkHttp
OkHttpClient client = new OkHttpClient();
RequestBody data = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("api_token", "your api token")
.addFormDataPart("url", "https://audd.tech/djatwork_example.mp3")
.addFormDataPart("accurate_offsets", "true")
.addFormDataPart("skip", "3")
.addFormDataPart("every", "1").build();
Request request = new Request.Builder().url("https://enterprise.audd.io/")
.post(data).build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
With the SDK:
# CMakeLists.txt
FetchContent_Declare(audd
GIT_REPOSITORY https://github.com/AudDMusic/audd-c.git
GIT_TAG v1.5.16)
FetchContent_MakeAvailable(audd)
target_link_libraries(your_app PRIVATE audd)
audd_client_t* client = audd_client_new("your-api-token", NULL);
audd_enterprise_options_t opts = audd_enterprise_options_default();
opts.limit = 10;
audd_enterprise_match_t* matches = NULL;
size_t n = 0;
audd_recognize_enterprise(client, audd_source_url("https://example.com/full-show.mp3"),
&opts, &matches, &n);
for (size_t i = 0; i < n; ++i) {
printf("%s %s — %s\n", matches[i].timecode, matches[i].artist, matches[i].title);
}
audd_enterprise_matches_free(matches, n);
audd_client_free(client);
With the SDK:
# CMakeLists.txt (after installing audd-cpp)
find_package(audd CONFIG REQUIRED)
target_link_libraries(your_app PRIVATE audd::audd)
audd::AudD client("your-api-token");
audd::EnterpriseOptions opts; opts.limit = 10;
auto matches = client.recognize_enterprise(
audd::Source::url("https://example.com/full-show.mp3"), opts);
for (auto& m : matches) {
std::cout << m.timecode << " " << m.artist << " — " << m.title << "\n";
}
- Python
- Node
- Go
- Rust
- PHP
- Swift
- Kotlin
- C#
- Java
- C
- C++
- curl
Plain HTTP, no SDK:
curl https://enterprise.audd.io/ \
-F api_token='your api token' \
-F file=@/path/to/largeFile.mp3 \
-F accurate_offsets='true' \
-F skip='3' \
-F every='1'
With the SDK:
pip install audd
from audd import AudD
audd = AudD("your-api-token")
matches = audd.recognize_enterprise("/path/to/full-show.mp3", limit=10)
for m in matches:
print(f"{m.timecode} {m.artist} — {m.title}")
Or send the request yourself, without the SDK:
import requests
data = {
'api_token': 'your api token',
'accurate_offsets': 'true',
'skip': '3',
'every': '1',
}
files = {
'file': open('/path/to/largeFile.mp3', 'rb'),
}
result = requests.post('https://enterprise.audd.io/', data=data, files=files)
print(result.text)
With the SDK:
npm install @audd/sdk
import { AudD } from "@audd/sdk";
const audd = new AudD("your-api-token");
const matches = await audd.recognizeEnterprise("/path/to/full-show.mp3", { limit: 10 });
for (const m of matches) console.log(`${m.timecode} ${m.artist} — ${m.title}`);
Or send the request yourself, without the SDK:
var axios = require("axios");
var fs = require('fs');
var data = {
'api_token': 'your api token',
'file': fs.createReadStream('/path/to/largeFile.mp3'),
'accurate_offsets': 'true',
'skip': '3',
'every': '1',
};
axios({
method: 'post',
url: 'https://enterprise.audd.io/',
data: data,
headers: { 'Content-Type': 'multipart/form-data' },
})
.then((response) => {
console.log(response);
})
.catch((error) => {
console.log(error);
});
With the SDK:
go get github.com/AudDMusic/audd-go
package main
import (
"fmt"
"log"
"os"
audd "github.com/AudDMusic/audd-go"
)
func main() {
client := audd.NewClient("your api token")
defer client.Close()
f, err := os.Open("/path/to/largeFile.mp3")
if err != nil {
log.Fatal(err)
}
defer f.Close()
skip := 3
every := 1
accurate := true
matches, err := client.RecognizeEnterprise(f, &audd.EnterpriseOptions{
Skip: &skip,
Every: &every,
AccurateOffsets: &accurate,
})
if err != nil {
log.Fatal(err)
}
for _, m := range matches {
fmt.Printf("%s %s — %s\n", m.Timecode, m.Artist, m.Title)
}
}
With the SDK:
cargo add audd
use audd::EnterpriseOptions;
let client = audd::Client::builder().api_token("your-api-token").build()?;
let matches = client.recognize_enterprise(
std::path::Path::new("/path/to/full-show.mp3"),
EnterpriseOptions { limit: Some(10), ..Default::default() },
).await?;
for m in matches { println!("{} {} — {}", m.timecode, m.artist, m.title); }
With the SDK:
composer require audd/audd
<?php
$audd = new AudD\AudD('your-api-token');
$matches = $audd->recognizeEnterprise('/path/to/full-show.mp3', ['limit' => 10]);
foreach ($matches as $m) {
echo "{$m->timecode} {$m->artist} — {$m->title}\n";
}
Or send the request yourself, without the SDK:
<?php
$data = [
'api_token' => 'your api token',
'file' => curl_file_create('/path/to/largeFile.mp3',
'application/octet-stream', 'file'),
'accurate_offsets' => 'true',
'skip' => '3',
'every' => '1',
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, 'https://enterprise.audd.io/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
With the SDK:
// Package.swift, in dependencies:
.package(url: "https://github.com/AudDMusic/audd-swift", from: "1.5.19"),
let audd = try AudD(apiToken: "your-api-token")
let file = URL(fileURLWithPath: "/path/to/full-show.mp3")
let matches = try await audd.recognizeEnterprise(.file(file), limit: 10)
for m in matches { print("\(m.timecode) \(m.artist) — \(m.title)") }
With the SDK:
// build.gradle.kts
implementation("io.audd:audd-kotlin:1.5.16")
val audd = AudD("your-api-token")
val matches = audd.recognizeEnterprise(
Source.FilePath(File("/path/to/full-show.mp3")),
limit = 10,
)
for (m in matches) println("${m.timecode} ${m.artist} — ${m.title}")
With the SDK:
dotnet add package AudD
using var audd = new AudD("your-api-token");
var matches = await audd.RecognizeEnterpriseAsync(
"/path/to/full-show.mp3",
new EnterpriseOptions { Limit = 10 });
foreach (var m in matches) Console.WriteLine($"{m.Timecode} {m.Artist} — {m.Title}");
With the SDK:
<!-- pom.xml -->
<dependency>
<groupId>io.audd</groupId>
<artifactId>audd</artifactId>
<version>1.5.16</version>
</dependency>
try (AudD audd = new AudD("your-api-token")) {
var opts = new EnterpriseOptions.Builder().limit(10).build();
List<EnterpriseMatch> matches = audd.recognizeEnterprise(
Path.of("/path/to/full-show.mp3"), opts);
for (var m : matches) {
System.out.println(m.timecode() + " " + m.artist() + " — " + m.title());
}
}
Or send the request yourself, without the SDK:
// requires OkHttp
final MediaType MEDIA_TYPE_MP3 = MediaType.get("audio/mpeg; charset=utf-8");
File file = new File("/path/to/largeFile.mp3");
OkHttpClient client = new OkHttpClient();
RequestBody data = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("api_token", "your api token")
.addFormDataPart("file", file.getName(),
RequestBody.Companion.create(file, MEDIA_TYPE_MP3))
.addFormDataPart("accurate_offsets", "true")
.addFormDataPart("skip", "3")
.addFormDataPart("every", "1").build();
Request request = new Request.Builder().url("https://enterprise.audd.io/")
.post(data).build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
With the SDK:
# CMakeLists.txt
FetchContent_Declare(audd
GIT_REPOSITORY https://github.com/AudDMusic/audd-c.git
GIT_TAG v1.5.16)
FetchContent_MakeAvailable(audd)
target_link_libraries(your_app PRIVATE audd)
audd_client_t* client = audd_client_new("your-api-token", NULL);
audd_enterprise_options_t opts = audd_enterprise_options_default();
opts.limit = 10;
audd_enterprise_match_t* matches = NULL;
size_t n = 0;
audd_recognize_enterprise(client, audd_source_path("/path/to/full-show.mp3"),
&opts, &matches, &n);
for (size_t i = 0; i < n; ++i) {
printf("%s %s — %s\n", matches[i].timecode, matches[i].artist, matches[i].title);
}
audd_enterprise_matches_free(matches, n);
audd_client_free(client);
With the SDK:
# CMakeLists.txt (after installing audd-cpp)
find_package(audd CONFIG REQUIRED)
target_link_libraries(your_app PRIVATE audd::audd)
audd::AudD client("your-api-token");
audd::EnterpriseOptions opts; opts.limit = 10;
auto matches = client.recognize_enterprise(
audd::Source::path("/path/to/full-show.mp3"), opts);
for (auto& m : matches) {
std::cout << m.timecode << " " << m.artist << " — " << m.title << "\n";
}
timecode is the position in the original song where the matched fragment is playing (e.g., that can be 00:45 of Imagine Dragons - Warriors).
offset is the position, in the audio file you submitted, of the start of the 12-second-long fragment that contains matches.
start_offset and end_offset are the positions (in milliseconds) in the 12-second-long fragment of the start and end of the fragment we matched to a song.
How to get additional metadata, e.g., ISRCs and UPCs
You don't have to have an enterprise account in order to use the enterprise endpoint. But you need an enterprise account to get ISRCs and UPCs with the results. Let us know if you want access to these features: send an email to api@audd.io.