MusicBrainz Scraper: Artists, Releases & Recordings avatar

MusicBrainz Scraper: Artists, Releases & Recordings

Pricing

from $0.37 / 1,000 entity scrapeds

Go to Apify Store
MusicBrainz Scraper: Artists, Releases & Recordings

MusicBrainz Scraper: Artists, Releases & Recordings

Scrape MusicBrainz artists, releases, recordings, labels and works with MBIDs, ISRCs, tags, genres, dates and relationships. No key, no proxy, no browser.

Pricing

from $0.37 / 1,000 entity scrapeds

Rating

0.0

(0)

Developer

Arman Hossain

Arman Hossain

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

19 days ago

Last modified

Share

MusicBrainz Scraper: Artists, releases, recordings, labels and works, MBIDs, ISRCs, tags, genres, ratings and the full relationship graph

Pulls structured entities out of the MusicBrainz open music encyclopedia: artists, releases, recordings, labels and works. You get MBIDs, ISRCs, ISWCs, tags, genres, aliases, ratings, dates and the full relationship graph.

MusicBrainz publishes everything through its WS/2 web service, and this Actor reads that service directly. no credentials, no proxy, no browser, no login. It sends a descriptive User-Agent and paces itself at one request per second, which is exactly what MusicBrainz asks of API clients.

Agent skill: SKILL.md

https://api.apify.com/v2/key-value-stores/t7YoTxpZEJOWvw4Ug/records/musicbrainz-scraper.md

What you get

FieldWhat it holds
entityType, mbid, urlEntity kind, MusicBrainz ID and the canonical musicbrainz.org page
name, sortNameDisplay name, or title for releases, recordings and works, plus the sort name
type, disambiguationSub-type such as Group, Person, Song or Album, and the community disambiguation comment
country, areaISO country code and the human-readable area name
beginDate, endDateLife-span for artists and labels, release date for releases, first-release date for recordings
lengthMsRecording duration in milliseconds
artistCreditCredited artist names, in order
tags, genres, aliasesCommunity tags, curated genres and every known alias
isrcs, iswcsRecording ISRCs and work ISWCs
labelsLabel name, MBID and catalogue number for a release
releaseCountNumber of releases MusicBrainz links to the entity
rating, ratingVotesCommunity rating out of 5 and the vote count
relationsFlattened relationship graph: band members, writers, official URLs, label links
score, matchedQuerySearch relevance from 0 to 100, and the query that produced the hit
scrapedAtRun timestamp

RUN_SUMMARY in the key-value store holds per-run counts, the filters you used, and every query or MBID that failed.

Use cases

  • Music catalogues. Seed a metadata layer with open, permissively licensed reference data.
  • Track identity via ISRC. Match a recording across streaming platforms and rights databases.
  • AI agent enrichment. A cheap, reliable lookup tool for music questions that would otherwise be hallucinated.
  • Discography research. Count releases per artist or label and track them over time.
  • Credit and rights analysis. Walk the relations graph to find writers, performers and producers.

Quick start

Search for artists by name:

{
"entityType": "artist",
"searchQueries": ["radiohead", "aphex twin"],
"maxResults": 20
}

Look up specific entities by MBID, with the relationship graph:

{
"entityType": "artist",
"mbids": [
"a74b1b7f-71a5-4011-9441-d0b5e4122711",
"https://musicbrainz.org/artist/f23074f4-2c06-477a-bf1d-12fa66e087ee"
],
"includeRelations": true,
"contactEmail": "you@example.com"
}

Lucene-syntax search over recordings, for ISRC harvesting:

{
"entityType": "recording",
"searchQueries": ["artist:queen AND recording:\"bohemian rhapsody\""],
"maxResults": 50,
"contactEmail": "you@example.com"
}

Input

FieldTypeDefaultNotes
entityTypestringartistOne of artist, release, recording, label, work. Applies to every query and MBID in the run.
searchQueriesarray[]Free text or Lucene syntax, run against the MusicBrainz search index.
mbidsarray[]MusicBrainz IDs to fetch directly. Full musicbrainz.org URLs are accepted and the MBID is extracted.
includeRelationsbooleanfalseAdds the relationship graph. No extra requests, but records get much larger: 92 relations for Radiohead.
maxResultsinteger25Total entities saved across all queries and MBIDs.
contactEmailstringnoneOptional. Added to the User-Agent, because MusicBrainz asks clients to identify themselves.

You need at least one of searchQueries or mbids. Supplying both is fine, and MBIDs are processed first. Duplicates across queries are removed before anything is fetched, so overlapping searches never cost you twice.

Output example

A real record, produced by {"entityType": "recording", "mbids": ["b1a9c0e9-d987-4042-ae91-78d6a3267d69"]}, with tag and genre lists truncated here:

{
"entityType": "recording",
"mbid": "b1a9c0e9-d987-4042-ae91-78d6a3267d69",
"name": "Bohemian Rhapsody",
"sortName": null,
"type": null,
"disambiguation": null,
"country": null,
"area": null,
"beginDate": "1975-11-21",
"endDate": null,
"lengthMs": 355106,
"artistCredit": ["Queen"],
"tags": ["album rock", "alternative rock", "arena rock", "art rock"],
"genres": ["alternative rock", "arena rock", "art rock", "baroque pop"],
"aliases": ["Bohemian Rapsody", "Bohemian Rhapsody (remastered 2011)", "ボヘミアン・ラプソディ"],
"isrcs": ["GBCEE0100112", "GBCEE0500364", "GBCEE7500015", "GBUM71029604"],
"iswcs": [],
"labels": [],
"releaseCount": 352,
"rating": null,
"ratingVotes": null,
"relations": [],
"score": null,
"matchedQuery": null,
"url": "https://musicbrainz.org/recording/b1a9c0e9-d987-4042-ae91-78d6a3267d69",
"scrapedAt": "2026-08-06T11:38:26.193Z"
}

Every key is present on every record. Fields that do not apply to an entity type, such as lengthMs on a label or labels on a work, come back null or [] rather than disappearing, so CSV exports stay rectangular.

Finding an MBID

An MBID is the UUID in any musicbrainz.org URL.

URL you seeMBID
musicbrainz.org/artist/a74b1b7f-71a5-4011-9441-d0b5e4122711a74b1b7f-71a5-4011-9441-d0b5e4122711
musicbrainz.org/release/4b3d18cc-8937-36f4-8de0-481088be58e64b3d18cc-8937-36f4-8de0-481088be58e6

Paste the whole URL if you like, and the Actor extracts the UUID itself. If you do not have one, use searchQueries instead and read the MBID off the results. score tells you how confident the search index was, and 100 means an exact match.

API example

curl -X POST "https://api.apify.com/v2/acts/arman-bd~musicbrainz-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"entityType": "artist",
"searchQueries": ["radiohead"],
"maxResults": 10,
"contactEmail": "you@example.com"
}'

JavaScript example

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('arman-bd/musicbrainz-scraper').call({
entityType: 'artist',
searchQueries: ['radiohead', 'portishead'],
includeRelations: true,
maxResults: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const a of items) console.log(`${a.name} (${a.country}): ${a.releaseCount} releases`);

Notes

  • One request per second is enforced in code. MusicBrainz throttles anonymous clients hard and blocks repeat offenders. A single global rate limiter spaces every call 1.2 seconds apart, so budget roughly 2.5 seconds per entity for artists, labels and recordings, and 1.2 seconds for releases and works. When the service throttles anyway it answers 503, which the retry logic absorbs.
  • Some entities take two requests. Artists, labels and recordings get a second, tiny browse call that returns an exact releaseCount. Releases and works have no equivalent browse filter, so releaseCount is null for them.
  • The inc parameter is type-specific. MusicBrainz rejects isrcs on a label with HTTP 400 rather than ignoring it, so each entity type sends its own include list. You never have to think about this.
  • One failure does not kill the run. A bad MBID, a dead query or a browse-count hiccup is recorded in RUN_SUMMARY.failures and the run continues. The Actor errors only if nothing at all was saved.
  • Transient errors get retried. 429, 503 and 5xx get three attempts with linear backoff. 400 and 404 are treated as fatal for that entity, because retrying a malformed MBID never helps.
  • Public data only. MusicBrainz core data is in the public domain, and no authentication or personal data is involved.

FAQ

Do I need a proxy? No. Proxy configuration is not required to run this Actor.

Do I need a MusicBrainz account or API key? No. You supply no credentials.

Why is contactEmail worth filling in? MusicBrainz asks clients to identify themselves so they can email you before blocking a misbehaving integration. It costs nothing and makes throttling far less likely on heavy scheduled runs.

Why are isrcs empty on some recordings? ISRCs are contributed by editors and coverage is uneven. A canonical studio recording usually has several, a live bootleg often none. The Actor reports what MusicBrainz holds and never invents identifiers.

Can I search several entity types in one run? No, one entityType per run, because search endpoints and include lists differ per type. Run the Actor once per type and merge the datasets, or schedule several runs.

How long does a big run take? About 2.5 seconds per artist, label or recording and 1.2 seconds per release or work. A 500-artist run is roughly 20 minutes, so raise the timeout above the 10-minute default before scheduling one.

Can I plug it into something else? Yes. Apify API, the client libraries, webhooks, scheduled runs, dataset exports to JSON, CSV or Excel, or MCP. The output is structured JSON.