Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Music Metadata API page →
Media, Film & Knowledge

Music Metadata API & Scraper

The Music Metadata API returns artist, album, track and label data as clean JSON.

14 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 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.

Reference

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.

IdentifierShape and where it is usedMeasured example
MBID, artistUUID. artist_detail, artist_profile, similar_artists.a74b1b7f-71a5-4011-9441-d0b5e4122711 (Radiohead)
MBID, release-groupUUID. The album as a body of work. album_detail with entity=release-group.b1392450-e666-3926-a536-22c65f834433 (OK Computer)
MBID, releaseUUID. One specific pressing of that album. album_detail with entity=release, and cover_art.4b3d18cc-8937-36f4-8de0-481088be58e6 (the Canadian press)
MBID, recordingUUID. One recorded performance. track_detail.9861822b-68d8-4e31-bea5-ed840d971905 ("Airbag")
MBID, workUUID. The composition itself. work_detail.1b4ff597-f43f-3dac-9f76-0e7b7f38d0d2 ("Paranoid Android")
ISRC12 characters: 2 letters, 3 alphanumerics, 7 digits. Attached to a recording.GBAYE9701274, which resolved to 2 distinct recordings
ISWCT-nnn.nnn.nnn-n. Attached to the work, never to the recording.T-010.257.771-8
BarcodeUPC or EAN on a release, returned as a string."724385522925", with catalog-number "7243 8 55229 2 5"
Apple Music idNumeric 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.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "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"
  }
}
Captured response
{
  "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"
  }
}
Actions

What the Music Metadata API does

ActionDescriptionConcrete use caseKey params
searchsearch 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_detailartist + relationships (members/collaborations), discography, aliases, tagsResearch tools call artist_detail to get artist + relationships (members/collaborations), discography, aliases, tags.mbid, inc
album_detailrelease (tracklist+labels+ISRCs+discids) or release-groupCommunity analysts call album_detail to get release (tracklist+labels+ISRCs+discids) or release-group.mbid, entity, inc
track_detailrecording + ISRCs + work-relations + artist creditsMedia monitors call track_detail to get recording + ISRCs + work-relations + artist credits.mbid, inc
labellabel detail (country, label-code, aliases, url-rels)Content platforms call label to get label detail (country, label-code, aliases, url-rels).mbid, inc
work_detailwork/composition + ISWC + writer relationsResearch tools call work_detail to get work/composition + ISWC + writer relations.mbid, inc
isrc_lookupreverse ISRC -> recordings (cross-catalog key)Community analysts call isrc_lookup to get reverse ISRC -> recordings (cross-catalog key).isrc, inc
cover_artCover-Art-Archive images (multi-resolution) for a release/release-groupMedia monitors call cover_art to get cover-Art-Archive images (multi-resolution) for a release/release-group.mbid, entity
itunes_searchiTunes / 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
chartsApple 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_profileRich 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 nameCommunity analysts call artist_profile to get rich artist profile.mbid, name
artist_top_tracksAn 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_artistsArtists similar to a given artist, ranked by a collaborative listening model (ListenBrainz, CC0). Pass the artist's MusicBrainz mbidContent platforms call similar_artists to get artists similar to a given artist, ranked by a collaborative listening model (ListenBrainz, CC0).mbid, limit
lyricsSong lyrics — both plain text and time-synced (LRC) when available — for an artist + track (lrclib, open). Optionally pass album+duration for an exact matchResearch tools call lyrics to get song lyrics.artist, track, album, duration
Code samples

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"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.music-metadata.search with {"query":"radiohead","type":"artist"}.
Use cases

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.
FAQ

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.

docs / music-metadata

Music Metadata

Artists, albums, tracks and cover art.

base /music-metadata/v114 endpoints
post/music-metadata/v1/artist_detail1 credit

artist + relationships (members/collaborations), discography, aliases, tags

ParameterAllowed / rangeDescription
mbidrequiredMusicBrainz id (UUID) of the artist. Find it via the search action (`type=artist`) — mbids are entity-specific, an artist id will not resolve here.
incoptionalAdvanced: override the MusicBrainz 'inc' sub-query (relations/sub-resources to embed, '+'-separated). A tuned default is used when omitted.
Try in playground →
post/music-metadata/v1/album_detail1 credit

release (tracklist+labels+ISRCs+discids) or release-group

ParameterAllowed / rangeDescription
mbidrequiredMusicBrainz id (UUID) of the release. Find it via the search action (`type=release`) — mbids are entity-specific, an artist id will not resolve here.
entity = releaseoptionalrelease · release-groupWhether the MBID is a single release or a release-group.
incoptionalAdvanced: override the MusicBrainz 'inc' sub-query (relations/sub-resources to embed, '+'-separated). A tuned default is used when omitted.
Try in playground →
post/music-metadata/v1/track_detail1 credit

recording + ISRCs + work-relations + artist credits

ParameterAllowed / rangeDescription
mbidrequiredMusicBrainz id (UUID) of the recording. Find it via the search action (`type=recording`) — mbids are entity-specific, an artist id will not resolve here.
incoptionalAdvanced: override the MusicBrainz 'inc' sub-query (relations/sub-resources to embed, '+'-separated). A tuned default is used when omitted.
Try in playground →
post/music-metadata/v1/label1 credit

label detail (country, label-code, aliases, url-rels)

ParameterAllowed / rangeDescription
mbidrequiredMusicBrainz id (UUID) of the label. Find it via the search action (`type=label`) — mbids are entity-specific, an artist id will not resolve here.
incoptionalAdvanced: override the MusicBrainz 'inc' sub-query (relations/sub-resources to embed, '+'-separated). A tuned default is used when omitted.
Try in playground →
post/music-metadata/v1/work_detail1 credit

work/composition + ISWC + writer relations

ParameterAllowed / rangeDescription
mbidrequiredMusicBrainz id (UUID) of the work. Find it via the search action (`type=work`) — mbids are entity-specific, an artist id will not resolve here.
incoptionalAdvanced: override the MusicBrainz 'inc' sub-query (relations/sub-resources to embed, '+'-separated). A tuned default is used when omitted.
Try in playground →
post/music-metadata/v1/isrc_lookup1 credit

reverse ISRC -> recordings (cross-catalog key)

ParameterAllowed / rangeDescription
isrcrequiredInternational Standard Recording Code (2 letters, 3 alphanumerics, 7 digits) — e.g. GBAYE9701274.
incoptionalAdvanced: override the MusicBrainz 'inc' sub-query (relations/sub-resources to embed, '+'-separated). A tuned default is used when omitted.
Try in playground →
post/music-metadata/v1/cover_art1 credit

Cover-Art-Archive images (multi-resolution) for a release/release-group

ParameterAllowed / rangeDescription
mbidrequiredMusicBrainz id (UUID) of the release. Find it via the search action (`type=release`) — mbids are entity-specific, an artist id will not resolve here.
entity = releaseoptionalrelease · release-groupWhether the MBID is a single release or a release-group.
Try in playground →
post/music-metadata/v1/charts1 credit

Apple Music top charts — the most-played songs or albums in a country (updated through the day)

ParameterAllowed / rangeDescription
type = songsoptionalsongs · albumsWhich chart to return.
country = usoptionalus · gb · de · fr · tr · ca · au · jp · br · mx · es · it · nl · se · ru · in · kr · pl · ae · saISO-3166 alpha-2 storefront/market for the chart or search (common set listed; others fall back to 'us').
limit = 25optional1–100Chart depth (1-100). Clamped to range.
Try in playground →
post/music-metadata/v1/artist_profile1 credit

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

ParameterAllowed / rangeDescription
mbidoptionalArtist MusicBrainz id (preferred — exact match).
nameoptionalArtist name (used when no mbid is given).
Try in playground →
post/music-metadata/v1/artist_top_tracks1 credit

An artist's most popular tracks (top 10) with album, duration, genre and music-video link (TheAudioDB)

ParameterAllowed / rangeDescription
namerequiredArtist name.
Try in playground →
post/music-metadata/v1/similar_artists1 credit

Artists similar to a given artist, ranked by a collaborative listening model (ListenBrainz, CC0). Pass the artist's MusicBrainz mbid

ParameterAllowed / rangeDescription
mbidrequiredArtist MusicBrainz id (from search/artist_detail).
limit = 25optional1–100How many similar artists (1-100). Clamped.
Try in playground →
post/music-metadata/v1/lyrics1 credit

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

ParameterAllowed / rangeDescription
artistrequiredArtist name.
trackrequiredTrack / song title.
albumoptionalAlbum name (improves exact-match precision).
durationoptional1–Track length in seconds (exact-match key).
Try in playground →