SonoVault is in open beta — signups are live. Get your free API key →
ResourcesMusic TrackingHow to Track New Releases from a Record Label

How to Track New Releases from a Record Label

Use the label search and label detail endpoints to monitor a label's catalog and get notified when new tracks drop. Complete TypeScript walkthrough using Drumcode as an example.

Why track a label?

If you follow a label like Drumcode, Anjunadeep, or mau5trap, you want to know the moment new music drops — not discover it weeks later in a playlist algorithm. The SonoVault API gives you two endpoints that, combined, turn any label into a live release feed.

  • /v1/labels/search — find a label by name and get its ID
  • /v1/labels/:id — get the full catalog: releases and tracks, sorted by release date (newest first)

That's all you need. Search once to get the ID, then poll the detail endpoint on a schedule. New releases appear at the top.

Build
1

Find the label

Search by name. The response includes the label ID and how many releases it has. Exact matches sort first, then by release count — so searching "Drumcode" returns the right one immediately.

GET/v1/labels/search?name=Drumcode200 OK
{
  "results": [{
    "id":            482,
    "name":          "Drumcode",
    "release_count": 842
  }],
  "next_cursor": null
}
2

Get the label summary

Pass the label ID to the detail endpoint. You get the label name plus catalog-size counts (release_count, artist_count). The embedded releases / tracks arrays were removed — they grew too large for big labels. Paginate via /v1/labels/:id/releases instead.

GET/v1/labels/482200 OK
{
  "id":            482,
  "name":          "Drumcode",
  "release_count": 842,
  "artist_count":  67
}

Then pull the release feed — each item is a release with nested artist and label objects, plus catalog number and track count:

GET/v1/labels/482/releases?limit=20200 OK
{
  "results": [
    {
      "id":           9102,
      "title":        "Drumcode 300",
      "artist":       { "id": 155, "name": "Adam Beyer" },
      "label":        { "id": 482, "name": "Drumcode" },
      "release_date": "2026-03-28",
      "catalog_no":   "DC300",
      "track_count":  12
    }
  ],
  "next_cursor": null
}
3

Display recent releases

The releases array is already sorted by date. Slice the first 10 for a "latest releases" view, or filter by date range to show only this week's drops.

Here's the complete script — search, fetch, and display in under 50 lines:

TypeScriptlabel-tracker.ts
const API_KEY = process.env.SONOVAULT_API_KEY!;
const BASE    = "https://api.sonovault.now/v1";

interface LabelSearchResult {
  id:            number;
  name:          string;
  release_count: number;
}

interface Release {
  id:           number;
  title:        string;
  artist:       { id: number; name: string };
  label:        { id: number; name: string } | null;
  release_date: string | null;
  catalog_no:   string | null;
  track_count:  number;
}

async function api(path: string) {
  const res = await fetch(`${BASE}${path}`, {
    headers: { "x-api-key": API_KEY },
  });
  if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);
  return res.json();
}

// Step 1: Find the label
const { results } = await api("/labels/search?name=Drumcode");
const label = results[0] as LabelSearchResult;
console.log(`Found: ${label.name} (id: ${label.id}, ${label.release_count} releases)`);

// Step 2: Get the paginated release feed
const releasesPage = await api(`/labels/${label.id}/releases?limit=20`);
const releases = releasesPage.results as Release[];

// Step 3: Show recent releases
console.log(`\nLatest releases from ${label.name}:\n`);
releases.forEach((r) => {
  console.log(
    `  ${r.release_date}  ${r.artist.name} — ${r.title} (${r.track_count} tracks)`
  );
});
4

Detect new releases on a schedule

To get notified when new tracks appear, run the script on a daily cron and compare against a stored list of previously seen track IDs. New IDs = new releases.

TypeScriptcron-check.ts
import fs from "node:fs";

const LABEL_ID    = 482;  // Drumcode
const STATE_FILE  = "./last-seen.json";

// Load previously seen release IDs
const seen: Set<number> = new Set(
  fs.existsSync(STATE_FILE)
    ? JSON.parse(fs.readFileSync(STATE_FILE, "utf-8"))
    : []
);

// Fetch the latest releases on the label
const page = await api(`/labels/${LABEL_ID}/releases?limit=20`);
const releases = page.results as Release[];

// Find new releases since last run
const newReleases = releases.filter(r => !seen.has(r.id));

if (newReleases.length > 0) {
  console.log(`${newReleases.length} new release(s) on Drumcode:\n`);
  newReleases.forEach(r => {
    console.log(`  ${r.artist.name} — ${r.title}`);
  });

  // Send a webhook, email, Slack message, etc.
  // await notify(newReleases);
}

// Save current state
fs.writeFileSync(STATE_FILE, JSON.stringify(releases.map(r => r.id)));
💡Run this daily via cron, GitHub Actions, or any scheduler. One API call per label per day — well within the free tier's 1,000 monthly requests even if you track dozens of labels.

Going further

Once the basics are running, a few natural extensions:

  • Track multiple labels. Store an array of label IDs and loop through them in your cron. Each label costs one API call.
  • Filter by genre. The tracks in the response include genre tags. Filter client-side to surface only the styles you care about.
  • Build a release calendar. Group releases by date to create a visual timeline of upcoming and recent drops across all your tracked labels.
  • Combine with browse.Once you know a label's ID, use the browse endpoint with labelIdto surface tracks by genre and year from a single label's catalog.

Frequently asked questions

How do I find a label's ID?

Use the /v1/labels/search endpoint with the label name. The response includes the label ID, which you then pass to /v1/labels/:id for the full catalog.

How often is label data updated?

New releases are imported daily. The label detail endpoint always returns the latest catalog, so polling once a day is sufficient to catch new drops.

Is there a limit on how many tracks are returned?

The label detail endpoint returns up to 500 tracks, sorted by release date (newest first). For most labels this covers the full catalog. For very large labels, you get the 500 most recent tracks.

Can I track multiple labels at once?

Yes — search for each label, store the IDs, and poll each one on a schedule. The endpoints are lightweight enough to check dozens of labels in a single cron run.

Ready to build?

Free API key. No credit card. 1,000 requests to get started.

Get Free API Key