a1f6701bac
- 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
417 lines
10 KiB
Markdown
417 lines
10 KiB
Markdown
# 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 names
|
|
- `annotation` - Latest annotation
|
|
- `tags` - Folksonomy tags
|
|
- `user-tags` - Tags submitted by authenticated user
|
|
- `genres` - Genre tags
|
|
- `user-genres` - Genres submitted by authenticated user
|
|
- `ratings` - Average rating
|
|
- `user-ratings` - Rating submitted by authenticated user
|
|
|
|
**Entity-Specific Includes:**
|
|
|
|
**Artist:**
|
|
- `recordings` - Recordings by this artist
|
|
- `releases` - Releases by this artist
|
|
- `release-groups` - Release groups by this artist
|
|
- `works` - Works by this artist
|
|
- `artist-rels` - Relationships to other artists
|
|
- `label-rels` - Relationships to labels
|
|
- `recording-rels` - Relationships to recordings
|
|
- `release-rels` - Relationships to releases
|
|
- `release-group-rels` - Relationships to release groups
|
|
- `url-rels` - Relationships to URLs
|
|
- `work-rels` - Relationships to works
|
|
|
|
**Release:**
|
|
- `artist-credits` - Artist credits for the release
|
|
- `labels` - Labels for the release
|
|
- `recordings` - Recordings on the release
|
|
- `release-groups` - Release group for this release
|
|
- `media` - Media (discs) in the release
|
|
- `discids` - Disc IDs associated with the release
|
|
- `isrcs` - ISRCs for recordings on the release
|
|
|
|
**Recording:**
|
|
- `artist-credits` - Artist credits for the recording
|
|
- `releases` - Releases containing this recording
|
|
- `isrcs` - ISRCs for this recording
|
|
- `work-rels` - Works this recording is a performance of
|
|
|
|
**Release Group:**
|
|
- `artist-credits` - Artist credits for the release group
|
|
- `releases` - 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 artist
|
|
- `release={mbid}` - Browse by release
|
|
- `release-group={mbid}` - Browse by release group
|
|
- `recording={mbid}` - Browse by recording
|
|
- `work={mbid}` - Browse by work
|
|
- `label={mbid}` - Browse by label
|
|
- `area={mbid}` - Browse by area
|
|
- `collection={mbid}` - Browse by collection
|
|
- `track_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
|
|
<?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
|
|
|
|
```json
|
|
{
|
|
"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):**
|
|
```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
|
|
|
|
1. **Always include a User-Agent header** identifying your application
|
|
2. **Respect rate limits** - 1 request per second recommended
|
|
3. **Use client parameter** for all POST requests
|
|
4. **Cache responses** when appropriate
|
|
5. **Use inc parameters** to minimize requests
|
|
6. **Handle errors gracefully** with exponential backoff
|
|
7. **Use HTTPS** for all requests (HTTP redirects to HTTPS)
|