Music Metadata API & Scraper
The Music Metadata API returns artist, album, track and label data as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary search endpoint returns entities such as artists and recordings with id, name and artist credit plus a total count, and you can pull artist, album, track and work details, a label and an ISRC lookup. It is built for music apps, catalog tools and rights workflows that need normalized music metadata without a scraper. One ReefAPI key, one shared credit pool, the standard envelope.
Which identifier goes where: MBID, ISRC, ISWC, barcode
This API stitches six open catalogs together and each keys on a different identifier. A MusicBrainz id is a 36-character UUID in 8-4-4-4-12 form, and it is entity-specific: the same album has one id as a release-group and a different one for every pressing. Values below were read from live calls on 2026-08-27.
| Identifier | Shape and where it is used | Measured example |
|---|---|---|
| MBID, artist | UUID. artist_detail, artist_profile, similar_artists. | a74b1b7f-71a5-4011-9441-d0b5e4122711 (Radiohead) |
| MBID, release-group | UUID. The album as a body of work. album_detail with entity=release-group. | b1392450-e666-3926-a536-22c65f834433 (OK Computer) |
| MBID, release | UUID. One specific pressing of that album. album_detail with entity=release, and cover_art. | 4b3d18cc-8937-36f4-8de0-481088be58e6 (the Canadian press) |
| MBID, recording | UUID. One recorded performance. track_detail. | 9861822b-68d8-4e31-bea5-ed840d971905 ("Airbag") |
| MBID, work | UUID. The composition itself. work_detail. | 1b4ff597-f43f-3dac-9f76-0e7b7f38d0d2 ("Paranoid Android") |
| ISRC | 12 characters: 2 letters, 3 alphanumerics, 7 digits. Attached to a recording. | GBAYE9701274, which resolved to 2 distinct recordings |
| ISWC | T-nnn.nnn.nnn-n. Attached to the work, never to the recording. | T-010.257.771-8 |
| Barcode | UPC or EAN on a release, returned as a string. | "724385522925", with catalog-number "7243 8 55229 2 5" |
| Apple Music id | Numeric string. charts and itunes_search only, unrelated to MBIDs. | artist_id "1633245914" on the TR songs chart |
Dates arrive at whatever precision MusicBrainz holds, and the two album dates are not the same date. The OK Computer release read here carried date "1997-06-17" (the Canadian pressing) while its release-group first-release-date was "1997-05-21" (the album's first appearance anywhere). Use the release-group date for when the album came out and the release date for a specific edition. Some entities carry only a year.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/music-metadata/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "radiohead",
"type": "artist"
}
}{
"ok": true,
"meta": {
"api": "music-metadata",
"endpoint": "search",
"mode": "live",
"latency_ms": 320.6,
"record_count": 25,
"bytes": 15617,
"cache_hit": false,
"completeness_pct": 100,
"stop_reason": "limit_reached",
"type": "artist",
"total": 29
},
"data": {
"artists": [
{
"id": "a74b1b7f-71a[redacted-phone]-d0b5e4122711",
"type": "Group",
"type-id": "e431f5f6-b5d2-343d-8b36-72607fffb74b",
"score": 100,
"name": "Radiohead",
"sort-name": "Radiohead",
"country": "GB",
"area": {
"id": "8a754a[redacted-phone]a29-b6d7-2b40ea0481ed",
"type": "Country",
"type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de",
"name": "[redacted-name]",
"sort-name": "United Kingdom",
"life-span": {
"ended": "[trimmed-depth]"
}
},
"begin-area": {
"id": "d840d4b[redacted-phone]b-398de760cc24",
"type": "City",
"type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78",
"name": "Abingdon-on-Thames",
"sort-name": "Abingdon-on-Thames",
"life-span": {
"ended": "[trimmed-depth]"
}
},
"isnis": [
"[redacted-phone]"
],
"life-span": {
"begin": "1991",
"ended": null
},
"aliases": [
{
"sort-name": "[trimmed-depth]",
"type-id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"locale": "[trimmed-depth]",
"type": "[trimmed-depth]",
"primary": "[trimmed-depth]",
"begin-date": "[trimmed-depth]",
"end-date": "[trimmed-depth]"
},
{
"sort-name": "[trimmed-depth]",
"type-id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"locale": "[trimmed-depth]",
"type": "[trimmed-depth]",
"primary": "[trimmed-depth]",
"begin-date": "[trimmed-depth]",
"end-date": "[trimmed-depth]"
},
{
"sort-name": "[trimmed-depth]",
"type-id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"locale": "[trimmed-depth]",
"type": "[trimmed-depth]",
"primary": "[trimmed-depth]",
"begin-date": "[trimmed-depth]",
"end-date": "[trimmed-depth]"
}
],
"tags": [
{
"count": "[trimmed-depth]",
"name": "[trimmed-depth]"
},
{
"count": "[trimmed-depth]",
"name": "[trimmed-depth]"
},
{
"count": "[trimmed-depth]",
"name": "[trimmed-depth]"
}
]
},
{
"id": "c74f[redacted-phone]b6-f70da905c05a",
"type": "Group",
"type-id": "e431f5f6-b5d2-343d-8b36-72607fffb74b",
"score": 64,
"name": "[redacted-name]",
"sort-name": "On a Friday",
"area": {
"id": "d840d4b[redacted-phone]b-398de760cc24",
"type": "City",
"type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78",
"name": "Abingdon-on-Thames",
"sort-name": "Abingdon-on-Thames",
"life-span": {
"ended": "[trimmed-depth]"
}
},
"begin-area": {
"id": "d840d4b[redacted-phone]b-398de760cc24",
"type": "City",
"type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78",
"name": "Abingdon-on-Thames",
"sort-name": "Abingdon-on-Thames",
"life-span": {
"ended": "[trimmed-depth]"
}
},
"disambiguation": "pre‐Radiohead group, until 1991",
"life-span": {
"begin": "1985",
"end": "1991",
"ended": true
},
"aliases": [
{
"sort-name": "[trimmed-depth]",
"type-id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"locale": "[trimmed-depth]",
"type": "[trimmed-depth]",
"primary": "[trimmed-depth]",
"begin-date": "[trimmed-depth]",
"end-date": "[trimmed-depth]"
},
{
"sort-name": "[trimmed-depth]",
"name": "[trimmed-depth]",
"locale": "[trimmed-depth]",
"type": "[trimmed-depth]",
"primary": "[trimmed-depth]",
"begin-date": "[trimmed-depth]",
"end-date": "[trimmed-depth]"
}
],
"tags": [
{
"count": "[trimmed-depth]",
"name": "[trimmed-depth]"
},
{
"count": "[trimmed-depth]",
"name": "[trimmed-depth]"
},
{
"count": "[trimmed-depth]",
"name": "[trimmed-depth]"
}
]
},
{
"id": "3ecaa799-94ae-45cd-9ad1-bcabae4073e1",
"score": 62,
"name": "[redacted-name]",
"sort-name": "radiohead 3",
"disambiguation": "Capsmusic LTD. artist",
"life-span": {
"ended": null
}
}
],
"count": 29,
"offset": 0,
"type": "artist"
}
}What the Music Metadata API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | search artist/album/release/recording/track/label/work (advanced field search supported) | Content platforms call search to search artist/album/release/recording/track/label/work (advanced field search supported). | query, type, limit, offset |
| artist_detail | artist + relationships (members/collaborations), discography, aliases, tags | Research tools call artist_detail to get artist + relationships (members/collaborations), discography, aliases, tags. | mbid, inc |
| album_detail | release (tracklist+labels+ISRCs+discids) or release-group | Community analysts call album_detail to get release (tracklist+labels+ISRCs+discids) or release-group. | mbid, entity, inc |
| track_detail | recording + ISRCs + work-relations + artist credits | Media monitors call track_detail to get recording + ISRCs + work-relations + artist credits. | mbid, inc |
| label | label detail (country, label-code, aliases, url-rels) | Content platforms call label to get label detail (country, label-code, aliases, url-rels). | mbid, inc |
| work_detail | work/composition + ISWC + writer relations | Research tools call work_detail to get work/composition + ISWC + writer relations. | mbid, inc |
| isrc_lookup | reverse ISRC -> recordings (cross-catalog key) | Community analysts call isrc_lookup to get reverse ISRC -> recordings (cross-catalog key). | isrc, inc |
| cover_art | Cover-Art-Archive images (multi-resolution) for a release/release-group | Media monitors call cover_art to get cover-Art-Archive images (multi-resolution) for a release/release-group. | mbid, entity |
| itunes_search | iTunes / Apple Music search for artists, albums or songs — returns genre, high-res artwork, a 30s preview URL, price and store link (country-aware) | Content platforms call itunes_search to get iTunes / Apple Music search for artists, albums or songs. | query, type, limit, country |
| charts | Apple Music top charts — the most-played songs or albums in a country (updated through the day) | Research tools call charts to get apple Music top charts. | type, country, limit |
| artist_profile | Rich artist profile: biography, genre/style/mood, formed year, label, follower/popularity counts, social links and images (TheAudioDB). Pass the MusicBrainz mbid (from search/artist_detail) for an exact match, or an artist name | Community analysts call artist_profile to get rich artist profile. | mbid, name |
| artist_top_tracks | An artist's most popular tracks (top 10) with album, duration, genre and music-video link (TheAudioDB) | Media monitors call artist_top_tracks to get an artist's most popular tracks (top 10) with album, duration, genre and music-video link (Th…. | name |
| similar_artists | Artists similar to a given artist, ranked by a collaborative listening model (ListenBrainz, CC0). Pass the artist's MusicBrainz mbid | Content platforms call similar_artists to get artists similar to a given artist, ranked by a collaborative listening model (ListenBrainz, CC0). | mbid, limit |
| lyrics | Song lyrics — both plain text and time-synced (LRC) when available — for an artist + track (lrclib, open). Optionally pass album+duration for an exact match | Research tools call lyrics to get song lyrics. | artist, track, album, duration |
Call search from your stack
curl -X POST https://api.reefapi.com/music-metadata/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"radiohead","type":"artist"}'import requests
r = requests.post(
"https://api.reefapi.com/music-metadata/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "radiohead",
"type": "artist"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/music-metadata/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "radiohead",
"type": "artist"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.music-metadata.search with {"query":"radiohead","type":"artist"}.Who uses this API and why
- Music apps call isrc_lookup to enrich a track with canonical metadata.
- Catalog tools use artist_detail and album_detail to resolve a full discography.
- Rights and royalty tools use label and work_detail to attribute recordings.
Questions developers ask before integrating
Is a MusicBrainz id a UUID, and why do I end up with two ids for one album?
Yes, a plain 36-character UUID such as 4b3d18cc-8937-36f4-8de0-481088be58e6. You end up with two because MusicBrainz separates the album as a concept (the release-group) from each pressing of it (a release). One live album_detail call returned release id 4b3d18cc-8937-36f4-8de0-481088be58e6 with country CA and barcode 724385522925, and nested inside it a release-group with its own id b1392450-e666-3926-a536-22c65f834433. Pass entity=release-group for the album, entity=release for one edition's tracklist, barcode and label.
Why did one ISRC come back with more than one recording?
Because an ISRC identifies a recorded master and MusicBrainz keeps remasters as separate recordings. A live lookup on GBAYE9701274 returned count 2, both titled "Airbag" by Radiohead: one with MBID 9861822b-68d8-4e31-bea5-ed840d971905, length 287880 ms and a first-release-date of 2008-05-28, the other 4a7fea2e-545b-4c63-bc9a-9943cc3a29d7 at 284400 ms and 1997-05-21. Read `count` and pick by first-release-date or length instead of assuming a single hit.
Where is the ISWC? track_detail did not return one.
An ISWC belongs to the composition, not to any recording of it, so it is never a top-level field on a recording. A live track_detail call returned isrcs [] and meta.isrc_count 0, but its relations array carried a performance relation pointing at the work "Paranoid Android", and that work object held iswcs ["T-010.257.771-8"]. Read relations[].work.iswcs, or take the work's MBID and call work_detail.
Why does a recording have no ISRC at all?
Usually because it was never commercially issued. The recording measured above turned out to be a live performance: its disambiguation field read "live, 2003-08-23: Alpine Valley, East Troy, WI, USA", and live, bootleg and demo recordings routinely carry no ISRC. meta.completeness_pct dropped to 80 on that call, which is the signal to watch. Studio recordings that appeared on a commercial release normally do have one.
Why did the lyrics action return a remix instead of the song I asked for?
Because with only artist and track it falls back to a fuzzy search. Asking for Daft Punk and "Get Lucky" returned track "Get Lucky (Daft Punk remix)" with duration 630.02 seconds, and meta.matched read "search" rather than an exact match. Pass `album` and `duration` in seconds to pin the exact master. When a match is found, plain_lyrics is unformatted text and synced_lyrics is LRC with per-line timestamps like [00:35.79].
Why is the same band member listed several times in artist_detail?
Because there is one row per membership relation, not one per person. A live call on Radiohead returned meta.member_count 20 for a five-piece band, with Colin Greenwood appearing three times under the same MBID f23074f4-2c06-477a-bf1d-12fa66e087ee, once for each instrument or period MusicBrainz records. Deduplicate on the member's MBID before you count or display.
Are the chart and iTunes ids MusicBrainz ids?
No. charts and itunes_search live entirely in Apple's namespace and return numeric ids as strings. A live TR songs chart returned artist_id "1633245914" and track id "6773421035", plus meta.updated as an RFC-1123 timestamp. Nothing joins those to a MusicBrainz MBID automatically, so if you need both you have to match on artist and title yourself. Twenty storefronts are accepted, including tr, jp, br, kr and sa; anything else falls back to us.
Which catalog is behind which action?
MusicBrainz backs search, artist_detail, album_detail, track_detail, label, work_detail and isrc_lookup. Cover Art Archive backs cover_art. Apple and iTunes back itunes_search and charts. TheAudioDB backs artist_profile and artist_top_tracks. ListenBrainz backs similar_artists. lrclib backs lyrics. That matters because coverage differs sharply: MusicBrainz is deep on catalog metadata but carries no popularity data, while the Apple and TheAudioDB actions have popularity, bios and artwork but no ISRCs or ISWCs.
What is the Music Metadata API?
Music Metadata API is a ReefAPI endpoint group for artists, albums, tracks and cover art. It returns live JSON through POST requests under /music-metadata/v1.
Is the Music Metadata API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Music Metadata calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Music Metadata login or account?
No login to Music Metadata is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Music Metadata data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Music Metadata API use?
Music Metadata actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Music Metadata from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call music-metadata actions with the same key, credit pool and JSON envelope used by normal REST requests.