- gRPC service with MusicBrainz provider - PostgreSQL schema with migrations - Service layer with database-first caching - Repository pattern for data access - YAML configuration support - Research documentation for 17 music metadata projects
10 KiB
MusicBrainz Server API
Base Endpoint
/ws/2/{entity}/{mbid}
Version: 2 (current stable)
Protocol: HTTPS (HTTP redirects to HTTPS)
Base URL: https://musicbrainz.org/ws/2/
Endpoint Reference
Core Entities (13)
| Entity | Endpoint | Description |
|---|---|---|
| artist | /ws/2/artist/{mbid} |
Artists, bands, orchestras, choirs, characters |
| release | /ws/2/release/{mbid} |
Physical or digital release of recordings |
| recording | /ws/2/recording/{mbid} |
Unique audio recording |
| release-group | /ws/2/release-group/{mbid} |
Logical grouping of releases |
| work | /ws/2/work/{mbid} |
Musical composition or song |
| label | /ws/2/label/{mbid} |
Record label or imprint |
| area | /ws/2/area/{mbid} |
Geographic region (country, city, etc.) |
| event | /ws/2/event/{mbid} |
Concert, festival, or other music event |
| place | /ws/2/place/{mbid} |
Venue, studio, or other location |
| series | /ws/2/series/{mbid} |
Ordered sequence of entities |
| instrument | /ws/2/instrument/{mbid} |
Musical instrument |
| genre | /ws/2/genre/{mbid} |
Music genre |
| url | /ws/2/url/{mbid} |
External URL relationship |
Identifier Lookups (3)
| Lookup | Endpoint | Description |
|---|---|---|
| discid | /ws/2/discid/{discid} |
CD table of contents lookup |
| isrc | /ws/2/isrc/{isrc} |
International Standard Recording Code |
| iswc | /ws/2/iswc/{iswc} |
International Standard Musical Work Code |
User Data Endpoints
| Endpoint | Methods | Description |
|---|---|---|
/ws/2/collection |
GET, POST, PUT, DELETE | User collections |
/ws/2/{entity}/{mbid}/tags |
GET, POST | User tags |
/ws/2/{entity}/{mbid}/ratings |
GET, POST | User ratings (0-100) |
/ws/2/{entity}/{mbid}/annotation |
GET | User annotations |
HTTP Methods
GET - Lookup
Retrieve a single entity by MBID:
GET /ws/2/artist/5b11f4ce-a62d-471e-81fc-a69a8278c7da
GET - Browse
Browse entities related to another entity:
GET /ws/2/release?artist=5b11f4ce-a62d-471e-81fc-a69a8278c7da
GET - Search
Search entities using Lucene query syntax:
GET /ws/2/artist?query=artist:nirvana AND country:US
POST - Submit
Submit new data (requires authentication):
POST /ws/2/recording/{mbid}?client={client_id}
Content-Type: application/json
{
"isrcs": ["USRC17607839"]
}
PUT - Add to Collection
Add entities to a collection (semicolon-separated MBIDs):
PUT /ws/2/collection/{collection_mbid}/releases/{mbid1};{mbid2};{mbid3}
DELETE - Remove from Collection
Remove entities from a collection:
DELETE /ws/2/collection/{collection_mbid}/releases/{mbid1};{mbid2}
Query Parameters
Format Parameter
Parameter: fmt
Values: xml, json
Default: xml
/ws/2/artist/{mbid}?fmt=json
Include Parameters (inc)
Control which related data to include in the response. Multiple values separated by +.
Common Includes (all entities):
aliases- Alternative namesannotation- Latest annotationtags- Folksonomy tagsuser-tags- Tags submitted by authenticated usergenres- Genre tagsuser-genres- Genres submitted by authenticated userratings- Average ratinguser-ratings- Rating submitted by authenticated user
Entity-Specific Includes:
Artist:
recordings- Recordings by this artistreleases- Releases by this artistrelease-groups- Release groups by this artistworks- Works by this artistartist-rels- Relationships to other artistslabel-rels- Relationships to labelsrecording-rels- Relationships to recordingsrelease-rels- Relationships to releasesrelease-group-rels- Relationships to release groupsurl-rels- Relationships to URLswork-rels- Relationships to works
Release:
artist-credits- Artist credits for the releaselabels- Labels for the releaserecordings- Recordings on the releaserelease-groups- Release group for this releasemedia- Media (discs) in the releasediscids- Disc IDs associated with the releaseisrcs- ISRCs for recordings on the release
Recording:
artist-credits- Artist credits for the recordingreleases- Releases containing this recordingisrcs- ISRCs for this recordingwork-rels- Works this recording is a performance of
Release Group:
artist-credits- Artist credits for the release groupreleases- Releases in this group
Work:
artist-rels- Artists related to this work (composers, lyricists)recording-rels- Recordings of this work
Example:
/ws/2/release/{mbid}?inc=artist-credits+labels+recordings+media
Browse Parameters
Browse entities related to another entity:
Parameters:
artist={mbid}- Browse by artistrelease={mbid}- Browse by releaserelease-group={mbid}- Browse by release grouprecording={mbid}- Browse by recordingwork={mbid}- Browse by worklabel={mbid}- Browse by labelarea={mbid}- Browse by areacollection={mbid}- Browse by collectiontrack_artist={mbid}- Browse by track artist
Example:
/ws/2/recording?artist=5b11f4ce-a62d-471e-81fc-a69a8278c7da&limit=100
Pagination Parameters
Parameters:
limit- Number of results (max 100, default 25)offset- Starting offset (default 0)
Example:
/ws/2/artist?query=nirvana&limit=100&offset=100
Search Parameter
Parameter: query
Syntax: Lucene query syntax
Example:
/ws/2/artist?query=artist:nirvana AND country:US AND type:group
Response Formats
XML Format
Namespace: http://musicbrainz.org/ns/mmd-2.0#
<?xml version="1.0" encoding="UTF-8"?>
<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#">
<artist id="5b11f4ce-a62d-471e-81fc-a69a8278c7da" type="Group">
<name>Nirvana</name>
<sort-name>Nirvana</sort-name>
<country>US</country>
<life-span>
<begin>1987</begin>
<end>1994-04-05</end>
<ended>true</ended>
</life-span>
</artist>
</metadata>
JSON Format
{
"id": "5b11f4ce-a62d-471e-81fc-a69a8278c7da",
"type": "Group",
"name": "Nirvana",
"sort-name": "Nirvana",
"country": "US",
"life-span": {
"begin": "1987",
"end": "1994-04-05",
"ended": true
}
}
Authentication
OAuth2 Bearer Token
Primary authentication method for user-specific operations.
Header:
Authorization: Bearer {access_token}
Token Endpoint: https://musicbrainz.org/oauth2/token
Authorization Endpoint: https://musicbrainz.org/oauth2/authorize
Grant Types:
- Authorization Code (with PKCE)
- Refresh Token
HTTP Digest Authentication
Legacy authentication method, still supported.
Header:
Authorization: Digest username="user", realm="musicbrainz.org", ...
OAuth Scopes
| Scope | Description |
|---|---|
profile |
Read user profile information |
email |
Read user email address |
tag |
Submit and modify tags |
rating |
Submit and modify ratings |
collection |
Create and modify collections |
submit_barcode |
Submit barcodes to releases |
submit_isrc |
Submit ISRCs to recordings |
Rate Limiting
Limits:
- Maximum 100 items per page
- 1 request per second (recommended)
- Client identification required for POST requests
Client Identification:
All POST requests must include a client parameter:
POST /ws/2/recording/{mbid}?client=MyApp-1.0
Format: {application_name}-{version}
Rate Limit Headers:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1609459200
CORS Support
Enabled: Yes
Allowed Origins: *
Allowed Methods: GET, POST, PUT, DELETE
Allowed Headers: Authorization, Content-Type
Error Codes
| Code | Description |
|---|---|
| 400 | Bad Request - Invalid parameters or malformed request |
| 401 | Unauthorized - Authentication required |
| 403 | Forbidden - Insufficient permissions |
| 404 | Not Found - Entity does not exist |
| 405 | Method Not Allowed - HTTP method not supported for this endpoint |
| 406 | Not Acceptable - Requested format not available |
| 415 | Unsupported Media Type - Invalid Content-Type |
| 501 | Not Implemented - Feature not yet implemented |
| 503 | Service Unavailable - Server overloaded or maintenance |
Error Response (JSON):
{
"error": "Not Found",
"help": "For usage, please see: https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2"
}
Example Requests
Lookup Artist with Releases
GET /ws/2/artist/5b11f4ce-a62d-471e-81fc-a69a8278c7da?inc=releases+release-groups&fmt=json
Search for Recordings
GET /ws/2/recording?query=recording:"Smells Like Teen Spirit" AND artist:nirvana&fmt=json
Browse Releases by Artist
GET /ws/2/release?artist=5b11f4ce-a62d-471e-81fc-a69a8278c7da&limit=100&offset=0&fmt=json
Submit ISRC
POST /ws/2/recording/5b11f4ce-a62d-471e-81fc-a69a8278c7da?client=MyApp-1.0
Authorization: Bearer {token}
Content-Type: application/json
{
"isrcs": ["USRC17607839"]
}
Add Releases to Collection
PUT /ws/2/collection/{collection_mbid}/releases/{mbid1};{mbid2};{mbid3}
Authorization: Bearer {token}
Collection Management
Collections allow users to organize entities (releases, artists, etc.).
List User Collections:
GET /ws/2/collection?fmt=json
Authorization: Bearer {token}
Get Collection Contents:
GET /ws/2/collection/{collection_mbid}/releases?fmt=json
Add to Collection (semicolon-separated MBIDs):
PUT /ws/2/collection/{collection_mbid}/releases/{mbid1};{mbid2};{mbid3}
Remove from Collection:
DELETE /ws/2/collection/{collection_mbid}/releases/{mbid1};{mbid2}
Best Practices
- Always include a User-Agent header identifying your application
- Respect rate limits - 1 request per second recommended
- Use client parameter for all POST requests
- Cache responses when appropriate
- Use inc parameters to minimize requests
- Handle errors gracefully with exponential backoff
- Use HTTPS for all requests (HTTP redirects to HTTPS)