// API Reference

Build on the
listening platform.

REST API for audio fingerprinting, rights reconciliation and A&R embeddings. Structured JSON responses, Bearer token auth, SDKs in Python, TypeScript and Go.

// Base URL: api.nomadrecords.net // Version: v1 // Updated quarterly
// Quick Start

Three steps to your first match.

Step 01

Install the SDK

# Python
pip install nomad-sdk

# TypeScript
npm install @nomad/sdk

# Go
go get github.com/nomad/sdk-go
Step 02

Authenticate

import nomad

client = nomad.Client(
    api_key="sk_live_..."
)

# All SDK methods use
# this client instance
Step 03

Run your first query

match = client.listen.fingerprint(
    audio_url="https://...",
    detectors=["melodic", "timbre"]
)

print(match.confidence)
# => 0.97
// Authentication

Bearer token auth.

All API requests require a Bearer token in the Authorization header. Tokens are scoped to your organisation and can be rotated from the dashboard. Sandbox tokens (sk_test_...) hit a 1,000-track reference set; production tokens (sk_live_...) hit the full 78M index.

Rate Limits Starter: 100 req/min · Pro: 500 req/min · Enterprise: unlimited.
Rate limit headers (X-RateLimit-Remaining) are included in every response. 429 responses include a Retry-After header in seconds.
HTTP Header
Authorization: Bearer sk_live_a1b2c3d4e5f6...

# Example with cURL
curl https://api.nomadrecords.net/v1/fingerprint \
  -H "Authorization: Bearer sk_live_a1b2c3d4e5f6" \
  -H "Content-Type: application/json"

# Sandbox (test) token
curl https://api.nomadrecords.net/v1/fingerprint \
  -H "Authorization: Bearer sk_test_x9y8z7w6..."
// Listen API

Audio fingerprinting & derivative detection.

POST /v1/fingerprint

Submit an audio file or URL for fingerprinting. Returns match results including derivative classification, confidence score, and rights-chain metadata.

Parameters

NameTypeDescription
audio_url requiredstringURL to audio file (WAV, FLAC, AAC, MP3). Max 25 MB.
detectorsstring[]Detectors to run: melodic, harmonic, lyric, timbre. Default: all four.
min_confidencefloatMinimum confidence threshold (0.0–1.0). Default: 0.80.
include_rightsbooleanInclude rights-chain metadata in response. Default: true.
callback_urlstringWebhook URL for async results (for files > 10 MB).
curl -X POST https://api.nomadrecords.net/v1/fingerprint \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "audio_url": "https://cdn.example.com/track.wav",
    "detectors": ["melodic", "harmonic", "lyric", "timbre"],
    "min_confidence": 0.85
  }'
import nomad

client = nomad.Client("sk_live_...")

match = client.listen.fingerprint(
    audio_url="https://cdn.example.com/track.wav",
    detectors=["melodic", "harmonic", "lyric", "timbre"],
    min_confidence=0.85
)

print(match.original.title)  # => "Midnight Signal"
import { NomadClient } from "@nomad/sdk";

const client = new NomadClient("sk_live_...");

const match = await client.listen.fingerprint({
  audioUrl: "https://cdn.example.com/track.wav",
  detectors: ["melodic", "harmonic", "lyric", "timbre"],
  minConfidence: 0.85,
});

console.log(match.original.title); // => "Midnight Signal"

Response — 200

{
  "match_id": "m_8f3a2b1c",
  "confidence": 0.97,
  "derivative_type": "sped_up_edit",
  "detectors_agreed": ["melodic", "timbre"],
  "original": {
    "isrc": "GBDUW2400118",
    "title": "Midnight Signal",
    "artist": "The Nomads",
    "rights_holder": "Nomad Publishing Ltd",
    "territories": ["GB", "US", "DE", "FR"]
  },
  "latency_ms": 340,
  "created_at": "2026-05-21T10:32:18Z"
}
GET /v1/matches/{match_id}

Retrieve a previously computed match by ID. Includes full derivative metadata and rights chain.

NameTypeDescription
match_id requiredstringThe match ID returned from /v1/fingerprint.
curl https://api.nomadrecords.net/v1/matches/m_8f3a2b1c \
  -H "Authorization: Bearer sk_live_..."
match = client.listen.get_match("m_8f3a2b1c")
print(match.derivative_type)  # => "sped_up_edit"
const match = await client.listen.getMatch("m_8f3a2b1c");
console.log(match.derivativeType); // => "sped_up_edit"
// Rights API

Royalty reconciliation & claims.

GET /v1/works/{isrc}/claims

List all claims associated with a work, including status, territory, PRO, and recovery amount. Works are identified by ISRC.

NameTypeDescription
isrc requiredstringInternational Standard Recording Code.
statusstringFilter by claim status: open, disputed, resolved, paid.
territorystringISO 3166-1 alpha-2 country code to filter by territory.
limitintegerMax results per page (1–100). Default: 25.
curl https://api.nomadrecords.net/v1/works/GBDUW2400118/claims?status=open \
  -H "Authorization: Bearer sk_live_..."
claims = client.rights.list_claims(
    isrc="GBDUW2400118",
    status="open"
)

for claim in claims:
    print(f"{claim.territory}: {claim.amount_gbp}")
const claims = await client.rights.listClaims({
  isrc: "GBDUW2400118",
  status: "open",
});

claims.forEach(c => console.log(`${c.territory}: ${c.amountGbp}`));

Response — 200

{
  "isrc": "GBDUW2400118",
  "total_claims": 3,
  "claims": [
    {
      "claim_id": "cl_9d2e4f8a",
      "territory": "DE",
      "type": "neighbouring_rights",
      "pro": "GVL",
      "status": "open",
      "amount_gbp": 1240.50,
      "evidence_type": "audio_match",
      "opened_at": "2026-04-12T09:18:00Z"
    },
    {
      "claim_id": "cl_7b1c3d5e",
      "territory": "FR",
      "type": "mechanical",
      "pro": "SACEM",
      "status": "open",
      "amount_gbp": 870.00,
      "evidence_type": "statement_mismatch",
      "opened_at": "2026-03-28T14:05:00Z"
    }
  ]
}
POST /v1/reconcile

Submit a PRO or distributor statement for reconciliation against the works graph. Returns discrepancies, new claims, and a reconciliation summary.

NameTypeDescription
statement_url requiredstringURL to the statement file (CSV, XLSX, or CWR format).
prostringPRO identifier (e.g. PRS, GEMA, ASCAP). Auto-detected if omitted.
periodstringStatement period in YYYY-Q# format (e.g. 2026-Q1).
auto_claimbooleanAutomatically generate claims for discrepancies. Default: false.
curl -X POST https://api.nomadrecords.net/v1/reconcile \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "statement_url": "https://cdn.example.com/prs-q1-2026.csv",
    "pro": "PRS",
    "period": "2026-Q1",
    "auto_claim": true
  }'
result = client.rights.reconcile(
    statement_url="https://cdn.example.com/prs-q1-2026.csv",
    pro="PRS",
    period="2026-Q1",
    auto_claim=True
)

print(f"Discrepancies: {result.discrepancies_found}")
print(f"Claims created: {result.claims_created}")
const result = await client.rights.reconcile({
  statementUrl: "https://cdn.example.com/prs-q1-2026.csv",
  pro: "PRS",
  period: "2026-Q1",
  autoClaim: true,
});

console.log(`Discrepancies: ${result.discrepanciesFound}`);

Response — 200

{
  "reconciliation_id": "rec_4a8b2c1d",
  "pro": "PRS",
  "period": "2026-Q1",
  "lines_processed": 4218,
  "matched": 3946,
  "discrepancies_found": 272,
  "claims_created": 18,
  "estimated_recovery_gbp": 8420.00,
  "completed_at": "2026-05-21T10:45:22Z"
}
// A&R API

Embedding queries & candidate discovery.

POST /v1/embeddings/query

Query the sub-genre embedding space. Pass a reference artist or audio URL and get back sonically similar candidates ranked by embedding distance — not by streams or social metrics.

NameTypeDescription
reference_isrcstringISRC of a reference track to anchor the query.
audio_urlstringURL to audio file — alternative to ISRC reference.
top_kintegerNumber of candidates to return (1–100). Default: 20.
exclude_labelsstring[]Label names to exclude from results (avoid recommending your own roster).
genre_filterstring[]Restrict to specific sub-genres in the embedding space.
curl -X POST https://api.nomadrecords.net/v1/embeddings/query \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "reference_isrc": "GBDUW2400118",
    "top_k": 10,
    "exclude_labels": ["Our Label"]
  }'
candidates = client.ar.query_embedding(
    reference_isrc="GBDUW2400118",
    top_k=10,
    exclude_labels=["Our Label"]
)

for c in candidates:
    print(f"{c.artist}: {c.distance:.3f}")
const candidates = await client.ar.queryEmbedding({
  referenceIsrc: "GBDUW2400118",
  topK: 10,
  excludeLabels: ["Our Label"],
});

candidates.forEach(c => console.log(`${c.artist}: ${c.distance}`));

Response — 200

{
  "query_id": "q_2f7a9c3b",
  "reference_isrc": "GBDUW2400118",
  "candidates": [
    {
      "artist": "Pale Circuits",
      "isrc": "USAT22500341",
      "title": "Wireframe Dusk",
      "distance": 0.042,
      "sub_genre": "ambient_electronic",
      "monthly_listeners": 12400,
      "references": ["GBDUW2400118", "GBDUW2400205", "USAT22500102"]
    },
    {
      "artist": "Kora Heights",
      "isrc": "DEA622500087",
      "title": "Salt Garden",
      "distance": 0.058,
      "sub_genre": "neo_folk_electronic",
      "monthly_listeners": 3200,
      "references": ["GBDUW2400118", "FRA522400441", "DEA622500023"]
    }
  ],
  "latency_ms": 180
}
GET /v1/candidates

List candidates from the Friday listening queue — the weekly batch of embedding-ranked discoveries personalised to your roster's taste profile.

NameTypeDescription
weekstringISO week (2026-W21). Default: current week.
statusstringFilter: pending, in_scope, out_of_scope, interesting.
limitintegerMax results (1–100). Default: 20.
curl https://api.nomadrecords.net/v1/candidates?week=2026-W21&status=pending \
  -H "Authorization: Bearer sk_live_..."
queue = client.ar.list_candidates(
    week="2026-W21",
    status="pending"
)

print(f"{len(queue)} candidates this week")
const queue = await client.ar.listCandidates({
  week: "2026-W21",
  status: "pending",
});

console.log(`${queue.length} candidates this week`);
// SDKs & Resources

Client libraries & further reading.

SDK

Python SDK

Official Python client for Nomad API. Supports async, type hints, and automatic pagination. Python 3.9+.

pip install nomad-sdk
Request access →
SDK

TypeScript SDK

Official TypeScript/JavaScript client. Full type definitions, ESM and CJS builds. Node 18+, Deno, Bun.

npm install @nomad/sdk
Request access →
SDK

Go SDK

Official Go client. Context-aware, struct-based responses. Go 1.21+.

go get github.com/nomad/sdk-go
Request access →
Docs

Whitepapers & Reports

Technical whitepapers on audio architecture, royalty leakage benchmarks, and A&R embedding methodology.

View publications →
// Get started

Ready to build?

Request API access and we'll set up your sandbox environment within one business day. Production keys are issued after a scoping call.