{"openapi":"3.1.0","info":{"title":"musiccloud API","description":"Public REST API for resolving music URLs and search queries, retrieving persisted shares, and consuming Creative-Commons media and metadata.\n\n## Authentication\n\nExactly three operations require a key issued to a client registration: `POST /api/v1/resolve`, `POST /api/v1/cc/resolve`, and `GET /api/v1/link/{id}`. A Developer Project owns its subscription and shared quota and may contain separate development, confidential, and public registrations. Send a registration key as `X-API-Key: mc_live_<prefix>_<secret>`. All other operations in this reference are callable without a key. Manage projects and registrations at https://developer.musiccloud.io/dashboard/api-access, then create or rotate registration keys at https://developer.musiccloud.io/dashboard/api-keys. A key is shown only when created or rotated. Store it as a secret and never embed it in browser code. Missing, invalid, suspended, or revoked project, registration, or key credentials receive `401`.\n\n## Rate limiting\n\nThree independent rules can apply:\n\n1. The three API-key operations use the rolling `60`-second and rolling `24`-hour quotas owned by the Developer Project. Registrations under one project share those quotas; an optional registration cap can only narrow them.\n2. Public data operations `GET /api/v1/resolve`, `GET /api/v1/share/{shortId}`, `GET /api/v1/share/{shortId}/preview`, `GET /api/v1/artist-info`, `GET /api/v1/cc/artist-info`, `GET /api/v1/cc/audio/{jamendoId}`, `GET /api/v1/cc/download/{jamendoId}`, and `GET /api/v1/cc/bandcamp/{jamendoId}` allow `10` requests in a rolling `60`-second window per client IP.\n3. Every route is also protected by a global ceiling of `300` requests in a rolling `60`-second window per client IP.\n\nA rejected request returns `429 Too Many Requests`, the `ErrorResponse` JSON body, and `Retry-After`. When available, `context.limit`, `context.windowSeconds`, and `context.retryAfterSeconds` describe the rule that rejected the request.","version":"2.1.10"},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Registration credential for a Developer Project. Project quotas are shared by all registrations; registration caps may only narrow them."}},"schemas":{"Album":{"type":"object","description":"Album-level metadata, returned for album resolves and share pages.","required":["title","artists","vinylLayout"],"additionalProperties":false,"properties":{"title":{"type":"string","description":"Album title as reported by the origin service."},"artists":{"type":"array","items":{"type":"string"},"description":"Credited album artists in source order."},"artistCredits":{"type":"array","items":{"$ref":"#/components/schemas/ArtistCredit"},"description":"Normalized artist entity credits in display order. The key is omitted when no normalized credits are available."},"releaseDate":{"type":"string","format":"date","description":"Original album release date in `YYYY-MM-DD` format. The key is omitted when unavailable."},"totalTracks":{"type":"integer","minimum":0,"description":"Total number of tracks. The key is omitted when the source supplies no count."},"artworkUrl":{"type":"string","format":"uri","description":"Absolute album-artwork URL. The key is omitted when no artwork is available."},"label":{"type":"string","description":"Record-label name. The key is omitted when no label is available."},"upc":{"type":"string","description":"Universal Product Code. The key is omitted when no `UPC` is available."},"previewUrl":{"type":"string","format":"uri","description":"Preview audio URL. The key is omitted when no usable preview is available."},"vinylLayout":{"anyOf":[{"$ref":"#/components/schemas/VinylLayout"},{"type":"null"}],"description":"The key is always included on public album response objects. Its value is the Discogs-derived vinyl layout, or `null` when no suitable pressing is available."}},"example":{"title":"Hunting High and Low","artists":["a-ha"],"artistCredits":[{"artistEntityId":"artist_a_ha","name":"a-ha","role":"main","position":0}],"releaseDate":"1985-06-01","totalTracks":10,"artworkUrl":"https://i.scdn.co/image/ab67616d0000b273e58a0f7f1f2f8e4f6a3c8b2d","label":"Warner Records","upc":"075993257228","previewUrl":"https://p.scdn.co/mp3-preview/7ae363b1bc5d7c6bd9cbca4d4f2ae6e3a8c7b0f5","vinylLayout":{"discogsReleaseId":"249504","sides":[{"label":"A","tracks":[{"position":"A1","title":"Take on Me","durationMs":225280}]}]}}},"AlbumResolveSuccess":{"type":"object","description":"Successful album resolve: unified album metadata plus per-service deep-links.","required":["type","id","shortUrl","album","links"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["album"],"description":"Discriminator: always `album` for this variant."},"id":{"type":"string","description":"Persisted musiccloud album ID for correlation. No public endpoint accepts it; use the final path segment of `shortUrl` with `GET /api/v1/share/{shortId}` to fetch the share payload."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this resolved album."},"album":{"allOf":[{"$ref":"#/components/schemas/Album"},{"type":"object","required":["vinylLayout"]}],"description":"Resolved album metadata with a mandatory vinyl lookup state."},"links":{"type":"array","items":{"$ref":"#/components/schemas/PlatformLink"},"description":"Cross-service deep-links for the resolved album."}},"example":{"type":"album","id":"al_01HZ8P3C7Q8R9S0T1U2V3W4X5Y","shortUrl":"https://musiccloud.io/dEf456y","album":{"title":"Hunting High and Low","artists":["a-ha"],"releaseDate":"1985-06-01","totalTracks":10,"artworkUrl":"https://i.scdn.co/image/ab67616d0000b273e58a0f7f1f2f8e4f6a3c8b2d","label":"Warner Records","upc":"075993257228","vinylLayout":{"discogsReleaseId":"249504","sides":[{"label":"A","tracks":[{"position":"A1","title":"Take on Me","durationMs":225280}]}]}},"links":[{"service":"spotify","displayName":"Spotify","url":"https://open.spotify.com/album/7svV5BWuNkkZrOlxRjKyLK","confidence":1,"matchMethod":"upc"},{"service":"apple-music","displayName":"Apple Music","url":"https://music.apple.com/us/album/hunting-high-and-low/1433036073","confidence":1,"matchMethod":"upc"}]}},"AlbumSharePageResponse":{"type":"object","description":"Commercial share-page payload for one resolved album.","required":["type","og","album","links","shortUrl"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["album"],"description":"Always `album` for this response shape."},"og":{"allOf":[{"$ref":"#/components/schemas/OgMeta"}],"description":"Open-Graph metadata for rendering and social sharing."},"album":{"allOf":[{"$ref":"#/components/schemas/Album"}],"description":"Stored canonical album metadata."},"links":{"type":"array","items":{"$ref":"#/components/schemas/PlatformLink"},"description":"Stored cross-service deep-links for this album."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this album."}}},"Artist":{"type":"object","description":"Minimal artist metadata used in artist resolves and share pages.","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"Artist display name as reported by the origin service."},"imageUrl":{"type":"string","format":"uri","description":"Absolute artist-image URL. The key is omitted when no image is available."},"genres":{"type":"array","items":{"type":"string"},"description":"Genre labels supplied by the source. The key is omitted when the source supplies no genre list."}},"example":{"name":"a-ha","imageUrl":"https://i.scdn.co/image/ab6761610000e5eb6b3f4e4e2f8e4f6a3c8b2d0a","genres":["synth-pop","new wave","pop rock"]}},"ArtistCredit":{"type":"object","description":"Normalized artist entity reference for one display credit. `artists` remains the compatibility display array.","required":["artistEntityId","name","role","position"],"additionalProperties":false,"properties":{"artistEntityId":{"type":"string","description":"Stable musiccloud artist-correlation ID. It links credits that refer to the same artist; no public request parameter currently accepts this value."},"name":{"type":"string","description":"Display credit exactly as stored for this track or album."},"role":{"type":"string","enum":["main","featured","remixer","producer","composer","lyricist","performer","unknown"],"description":"Role of this artist in the credited work; use `main` for the primary performer."},"position":{"type":"integer","minimum":0,"description":"Zero-based display order within the artist credits."}},"example":{"artistEntityId":"artist_a_ha","name":"a-ha","role":"main","position":0}},"ArtistEvent":{"type":"object","description":"Upcoming live event sourced from Bandsintown or Ticketmaster.","required":["date","venueName","city","country","ticketUrl","source"],"additionalProperties":false,"properties":{"date":{"type":"string","format":"date","description":"Event date in `YYYY-MM-DD` format."},"venueName":{"type":"string","description":"Venue name supplied by the event provider."},"city":{"type":"string","description":"City in which the event takes place."},"country":{"type":"string","description":"Country supplied by the event source. It may be an ISO `3166-1 alpha-2` code such as `NO` or a country name; clients must support both forms."},"ticketUrl":{"type":"string","nullable":true,"format":"uri","description":"The key is always included. Its value is the ticket or event-details URL, or `null` when the event source exposes none."},"source":{"type":"string","enum":["bandsintown","ticketmaster"],"description":"Provider identifier: `bandsintown` or `ticketmaster`."}},"example":{"date":"2026-07-18","venueName":"Oslo Spektrum","city":"Oslo","country":"NO","ticketUrl":"https://www.ticketmaster.no/event/a-ha-oslo-spektrum-18-jul-2026","source":"ticketmaster"}},"ArtistInfo":{"type":"object","description":"Commercial artist metadata with selected tracks, profile data, and upcoming events. Every top-level key is included so clients can distinguish an empty list or `null` profile from a missing field.","required":["artistName","topTracks","profile","events","similarArtistTracks"],"additionalProperties":false,"properties":{"artistName":{"type":"string","description":"Artist display name actually used for the lookup after input normalization and optional `shortId` alias resolution."},"topTracks":{"type":"array","items":{"$ref":"#/components/schemas/ArtistTopTrack"},"maxItems":5,"description":"Up to `5` selected top tracks. The key is always included; an empty array means no tracks were found."},"profile":{"anyOf":[{"$ref":"#/components/schemas/ArtistProfile"},{"type":"null"}],"description":"The key is always included. Its value is the assembled profile, or `null` when no metadata source returned an artist match. Inspect the profile's individual nullable fields and arrays rather than assuming every field is populated."},"events":{"type":"array","items":{"$ref":"#/components/schemas/ArtistEvent"},"maxItems":5,"description":"Up to `5` upcoming events. The key is always included; an empty array means no events were found."},"similarArtistTracks":{"type":"array","items":{"$ref":"#/components/schemas/SimilarArtistTrack"},"maxItems":5,"description":"Top-track lookup for up to `5` related artists. The key is always included; an empty array means no related artists or tracks were found."}},"example":{"artistName":"a-ha","topTracks":[{"title":"Take on Me","artists":["a-ha"],"albumName":"Hunting High and Low","artworkUrl":"https://e-cdns-images.dzcdn.net/images/cover/abc123/500x500-000000-80-0-0.jpg","durationMs":225280,"deezerUrl":"https://www.deezer.com/track/14408535","shortId":"aBc123x"}],"profile":{"imageUrl":"https://i.scdn.co/image/ab6761610000e5eb6b3f4e4e2f8e4f6a3c8b2d0a","genres":["synth-pop","new wave","pop rock"],"popularity":1840321,"followers":2840192,"bioSummary":"a-ha are a Norwegian synth-pop band formed in Oslo in 1982.","scrobbles":128340921,"similarArtists":["Morten Harket","Magne Furuholmen","Savoy"]},"events":[{"date":"2026-07-18","venueName":"Oslo Spektrum","city":"Oslo","country":"NO","ticketUrl":"https://www.ticketmaster.no/event/a-ha-oslo-spektrum-18-jul-2026","source":"ticketmaster"}],"similarArtistTracks":[{"artistName":"Savoy","track":{"title":"Velvet","artists":["Savoy"],"albumName":"Mountains of Time","artworkUrl":"https://e-cdns-images.dzcdn.net/images/cover/def456/500x500-000000-80-0-0.jpg","durationMs":218000,"deezerUrl":"https://www.deezer.com/track/987654","shortId":null}}]}},"ArtistProfile":{"type":"object","description":"Commercial artist profile assembled from available public metadata. An object can contain only `null` values and empty arrays when an artist match exists but individual profile fields are unavailable.","required":["imageUrl","genres","popularity","followers","bioSummary","scrobbles","similarArtists"],"additionalProperties":false,"properties":{"imageUrl":{"type":"string","nullable":true,"format":"uri","description":"The key is always included. Its value is the best available artist image URL, or `null` when unavailable."},"genres":{"type":"array","items":{"type":"string"},"maxItems":3,"description":"Up to `3` genre labels; an empty array means none are available."},"popularity":{"type":"integer","nullable":true,"minimum":0,"description":"The key is always included. Its value is a non-negative audience-reach count, or `null` when no source supplies one; it is not a `0`–`100` score."},"followers":{"type":"integer","nullable":true,"minimum":0,"description":"The key is always included. Its value is a non-negative fan or listener count, or `null` when unavailable."},"bioSummary":{"type":"string","nullable":true,"description":"The key is always included. Its value is a short artist biography, or `null` when unavailable."},"scrobbles":{"type":"integer","nullable":true,"minimum":0,"description":"The key is always included. Its value is the aggregate play count, or `null` when unavailable."},"similarArtists":{"type":"array","items":{"type":"string"},"maxItems":5,"description":"Up to `5` related artist names; an empty array means no related artists are available."}},"example":{"imageUrl":"https://i.scdn.co/image/ab6761610000e5eb6b3f4e4e2f8e4f6a3c8b2d0a","genres":["synth-pop","new wave","pop rock"],"popularity":1840321,"followers":2840192,"bioSummary":"a-ha are a Norwegian synth-pop band formed in Oslo in 1982. The band was founded by Morten Harket, Magne Furuholmen and Paul Waaktaar-Savoy.","scrobbles":128340921,"similarArtists":["Morten Harket","Magne Furuholmen","Savoy"]}},"ArtistResolveSuccess":{"type":"object","description":"Successful artist resolve: artist metadata plus per-service deep-links.","required":["type","id","shortUrl","artist","links"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["artist"],"description":"Discriminator: always `artist` for this variant."},"id":{"type":"string","description":"Persisted musiccloud artist ID for correlation. No public endpoint accepts it; use the final path segment of `shortUrl` with `GET /api/v1/share/{shortId}` to fetch the share payload."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this resolved artist."},"artist":{"allOf":[{"$ref":"#/components/schemas/Artist"}],"description":"Unified metadata for the resolved artist."},"links":{"type":"array","items":{"$ref":"#/components/schemas/PlatformLink"},"description":"Cross-service deep-links for the resolved artist."}},"example":{"type":"artist","id":"ar_01HZ8Q4D8R9S0T1U2V3W4X5Y6Z","shortUrl":"https://musiccloud.io/gHi789z","artist":{"name":"a-ha","imageUrl":"https://i.scdn.co/image/ab6761610000e5eb6b3f4e4e2f8e4f6a3c8b2d0a","genres":["synth-pop","new wave","pop rock"]},"links":[{"service":"spotify","displayName":"Spotify","url":"https://open.spotify.com/artist/26dSoYclwsYLMAKD3tpOr4","confidence":1,"matchMethod":"search"},{"service":"apple-music","displayName":"Apple Music","url":"https://music.apple.com/us/artist/a-ha/266892","confidence":1,"matchMethod":"search"}]}},"ArtistSharePageResponse":{"type":"object","description":"Commercial share-page payload for one resolved artist.","required":["type","og","artist","links","shortUrl"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["artist"],"description":"Always `artist` for this response shape."},"og":{"allOf":[{"$ref":"#/components/schemas/OgMeta"}],"description":"Open-Graph metadata for rendering and social sharing."},"artist":{"allOf":[{"$ref":"#/components/schemas/Artist"}],"description":"Stored canonical artist metadata."},"links":{"type":"array","items":{"$ref":"#/components/schemas/PlatformLink"},"description":"Stored cross-service deep-links for this artist."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this artist."}}},"ArtistTopTrack":{"type":"object","description":"One of an artist's top commercial tracks, selected from the available artist metadata sources.","required":["title","artists","albumName","artworkUrl","durationMs","deezerUrl","shortId"],"additionalProperties":false,"properties":{"title":{"type":"string","description":"Top-track title."},"artists":{"type":"array","items":{"type":"string"},"description":"Top-track artist display names in source order."},"albumName":{"type":"string","nullable":true,"description":"The key is always included. Its value is the containing album title, or `null` when unavailable."},"artworkUrl":{"type":"string","nullable":true,"format":"uri","description":"The key is always included. Its value is the artwork URL, or `null` when unavailable."},"durationMs":{"type":"integer","nullable":true,"minimum":0,"description":"The key is always included. Its value is the duration in milliseconds, or `null` when unavailable."},"deezerUrl":{"type":"string","format":"uri","description":"Compatibility field containing a Deezer or Last.fm track URL. Send it as `query` to `POST /api/v1/resolve` for a full resolve; do not infer the provider from the key name."},"shortId":{"type":"string","nullable":true,"description":"The key is always included. Its value is a musiccloud share code accepted by `GET /api/v1/share/{shortId}`, or `null` when this top track has no persisted share."}},"example":{"title":"Take on Me","artists":["a-ha"],"albumName":"Hunting High and Low","artworkUrl":"https://e-cdns-images.dzcdn.net/images/cover/abc123/500x500-000000-80-0-0.jpg","durationMs":225280,"deezerUrl":"https://www.deezer.com/track/14408535","shortId":"aBc123x"}},"CcAlbum":{"type":"object","description":"Creative Commons album metadata and its Jamendo track list.","required":["jamendoId","name","artistName","tracks","vinylLayout"],"additionalProperties":false,"properties":{"jamendoId":{"type":"string","pattern":"^[0-9]+$","description":"Numeric Jamendo album ID used to correlate this album with Jamendo. No public request parameter accepts the bare album ID; use the result's `shortUrl` to fetch the persisted share."},"name":{"type":"string","description":"Album title reported by Jamendo."},"artistName":{"type":"string","description":"Jamendo artist display name for the album."},"artworkUrl":{"type":"string","format":"uri","description":"Absolute Jamendo album-artwork URL. The key is omitted when no artwork is available."},"releaseDate":{"type":"string","format":"date","description":"Jamendo album release date in `YYYY-MM-DD` format. The key is omitted when unavailable."},"zipUrl":{"type":"string","format":"uri","description":"Full-album ZIP download URL. The key is omitted when Jamendo does not permit or expose it."},"shareUrl":{"type":"string","format":"uri","description":"Canonical Jamendo page for this album. The key is omitted when Jamendo supplies no page URL."},"tracks":{"type":"array","maxItems":50,"items":{"$ref":"#/components/schemas/CcTrack"},"description":"Up to `50` album tracks in release order. Use each item's `jamendoId` with the CC audio or download endpoint."},"vinylLayout":{"anyOf":[{"$ref":"#/components/schemas/VinylLayout"},{"type":"null"}],"description":"The key is always included on public `CcAlbum` objects. Its value is the Discogs-derived vinyl layout, or `null` when no suitable pressing is available."}}},"CcAlbumResolveSuccess":{"type":"object","description":"Successful Creative Commons album resolve.","required":["type","id","shortUrl","album","artistInfo"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["cc-album"],"description":"Discriminator: always `cc-album` for this response shape."},"id":{"type":"string","description":"Persisted musiccloud CC-album ID for correlation. No public endpoint accepts it; use the final path segment of `shortUrl` with `GET /api/v1/share/{shortId}`."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this Creative Commons album."},"album":{"allOf":[{"$ref":"#/components/schemas/CcAlbum"},{"type":"object","required":["vinylLayout"]}],"description":"Resolved Jamendo album with its vinyl-layout lookup state."},"artistInfo":{"allOf":[{"$ref":"#/components/schemas/CcArtistInfo"}],"description":"Jamendo-derived profile, album tracks, and related-artist tracks for the album artist."}}},"CcAlbumSharePageResponse":{"type":"object","description":"Creative Commons share-page payload for one Jamendo album.","required":["type","og","shortUrl","album","artistInfo"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["cc-album"],"description":"Discriminator: always `cc-album` for this response shape."},"og":{"allOf":[{"$ref":"#/components/schemas/OgMeta"}],"description":"Open-Graph metadata for rendering and social sharing."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this Creative Commons album."},"album":{"allOf":[{"$ref":"#/components/schemas/CcAlbum"},{"type":"object","required":["vinylLayout"]}],"description":"Persisted Jamendo album with its vinyl-layout lookup state."},"artistInfo":{"allOf":[{"$ref":"#/components/schemas/CcArtistInfo"}],"description":"Jamendo-derived profile, album tracks, and related-artist tracks for the album artist."}}},"CcArtist":{"type":"object","description":"Creative Commons artist metadata and the artist's popular Jamendo tracks.","required":["jamendoId","name","topTracks"],"additionalProperties":false,"properties":{"jamendoId":{"type":"string","pattern":"^[0-9]+$","description":"Numeric Jamendo artist ID. Pass it as `jamendoArtistId` to `GET /api/v1/cc/artist-info` together with this artist's `name`."},"name":{"type":"string","description":"Artist display name reported by Jamendo."},"website":{"type":"string","format":"uri","description":"Artist-owned website. The key is omitted when Jamendo supplies none."},"imageUrl":{"type":"string","format":"uri","description":"Absolute Jamendo artist-image URL. The key is omitted when no image is available."},"shareUrl":{"type":"string","format":"uri","description":"Canonical Jamendo page for this artist. The key is omitted when Jamendo supplies no page URL."},"topTracks":{"type":"array","maxItems":20,"items":{"$ref":"#/components/schemas/CcTrack"},"description":"Up to `20` Creative Commons tracks in descending Jamendo popularity order."}}},"CcArtistInfo":{"type":"object","description":"Creative Commons artist metadata derived from Jamendo. Every top-level key is included. `events` is always empty, while unavailable profile counters remain explicit `null` values.","required":["artistName","topTracks","profile","events","similarArtistTracks"],"additionalProperties":false,"properties":{"artistName":{"type":"string","description":"Artist display label associated with the supplied Jamendo artist ID."},"topTracks":{"type":"array","items":{"$ref":"#/components/schemas/CcArtistTopTrack"},"description":"The key is always included. For `GET /api/v1/cc/artist-info` and `cc-artist` payloads it contains up to `20` tracks in descending Jamendo popularity order; for `cc-album` payloads it contains up to `50` album tracks in release order. An empty array means no tracks could be returned."},"profile":{"anyOf":[{"$ref":"#/components/schemas/CcArtistProfile"},{"type":"null"}],"description":"The key is always included. Its value is the Jamendo profile, or `null` when no image, genre, or biography metadata can be returned."},"events":{"type":"array","maxItems":0,"items":{"$ref":"#/components/schemas/ArtistEvent"},"description":"The key is always included as an empty array because this CC response does not provide event data."},"similarArtistTracks":{"type":"array","maxItems":12,"items":{"$ref":"#/components/schemas/CcSimilarArtistTrack"},"description":"Up to `12` tracks by distinct related artists, excluding the requested artist. The key is always included; an empty array means no related tracks could be returned."}},"example":{"artistName":"Jamendo Artist","topTracks":[{"title":"Creative Commons Track","artists":["Jamendo Artist"],"albumName":"Open Album","artworkUrl":"https://usercontent.jamendo.com/example.jpg","durationMs":210000,"deezerUrl":"jamendo:123456","shortId":null}],"profile":null,"events":[],"similarArtistTracks":[]}},"CcArtistProfile":{"type":"object","description":"Jamendo artist profile with every compatibility key represented explicitly, including unavailable counters as `null`.","required":["imageUrl","genres","popularity","followers","bioSummary","scrobbles","similarArtists"],"additionalProperties":false,"properties":{"imageUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"The key is always included. Its value is the Jamendo artist image URL, or `null` when unavailable."},"genres":{"type":"array","items":{"type":"string"},"maxItems":3,"description":"Up to `3` Jamendo genre labels; an empty array means none are available."},"popularity":{"type":"integer","nullable":true,"description":"The key is always included and its value is always `null`; Jamendo artist-info exposes no compatible reach count."},"followers":{"type":"integer","nullable":true,"description":"The key is always included and its value is always `null`; Jamendo artist-info exposes no compatible follower count."},"bioSummary":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The key is always included. Its value is the Jamendo biography, or `null` when unavailable."},"scrobbles":{"type":"integer","nullable":true,"description":"The key is always included and its value is always `null`; Jamendo exposes no compatible scrobble count."},"similarArtists":{"type":"array","maxItems":0,"items":{"type":"string"},"description":"The key is always included as an empty array because this response carries related tracks separately."}},"example":{"imageUrl":"https://usercontent.jamendo.com/example-artist.jpg","genres":["ambient"],"popularity":null,"followers":null,"bioSummary":null,"scrobbles":null,"similarArtists":[]}},"CcArtistResolveSuccess":{"type":"object","description":"Successful Creative Commons artist resolve.","required":["type","id","shortUrl","artist","artistInfo"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["cc-artist"],"description":"Discriminator: always `cc-artist` for this response shape."},"id":{"type":"string","description":"Persisted musiccloud CC-artist ID for correlation. No public endpoint accepts it; use the final path segment of `shortUrl` with `GET /api/v1/share/{shortId}`."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this Creative Commons artist."},"artist":{"allOf":[{"$ref":"#/components/schemas/CcArtist"}],"description":"Resolved Jamendo artist and popular Creative Commons tracks."},"artistInfo":{"allOf":[{"$ref":"#/components/schemas/CcArtistInfo"}],"description":"Jamendo-derived profile, popular tracks, and related-artist tracks for the resolved artist."}}},"CcArtistSharePageResponse":{"type":"object","description":"Creative Commons share-page payload for one Jamendo artist.","required":["type","og","shortUrl","artist","artistInfo"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["cc-artist"],"description":"Discriminator: always `cc-artist` for this response shape."},"og":{"allOf":[{"$ref":"#/components/schemas/OgMeta"}],"description":"Open-Graph metadata for rendering and social sharing."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this Creative Commons artist."},"artist":{"allOf":[{"$ref":"#/components/schemas/CcArtist"}],"description":"Persisted Jamendo artist and the artist's popular Creative Commons tracks."},"artistInfo":{"allOf":[{"$ref":"#/components/schemas/CcArtistInfo"}],"description":"Jamendo-derived profile, popular tracks, and related-artist tracks for this artist."}}},"CcArtistTopTrack":{"type":"object","description":"One Jamendo track returned as Creative Commons artist metadata.","required":["title","artists","albumName","artworkUrl","durationMs","deezerUrl","shortId"],"additionalProperties":false,"properties":{"title":{"type":"string","description":"Jamendo track title."},"artists":{"type":"array","items":{"type":"string"},"description":"Jamendo artist display names in source order."},"albumName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The key is always included. Its value is the album title, or `null` when Jamendo supplies none."},"artworkUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"The key is always included. Its value is the artwork URL, or `null` when unavailable."},"durationMs":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"The key is always included. Its value is the duration in milliseconds, or `null` when unavailable."},"deezerUrl":{"type":"string","pattern":"^jamendo:[0-9]+$","description":"Compatibility field containing an opaque `jamendo:<trackId>` candidate token, not a URL. Pass it as `selectedCandidate` to `POST /api/v1/cc/resolve`."},"shortId":{"type":"string","nullable":true,"description":"The key is always included and its value is always `null`; this response does not perform share-code lookup for its track rows. Resolve `deezerUrl` through `POST /api/v1/cc/resolve` to obtain a share code."}},"example":{"title":"Creative Commons Track","artists":["Jamendo Artist"],"albumName":"Open Album","artworkUrl":"https://usercontent.jamendo.com/example.jpg","durationMs":210000,"deezerUrl":"jamendo:123456","shortId":null}},"CcBandcampAvailabilityResponse":{"type":"object","description":"Bandcamp availability for one Creative Commons track. `bandcampUrl` is omitted when no confident matching listing exists.","additionalProperties":false,"properties":{"bandcampUrl":{"type":"string","format":"uri","description":"Bandcamp track URL when a reliable listing is found. The key is omitted when the Jamendo ID is unknown or no safe match can be confirmed."}},"example":{"bandcampUrl":"https://artist.bandcamp.com/track/take-on-me"}},"CcGenreAlbumCandidate":{"type":"object","description":"Creative-Commons album row returned by a genre-search query.","required":["id","title","artists"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^jamendo-album:[0-9]+$","description":"Opaque Jamendo album candidate token. Pass it unchanged as `selectedCandidate` to `POST /api/v1/cc/resolve`."},"title":{"type":"string","description":"Album title returned by the Creative Commons genre search. An empty string means the candidate has a Jamendo album ID but the track result supplied no album title."},"artists":{"type":"array","items":{"type":"string"},"description":"Album artist display names in source order."},"artworkUrl":{"type":"string","format":"uri","description":"Artwork URL. The key is omitted when no artwork is available."},"webUrl":{"type":"string","format":"uri","description":"Canonical Jamendo page. The key is omitted when the source supplies no page URL; it is not used for the follow-up resolve."}}},"CcGenreArtistCandidate":{"type":"object","description":"Creative-Commons artist row returned by a genre-search query.","required":["id","name"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^jamendo-artist:[0-9]+$","description":"Opaque Jamendo artist candidate token. Pass it unchanged as `selectedCandidate` to `POST /api/v1/cc/resolve`."},"name":{"type":"string","description":"Artist display name returned by the Creative-Commons genre search."},"imageUrl":{"type":"string","format":"uri","description":"Artist image URL. The key is omitted when no image is available."},"webUrl":{"type":"string","format":"uri","description":"Canonical Jamendo page. The key is omitted when the source supplies no page URL; it is not used for the follow-up resolve."}}},"CcGenreBrowseResponse":{"type":"object","description":"Creative-Commons genre browse response returned for the exact query `genre:?`.","required":["status","genres"],"additionalProperties":false,"properties":{"status":{"type":"string","enum":["genre-browse"],"description":"Always `genre-browse` for this response shape."},"genres":{"type":"array","items":{"$ref":"#/components/schemas/CcGenreTile"},"description":"Selectable genres for a follow-up `genre:<name>` CC query."}}},"CcGenreSearchResponse":{"type":"object","description":"Creative-Commons genre results. Select a row by sending its `id` as `selectedCandidate` to `POST /api/v1/cc/resolve`.","required":["status","query","results","warnings"],"additionalProperties":false,"properties":{"status":{"type":"string","enum":["genre-search"],"description":"Always `genre-search` for this response shape."},"query":{"type":"object","description":"Normalized genre filters used for this search.","required":["genres","vibe","tracks","albums","artists"],"additionalProperties":false,"properties":{"genres":{"type":"array","items":{"type":"string"},"description":"Requested normalized genre tags."},"vibe":{"type":"string","enum":["hot","mixed"],"description":"Normalized ordering mode: `hot` selects the highest-ranked results, while `mixed` samples across the ranked result pool."},"tracks":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The key is always included. Its value is the requested track count, or `null` when tracks were not requested."},"albums":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The key is always included. Its value is the requested album count, or `null` when albums were not requested."},"artists":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The key is always included. Its value is the requested artist count, or `null` when artists were not requested."}}},"results":{"type":"object","description":"Candidate lists grouped by requested resource type.","required":["tracks","albums","artists"],"additionalProperties":false,"properties":{"tracks":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/CcGenreTrackCandidate"}},{"type":"null"}],"description":"The key is always included. Its value is the track-candidate array, or `null` when tracks were not requested."},"albums":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/CcGenreAlbumCandidate"}},{"type":"null"}],"description":"The key is always included. Its value is the album-candidate array, or `null` when albums were not requested."},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/CcGenreArtistCandidate"}},{"type":"null"}],"description":"The key is always included. Its value is the artist-candidate array, or `null` when artists were not requested."}}},"warnings":{"type":"array","items":{"type":"string"},"description":"Query-normalization notes; an empty array means no adjustment was needed."}}},"CcGenreTile":{"type":"object","description":"One selectable Creative-Commons genre tile.","required":["name","displayName","artworkUrl"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"Genre tag to use in a follow-up `genre:<name>` CC query."},"displayName":{"type":"string","description":"Human-readable genre label."},"artworkUrl":{"type":"string","description":"Root-relative public-site image path. Prefix it with `https://musiccloud.io`; do not resolve it against `https://api.musiccloud.io`."}}},"CcGenreTrackCandidate":{"type":"object","description":"Creative-Commons track row returned by a genre-search query.","required":["id","title","artists"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^jamendo:[0-9]+$","description":"Opaque Jamendo track candidate token. Pass it unchanged as `selectedCandidate` to `POST /api/v1/cc/resolve`."},"title":{"type":"string","description":"Track title returned by the Creative-Commons genre search."},"artists":{"type":"array","items":{"type":"string"},"description":"Track artist display names in source order."},"albumName":{"type":"string","description":"Album title. The key is omitted when the source supplies no album name."},"artworkUrl":{"type":"string","format":"uri","description":"Artwork URL. The key is omitted when no artwork is available."},"durationMs":{"type":"number","minimum":0,"description":"Track duration in milliseconds. The key is omitted when unavailable."},"webUrl":{"type":"string","format":"uri","description":"Canonical Jamendo page. The key is omitted when the source supplies no page URL; it is not used for the follow-up resolve."}}},"CcMusicInfo":{"type":"object","description":"Jamendo music classification for a Creative Commons track.","required":["genres","instruments","vartags"],"additionalProperties":false,"properties":{"genres":{"type":"array","items":{"type":"string"},"description":"Jamendo genre tags for the track; an empty array means none were supplied."},"instruments":{"type":"array","items":{"type":"string"},"description":"Jamendo instrument tags; an empty array means none were supplied."},"vartags":{"type":"array","items":{"type":"string"},"description":"Jamendo mood and theme tags; an empty array means none were supplied."},"vocalInstrumental":{"type":"string","description":"Jamendo vocal/instrumental classifier, such as `vocal` or `instrumental`. Treat the value as source-defined. The key is omitted when no classifier is supplied."},"gender":{"type":"string","description":"Jamendo lead-vocal gender classifier. Treat the value as source-defined rather than as a fixed enum. The key is omitted when no classifier is supplied."},"speed":{"type":"string","description":"Jamendo tempo classifier string. Treat it as source-defined rather than assuming a fixed enum. The key is omitted when unavailable."},"acousticElectric":{"type":"string","description":"Jamendo acoustic/electric classifier. Treat the value as source-defined rather than as a fixed enum. The key is omitted when no classifier is supplied."},"lang":{"type":"string","description":"Source-provided language code for the lyrics. Treat the value as source-defined rather than assuming one specific code standard. The key is omitted when unavailable."}}},"CcResolveSuccess":{"description":"Successful Creative Commons resolve, discriminated by `type` into track, album, or artist payloads.","oneOf":[{"$ref":"#/components/schemas/CcTrackResolveSuccess"},{"$ref":"#/components/schemas/CcAlbumResolveSuccess"},{"$ref":"#/components/schemas/CcArtistResolveSuccess"}]},"CcSimilarArtistTrack":{"type":"object","description":"One related Jamendo artist and a resolvable Creative-Commons track by that artist.","required":["artistName","track"],"additionalProperties":false,"properties":{"artistName":{"type":"string","description":"Related Jamendo artist display name."},"track":{"allOf":[{"$ref":"#/components/schemas/CcArtistTopTrack"}],"description":"Resolvable related track. The key and object are always included for every item in `similarArtistTracks`."}}},"CcTrack":{"type":"object","description":"Creative Commons track metadata, playback URLs, and Jamendo-specific attributes.","required":["jamendoId","title","artistName","jamendoArtistId","streamUrl","downloadAllowed"],"additionalProperties":false,"properties":{"jamendoId":{"type":"string","pattern":"^[0-9]+$","description":"Numeric Jamendo track ID. Pass it as `{jamendoId}` to `GET /api/v1/cc/audio/{jamendoId}`, `GET /api/v1/cc/download/{jamendoId}`, or `GET /api/v1/cc/bandcamp/{jamendoId}`."},"title":{"type":"string","description":"Track title reported by Jamendo."},"artistName":{"type":"string","description":"Jamendo artist display name for this track."},"jamendoArtistId":{"type":"string","pattern":"^[0-9]+$","description":"Numeric Jamendo artist ID. Pass it as `jamendoArtistId` to `GET /api/v1/cc/artist-info` together with this track's `artistName`."},"albumName":{"type":"string","description":"Containing album title. The key is omitted when Jamendo supplies no album name."},"artworkUrl":{"type":"string","format":"uri","description":"Absolute Jamendo artwork URL. The key is omitted when no artwork is available."},"durationMs":{"type":"integer","minimum":0,"description":"Track duration in milliseconds. The key is omitted when Jamendo supplies no duration."},"releaseDate":{"type":"string","format":"date","description":"Jamendo release date in `YYYY-MM-DD` format. The key is omitted when unavailable."},"licenseCcurl":{"type":"string","format":"uri","description":"Exact Creative Commons license URL governing this track. The key is omitted when Jamendo supplies no license URL."},"streamUrl":{"type":"string","format":"uri","description":"Permanent full-track Jamendo audio URL. For browser playback, byte ranges, and an API-controlled media type, use `GET /api/v1/cc/audio/{jamendoId}` instead of depending on this source URL directly."},"downloadUrl":{"type":"string","format":"uri","description":"Direct Jamendo audio URL. The key is omitted when Jamendo supplies no URL. Use it only when `downloadAllowed` is `true`; prefer `GET /api/v1/cc/download/{jamendoId}` when a named attachment and an explicit `403` permission response are required."},"downloadAllowed":{"type":"boolean","description":"Whether the track can be downloaded. Only offer `GET /api/v1/cc/download/{jamendoId}` when this value is `true`; otherwise that endpoint returns `403`."},"waveform":{"type":"string","description":"JSON-encoded string. Call `JSON.parse(waveform)` to obtain an object shaped as `{ peaks: number[] }`. The key is omitted when Jamendo supplies no waveform."},"shareUrl":{"type":"string","format":"uri","description":"Canonical Jamendo page for this track. The key is omitted when Jamendo supplies no page URL."},"musicInfo":{"allOf":[{"$ref":"#/components/schemas/CcMusicInfo"}],"description":"Jamendo music classification. The key is omitted when the source supplies no classification object."},"stats":{"allOf":[{"$ref":"#/components/schemas/CcTrackStats"}],"description":"Jamendo engagement counters. The key is omitted when the source supplies no statistics object."},"proLicensing":{"type":"boolean","description":"Always `true` when included, indicating that Jamendo Pro offers commercial licensing. The key is omitted when commercial licensing is not advertised."},"proUrl":{"type":"string","format":"uri","description":"Jamendo Pro licensing page. The key is omitted when Jamendo supplies no commercial-licensing URL."},"vinylLayout":{"anyOf":[{"$ref":"#/components/schemas/VinylLayout"},{"type":"null"}],"description":"Discogs vinyl-layout lookup state. The key is included only on the top-level track of a resolve or share response. The key is omitted from nested track lists."}}},"CcTrackResolveSuccess":{"type":"object","description":"Successful Creative Commons track resolve.","required":["type","id","shortUrl","track"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["cc-track"],"description":"Discriminator: always `cc-track` for this response shape."},"id":{"type":"string","description":"Persisted musiccloud CC-track ID for correlation. No public endpoint accepts it; use the final path segment of `shortUrl` with `GET /api/v1/share/{shortId}`."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this Creative Commons track."},"track":{"allOf":[{"$ref":"#/components/schemas/CcTrack"},{"type":"object","required":["vinylLayout"]}],"description":"Resolved Jamendo track with its vinyl-layout lookup state."}}},"CcTrackSharePageResponse":{"type":"object","description":"Creative Commons share-page payload for one Jamendo track.","required":["type","og","shortUrl","track"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["cc-track"],"description":"Discriminator: always `cc-track` for this response shape."},"og":{"allOf":[{"$ref":"#/components/schemas/OgMeta"}],"description":"Open-Graph metadata for rendering and social sharing."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this Creative Commons track."},"track":{"allOf":[{"$ref":"#/components/schemas/CcTrack"},{"type":"object","required":["vinylLayout"]}],"description":"Persisted Jamendo track with its vinyl-layout lookup state."}}},"CcTrackStats":{"type":"object","description":"Jamendo engagement counters and user-rating data for a Creative Commons track.","required":["listens","downloads","playlisted","favorited","likes","dislikes","avgNote","notes"],"additionalProperties":false,"properties":{"listens":{"type":"number","minimum":0,"description":"Total Jamendo play count."},"downloads":{"type":"number","minimum":0,"description":"Total Jamendo download count."},"playlisted":{"type":"number","minimum":0,"description":"Number of Jamendo playlists that include the track."},"favorited":{"type":"number","minimum":0,"description":"Number of Jamendo users who favorited the track."},"likes":{"type":"number","minimum":0,"description":"Jamendo thumbs-up count."},"dislikes":{"type":"number","minimum":0,"description":"Jamendo thumbs-down count."},"avgNote":{"type":"number","minimum":0,"description":"Source-provided average Jamendo rating. Interpret it together with `notes`; do not assume a fixed rating scale."},"notes":{"type":"number","minimum":0,"description":"Number of ratings contributing to `avgNote`."}}},"DisambiguationCandidate":{"type":"object","description":"A possible match returned when the query was ambiguous and the caller must pick one.","required":["id","title","artists"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Opaque candidate ID returned only for this selection flow. Pass it unchanged as `selectedCandidate` to the same `POST /api/v1/resolve` or `POST /api/v1/cc/resolve` operation that produced the list."},"title":{"type":"string","description":"Candidate track title."},"artists":{"type":"array","items":{"type":"string"},"description":"Candidate track artists in source order."},"albumName":{"type":"string","description":"Candidate album title. The key is omitted when the search result supplies no album."},"artworkUrl":{"type":"string","format":"uri","description":"Candidate artwork URL. The key is omitted when the search result supplies no artwork."}},"example":{"id":"spotify:2WfaOiMkCvy7F5fcp2zZ8L","title":"Take on Me","artists":["a-ha"],"albumName":"Hunting High and Low","artworkUrl":"https://i.scdn.co/image/ab67616d0000b273e58a0f7f1f2f8e4f6a3c8b2d"}},"ErrorResponse":{"type":"object","additionalProperties":false,"description":"Standard public error envelope. Route-specific error schemas add documented fields such as form validation issues or readiness details.","required":["error","message","errorId"],"properties":{"error":{"type":"string","pattern":"^MC-(URL|API|AUTH|RES|DB|CFG|MAP|REQ|SYS)-\\d{3,4}$","description":"Stable musiccloud error code for programmatic handling, for example `MC-URL-0003`, `MC-API-0003`, or `MC-RES-0001`."},"message":{"type":"string","description":"Safe English failure detail. The final parenthesized value repeats the `error` code."},"errorId":{"type":"string","format":"uuid","description":"Unique incident identifier included in the matching backend log. Send it to musiccloud support when reporting the failure."},"context":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"}]},"description":"Optional structured values associated with the error code. For `MC-API-0003`, the object can contain the active limit, window, and retry delay. The key is omitted when no structured values apply.","properties":{"limit":{"type":"number","description":"Maximum requests allowed by the rate-limit rule that rejected this request. The key is omitted for non-rate-limit errors."},"windowSeconds":{"type":"number","description":"Length in seconds of the rate-limit window that rejected this request. The key is omitted for non-rate-limit errors."},"retryAfterSeconds":{"type":"number","description":"Seconds until the client can retry after a `429 Too Many Requests` response. The key is omitted when no retry delay applies."}}}},"example":{"error":"MC-API-0003","errorId":"7d33e012-685f-4f11-94da-c6bc72918d7b","message":"Too many requests. You can make 10 requests per 60 seconds. Please try again in 42 seconds. (MC-API-0003)","context":{"limit":10,"retryAfterSeconds":42,"windowSeconds":60}}},"GenreAlbumCandidate":{"type":"object","description":"Album row returned by a genre-search query.","required":["id","title","artists","webUrl"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Source identifier for correlating this row within the result. No public request accepts it; resolve the row by sending `webUrl` as `query` to `POST /api/v1/resolve`."},"title":{"type":"string","description":"Album title returned by the genre search."},"artists":{"type":"array","items":{"type":"string"},"description":"Album artists in source order."},"artworkUrl":{"type":"string","format":"uri","description":"Artwork URL. The key is omitted when the search result supplies no artwork."},"webUrl":{"type":"string","format":"uri","description":"Source URL accepted as `query` by `POST /api/v1/resolve`. Send it unchanged to persist the album and obtain `id`, `shortUrl`, metadata, and service links."}}},"GenreArtistCandidate":{"type":"object","description":"Artist row returned by a genre-search query.","required":["id","name","webUrl"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Source identifier for correlating this row within the result. No public request accepts it; resolve the row by sending `webUrl` as `query` to `POST /api/v1/resolve`."},"name":{"type":"string","description":"Artist display name returned by the genre search."},"imageUrl":{"type":"string","format":"uri","description":"Artist-image URL. The key is omitted when the search result supplies no image."},"webUrl":{"type":"string","format":"uri","description":"Source URL accepted as `query` by `POST /api/v1/resolve`. Send it unchanged to persist the artist and obtain `id`, `shortUrl`, metadata, and service links."}}},"GenreBrowseResponse":{"type":"object","description":"Genre browse-grid response produced when the query is exactly `genre:?`.","required":["status","genres"],"additionalProperties":false,"properties":{"status":{"type":"string","enum":["genre-browse"],"description":"Always `genre-browse` for this response shape."},"genres":{"type":"array","items":{"$ref":"#/components/schemas/GenreTile"},"description":"Popular genres available for a follow-up genre search."}}},"GenreSearchResponse":{"type":"object","description":"Genre-discovery response produced when a resolve query starts with `genre:`.","required":["status","query","results","warnings"],"additionalProperties":false,"properties":{"status":{"type":"string","enum":["genre-search"],"description":"Always `genre-search` for this response shape."},"query":{"type":"object","description":"Normalized genre-search filters that produced these results.","required":["genres","vibe","tracks","albums","artists"],"additionalProperties":false,"properties":{"genres":{"type":"array","items":{"type":"string"},"description":"Requested normalized genre tags."},"vibe":{"type":"string","enum":["hot","mixed"],"description":"Normalized ordering mode: `hot` selects the highest-ranked results, while `mixed` samples across the ranked result pool."},"tracks":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The key is always included. Its value is the requested track count, or `null` when tracks were not requested."},"albums":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The key is always included. Its value is the requested album count, or `null` when albums were not requested."},"artists":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"The key is always included. Its value is the requested artist count, or `null` when artists were not requested."}}},"results":{"type":"object","description":"Result lists grouped by the entity type requested in the query.","required":["tracks","albums","artists"],"additionalProperties":false,"properties":{"tracks":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GenreTrackCandidate"}},{"type":"null"}],"description":"The key is always included. Its value is the track-candidate array, or `null` when tracks were not requested."},"albums":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GenreAlbumCandidate"}},{"type":"null"}],"description":"The key is always included. Its value is the album-candidate array, or `null` when albums were not requested."},"artists":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GenreArtistCandidate"}},{"type":"null"}],"description":"The key is always included. Its value is the artist-candidate array, or `null` when artists were not requested."}}},"warnings":{"type":"array","items":{"type":"string"},"description":"Non-fatal query-normalization notes; an empty array means no adjustments were made."}}},"GenreTile":{"type":"object","description":"A single genre tile in the browse grid.","required":["name","displayName","artworkUrl"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"Genre tag to use in a follow-up `genre:<name>` query."},"displayName":{"type":"string","description":"Human-readable genre label suitable for display."},"artworkUrl":{"type":"string","description":"Root-relative public-site image path. Prefix it with `https://musiccloud.io`; do not resolve it against `https://api.musiccloud.io`."},"accentColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","description":"Dominant artwork color in `#RRGGBB` format. The key is omitted until a stable generated artwork has supplied a color."}}},"GenreTrackCandidate":{"type":"object","description":"Track row returned by a genre-search query.","required":["id","title","artists","webUrl"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Source identifier for correlating this row within the result. No public request accepts it; resolve the row by sending `webUrl` as `query` to `POST /api/v1/resolve`."},"title":{"type":"string","description":"Track title returned by the genre search."},"artists":{"type":"array","items":{"type":"string"},"description":"Track artists in source order."},"albumName":{"type":"string","description":"Album title. The key is omitted when the search result supplies no album."},"artworkUrl":{"type":"string","format":"uri","description":"Artwork URL. The key is omitted when the search result supplies no artwork."},"durationMs":{"type":"number","minimum":0,"description":"Track duration in milliseconds. The key is omitted when unavailable."},"webUrl":{"type":"string","format":"uri","description":"Source URL accepted as `query` by `POST /api/v1/resolve`. Send it unchanged to persist the track and obtain `id`, `shortUrl`, metadata, and service links."}}},"LinkMetadataResponse":{"type":"object","description":"Stored track metadata and public service links for one previously resolved track.","required":["id","track","links"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Persisted musiccloud track ID echoed from the request path. Obtain it from the top-level `id` of a successful track resolve."},"track":{"allOf":[{"$ref":"#/components/schemas/Track"}],"description":"Stored canonical metadata for the resolved track."},"links":{"type":"array","items":{"$ref":"#/components/schemas/PlatformLink"},"description":"Available deep-links to the track on streaming services."}},"example":{"id":"tr_01HZ8N2B6P7Q8W9E3R4T5Y6U7I","track":{"title":"Take on Me","artists":["a-ha"],"vinylLayout":null},"links":[{"service":"spotify","displayName":"Spotify","url":"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L","confidence":1,"matchMethod":"cache"}]}},"OgMeta":{"type":"object","description":"Open Graph metadata for rendering a share page and its social preview.","required":["title","description","image","url"],"additionalProperties":false,"properties":{"title":{"type":"string","description":"Open-Graph title for the share page."},"description":{"type":"string","description":"Open-Graph description for the share page."},"image":{"type":"string","format":"uri","description":"Open-Graph image URL. The key is always included; a service fallback image is used when no artwork exists."},"url":{"type":"string","format":"uri","description":"Canonical public URL represented by these Open-Graph tags."}},"example":{"title":"a-ha — Take on Me","description":"Listen on Spotify, Apple Music, Deezer, YouTube Music and 16+ more services.","image":"https://i.scdn.co/image/ab67616d0000b273e58a0f7f1f2f8e4f6a3c8b2d","url":"https://musiccloud.io/aBc123x"}},"PlatformLink":{"type":"object","description":"One streaming-service link for a resolved track/album/artist.","required":["service","displayName","url","confidence","matchMethod"],"additionalProperties":false,"properties":{"service":{"type":"string","description":"Stable service identifier, for example `spotify`, `apple-music`, or `deezer`."},"displayName":{"type":"string","description":"Human-friendly service name."},"url":{"type":"string","format":"uri","description":"Deep-link that opens the item on that service."},"confidence":{"type":"number","minimum":0,"maximum":1,"description":"Match confidence in the inclusive range `0` to `1`. A value of `1` is an identity match; lower values are fuzzy matches."},"matchMethod":{"type":"string","enum":["isrc","search","cache","upc","isrc-inference"],"description":"How this link was located: `isrc` and `upc` are direct identifier matches, `isrc-inference` derives an ISRC match from related metadata, `search` is a text search, and `cache` means a previously stored link was returned."}},"example":{"service":"spotify","displayName":"Spotify","url":"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L","confidence":1,"matchMethod":"isrc"}},"ResolveDisambiguation":{"type":"object","description":"Resolve could not pick one match; the caller must choose from `candidates`.","required":["status","candidates"],"additionalProperties":false,"properties":{"status":{"type":"string","enum":["disambiguation"],"description":"Always `disambiguation`; choose one item from `candidates` before resolving again."},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/DisambiguationCandidate"},"description":"Candidate matches to present to the user for selection."}},"example":{"status":"disambiguation","candidates":[{"id":"spotify:2WfaOiMkCvy7F5fcp2zZ8L","title":"Take on Me","artists":["a-ha"],"albumName":"Hunting High and Low","artworkUrl":"https://i.scdn.co/image/ab67616d0000b273e58a0f7f1f2f8e4f6a3c8b2d"},{"id":"spotify:4VqPOruhp5EdPBeR92t6lQ","title":"Take on Me (MTV Unplugged)","artists":["a-ha"],"albumName":"MTV Unplugged — Summer Solstice","artworkUrl":"https://i.scdn.co/image/ab67616d0000b27309d2e5cb5e5a8f6a3c8b2d0a"}]}},"ResolveSuccess":{"type":"object","description":"Successful track resolve: unified metadata plus per-service deep-links.","required":["id","shortUrl","track","links"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Persisted musiccloud track ID. Pass this exact value as `{id}` to `GET /api/v1/link/{id}` to retrieve the stored metadata and service links again."},"shortUrl":{"type":"string","format":"uri","description":"Canonical public share URL. Its final path segment is the `shortId` accepted by `GET /api/v1/share/{shortId}` and `GET /api/v1/share/{shortId}/preview`."},"track":{"allOf":[{"$ref":"#/components/schemas/Track"}],"description":"Unified metadata for the resolved track."},"links":{"type":"array","items":{"$ref":"#/components/schemas/PlatformLink"},"description":"Cross-service deep-links for the resolved track."}},"example":{"id":"tr_01HZ8N2B6P7Q8W9E3R4T5Y6U7I","shortUrl":"https://musiccloud.io/aBc123x","track":{"title":"Take on Me","artists":["a-ha"],"albumName":"Hunting High and Low","artworkUrl":"https://i.scdn.co/image/ab67616d0000b273e58a0f7f1f2f8e4f6a3c8b2d","durationMs":225280,"isrc":"GBAYE8500114","releaseDate":"1985-06-01","isExplicit":false,"previewUrl":"https://p.scdn.co/mp3-preview/7ae363b1bc5d7c6bd9cbca4d4f2ae6e3a8c7b0f5","vinylLayout":null},"links":[{"service":"spotify","displayName":"Spotify","url":"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L","confidence":1,"matchMethod":"isrc"},{"service":"apple-music","displayName":"Apple Music","url":"https://music.apple.com/us/album/take-on-me/1433036073?i=1433036081","confidence":1,"matchMethod":"isrc"},{"service":"deezer","displayName":"Deezer","url":"https://www.deezer.com/track/14408535","confidence":1,"matchMethod":"isrc"},{"service":"youtube","displayName":"YouTube","url":"https://www.youtube.com/watch?v=djV11Xbc914","confidence":0.92,"matchMethod":"search"}]}},"SharePage":{"description":"Unified share payload discriminated by `type`. Commercial `track`, `album`, and `artist` variants carry the matching entity, `links`, `og`, and `shortUrl`. `cc-track` carries only `track`, `og`, and `shortUrl`; `cc-album` and `cc-artist` additionally carry `artistInfo`. Creative Commons variants never carry `links`.","oneOf":[{"$ref":"#/components/schemas/TrackSharePageResponse"},{"$ref":"#/components/schemas/AlbumSharePageResponse"},{"$ref":"#/components/schemas/ArtistSharePageResponse"},{"$ref":"#/components/schemas/CcTrackSharePageResponse"},{"$ref":"#/components/schemas/CcAlbumSharePageResponse"},{"$ref":"#/components/schemas/CcArtistSharePageResponse"}],"example":{"type":"track","og":{"title":"a-ha — Take on Me","description":"Listen on Spotify, Apple Music, Deezer, YouTube Music and 16+ more services.","image":"https://i.scdn.co/image/ab67616d0000b273e58a0f7f1f2f8e4f6a3c8b2d","url":"https://musiccloud.io/aBc123x"},"track":{"title":"Take on Me","artists":["a-ha"],"albumName":"Hunting High and Low","artworkUrl":"https://i.scdn.co/image/ab67616d0000b273e58a0f7f1f2f8e4f6a3c8b2d","durationMs":225280,"isrc":"GBAYE8500114","releaseDate":"1985-06-01","isExplicit":false,"vinylLayout":null},"links":[{"service":"spotify","displayName":"Spotify","url":"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L","confidence":1,"matchMethod":"cache"},{"service":"apple-music","displayName":"Apple Music","url":"https://music.apple.com/us/album/take-on-me/1433036073?i=1433036081","confidence":1,"matchMethod":"cache"}],"shortUrl":"https://musiccloud.io/aBc123x"}},"SharePreviewResponse":{"type":"object","description":"Refreshed Deezer preview URL for a commercial track share.","required":["previewUrl"],"additionalProperties":false,"properties":{"previewUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"The key is always included. Its value is a currently usable preview URL, or `null` when no preview can be produced for the track."}},"example":{"previewUrl":"https://cdn.example.com/previews/take-on-me.mp3"}},"SimilarArtistTrack":{"type":"object","description":"One related artist and that artist's selected top track. The object is always present in `similarArtistTracks`; its `track` value can be `null`.","required":["artistName","track"],"additionalProperties":false,"properties":{"artistName":{"type":"string","description":"Similar artist's display name."},"track":{"anyOf":[{"$ref":"#/components/schemas/ArtistTopTrack"},{"type":"null"}],"description":"The key is always included. Its value is the related artist's selected top track, or `null` when no resolvable track is available."}},"example":{"artistName":"Savoy","track":{"title":"Velvet","artists":["Savoy"],"albumName":"Mountains of Time","artworkUrl":"https://e-cdns-images.dzcdn.net/images/cover/def456/500x500-000000-80-0-0.jpg","durationMs":218000,"deezerUrl":"https://www.deezer.com/track/987654","shortId":null}}},"Track":{"type":"object","description":"Canonical track metadata returned across the public API.","required":["title","artists","vinylLayout"],"additionalProperties":false,"properties":{"title":{"type":"string","description":"Track title as reported by the origin service."},"artists":{"type":"array","items":{"type":"string"},"description":"Credited artists, ordered as the origin service returns them (primary first)."},"artistCredits":{"type":"array","items":{"$ref":"#/components/schemas/ArtistCredit"},"description":"Normalized artist entity credits in display order. The key is omitted when no normalized credits are stored for this track."},"albumName":{"type":"string","description":"Containing album title. The key is omitted when no album title is available."},"artworkUrl":{"type":"string","format":"uri","description":"Absolute artwork URL. The key is omitted when no artwork is available."},"durationMs":{"type":"integer","minimum":0,"description":"Track duration in milliseconds. The key is omitted when the duration is unavailable."},"isrc":{"type":"string","description":"International Standard Recording Code. The key is omitted when the source exposes no `ISRC`."},"releaseDate":{"type":"string","format":"date","description":"Original release date in `YYYY-MM-DD` format. The key is omitted when unavailable."},"isExplicit":{"type":"boolean","description":"Whether the track carries an explicit-content advisory. The key is omitted when the source gives no advisory state."},"previewUrl":{"type":"string","format":"uri","description":"Preview audio URL, typically an MP3 clip. The key is omitted when no usable preview is currently available."},"previewRefreshable":{"type":"boolean","description":"Set to `true` when `previewUrl` is absent but `GET /api/v1/share/{shortId}/preview` can attempt a refresh. The key is omitted otherwise."},"vinylLayout":{"anyOf":[{"$ref":"#/components/schemas/VinylLayout"},{"type":"null"}],"description":"The key is always included on public track response objects. Its value is the Discogs-derived vinyl layout for the containing album, or `null` when no suitable pressing is available."}},"example":{"title":"Take on Me","artists":["a-ha"],"artistCredits":[{"artistEntityId":"artist_a_ha","name":"a-ha","role":"main","position":0}],"albumName":"Hunting High and Low","artworkUrl":"https://i.scdn.co/image/ab67616d0000b273e58a0f7f1f2f8e4f6a3c8b2d","durationMs":225280,"isrc":"GBAYE8500114","releaseDate":"1985-06-01","isExplicit":false,"previewUrl":"https://p.scdn.co/mp3-preview/7ae363b1bc5d7c6bd9cbca4d4f2ae6e3a8c7b0f5","vinylLayout":null}},"TrackResolveSuccess":{"type":"object","description":"Successful track resolve (type-discriminated variant used inside `UnifiedResolveSuccess`).","required":["type","id","shortUrl","track","links"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["track"],"description":"Discriminator: always `track` for this variant."},"id":{"type":"string","description":"Persisted musiccloud track ID accepted by `GET /api/v1/link/{id}`. It is distinct from the share code in the final path segment of `shortUrl`."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this resolved track."},"track":{"allOf":[{"$ref":"#/components/schemas/Track"}],"description":"Unified metadata for the resolved track."},"links":{"type":"array","items":{"$ref":"#/components/schemas/PlatformLink"},"description":"Cross-service deep-links for the resolved track."}},"example":{"type":"track","id":"tr_01HZ8N2B6P7Q8W9E3R4T5Y6U7I","shortUrl":"https://musiccloud.io/aBc123x","track":{"title":"Take on Me","artists":["a-ha"],"albumName":"Hunting High and Low","artworkUrl":"https://i.scdn.co/image/ab67616d0000b273e58a0f7f1f2f8e4f6a3c8b2d","durationMs":225280,"isrc":"GBAYE8500114","releaseDate":"1985-06-01","isExplicit":false,"previewUrl":"https://p.scdn.co/mp3-preview/7ae363b1bc5d7c6bd9cbca4d4f2ae6e3a8c7b0f5","vinylLayout":null},"links":[{"service":"spotify","displayName":"Spotify","url":"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L","confidence":1,"matchMethod":"isrc"},{"service":"apple-music","displayName":"Apple Music","url":"https://music.apple.com/us/album/take-on-me/1433036073?i=1433036081","confidence":1,"matchMethod":"isrc"},{"service":"deezer","displayName":"Deezer","url":"https://www.deezer.com/track/14408535","confidence":1,"matchMethod":"isrc"},{"service":"youtube","displayName":"YouTube","url":"https://www.youtube.com/watch?v=djV11Xbc914","confidence":0.92,"matchMethod":"search"}]}},"TrackSharePageResponse":{"type":"object","description":"Commercial share-page payload for one resolved track.","required":["type","og","track","links","shortUrl"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["track"],"description":"Always `track` for this response shape."},"og":{"allOf":[{"$ref":"#/components/schemas/OgMeta"}],"description":"Open-Graph metadata for rendering and social sharing."},"track":{"allOf":[{"$ref":"#/components/schemas/Track"}],"description":"Stored canonical track metadata."},"links":{"type":"array","items":{"$ref":"#/components/schemas/PlatformLink"},"description":"Stored cross-service deep-links for this track."},"shortUrl":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for this track."}}},"UnifiedResolveSuccess":{"description":"Successful resolve, one of three shapes discriminated by `type`. Use `type` to decide whether to read `track`, `album`, or `artist`.","oneOf":[{"$ref":"#/components/schemas/TrackResolveSuccess"},{"$ref":"#/components/schemas/AlbumResolveSuccess"},{"$ref":"#/components/schemas/ArtistResolveSuccess"}]},"VinylLayout":{"type":"object","description":"Discogs-derived side and track timing data for a matched vinyl release.","required":["discogsReleaseId","sides"],"additionalProperties":false,"properties":{"discogsReleaseId":{"type":"string","description":"Numeric Discogs release ID used as the layout source. Append it to `https://www.discogs.com/release/` to link to that exact pressing."},"sides":{"type":"array","items":{"$ref":"#/components/schemas/VinylSide"},"description":"Physical vinyl sides with their ordered tracks."}},"example":{"discogsReleaseId":"249504","sides":[{"label":"A","tracks":[{"position":"A1","title":"Take on Me","durationMs":225280}]}]}},"VinylLayoutTrack":{"type":"object","description":"One track on a physical vinyl side, including its Discogs position and duration.","required":["position","title","durationMs"],"additionalProperties":false,"properties":{"position":{"type":"string","description":"Discogs position string, for example `A1` or `B2`."},"title":{"type":"string","description":"Track title printed for this physical release."},"durationMs":{"type":"integer","minimum":0,"description":"Track duration in milliseconds for this vinyl pressing."}},"example":{"position":"A1","title":"Take on Me","durationMs":225280}},"VinylSide":{"type":"object","description":"One physical vinyl side with its tracks in play order.","required":["label","tracks"],"additionalProperties":false,"properties":{"label":{"type":"string","description":"Physical side label, for example `A` or `B`."},"tracks":{"type":"array","items":{"$ref":"#/components/schemas/VinylLayoutTrack"},"description":"Tracks on this physical side in playback order."}},"example":{"label":"A","tracks":[{"position":"A1","title":"Take on Me","durationMs":225280}]}}}},"paths":{"/api/v1/artist-info":{"get":{"summary":"Aggregated artist info (top tracks, profile, events)","tags":["Artist"],"description":"Returns commercial artist details in one stable object: up to `5` top tracks, an assembled profile or `null`, up to `5` upcoming events, and up to `5` related-artist track lookups. Every top-level key is included; unavailable lists are empty. When `region` is supplied, matching events are sorted first.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":200},"in":"query","name":"name","required":false,"description":"Compatibility artist display name to look up when `artistEntityId` is not available. Leading and trailing whitespace is ignored, and a trailing YouTube auto-channel suffix ` - Topic` is removed before matching. Use the spelling returned in track or artist metadata when available."},{"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9_-]+$"},"in":"query","name":"artistEntityId","required":false,"description":"Normalized musiccloud artist entity ID from an `artistCredits[].artistEntityId` field in a successful track or album response. When supplied, this exact entity selects the persisted canonical artist name, its isolated enrichment cache, and the upstream lookup. It takes precedence over both `name` and `shortId`. Unknown entity IDs return `404`."},{"schema":{"type":"string"},"in":"query","name":"region","required":false,"description":"Country preference for event ordering. Supply a two-letter ISO `3166-1 alpha-2` code such as `NO`; matching is case-insensitive. Only the first two characters are used. Matching events are placed first and each group is ordered by `date`.\n\n**Default**: no country is prioritized and events remain in ascending date order."},{"schema":{"type":"string","minLength":1,"maxLength":32},"in":"query","name":"shortId","required":false,"description":"Optional musiccloud track share code. Take the last path segment of `shortUrl` from a successful track response from `POST /api/v1/resolve` or `GET /api/v1/resolve`. Without `artistEntityId`, a stored alternate artist can replace `name` for this lookup. With `artistEntityId`, this compatibility alias is ignored.\n\n**Default**: the supplied `name` is used directly, with no persisted-resolution context."},{"schema":{"type":"string","enum":["profile"]},"in":"query","name":"refresh","required":false,"description":"Set to `profile` to fetch profile metadata again before responding, even when the stored profile snapshot is younger than `183` days. This does not force a refresh of top tracks or events: those sections are fetched again only when their stored snapshots are at least `7` days and `24` hours old, respectively.\n\n**Default**: profile metadata is fetched when no stored snapshot exists or its snapshot is at least `183` days old."}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl \"https://api.musiccloud.io/api/v1/artist-info?name=a-ha&region=NO\""},{"lang":"Shell","label":"Bash","source":"#!/usr/bin/env bash\nset -euo pipefail\n\nBASE_URL=\"https://api.musiccloud.io\"\n\nresponse=$(curl -sS \"$BASE_URL/api/v1/artist-info?name=a-ha&region=NO\")\n\necho \"$response\" | jq ."},{"lang":"JavaScript","source":"const response = await fetch(\"https://api.musiccloud.io/api/v1/artist-info?name=a-ha&region=NO\");\nconst data = await response.json();"},{"lang":"Python","source":"import requests\n\nresponse = requests.get(\"https://api.musiccloud.io/api/v1/artist-info?name=a-ha&region=NO\")\ndata = response.json()"},{"lang":"PHP","source":"<?php\n\n$ch = curl_init(\"https://api.musiccloud.io/api/v1/artist-info?name=a-ha&region=NO\");\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n\n$response = curl_exec($ch);\ncurl_close($ch);\n$data = json_decode($response, true);"},{"lang":"Ruby","source":"require \"net/http\"\nrequire \"json\"\n\nuri = URI(\"https://api.musiccloud.io/api/v1/artist-info?name=a-ha&region=NO\")\nhttp = Net::HTTP.new(uri.host, uri.port)\nhttp.use_ssl = uri.scheme == \"https\"\n\nrequest = Net::HTTP::Get.new(uri.request_uri)\n\nresponse = http.request(request)\ndata = JSON.parse(response.body)"},{"lang":"Swift","source":"import Foundation\n\nlet url = URL(string: \"https://api.musiccloud.io/api/v1/artist-info?name=a-ha&region=NO\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nlet json = try JSONSerialization.jsonObject(with: data)"}],"responses":{"200":{"description":"`ArtistInfo` containing up to `5` selected top tracks, a nullable profile, up to `5` upcoming events, and related-artist track lookups.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArtistInfo"}}}},"400":{"description":"Missing or malformed artist identity query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The supplied normalized artist entity does not exist or has no usable stored name.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"This client IP exceeded `10` requests in a rolling `60`-second window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"retrieveArtistInfo"}},"/api/v1/cc/artist-info":{"get":{"summary":"Get Creative Commons artist details and related tracks","tags":["CC"],"description":"Returns `CcArtistInfo` for one Jamendo artist: up to `20` popular tracks in descending popularity order, a profile or `null`, up to `12` tracks by related artists, and an always-empty `events` array. Candidate values in `topTracks[].deezerUrl` and `similarArtistTracks[].track.deezerUrl` are opaque `jamendo:<trackId>` tokens, not URLs. Pass one unchanged as `selectedCandidate` to `POST /api/v1/cc/resolve` to persist and resolve that track.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[0-9]+$"},"in":"query","name":"jamendoArtistId","required":true,"description":"Numeric Jamendo artist ID. Read `track.jamendoArtistId`, `album.tracks[].jamendoArtistId`, or `artist.jamendoId` from a successful `POST /api/v1/cc/resolve` or `GET /api/v1/share/{shortId}` response."},{"schema":{"type":"string","minLength":1,"maxLength":200},"in":"query","name":"artistName","required":true,"description":"Display label for the artist identified by `jamendoArtistId`. Read it from `track.artistName`, `album.artistName`, or `artist.name` in the same response as the ID. The ID, not this name, controls which Jamendo artist, profile, and tracks are fetched; the supplied string is returned as `artistName`."}],"responses":{"200":{"description":"`CcArtistInfo` derived from the requested Jamendo artist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CcArtistInfo"}}}},"400":{"description":"`jamendoArtistId` is not numeric, or `artistName` is missing or empty.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"This client IP exceeded `10` requests in a rolling `60`-second window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"retrieveCcArtistInfo"}},"/api/v1/cc/audio/{jamendoId}":{"get":{"summary":"Stream a full Creative Commons track","tags":["CC"],"description":"Returns the selected full-track representation as raw audio bytes, not JSON. For ordinary browser playback, point an `<audio>` element directly at the endpoint:\n\n```html\n<audio controls src=\"https://api.musiccloud.io/api/v1/cc/audio/123456?format=mp32\"></audio>\n```\n\nFor `fetch`, consume `response.body` as a byte stream or call `response.blob()`; do not call `response.json()`. A `Blob` is available only after the complete response has been buffered, so use streaming or a direct `<audio>` URL for long tracks.\n\n**Formats.** `format=mp31` selects MP3 at `96 kbps`; `format=mp32` selects MP3 at approximately `256 kbps`; `format=ogg` selects Ogg Vorbis; and `format=flac` selects lossless FLAC. The default is `mp32`. The response `Content-Type` identifies the actual representation.\n\n**Seeking and resumable reads.** Send a valid HTTP range such as `Range: bytes=0-1048575` or `Range: bytes=-1048576`. A satisfiable range returns `206` and `Content-Range`; a complete representation returns `200`. `Accept-Ranges` is always `bytes`. `Content-Length` and `Cache-Control` are included only when supplied for the selected representation.","parameters":[{"schema":{"type":"string","default":"mp32"},"in":"query","name":"format","required":false,"description":"Jamendo delivery format: `mp31` (MP3 96 kbps), `mp32` (MP3 about 256 kbps), `ogg`, or `flac`. Invalid values also fall back to `mp32`.\n\n**Default**: `mp32`."},{"schema":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[0-9]+$"},"in":"path","name":"jamendoId","required":true,"description":"Numeric Jamendo track ID. Read `track.jamendoId`, `album.tracks[].jamendoId`, or `artist.topTracks[].jamendoId` from a successful `POST /api/v1/cc/resolve` or `GET /api/v1/share/{shortId}` response."},{"schema":{"type":"string","pattern":"^bytes=(?:[0-9]+-[0-9]*|-[0-9]+)$"},"in":"header","name":"range","required":false,"description":"Optional HTTP byte range, for example `bytes=0-1048575`. Omit it for the complete stream."}],"responses":{"200":{"description":"Complete full raw audio stream when no byte range was requested.","headers":{"Accept-Ranges":{"schema":{"type":"string","enum":["bytes"]},"description":"Always `bytes`."},"Content-Length":{"schema":{"type":"integer","minimum":0},"description":"Complete representation size in bytes. The header is omitted when the size is unavailable."},"Cache-Control":{"schema":{"type":"string"},"description":"Cache policy for the selected audio representation. The header is omitted when no policy is available."}},"content":{"audio/mpeg":{"schema":{"type":"string","format":"binary"}},"audio/ogg":{"schema":{"type":"string","format":"binary"}},"audio/flac":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested raw-audio byte range. `Content-Range` identifies the delivered segment.","headers":{"Accept-Ranges":{"schema":{"type":"string","enum":["bytes"]},"description":"Always `bytes`."},"Content-Range":{"schema":{"type":"string"},"description":"Delivered byte interval and complete size, for example `bytes 0-1048575/7340032`."},"Content-Length":{"schema":{"type":"integer","minimum":0},"description":"Delivered range size in bytes. The header is omitted when the size is unavailable."},"Cache-Control":{"schema":{"type":"string"},"description":"Cache policy for the selected audio representation. The header is omitted when no policy is available."}},"content":{"audio/mpeg":{"schema":{"type":"string","format":"binary"}},"audio/ogg":{"schema":{"type":"string","format":"binary"}},"audio/flac":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"`jamendoId` is not numeric or `Range` does not use a supported single-byte-range syntax.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No Creative Commons track exists for this `jamendoId`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"This client IP exceeded `10` requests in a rolling `60`-second window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The upstream Jamendo audio stream is unavailable or returned no body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"streamCcAudio"}},"/api/v1/cc/bandcamp/{jamendoId}":{"get":{"summary":"Whether a CC track is also available on Bandcamp","tags":["CC"],"description":"Returns `bandcampUrl` when the Jamendo track has a sufficiently reliable matching Bandcamp listing. Returns an empty object when the Jamendo ID is unknown or no safe match can be confirmed. Treat an omitted key as unavailable and do not construct a Bandcamp URL yourself.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[0-9]+$"},"in":"path","name":"jamendoId","required":true,"description":"Numeric Jamendo track ID. Read `track.jamendoId`, `album.tracks[].jamendoId`, or `artist.topTracks[].jamendoId` from a successful `POST /api/v1/cc/resolve` or `GET /api/v1/share/{shortId}` response."}],"responses":{"200":{"description":"Bandcamp availability for the Creative Commons track.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CcBandcampAvailabilityResponse"}}}},"400":{"description":"`jamendoId` is not numeric.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"This client IP exceeded `10` requests in a rolling `60`-second window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"retrieveCcBandcampAvailability"}},"/api/v1/cc/download/{jamendoId}":{"get":{"summary":"Download a CC track as a correctly named audio file","tags":["CC"],"description":"Returns a complete Creative Commons track as a downloadable attachment. `Content-Disposition` provides an ASCII fallback and a UTF-8 filename following `Artist_Album_NN_Title.ext`; unavailable album and track-position segments are omitted. `format=mp31` selects MP3 at `96 kbps`, `format=mp32` selects MP3 at approximately `256 kbps`, `format=ogg` selects Ogg Vorbis, and `format=flac` selects lossless FLAC. The default is `mp32`. Check `track.downloadAllowed` before offering this action; the endpoint returns `403` when downloads are not permitted.","parameters":[{"schema":{"type":"string","default":"mp32"},"in":"query","name":"format","required":false,"description":"Jamendo delivery format: `mp31` (MP3 96 kbps), `mp32` (MP3 about 256 kbps), `ogg`, or `flac`. Invalid values also fall back to `mp32`.\n\n**Default**: `mp32`."},{"schema":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[0-9]+$"},"in":"path","name":"jamendoId","required":true,"description":"Numeric Jamendo track ID. Read `track.jamendoId`, `album.tracks[].jamendoId`, or `artist.topTracks[].jamendoId` from a successful `POST /api/v1/cc/resolve` or `GET /api/v1/share/{shortId}` response."}],"responses":{"200":{"description":"Complete Creative Commons audio file served as an attachment.","headers":{"Content-Disposition":{"schema":{"type":"string"},"description":"Attachment filename in ASCII `filename=` and UTF-8 `filename*=` forms, for example `Artist_Album_01_Title.mp3`."},"Content-Length":{"schema":{"type":"integer","minimum":0},"description":"Complete audio-file size in bytes. The header is omitted when the size is unavailable."},"Cache-Control":{"schema":{"type":"string","enum":["no-store"]},"description":"Always `no-store`."}},"content":{"audio/mpeg":{"schema":{"type":"string","format":"binary"}},"audio/ogg":{"schema":{"type":"string","format":"binary"}},"audio/flac":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"`jamendoId` is not numeric.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The track's Creative Commons terms do not permit downloads.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No Creative Commons track exists for this `jamendoId`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"This client IP exceeded `10` requests in a rolling `60`-second window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The upstream Jamendo audio file is unavailable or returned no body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"downloadCcAudio"}},"/api/v1/cc/genre-artwork/{genreKey}":{"get":{"summary":"Procedurally generated Creative-Commons genre artwork","tags":["Artwork"],"description":"Returns a `512×512` JPEG derived only from Creative Commons source artwork. A stable generated image is served with `Cache-Control: public, max-age=31536000, immutable`. If source artwork is temporarily unavailable, the endpoint still returns a fallback JPEG with `Cache-Control: no-store`, allowing a later request to retry generation. This route is subject only to the global limit of `300` requests in a rolling `60`-second window per client IP.","parameters":[{"schema":{"type":"string"},"in":"path","name":"genreKey","required":true,"description":"Genre name from `CcGenreBrowseResponse.genres[].name`. URL-encode it when inserting it into the path; the endpoint lowercases and normalizes whitespace before validation."}],"responses":{"200":{"description":"Generated, cached, or transient fallback Creative Commons genre artwork as raw JPEG bytes.","headers":{"Cache-Control":{"schema":{"type":"string"},"description":"`public, max-age=31536000, immutable` for a stable image, or `no-store` for a transient fallback."}},"content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The normalized genre key contains invalid characters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Global rate limit exceeded. Retry after the interval provided by the `Retry-After` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"retrieveCcGenreArtwork"}},"/api/v1/cc/resolve":{"post":{"summary":"Resolve a Creative-Commons free-text or structured query (Jamendo)","tags":["Resolve"],"description":"Use `query` for Creative-Commons free text, a `title:`/`artist:`/`album:` structured search, or `genre:` discovery. Pasted streaming-service URLs are not accepted. A text search returns `ResolveDisambiguation`; choose one row and send its opaque `candidates[].id` back as `selectedCandidate`. A CC genre result already returns candidate IDs in `results.*[].id`; pass one unchanged as `selectedCandidate` to receive a persisted `cc-track`, `cc-album`, or `cc-artist` response.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Exactly one of `query` or `selectedCandidate` must be present. Supplying both is rejected with `400`.","properties":{"query":{"type":"string","minLength":1,"maxLength":500,"description":"Creative-Commons free text, structured search beginning with `title:`, `artist:`, or `album:`, or a `genre:` discovery query. Streaming-service URLs are not accepted.","example":"ambient piano"},"selectedCandidate":{"type":"string","minLength":1,"maxLength":200,"description":"Opaque candidate token returned as `candidates[].id` or `results.*[].id` by this endpoint. Pass it unchanged; prefixes such as `jamendo:`, `jamendo-album:`, and `jamendo-artist:` identify the response variant.","example":"jamendo:123456"}},"oneOf":[{"required":["query"]},{"required":["selectedCandidate"]}],"additionalProperties":false},"examples":{"example1":{"value":{"query":"ambient piano"}},"example2":{"value":{"selectedCandidate":"jamendo:123456"}}}}},"description":"Exactly one of `query` or `selectedCandidate` must be present. Supplying both is rejected with `400`."},"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"A `ResolveDisambiguation` selection list, a persisted `cc-track`, `cc-album`, or `cc-artist`, or a genre-discovery result with `status` equal to `genre-browse` or `genre-search`.","content":{"application/json":{"schema":{"description":"A `ResolveDisambiguation` selection list, a persisted `cc-track`, `cc-album`, or `cc-artist`, or a genre-discovery result with `status` equal to `genre-browse` or `genre-search`.","oneOf":[{"$ref":"#/components/schemas/ResolveDisambiguation"},{"$ref":"#/components/schemas/CcResolveSuccess"},{"$ref":"#/components/schemas/CcGenreSearchResponse"},{"$ref":"#/components/schemas/CcGenreBrowseResponse"}]}}}},"400":{"description":"The body does not contain exactly one usable `query` or `selectedCandidate`, the query syntax is invalid, or the candidate token has an unsupported format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The selected candidate could not be resolved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The issued API key exceeded its assigned rolling `60`-second or rolling `24`-hour quota. Inspect `context` and `Retry-After` before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"resolveCc"}},"/api/v1/genre-artwork/{genreKey}":{"get":{"summary":"Procedurally generated genre artwork","tags":["Artwork"],"description":"Returns a `512×512` JPEG for a normalized genre. A stable generated image is served with `Cache-Control: public, max-age=31536000, immutable`. If source artwork is temporarily unavailable, the endpoint still returns a fallback JPEG with `Cache-Control: no-store`, allowing a later request to retry generation. This route is subject only to the global limit of `300` requests in a rolling `60`-second window per client IP.","parameters":[{"schema":{"type":"string"},"in":"path","name":"genreKey","required":true,"description":"Genre name from `GenreBrowseResponse.genres[].name`. URL-encode it when inserting it into the path; the endpoint lowercases and normalizes whitespace before validation."}],"responses":{"200":{"description":"Generated, cached, or transient fallback genre artwork as raw JPEG bytes.","headers":{"Cache-Control":{"schema":{"type":"string"},"description":"`public, max-age=31536000, immutable` for a stable image, or `no-store` for a transient fallback."}},"content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The normalized genre key contains invalid characters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Global rate limit exceeded. Retry after the interval provided by the `Retry-After` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"retrieveGenreArtwork"}},"/api/v1/link/{id}":{"get":{"summary":"Fetch link metadata for a previously-resolved track","tags":["Links"],"description":"Returns stored metadata and service links for a track that has already been resolved. Use it when you have the top-level `id` from a successful track response and do not need to run another resolve. Because this operation reads stored links, each `links[]` item has `matchMethod` equal to `cache` and `confidence` equal to `1`; these values do not reproduce the original resolve's matching score.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"in":"path","name":"id","required":true,"description":"Persisted musiccloud track ID from the top-level `id` field of a successful track response from `POST /api/v1/resolve` or `GET /api/v1/resolve` with `format=json`."}],"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl \"https://api.musiccloud.io/api/v1/link/tr_01HZ8N2B6P7Q8W9E3R4T5Y6U7I\" \\\n  -H \"X-API-Key: <api-key>\""},{"lang":"Shell","label":"Bash","source":"#!/usr/bin/env bash\nset -euo pipefail\n\nBASE_URL=\"https://api.musiccloud.io\"\nTOKEN=\"<api-key>\"\n\nresponse=$(curl -sS \"$BASE_URL/api/v1/link/tr_01HZ8N2B6P7Q8W9E3R4T5Y6U7I\" \\\n  -H \"X-API-Key: $TOKEN\")\n\necho \"$response\" | jq ."},{"lang":"JavaScript","source":"const response = await fetch(\"https://api.musiccloud.io/api/v1/link/tr_01HZ8N2B6P7Q8W9E3R4T5Y6U7I\", {\n  headers: {\n      \"X-API-Key\": \"<api-key>\"\n  },\n});\nconst data = await response.json();"},{"lang":"Python","source":"import requests\n\nheaders = {\n    \"X-API-Key\": \"<api-key>\",\n}\nresponse = requests.get(\"https://api.musiccloud.io/api/v1/link/tr_01HZ8N2B6P7Q8W9E3R4T5Y6U7I\", headers=headers)\ndata = response.json()"},{"lang":"PHP","source":"<?php\n\n$ch = curl_init(\"https://api.musiccloud.io/api/v1/link/tr_01HZ8N2B6P7Q8W9E3R4T5Y6U7I\");\ncurl_setopt($ch, CURLOPT_HTTPHEADER, [\"X-API-Key: <api-key>\"]);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n\n$response = curl_exec($ch);\ncurl_close($ch);\n$data = json_decode($response, true);"},{"lang":"Ruby","source":"require \"net/http\"\nrequire \"json\"\n\nuri = URI(\"https://api.musiccloud.io/api/v1/link/tr_01HZ8N2B6P7Q8W9E3R4T5Y6U7I\")\nhttp = Net::HTTP.new(uri.host, uri.port)\nhttp.use_ssl = uri.scheme == \"https\"\n\nrequest = Net::HTTP::Get.new(uri.request_uri)\nrequest[\"X-API-Key\"] = \"<api-key>\"\n\nresponse = http.request(request)\ndata = JSON.parse(response.body)"},{"lang":"Swift","source":"import Foundation\n\nlet url = URL(string: \"https://api.musiccloud.io/api/v1/link/tr_01HZ8N2B6P7Q8W9E3R4T5Y6U7I\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.setValue(\"<api-key>\", forHTTPHeaderField: \"X-API-Key\")\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nlet json = try JSONSerialization.jsonObject(with: data)"}],"responses":{"200":{"description":"`LinkMetadataResponse` with stored track metadata and service links.","headers":{"Cache-Control":{"schema":{"type":"string","enum":["public, max-age=3600"]},"description":"Always `public, max-age=3600`."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkMetadataResponse"}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No track exists for this `id`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The issued API key exceeded its assigned rolling `60`-second or rolling `24`-hour quota. Inspect `context` and `Retry-After` before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"retrieveLinkMetadata"}},"/api/v1/resolve":{"get":{"summary":"Resolve a music URL or query (unauthenticated, GET)","tags":["Resolve"],"description":"Unauthenticated one-request companion to `POST /api/v1/resolve`, suitable for command-line tools, shortcuts, and other clients that do not need an interactive candidate-selection round. Accepts:\n\n- **Streaming-service URL** (e.g. `https://open.spotify.com/track/...`)\n- **Free-text query** (e.g. `bohemian rhapsody queen`)\n- **Structured search query** — starts with `title:`, `artist:`, or `album:` and resolves tracks only. Use it when the caller knows individual fields and wants more precise adapter-side matching than plain free text.\n\nSupported fields:\n- `title:` — track title. At least one of `title` or `artist` is required.\n- `artist:` — artist name. At least one of `title` or `artist` is required.\n- `album:` — optional album title. Refines a track match and cannot be used alone.\n- `count:` — optional integer from `1` to `10`. Caps the disambiguation candidate list.\n\nSyntax rules:\n- Field names are case-insensitive.\n- Fields are separated by commas. A missing comma before the next known field is tolerated, e.g. `title: foo artist: bar`.\n- Values may contain spaces. Commas are field separators and are not escaped.\n- Duplicate fields, empty values, unknown fields, `count` outside `1`–`10`, and `count` without `title` or `artist` return `400`.\n- `genre:`, `tracks:`, `albums:`, `artists:`, and `vibe:` are rejected here. Use the `genre:` query shape instead.\n\nExamples:\n- `title: The Killing Moon, artist: Echo & The Bunnymen`\n- `artist: Radiohead`\n- `title: Karma Police, artist: Radiohead, album: OK Computer, count: 5`\n\n`GET` has no `selectedCandidate` parameter. Ambiguous structured searches therefore return `400`; use `POST /api/v1/resolve` when the caller must present candidates and submit a selection. A successful `GET` resolve is persisted just like a successful `POST` resolve.\n\nA successful request persists the resolved track and returns either `ResolveSuccess` or its canonical share URL. Malformed input, ambiguous text, or text with no unambiguous match returns `400`. A valid streaming-service URL whose item cannot be found returns `404`.\n\n`genre:` discovery queries are not supported because they return candidate lists. Send those queries to `POST /api/v1/resolve`.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":500},"examples":{"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L":{"value":"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L"},"bohemian rhapsody queen":{"value":"bohemian rhapsody queen"},"title: Karma Police, artist: Radiohead, album: OK Computer, count: 5":{"value":"title: Karma Police, artist: Radiohead, album: OK Computer, count: 5"}},"in":"query","name":"query","required":true,"description":"Streaming-service URL, free-text query, or structured search query (e.g. `title: Bohemian Rhapsody, artist: Queen`)."},{"schema":{"type":"string","enum":["json","text"],"default":"json"},"in":"query","name":"format","required":false,"description":"`json` returns the full response; `text` returns the short URL as plain text.\n\n**Default**: `json`."}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl \"https://api.musiccloud.io/api/v1/resolve?query=https%3A%2F%2Fopen.spotify.com%2Ftrack%2F2WfaOiMkCvy7F5fcp2zZ8L\""},{"lang":"Shell","label":"Bash","source":"#!/usr/bin/env bash\nset -euo pipefail\n\nBASE_URL=\"https://api.musiccloud.io\"\n\nresponse=$(curl -sS \"$BASE_URL/api/v1/resolve?query=https%3A%2F%2Fopen.spotify.com%2Ftrack%2F2WfaOiMkCvy7F5fcp2zZ8L\")\n\necho \"$response\" | jq ."},{"lang":"JavaScript","source":"const response = await fetch(\"https://api.musiccloud.io/api/v1/resolve?query=https%3A%2F%2Fopen.spotify.com%2Ftrack%2F2WfaOiMkCvy7F5fcp2zZ8L\");\nconst data = await response.json();"},{"lang":"Python","source":"import requests\n\nresponse = requests.get(\"https://api.musiccloud.io/api/v1/resolve?query=https%3A%2F%2Fopen.spotify.com%2Ftrack%2F2WfaOiMkCvy7F5fcp2zZ8L\")\ndata = response.json()"},{"lang":"PHP","source":"<?php\n\n$ch = curl_init(\"https://api.musiccloud.io/api/v1/resolve?query=https%3A%2F%2Fopen.spotify.com%2Ftrack%2F2WfaOiMkCvy7F5fcp2zZ8L\");\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n\n$response = curl_exec($ch);\ncurl_close($ch);\n$data = json_decode($response, true);"},{"lang":"Ruby","source":"require \"net/http\"\nrequire \"json\"\n\nuri = URI(\"https://api.musiccloud.io/api/v1/resolve?query=https%3A%2F%2Fopen.spotify.com%2Ftrack%2F2WfaOiMkCvy7F5fcp2zZ8L\")\nhttp = Net::HTTP.new(uri.host, uri.port)\nhttp.use_ssl = uri.scheme == \"https\"\n\nrequest = Net::HTTP::Get.new(uri.request_uri)\n\nresponse = http.request(request)\ndata = JSON.parse(response.body)"},{"lang":"Swift","source":"import Foundation\n\nlet url = URL(string: \"https://api.musiccloud.io/api/v1/resolve?query=https%3A%2F%2Fopen.spotify.com%2Ftrack%2F2WfaOiMkCvy7F5fcp2zZ8L\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nlet json = try JSONSerialization.jsonObject(with: data)"}],"responses":{"200":{"description":"With `format=json` or no format, returns `ResolveSuccess`. With `format=text`, returns only the canonical share URL as UTF-8 plain text.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveSuccess"}},"text/plain":{"schema":{"type":"string","format":"uri","description":"Canonical musiccloud share URL for the resolved track."}}}},"400":{"description":"The query is missing or malformed, or a text search did not produce one unambiguous match.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The query is a valid streaming-service URL, but the referenced track could not be found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"408":{"description":"Upstream service timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"This client IP exceeded `10` requests in a rolling `60`-second window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Required upstream service is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"resolvePublicQuery"},"post":{"summary":"Resolve a music URL, free-text query, genre-discovery query, or structured search query","tags":["Resolve"],"description":"Accepts four query shapes. Pick the one that matches what the user knows:\n\n**1. Streaming-service URL** — e.g. `https://open.spotify.com/track/...`, `https://music.apple.com/...`. Returns unified cross-service metadata. Use when the user already has a link.\n\n**2. Free-text query** — any string that is not a URL and does not start with a structured prefix. Returns a resolved match or a disambiguation list (follow up with `selectedCandidate` to pick one). Use when the user only knows roughly what they want.\n\n**3. Genre-discovery query** — starts with `genre:`. Two sub-modes:\n  - `genre: ?` → browse grid of popular genres (no other fields allowed).\n  - `genre: <name>[|<name>...]<, modifier>*` → discovery results. Modifiers: `tracks`/`albums`/`artists` (`1`–`50` each, default `10` of each when none is specified), `count` (`1`–`50`, sets all three to the same value, mutually exclusive with per-type modifiers), `vibe` (`hot` for the highest-ranked results, `mixed` for a stratified sample across the ranked pool). `|` inside a value means OR.\n  - Example: `genre: jazz|r&b, tracks: 20, vibe: mixed`.\n\n**4. Structured search query** — starts with `title:`, `artist:`, or `album:` and resolves tracks only. Use it when the caller knows individual fields and wants more precise adapter-side matching than plain free text.\n\nSupported fields:\n- `title:` — track title. At least one of `title` or `artist` is required.\n- `artist:` — artist name. At least one of `title` or `artist` is required.\n- `album:` — optional album title. Refines a track match and cannot be used alone.\n- `count:` — optional integer from `1` to `10`. Caps the disambiguation candidate list.\n\nSyntax rules:\n- Field names are case-insensitive.\n- Fields are separated by commas. A missing comma before the next known field is tolerated, e.g. `title: foo artist: bar`.\n- Values may contain spaces. Commas are field separators and are not escaped.\n- Duplicate fields, empty values, unknown fields, `count` outside `1`–`10`, and `count` without `title` or `artist` return `400`.\n- `genre:`, `tracks:`, `albums:`, `artists:`, and `vibe:` are rejected here. Use the `genre:` query shape instead.\n\nExamples:\n- `title: The Killing Moon, artist: Echo & The Bunnymen`\n- `artist: Radiohead`\n- `title: Karma Police, artist: Radiohead, album: OK Computer, count: 5`\n\n`POST` can return `ResolveDisambiguation` for structured searches. Send the chosen `candidates[].id` back as `selectedCandidate` to the same endpoint to complete and persist the resolve.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Exactly one of `query` or `selectedCandidate` must be present. `query` is a URL or search string; `selectedCandidate` completes a prior disambiguation round.","properties":{"query":{"type":"string","minLength":1,"maxLength":500,"description":"Streaming-service URL, free-text query, genre-discovery query, or structured search query.","example":"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L"},"selectedCandidate":{"type":"string","minLength":1,"maxLength":200,"description":"Opaque `candidates[].id` value from a previous `ResolveDisambiguation` response. Pass it unchanged and omit `query`.","example":"spotify:2WfaOiMkCvy7F5fcp2zZ8L"}},"oneOf":[{"required":["query"]},{"required":["selectedCandidate"]}],"additionalProperties":false},"examples":{"example1":{"value":{"query":"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L"}},"example2":{"value":{"query":"title: Karma Police, artist: Radiohead, album: OK Computer, count: 5"}},"example3":{"value":{"selectedCandidate":"spotify:2WfaOiMkCvy7F5fcp2zZ8L"}}}}},"description":"Exactly one of `query` or `selectedCandidate` must be present. `query` is a URL or search string; `selectedCandidate` completes a prior disambiguation round."},"security":[{"ApiKeyAuth":[]}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl -X POST \"https://api.musiccloud.io/api/v1/resolve\" \\\n  -H \"X-API-Key: <api-key>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"query\": \"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L\"\n}'"},{"lang":"Shell","label":"Bash","source":"#!/usr/bin/env bash\nset -euo pipefail\n\nBASE_URL=\"https://api.musiccloud.io\"\nTOKEN=\"<api-key>\"\n\nresponse=$(curl -sS -X POST \"$BASE_URL/api/v1/resolve\" \\\n  -H \"X-API-Key: $TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"query\": \"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L\"\n}')\n\necho \"$response\" | jq ."},{"lang":"JavaScript","source":"const response = await fetch(\"https://api.musiccloud.io/api/v1/resolve\", {\n  method: \"POST\",\n  headers: {\n      \"X-API-Key\": \"<api-key>\",\n      \"Content-Type\": \"application/json\"\n  },\n  body: JSON.stringify({\n    \"query\": \"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L\"\n  }),\n});\nconst data = await response.json();"},{"lang":"Python","source":"import requests\n\nheaders = {\n    \"X-API-Key\": \"<api-key>\",\n}\nresponse = requests.post(\"https://api.musiccloud.io/api/v1/resolve\", headers=headers, json={\"query\": \"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L\"})\ndata = response.json()"},{"lang":"PHP","source":"<?php\n\n$ch = curl_init(\"https://api.musiccloud.io/api/v1/resolve\");\ncurl_setopt($ch, CURLOPT_CUSTOMREQUEST, \"POST\");\ncurl_setopt($ch, CURLOPT_HTTPHEADER, [\"X-API-Key: <api-key>\", \"Content-Type: application/json\"]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, '{\"query\":\"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L\"}');\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n\n$response = curl_exec($ch);\ncurl_close($ch);\n$data = json_decode($response, true);"},{"lang":"Ruby","source":"require \"net/http\"\nrequire \"json\"\n\nuri = URI(\"https://api.musiccloud.io/api/v1/resolve\")\nhttp = Net::HTTP.new(uri.host, uri.port)\nhttp.use_ssl = uri.scheme == \"https\"\n\nrequest = Net::HTTP::Post.new(uri.request_uri)\nrequest[\"X-API-Key\"] = \"<api-key>\"\nrequest[\"Content-Type\"] = \"application/json\"\nrequest.body = \"{\\\"query\\\":\\\"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L\\\"}\"\n\nresponse = http.request(request)\ndata = JSON.parse(response.body)"},{"lang":"Swift","source":"import Foundation\n\nlet url = URL(string: \"https://api.musiccloud.io/api/v1/resolve\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"POST\"\nrequest.setValue(\"<api-key>\", forHTTPHeaderField: \"X-API-Key\")\nrequest.setValue(\"application/json\", forHTTPHeaderField: \"Content-Type\")\nrequest.httpBody = try JSONSerialization.data(withJSONObject: [\"query\": \"https://open.spotify.com/track/2WfaOiMkCvy7F5fcp2zZ8L\"])\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nlet json = try JSONSerialization.jsonObject(with: data)"}],"responses":{"200":{"description":"A persisted `UnifiedResolveSuccess` selected by `type`, a `ResolveDisambiguation` list with `status` equal to `disambiguation`, or a genre result with `status` equal to `genre-search` or `genre-browse`.","content":{"application/json":{"schema":{"description":"A persisted `UnifiedResolveSuccess` selected by `type`, a `ResolveDisambiguation` list with `status` equal to `disambiguation`, or a genre result with `status` equal to `genre-search` or `genre-browse`.","oneOf":[{"$ref":"#/components/schemas/UnifiedResolveSuccess"},{"$ref":"#/components/schemas/ResolveDisambiguation"},{"$ref":"#/components/schemas/GenreSearchResponse"},{"$ref":"#/components/schemas/GenreBrowseResponse"}]}}}},"400":{"description":"Invalid URL, invalid genre query, invalid structured search query, or malformed body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"URL is valid but the track/album/artist could not be found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"408":{"description":"Upstream service timed out before a match could be confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The issued API key exceeded its assigned rolling `60`-second or rolling `24`-hour quota. Inspect `context` and `Retry-After` before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A service needed to resolve this request is currently unavailable. Retry after a delay; if the response repeats, report its `errorId`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"resolve"}},"/api/v1/share/{shortId}":{"get":{"summary":"Fetch a previously-resolved share","tags":["Share"],"description":"Returns one of six exact share variants selected by `type`: commercial `track`, `album`, or `artist`, and Creative Commons `cc-track`, `cc-album`, or `cc-artist`. Commercial variants contain the matching entity plus `links`. `cc-track` contains only `track`, `og`, and `shortUrl`; `cc-album` and `cc-artist` additionally contain `artistInfo`. Creative Commons variants never contain `links`. Read `type` before accessing the variant-specific entity key.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9_-]+$"},"in":"path","name":"shortId","required":true,"description":"Public musiccloud share code: take the last path segment of `shortUrl` from a successful `POST /api/v1/resolve`, `GET /api/v1/resolve`, or `POST /api/v1/cc/resolve` response."}],"x-codeSamples":[{"lang":"Shell","label":"cURL","source":"curl \"https://api.musiccloud.io/api/v1/share/aBc123x\""},{"lang":"Shell","label":"Bash","source":"#!/usr/bin/env bash\nset -euo pipefail\n\nBASE_URL=\"https://api.musiccloud.io\"\n\nresponse=$(curl -sS \"$BASE_URL/api/v1/share/aBc123x\")\n\necho \"$response\" | jq ."},{"lang":"JavaScript","source":"const response = await fetch(\"https://api.musiccloud.io/api/v1/share/aBc123x\");\nconst data = await response.json();"},{"lang":"Python","source":"import requests\n\nresponse = requests.get(\"https://api.musiccloud.io/api/v1/share/aBc123x\")\ndata = response.json()"},{"lang":"PHP","source":"<?php\n\n$ch = curl_init(\"https://api.musiccloud.io/api/v1/share/aBc123x\");\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n\n$response = curl_exec($ch);\ncurl_close($ch);\n$data = json_decode($response, true);"},{"lang":"Ruby","source":"require \"net/http\"\nrequire \"json\"\n\nuri = URI(\"https://api.musiccloud.io/api/v1/share/aBc123x\")\nhttp = Net::HTTP.new(uri.host, uri.port)\nhttp.use_ssl = uri.scheme == \"https\"\n\nrequest = Net::HTTP::Get.new(uri.request_uri)\n\nresponse = http.request(request)\ndata = JSON.parse(response.body)"},{"lang":"Swift","source":"import Foundation\n\nlet url = URL(string: \"https://api.musiccloud.io/api/v1/share/aBc123x\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\n\nlet (data, _) = try await URLSession.shared.data(for: request)\nlet json = try JSONSerialization.jsonObject(with: data)"}],"responses":{"200":{"description":"`SharePage`, discriminated by `type` into the exact commercial or Creative-Commons resource shape.","headers":{"Cache-Control":{"schema":{"type":"string"},"description":"`private, max-age=3600` for commercial `track`, `album`, and `artist` plus `cc-artist`; `no-store` for `cc-track` and `cc-album`."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharePage"}}}},"400":{"description":"`shortId` failed validation (empty, too long, or contains disallowed characters).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No commercial or Creative-Commons track, album, or artist exists for this share code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"This client IP exceeded `10` requests in a rolling `60`-second window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"retrieveShare"}},"/api/v1/share/{shortId}/preview":{"get":{"summary":"Refresh the audio preview URL for a share","tags":["Share"],"description":"Returns a currently usable audio-preview URL for a commercial track share. The key `previewUrl` is always included: its value is a URL when one is available, or `null` when the track has no source identifier or no preview can be obtained. This endpoint does not accept album, artist, or Creative-Commons share codes.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9_-]+$"},"in":"path","name":"shortId","required":true,"description":"Track share code: take the last path segment of `shortUrl` from a successful track response from `POST /api/v1/resolve` or `GET /api/v1/resolve`. Album, artist, and Creative Commons share codes are not accepted."}],"responses":{"200":{"description":"Fresh preview URL for the commercial track share, or `null` when no preview is available.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharePreviewResponse"}}}},"404":{"description":"No commercial track exists for this share code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"This client IP exceeded `10` requests in a rolling `60`-second window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Unexpected server error. Use `errorId` from the response when reporting the failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"operationId":"refreshSharePreview"}}},"servers":[{"url":"https://api.musiccloud.io","description":"Production"}],"tags":[{"name":"Artist","description":"Commercial and Creative-Commons artist metadata"},{"name":"Artwork","description":"Generated JPEG artwork for commercial and Creative-Commons genres"},{"name":"CC","description":"Creative-Commons (Jamendo) resolve, audio, and metadata"},{"name":"Links","description":"Link metadata"},{"name":"Resolve","description":"Resolve music URLs or text queries"},{"name":"Share","description":"Fetch previously-resolved shares"}],"x-musiccloud-error-codes":[{"code":"MC-API-0001","httpStatus":503,"message":"One of the services is temporarily unavailable. We returned what we could find."},{"code":"MC-API-0002","httpStatus":503,"message":"All services are currently unreachable. Please try again in a few minutes."},{"code":"MC-API-0003","httpStatus":429,"message":"Too many requests. You can make {limit} requests per {windowSeconds} seconds. Please try again in {retryAfterSeconds} seconds."},{"code":"MC-API-0004","httpStatus":500,"message":"Something went wrong talking to a service. Please try again."},{"code":"MC-API-0005","httpStatus":408,"message":"This is taking longer than usual. Please try again."},{"code":"MC-API-1001","httpStatus":503,"message":"Apple Music returned an unexpected response. Please try again later."},{"code":"MC-API-1404","httpStatus":404,"message":"Apple Music doesn't have this {kind} in the {storefront} region."},{"code":"MC-API-1429","httpStatus":429,"message":"Apple Music is rate-limiting us. Please try again in a moment."},{"code":"MC-API-2001","httpStatus":503,"message":"Qobuz returned an unexpected response. Please try again later."},{"code":"MC-API-2404","httpStatus":404,"message":"Qobuz doesn't have this track or album anymore."},{"code":"MC-AUTH-0001","httpStatus":401,"message":"Authentication is required or no longer valid."},{"code":"MC-AUTH-0002","httpStatus":403,"message":"You do not have permission to perform this action."},{"code":"MC-AUTH-1401","httpStatus":503,"message":"Apple Music rejected our credentials. The dev token may be expired or misconfigured."},{"code":"MC-AUTH-1501","httpStatus":503,"message":"Apple Music token signing failed on the server."},{"code":"MC-AUTH-2401","httpStatus":503,"message":"Qobuz rejected our login. Credentials or app id may be wrong."},{"code":"MC-CFG-1001","httpStatus":503,"message":"Apple Music is not configured on this server."},{"code":"MC-CFG-2001","httpStatus":503,"message":"Qobuz is not configured on this server."},{"code":"MC-DB-0001","httpStatus":500,"message":"The database permissions are invalid for this operation."},{"code":"MC-DB-0002","httpStatus":500,"message":"The database schema is incomplete for this operation."},{"code":"MC-DB-0003","httpStatus":503,"message":"The database is temporarily unavailable."},{"code":"MC-DB-0004","httpStatus":500,"message":"A database operation failed."},{"code":"MC-REQ-0001","httpStatus":400,"message":"The request did not match the expected format."},{"code":"MC-REQ-0002","httpStatus":409,"message":"The request conflicts with the current resource state."},{"code":"MC-RES-0001","httpStatus":404,"message":"This track doesn't seem to be available anymore on the source service."},{"code":"MC-RES-0002","httpStatus":404,"message":"We couldn't find this on other services. It may be exclusive to the source."},{"code":"MC-RES-0003","httpStatus":404,"message":"The requested resource was not found."},{"code":"MC-SYS-0001","httpStatus":500,"message":"An unexpected server error occurred."},{"code":"MC-SYS-0002","httpStatus":503,"message":"The backend could not be reached."},{"code":"MC-URL-0001","httpStatus":400,"message":"This platform isn't supported. Try a link from Spotify, Apple Music, or YouTube."},{"code":"MC-URL-0002","httpStatus":400,"message":"This doesn't look like a music link. Try pasting a link from a supported service."},{"code":"MC-URL-0003","httpStatus":400,"message":"That URL looks malformed. Please paste the full link from the streaming service."},{"code":"MC-URL-0004","httpStatus":400,"message":"Playlists aren't supported yet. Paste a link to a single track or album instead."},{"code":"MC-URL-0005","httpStatus":400,"message":"We only support music tracks at the moment. Podcasts aren't resolved."},{"code":"MC-URL-0006","httpStatus":400,"message":"Try pasting a link to a specific song or open the album page and share from there."},{"code":"MC-URL-0007","httpStatus":503,"message":"This service is currently disabled. Please try a link from another service."}]}