MusicBrainz APImusicbrainz.org ↗
Access MusicBrainz music metadata via 7 endpoints: search artists and recordings, fetch credits, genres, ISRCs, track listings, and release editions.
What is the MusicBrainz API?
This API exposes 7 endpoints covering MusicBrainz's open music database, returning artist metadata, recording credits, release track listings, and release group editions. The get_recording_details endpoint alone surfaces musician instruments, producer and engineer credits, ISRC codes, work relationships (cover/original), and every release the recording appears on — all keyed by MusicBrainz UUID (MBID). Full-text search endpoints support Lucene query syntax for precise filtering across artists and recordings.
curl -X GET 'https://api.parse.bot/scraper/b76d1d93-5af4-4108-bc84-5729f72c3ce5/search_artist?limit=5&query=Aretha+Franklin&offset=0' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace musicbrainz-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: MusicBrainz SDK — search artists, drill into albums, explore recordings and Muscle Shoals scene."""
from parse_apis.musicbrainz_music_metadata_api import MusicBrainz, EntityType, ResourceNotFound
mb = MusicBrainz()
# Search for artists and inspect summary fields
for artist in mb.artists.search(query="Massive Attack", limit=3):
print(artist.name, artist.score, artist.country)
# Drill into the first artist for full details
summary = mb.artists.search(query="Radiohead", limit=1).first()
if summary:
full = summary.details()
print(full.name, full.type, full.country)
if full.rating:
print(full.rating.value, full.rating.votes_count)
for genre in full.genres[:3]:
print(genre.name, genre.count)
# Walk release groups (albums/EPs)
for rg in full.release_groups[:2]:
print(rg.title, rg.primary_type, rg.first_release_date)
# Drill into release group for all editions
rg_full = rg.details()
print(rg_full.title, rg_full.primary_type)
for edition in rg_full.releases[:2]:
print(edition.title, edition.date, edition.country)
# Drill into a specific release for track listing
release = edition.details()
print(release.title, release.status)
if release.cover_art_archive:
print(release.cover_art_archive.front, release.cover_art_archive.count)
for medium in release.media[:1]:
print(medium.format, medium.track_count)
for track in medium.tracks[:2]:
print(track.title, track.length_formatted, track.number)
break
# Search recordings and get detailed credits
rec = mb.recordings.search(query='artist:"Massive Attack"', limit=1).first()
if rec:
print(rec.title, rec.length_formatted, rec.score)
for ac in rec.artist_credits:
print(ac.name, ac.joinphrase)
full_rec = rec.details()
print(full_rec.title, full_rec.video)
for credit in full_rec.credits[:3]:
print(credit.type, credit.direction)
if credit.artist:
print(credit.artist.name, credit.artist.type)
# Discover Muscle Shoals music scene entities
scene = mb.muscleshowalsscenes.discover(entity_type=EntityType.ARTISTS)
print(scene.artists, scene.places, scene.labels)
# Typed error handling
try:
bad = mb.artists.search(query="zzz_nonexistent_xyz", limit=1).first()
if bad:
bad.details()
except ResourceNotFound as exc:
print(f"Not found: {exc.mbid}")
print("exercised: artists.search / details / release_groups.details / releases.details / recordings.search / recording.details / muscleshowalsscenes.discover")
Full-text search over MusicBrainz artists. Supports Lucene query syntax for field-specific searches (e.g. area:"New York", type:Group). Returns paginated artist summaries with tags, genres, aliases, and life span. Each result includes an MBID usable with get_artist_details for full metadata.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of results (1-100). |
| queryrequired | string | Search query. Supports Lucene syntax: plain text ('Aretha Franklin'), field-specific ('area:"New York"'), or combined ('artist:"Beatles" AND type:Group'). |
| offset | integer | Pagination offset for results. |
{
"type": "object",
"fields": {
"count": "integer, total number of matching artists",
"offset": "integer, current pagination offset",
"artists": "array of ArtistSummary objects"
},
"sample": {
"data": {
"count": 729,
"offset": 0,
"artists": [
{
"id": "2f9ecbed-27be-40e6-abca-6de49d50299e",
"area": "United States",
"name": "Aretha Franklin",
"tags": [
{
"name": "soul",
"count": 8
}
],
"type": "Person",
"score": 100,
"gender": "female",
"genres": [],
"aliases": [
"Aretha Louise Franklin"
],
"country": "US",
"life_span": {
"end": "2018-08-16",
"begin": "1942-03-25",
"ended": true
},
"sort_name": "Franklin, Aretha",
"begin_area": "Memphis",
"disambiguation": null
}
]
},
"status": "success"
}
}About the MusicBrainz API
Search and Lookup
search_artist and search_recording both accept a query parameter with optional Lucene field syntax — for example area:"New York" or title:"Yesterday" AND artist:"The Beatles". Results are paginated via limit (1–100) and offset. Each hit returns a summary object including MBIDs, tags, genres, and aliases, which can be passed directly to the detail endpoints for deeper data.
Artist and Recording Details
get_artist_details takes an mbid and returns the artist's type (Person or Group), gender, area, isnis, ipis, genres, tags, community rating, and inline release_groups — albums, singles, and EPs — without requiring additional calls. get_recording_details returns length in milliseconds, isrcs, video flag, genres, and a credits array that captures instrument performers, producers, engineers, and work relationships including cover/original attribution. The releases array inside the response lists every release the recording appears on, with date, status, and country.
Release and Release Group Data
get_release_details returns a full track listing via the media array: each disc includes format, track_count, and a tracks array where every track carries its own recording MBID, duration, and per-track artist credits. Label info, barcode, packaging, and release events are also included. get_release_group_details lists all pressings and editions of an album across countries under a single releases array, alongside primary_type, secondary_types, artist_credits, and community rating.
Muscle Shoals Specialty Endpoint
search_muscle_shoals is a focused endpoint for discovering music industry entities tied to Muscle Shoals, Alabama. The entity_type parameter filters results to artists, places (studios like FAME and Muscle Shoals Sound), or labels. Setting include_releases to true adds release group data for artists and release data for labels. Results distinguish between artists based in the area and artists born there via separate arrays.
The MusicBrainz API is a managed, monitored endpoint for musicbrainz.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when musicbrainz.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official musicbrainz.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a musician credits database by chaining search_recording with get_recording_details to extract instrument and production credits per track.
- Identify all international pressings and editions of an album using get_release_group_details and its releases array.
- Enrich a music catalog with ISRC codes and duration data from get_recording_details for royalty tracking or fingerprinting.
- Generate genre and tag profiles for artists using the genres and tags arrays returned by get_artist_details.
- Map recording cover/original relationships from the credits work relationships in get_recording_details.
- Compile a full tracklist with per-track recording MBIDs from get_release_details to link to deeper credit data.
- Research the Muscle Shoals music ecosystem — studios, labels, and affiliated artists — using search_muscle_shoals with entity_type filtering.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.