REST API for audio fingerprinting, rights reconciliation and A&R embeddings. Structured JSON responses, Bearer token auth, SDKs in Python, TypeScript and Go.
# Python pip install nomad-sdk # TypeScript npm install @nomad/sdk # Go go get github.com/nomad/sdk-go
import nomad client = nomad.Client( api_key="sk_live_..." ) # All SDK methods use # this client instance
match = client.listen.fingerprint(
audio_url="https://...",
detectors=["melodic", "timbre"]
)
print(match.confidence)
# => 0.97
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.
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..."
Submit an audio file or URL for fingerprinting. Returns match results including derivative classification, confidence score, and rights-chain metadata.
| Name | Type | Description |
|---|---|---|
| audio_url required | string | URL to audio file (WAV, FLAC, AAC, MP3). Max 25 MB. |
| detectors | string[] | Detectors to run: melodic, harmonic, lyric, timbre. Default: all four. |
| min_confidence | float | Minimum confidence threshold (0.0–1.0). Default: 0.80. |
| include_rights | boolean | Include rights-chain metadata in response. Default: true. |
| callback_url | string | Webhook 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"
{
"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"
}
Retrieve a previously computed match by ID. Includes full derivative metadata and rights chain.
| Name | Type | Description |
|---|---|---|
| match_id required | string | The 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"
List all claims associated with a work, including status, territory, PRO, and recovery amount. Works are identified by ISRC.
| Name | Type | Description |
|---|---|---|
| isrc required | string | International Standard Recording Code. |
| status | string | Filter by claim status: open, disputed, resolved, paid. |
| territory | string | ISO 3166-1 alpha-2 country code to filter by territory. |
| limit | integer | Max 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}`));
{
"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"
}
]
}
Submit a PRO or distributor statement for reconciliation against the works graph. Returns discrepancies, new claims, and a reconciliation summary.
| Name | Type | Description |
|---|---|---|
| statement_url required | string | URL to the statement file (CSV, XLSX, or CWR format). |
| pro | string | PRO identifier (e.g. PRS, GEMA, ASCAP). Auto-detected if omitted. |
| period | string | Statement period in YYYY-Q# format (e.g. 2026-Q1). |
| auto_claim | boolean | Automatically 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}`);
{
"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"
}
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.
| Name | Type | Description |
|---|---|---|
| reference_isrc | string | ISRC of a reference track to anchor the query. |
| audio_url | string | URL to audio file — alternative to ISRC reference. |
| top_k | integer | Number of candidates to return (1–100). Default: 20. |
| exclude_labels | string[] | Label names to exclude from results (avoid recommending your own roster). |
| genre_filter | string[] | 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}`));
{
"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
}
List candidates from the Friday listening queue — the weekly batch of embedding-ranked discoveries personalised to your roster's taste profile.
| Name | Type | Description |
|---|---|---|
| week | string | ISO week (2026-W21). Default: current week. |
| status | string | Filter: pending, in_scope, out_of_scope, interesting. |
| limit | integer | Max 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`);
Official Python client for Nomad API. Supports async, type hints, and automatic pagination. Python 3.9+.
pip install nomad-sdkOfficial TypeScript/JavaScript client. Full type definitions, ESM and CJS builds. Node 18+, Deno, Bun.
npm install @nomad/sdkOfficial Go client. Context-aware, struct-based responses. Go 1.21+.
go get github.com/nomad/sdk-goTechnical whitepapers on audio architecture, royalty leakage benchmarks, and A&R embedding methodology.
View publications →Request API access and we'll set up your sandbox environment within one business day. Production keys are issued after a scoping call.