Music Metadata API

The identifiers the music industry actually runs on

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

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a Music Metadata endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
M
/music-metadata/v1

14 active endpoints. Every call is 1 credit.

  • POST/music-metadata/v1/search
  • POST/music-metadata/v1/artist_detail
  • POST/music-metadata/v1/album_detail
  • POST/music-metadata/v1/track_detail
  • POST/music-metadata/v1/label
  • POST/music-metadata/v1/work_detail
  • POST/music-metadata/v1/isrc_lookup
  • +7 more

What Music Metadata endpoints does ReefAPI ship?

14 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

14 endpoints

search

1 cr

search artist/album/release/recording/track/label/work (advanced field search supported).

required
query
optional
type, limit, offset

artist_detail

1 cr

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

required
mbid
optional
inc

album_detail

1 cr

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

required
mbid
optional
entity, inc

track_detail

1 cr

recording + ISRCs + work-relations + artist credits.

required
mbid
optional
inc

label

1 cr

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

required
mbid
optional
inc

work_detail

1 cr

work/composition + ISWC + writer relations.

required
mbid
optional
inc

isrc_lookup

1 cr

reverse ISRC -> recordings (cross-catalog key).

required
isrc
optional
inc

cover_art

1 cr

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

required
mbid
optional
entity

itunes_search

1 cr

iTunes / Apple Music search for artists, albums or songs.

required
query
optional
type, limit, country

charts

1 cr

Apple Music top charts.

required
optional
type, country, limit

artist_profile

1 cr

Rich artist profile.

required
optional
mbid, name

artist_top_tracks

1 cr

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

required
name
optional

similar_artists

1 cr

Artists similar to a given artist, ranked by a collaborative listening model (ListenBrainz, CC0).

required
mbid
optional
limit

lyrics

1 cr

Song lyrics.

required
artist, track
optional
album, duration

Every parameter, every allowed value →

Music Metadata API

3 of 14 endpoints, ready to run

View docs ↗

Artists, releases, recordings, labels or works matching a query, each with its stable identifier.

1 credit1 required · 2 optional
POST/music-metadata/v1/search
ok587 ms · 25 records · sample
{
  "ok": true,
  "meta": {
    "api": "music-metadata",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 587.4,
    "record_count": 25,
    "cache_hit": false,
    "completeness_pct": 100
  },
  "data": {
    "artists": [
      {
        "id": "a74b1b7f-71a5-4011-9441-d0b5e4122711",
        "type": "Group",
        "type-id": "e431f5f6-b5d2-343d-8b36-72607fffb74b",
        "score": 100,
        "name": "Radiohead",
        "sort-name": "Radiohead",
        "country": "GB",
        "area": {
          "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed",
          "type": "Country",
          "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de",
          "name": "United Kingdom",
          "sort-name": "United Kingdom",
          "life-span": {
            "ended": null
          }
        },
        "begin-area": {
          "id": "d840d4b3-8987-4626-928b-398de760cc24",
          "type": "City",
          "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78",
          "name": "Abingdon-on-Thames",
          "sort-name": "Abingdon-on-Thames",
          "life-span": {
            "ended": null
          }
        },
        "isnis": [
          "0000000115475162"
        ],
        "life-span": {
          "begin": "1991",
          "ended": null
        },
        "aliases": [
          {
            "sort-name": "r/head",
            "type-id": "1937e404-b981-3cb7-8151-4c86ebfc8d8e",
            "name": "r/head",
            "locale": null,
            "type": "Search hint",
            "primary": null,
            "begin-date": null,
            "end-date": null
          },
          {
            "sort-name": "电台司令",
            "type-id": "894afba6-2816-3c24-8072-eadb66bd04bc",
            "name": "电台司令",
            "locale": "zh",
            "type": "Artist name",
            "primary": true,
            "begin-date": null,
            "end-date": null
          },
          {
            "sort-name": "れでぃおへっど",
            "type-id": "894afba6-2816-3c24-8072-eadb66bd04bc",
            "name": "レディオヘッド",
            "locale": "ja",
            "type": "Artist name",
            "primary": true,
            "begin-date": null,
            "end-date": null
          }
        ],
        "tags": [
          {
            "count": 18,
            "name": "rock"
          },
          {
            "count": 13,
            "name": "electronic"
          },
          {
            "count": 0,
            "name": "post-rock"
          }
        ]
      },
      {
        "id": "c74f4726-2671-4011-81b6-f70da905c05a",
        "type": "Group",
        "type-id": "e431f5f6-b5d2-343d-8b36-72607fffb74b",
        "score": 64,
        "name": "On a Friday",
        "sort-name": "On a Friday",
        "area": {
          "id": "d840d4b3-8987-4626-928b-398de760cc24",
          "type": "City",
          "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78",
          "name": "Abingdon-on-Thames",
          "sort-name": "Abingdon-on-Thames",
          "life-span": {
            "ended": null
          }
        },
        "begin-area": {
          "id": "d840d4b3-8987-4626-928b-398de760cc24",
          "type": "City",
          "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78",
          "name": "Abingdon-on-Thames",
          "sort-name": "Abingdon-on-Thames",
          "life-span": {
            "ended": null
          }
        },
        "disambiguation": "pre‐Radiohead group, until 1991",
        "life-span": {
          "begin": "1985",
          "end": "1991",
          "ended": true
        },
        "aliases": [
          {
            "sort-name": "Radiohead",
            "type-id": "1937e404-b981-3cb7-8151-4c86ebfc8d8e",
            "name": "Radiohead",
            "locale": null,
            "type": "Search hint",
            "primary": null,
            "begin-date": null,
            "end-date": null
          },
          {
            "sort-name": "Shindig",
            "name": "Shindig",
            "locale": null,
            "type": null,
            "primary": null,
            "begin-date": null,
            "end-date": null
          }
        ],
        "tags": [
          {
            "count": 1,
            "name": "indie pop"
          },
          {
            "count": 1,
            "name": "uk"
          },
          {
            "count": 1,
            "name": "oxford"
          }
        ]
      },
      {
        "id": "3ecaa799-94ae-45cd-9ad1-bcabae4073e1",
        "score": 63,
        "name": "radiohead 3",
        "sort-name": "radiohead 3",
        "disambiguation": "Capsmusic LTD. artist",
        "life-span": {
          "ended": null
        }
      }
    ],
    "count": 29,
    "offset": 0,
    "type": "artist"
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the Music Metadata API works

Music Metadata is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 184 engines.

02
Call
POST /music-metadata/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 credit per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Resolving a track code to what it actually is

Royalty reports, DSP exports and label spreadsheets identify recordings by ISRC. On its own it is twelve characters and no information.

01isrc_lookup
POST/music-metadata/v1/isrc_lookup
{"isrc": "GBAYE0601498"}

Returned the recording with its title, length, and the artist credit with the artist's own identifier and country attached.

02artist_detail
POST/music-metadata/v1/artist_detail
{"mbid": "…", "inc": "aliases+tags+genres"}

Then the artist by the identifier the first call handed you, rather than by a name you would have to disambiguate.

The artist credit is a structured list rather than a string, which is what makes a collaboration parseable instead of a name with ampersands in it.

request
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"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "music-metadata",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

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.

Which identifiers matter, and how the source expects to be used

Measured on searches and identifier lookups.

ISRC is the industry key, and it is directly queryable

Every commercially released recording carries one, and it is what royalty and distribution systems key on. Resolving it to a title, a length and a credited artist is the join most music tooling actually needs.

Artist credits are structured, not a string

A credit comes back as a list of artists with their own identifiers, join phrases and countries. 'Artist A feat. Artist B' as one string is where music data goes wrong; here the two are separate objects.

Disambiguation is a field

Entities carry a disambiguation note — 'UK rock band', 'original stereo studio mix'. Music is full of identically-named artists and multiple mixes of one recording, and this field is the source's own answer to which one you have.

Relations are opt-in, so responses stay small

Aliases, tags, genres and relationship data are requested rather than returned by default. That keeps the common lookup light and makes the expensive one deliberate.

Against us: the source rate-limits, and it means it

This is a free community database with a strict request rate. Fire several calls in parallel and some come back throttled — we saw exactly that when running our own measurements concurrently, and serialising them fixed it. Space your calls rather than fanning out.

What people build with Music Metadata

The jobs this data is most often used for.

14

endpoints

1

credit per call

01

Music apps call isrc_lookup to enrich a track with canonical metadata.

02

Catalog tools use artist_detail and album_detail to resolve a full discography.

03

Rights and royalty tools use label and work_detail to attribute recordings.

What Music Metadata data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 184 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
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"}'
python
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"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Music Metadata.

Get a free key →
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.

25 Media, Film & Knowledge APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Music Metadata, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-30.