openapi: 3.0.3
info:
title: Last.fm Web Services API (2.0)
version: '2.0'
description: |
The Last.fm (AudioScrobbler) Web Services 2.0 API provides programmatic access to
music metadata, charts, geo-listening data, tags, user listening history, and
scrobbling. The API is method-dispatched: every request targets the single endpoint
`https://ws.audioscrobbler.com/2.0/` and identifies the operation via the `method`
query/body parameter (e.g. `method=track.getInfo`).
Read methods accept `GET`; write methods (scrobbling, tagging, love/unlove, session
management) require `POST` with an authenticated session key and a signed
`api_sig` parameter (MD5 of sorted params + shared secret).
Responses default to XML; pass `format=json` for JSON.
termsOfService: https://www.last.fm/api/tos
contact:
name: Last.fm API Support
url: https://www.last.fm/api
email: partners@last.fm
license:
name: Last.fm API Terms of Service
url: https://www.last.fm/api/tos
servers:
- url: https://ws.audioscrobbler.com/2.0
description: Production AudioScrobbler endpoint
- url: http://ws.audioscrobbler.com/2.0
description: Non-TLS endpoint (legacy)
tags:
- name: Album
description: Album metadata, tagging, and search.
- name: Artist
description: Artist metadata, similarity, tagging, top albums/tracks, and search.
- name: Auth
description: Token, session, and mobile session acquisition for authenticated calls.
- name: Chart
description: Global top artists, tags, and tracks.
- name: Geo
description: Country-level top artists and tracks.
- name: Library
description: A user's scrobbled artist library.
- name: Tag
description: Tag metadata, similar tags, top albums/artists/tracks, and chart history.
- name: Track
description: Track metadata, scrobbling, love/unlove, tagging, search.
- name: User
description: User profile, friends, listening history, top entities, and weekly charts.
security:
- ApiKeyAuth: []
- SignedAuth: []
paths:
/:
get:
operationId: invokeReadMethod
summary: Invoke A Read Method
description: |
Single read-side dispatch endpoint. The `method` parameter selects the
operation (e.g. `album.getInfo`, `artist.getTopTracks`, `chart.getTopArtists`).
Use `format=json` for JSON responses.
tags: [Album, Artist, Chart, Geo, Library, Tag, Track, User]
parameters:
- $ref: '#/components/parameters/MethodParam'
- $ref: '#/components/parameters/ApiKeyParam'
- $ref: '#/components/parameters/FormatParam'
- $ref: '#/components/parameters/CallbackParam'
- name: artist
in: query
schema: { type: string }
description: Artist name (used by album.*, artist.*, track.* read methods).
- name: album
in: query
schema: { type: string }
description: Album name (used by album.* methods).
- name: track
in: query
schema: { type: string }
description: Track name (used by track.* methods).
- name: mbid
in: query
schema: { type: string }
description: MusicBrainz identifier; takes precedence over artist/album/track names.
- name: user
in: query
schema: { type: string }
description: Last.fm username (used by user.* methods).
- name: tag
in: query
schema: { type: string }
description: Tag name (used by tag.* methods).
- name: country
in: query
schema: { type: string }
description: ISO 3166-1 country name (used by geo.* methods).
- name: limit
in: query
schema: { type: integer, default: 50, maximum: 1000 }
description: Max items per page.
- name: page
in: query
schema: { type: integer, default: 1 }
description: Page number for paginated results.
- name: period
in: query
schema:
type: string
enum: [overall, 7day, 1month, 3month, 6month, 12month]
description: Aggregation window for user.getTop* methods.
- name: autocorrect
in: query
schema: { type: integer, enum: [0, 1], default: 0 }
description: Auto-correct misspelled artist/track names when set to 1.
- name: username
in: query
schema: { type: string }
description: Username context for personalized fields (playcount, userplaycount).
responses:
'200':
description: Successful response in XML (default) or JSON (`format=json`).
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/AlbumInfoResponse'
- $ref: '#/components/schemas/ArtistInfoResponse'
- $ref: '#/components/schemas/TrackInfoResponse'
- $ref: '#/components/schemas/TagInfoResponse'
- $ref: '#/components/schemas/UserInfoResponse'
- $ref: '#/components/schemas/ChartResponse'
- $ref: '#/components/schemas/GeoResponse'
- $ref: '#/components/schemas/SearchResponse'
application/xml:
schema:
type: string
description: XML payload wrapped in `…`.
'400':
$ref: '#/components/responses/ErrorResponse'
'403':
$ref: '#/components/responses/ErrorResponse'
'429':
$ref: '#/components/responses/ErrorResponse'
post:
operationId: invokeWriteMethod
summary: Invoke A Write Method
description: |
Single write-side dispatch endpoint. Used for authenticated write actions:
`track.scrobble`, `track.updateNowPlaying`, `track.love`, `track.unlove`,
`album.addTags`, `album.removeTag`, `artist.addTags`, `artist.removeTag`,
`track.addTags`, `track.removeTag`. POST body parameters are
`application/x-www-form-urlencoded` UTF-8 encoded and must include
`api_key`, `sk` (session key), and `api_sig`.
tags: [Album, Artist, Track, Auth]
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/WriteRequestBody'
responses:
'200':
description: Successful write response with status wrapper.
content:
application/json:
schema: { $ref: '#/components/schemas/WriteResponse' }
'400':
$ref: '#/components/responses/ErrorResponse'
'403':
$ref: '#/components/responses/ErrorResponse'
'429':
$ref: '#/components/responses/ErrorResponse'
# --- Convenience method-as-path operations (logical alias of the dispatch endpoint) ---
# ALBUM
/?method=album.addTags:
post:
operationId: albumAddTags
summary: Add Album Tags
tags: [Album]
description: Tag an album using a list of user supplied tags. Requires authentication.
requestBody: { $ref: '#/components/requestBodies/AlbumTagWrite' }
responses:
'200': { description: OK, content: { application/json: { schema: { $ref: '#/components/schemas/WriteResponse' } } } }
/?method=album.getInfo:
get:
operationId: albumGetInfo
summary: Get Album Info
tags: [Album]
description: Get the metadata and tracklist for an album on Last.fm using the album name or a musicbrainz id.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: album
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: lang
in: query
schema: { type: string, example: en }
- name: autocorrect
in: query
schema: { type: integer, enum: [0, 1] }
- name: username
in: query
schema: { type: string }
responses:
'200':
description: Album info envelope.
content:
application/json:
schema: { $ref: '#/components/schemas/AlbumInfoResponse' }
/?method=album.getTags:
get:
operationId: albumGetTags
summary: Get Album Tags
tags: [Album]
description: Get the tags applied by an individual user to an album on Last.fm.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: album
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: user
in: query
required: true
schema: { type: string }
responses:
'200':
description: User tags applied to the album.
content:
application/json:
schema: { $ref: '#/components/schemas/TagListResponse' }
/?method=album.getTopTags:
get:
operationId: albumGetTopTags
summary: Get Top Album Tags
tags: [Album]
description: Get the top tags for an album on Last.fm, ordered by popularity.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: album
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: autocorrect
in: query
schema: { type: integer, enum: [0, 1] }
responses:
'200':
description: Top tags for the album.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTagsResponse' }
/?method=album.removeTag:
post:
operationId: albumRemoveTag
summary: Remove Album Tag
tags: [Album]
description: Remove a user's tag from an album.
requestBody: { $ref: '#/components/requestBodies/AlbumTagWrite' }
responses:
'200': { description: OK, content: { application/json: { schema: { $ref: '#/components/schemas/WriteResponse' } } } }
/?method=album.search:
get:
operationId: albumSearch
summary: Search Albums
tags: [Album]
description: Search for an album by name. Returns album matches sorted by relevance.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: album
in: query
required: true
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 30 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Search results for albums.
content:
application/json:
schema: { $ref: '#/components/schemas/SearchResponse' }
# ARTIST
/?method=artist.addTags:
post:
operationId: artistAddTags
summary: Add Artist Tags
tags: [Artist]
description: Tag an artist with one or more user supplied tags.
requestBody: { $ref: '#/components/requestBodies/ArtistTagWrite' }
responses:
'200': { description: OK, content: { application/json: { schema: { $ref: '#/components/schemas/WriteResponse' } } } }
/?method=artist.getCorrection:
get:
operationId: artistGetCorrection
summary: Get Artist Correction
tags: [Artist]
description: Use the last.fm corrections data to check whether the supplied artist has a correction to a canonical artist.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
required: true
schema: { type: string }
responses:
'200':
description: Suggested artist correction, if any.
content:
application/json:
schema: { type: object, additionalProperties: true }
/?method=artist.getInfo:
get:
operationId: artistGetInfo
summary: Get Artist Info
tags: [Artist]
description: Get the metadata for an artist. Includes biography, listener counts, similar artists, tags.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: lang
in: query
schema: { type: string }
- name: autocorrect
in: query
schema: { type: integer, enum: [0, 1] }
- name: username
in: query
schema: { type: string }
responses:
'200':
description: Artist info envelope.
content:
application/json:
schema: { $ref: '#/components/schemas/ArtistInfoResponse' }
/?method=artist.getSimilar:
get:
operationId: artistGetSimilar
summary: Get Similar Artists
tags: [Artist]
description: Get all the artists similar to this artist.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 100 }
- name: autocorrect
in: query
schema: { type: integer, enum: [0, 1] }
responses:
'200':
description: Similar artists list.
content:
application/json:
schema: { type: object, additionalProperties: true }
/?method=artist.getTags:
get:
operationId: artistGetTags
summary: Get Artist Tags
tags: [Artist]
description: Get the tags applied by an individual user to an artist on Last.fm.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: user
in: query
required: true
schema: { type: string }
responses:
'200':
description: User tags for the artist.
content:
application/json:
schema: { $ref: '#/components/schemas/TagListResponse' }
/?method=artist.getTopAlbums:
get:
operationId: artistGetTopAlbums
summary: Get Top Albums For Artist
tags: [Artist]
description: Get the top albums for an artist on Last.fm, ordered by popularity.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
- name: autocorrect
in: query
schema: { type: integer, enum: [0, 1] }
responses:
'200':
description: Top albums for the artist.
content:
application/json:
schema: { $ref: '#/components/schemas/TopAlbumsResponse' }
/?method=artist.getTopTags:
get:
operationId: artistGetTopTags
summary: Get Top Artist Tags
tags: [Artist]
description: Get the top tags for an artist on Last.fm, ordered by popularity.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: autocorrect
in: query
schema: { type: integer, enum: [0, 1] }
responses:
'200':
description: Top tags for the artist.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTagsResponse' }
/?method=artist.getTopTracks:
get:
operationId: artistGetTopTracks
summary: Get Top Tracks For Artist
tags: [Artist]
description: Get the top tracks by an artist on Last.fm, ordered by popularity.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
- name: autocorrect
in: query
schema: { type: integer, enum: [0, 1] }
responses:
'200':
description: Top tracks for the artist.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTracksResponse' }
/?method=artist.removeTag:
post:
operationId: artistRemoveTag
summary: Remove Artist Tag
tags: [Artist]
description: Remove a user's tag from an artist.
requestBody: { $ref: '#/components/requestBodies/ArtistTagWrite' }
responses:
'200': { description: OK, content: { application/json: { schema: { $ref: '#/components/schemas/WriteResponse' } } } }
/?method=artist.search:
get:
operationId: artistSearch
summary: Search Artists
tags: [Artist]
description: Search for an artist by name. Returns artist matches sorted by relevance.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
required: true
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 30 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Search results for artists.
content:
application/json:
schema: { $ref: '#/components/schemas/SearchResponse' }
# AUTH
/?method=auth.getMobileSession:
post:
operationId: authGetMobileSession
summary: Get Mobile Session
tags: [Auth]
description: Create a Last.fm web service session for a user. Used by mobile devices. Requires signed POST.
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
required: [method, api_key, username, password, api_sig]
properties:
method: { type: string, enum: [auth.getMobileSession] }
api_key: { type: string }
username: { type: string }
password: { type: string }
api_sig: { type: string, description: MD5 signature of sorted params + secret. }
responses:
'200':
description: Session response with session key, name, and subscriber flag.
content:
application/json:
schema: { $ref: '#/components/schemas/SessionResponse' }
/?method=auth.getSession:
get:
operationId: authGetSession
summary: Get Web Session
tags: [Auth]
description: Fetch a session key for a user using a previously authorized token.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: token
in: query
required: true
schema: { type: string }
- name: api_sig
in: query
required: true
schema: { type: string }
responses:
'200':
description: Session response.
content:
application/json:
schema: { $ref: '#/components/schemas/SessionResponse' }
/?method=auth.getToken:
get:
operationId: authGetToken
summary: Get Auth Token
tags: [Auth]
description: Fetch an unauthorized request token for an API account. Returns a token to be authorized by the user.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
responses:
'200':
description: Unauthorized token.
content:
application/json:
schema:
type: object
properties:
token: { type: string }
# CHART
/?method=chart.getTopArtists:
get:
operationId: chartGetTopArtists
summary: Get Top Artists Chart
tags: [Chart]
description: Get the top artists chart on Last.fm.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Top artists chart.
content:
application/json:
schema: { $ref: '#/components/schemas/ChartResponse' }
/?method=chart.getTopTags:
get:
operationId: chartGetTopTags
summary: Get Top Tags Chart
tags: [Chart]
description: Get the top tags chart on Last.fm.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Top tags chart.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTagsResponse' }
/?method=chart.getTopTracks:
get:
operationId: chartGetTopTracks
summary: Get Top Tracks Chart
tags: [Chart]
description: Get the top tracks chart on Last.fm.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Top tracks chart.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTracksResponse' }
# GEO
/?method=geo.getTopArtists:
get:
operationId: geoGetTopArtists
summary: Get Top Artists By Country
tags: [Geo]
description: Get the most popular artists on Last.fm by country.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: country
in: query
required: true
schema: { type: string, example: United States }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Country top artists.
content:
application/json:
schema: { $ref: '#/components/schemas/GeoResponse' }
/?method=geo.getTopTracks:
get:
operationId: geoGetTopTracks
summary: Get Top Tracks By Country
tags: [Geo]
description: Get the most popular tracks on Last.fm last week by country.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: country
in: query
required: true
schema: { type: string }
- name: location
in: query
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Country top tracks.
content:
application/json:
schema: { $ref: '#/components/schemas/GeoResponse' }
# LIBRARY
/?method=library.getArtists:
get:
operationId: libraryGetArtists
summary: Get Library Artists
tags: [Library]
description: A paginated list of all the artists in a user's library, with play counts and tag counts.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Library artists for the user.
content:
application/json:
schema:
type: object
additionalProperties: true
# TAG
/?method=tag.getInfo:
get:
operationId: tagGetInfo
summary: Get Tag Info
tags: [Tag]
description: Get the metadata for a tag.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: tag
in: query
required: true
schema: { type: string }
- name: lang
in: query
schema: { type: string }
responses:
'200':
description: Tag metadata.
content:
application/json:
schema: { $ref: '#/components/schemas/TagInfoResponse' }
/?method=tag.getSimilar:
get:
operationId: tagGetSimilar
summary: Get Similar Tags
tags: [Tag]
description: Search for tags similar to this one. Returns tags ranked by similarity, based on listening data.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: tag
in: query
required: true
schema: { type: string }
responses:
'200':
description: Similar tags.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTagsResponse' }
/?method=tag.getTopAlbums:
get:
operationId: tagGetTopAlbums
summary: Get Top Albums For Tag
tags: [Tag]
description: Get the top albums tagged by this tag, ordered by tag count.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: tag
in: query
required: true
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Top albums tagged with this tag.
content:
application/json:
schema: { $ref: '#/components/schemas/TopAlbumsResponse' }
/?method=tag.getTopArtists:
get:
operationId: tagGetTopArtists
summary: Get Top Artists For Tag
tags: [Tag]
description: Get the top artists tagged by this tag, ordered by tag count.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: tag
in: query
required: true
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Top artists for the tag.
content:
application/json:
schema: { $ref: '#/components/schemas/ChartResponse' }
/?method=tag.getTopTags:
get:
operationId: tagGetTopTags
summary: Get Top Tags Overall
tags: [Tag]
description: Fetches the top global tags on Last.fm, sorted by popularity (number of times used).
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
responses:
'200':
description: Top global tags.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTagsResponse' }
/?method=tag.getTopTracks:
get:
operationId: tagGetTopTracks
summary: Get Top Tracks For Tag
tags: [Tag]
description: Get the top tracks tagged by this tag, ordered by tag count.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: tag
in: query
required: true
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Top tracks for the tag.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTracksResponse' }
/?method=tag.getWeeklyChartList:
get:
operationId: tagGetWeeklyChartList
summary: Get Weekly Tag Chart List
tags: [Tag]
description: Get a list of available charts for this tag, expressed as date ranges.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: tag
in: query
required: true
schema: { type: string }
responses:
'200':
description: Available weekly chart ranges.
content:
application/json:
schema:
type: object
additionalProperties: true
# TRACK
/?method=track.addTags:
post:
operationId: trackAddTags
summary: Add Track Tags
tags: [Track]
description: Tag a track using a list of user supplied tags.
requestBody: { $ref: '#/components/requestBodies/TrackTagWrite' }
responses:
'200': { description: OK, content: { application/json: { schema: { $ref: '#/components/schemas/WriteResponse' } } } }
/?method=track.getCorrection:
get:
operationId: trackGetCorrection
summary: Get Track Correction
tags: [Track]
description: Use the last.fm corrections data to check whether the supplied track has a correction to a canonical track.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
required: true
schema: { type: string }
- name: track
in: query
required: true
schema: { type: string }
responses:
'200':
description: Suggested track correction.
content:
application/json:
schema: { type: object, additionalProperties: true }
/?method=track.getInfo:
get:
operationId: trackGetInfo
summary: Get Track Info
tags: [Track]
description: Get the metadata for a track on Last.fm using the artist/track name or a musicbrainz id.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: track
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: autocorrect
in: query
schema: { type: integer, enum: [0, 1] }
- name: username
in: query
schema: { type: string }
responses:
'200':
description: Track info envelope.
content:
application/json:
schema: { $ref: '#/components/schemas/TrackInfoResponse' }
/?method=track.getSimilar:
get:
operationId: trackGetSimilar
summary: Get Similar Tracks
tags: [Track]
description: Get the similar tracks for this track on Last.fm, based on listening data.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: track
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 100 }
- name: autocorrect
in: query
schema: { type: integer, enum: [0, 1] }
responses:
'200':
description: Similar tracks list.
content:
application/json:
schema: { type: object, additionalProperties: true }
/?method=track.getTags:
get:
operationId: trackGetTags
summary: Get Track Tags
tags: [Track]
description: Get the tags applied by an individual user to a track on Last.fm.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: track
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: user
in: query
required: true
schema: { type: string }
responses:
'200':
description: User tags for the track.
content:
application/json:
schema: { $ref: '#/components/schemas/TagListResponse' }
/?method=track.getTopTags:
get:
operationId: trackGetTopTags
summary: Get Top Track Tags
tags: [Track]
description: Get the top tags for this track on Last.fm, ordered by tag count.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: artist
in: query
schema: { type: string }
- name: track
in: query
schema: { type: string }
- name: mbid
in: query
schema: { type: string }
- name: autocorrect
in: query
schema: { type: integer, enum: [0, 1] }
responses:
'200':
description: Top tags for the track.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTagsResponse' }
/?method=track.love:
post:
operationId: trackLove
summary: Love Track
tags: [Track]
description: Love a track for a user profile.
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
required: [method, api_key, artist, track, sk, api_sig]
properties:
method: { type: string, enum: [track.love] }
api_key: { type: string }
artist: { type: string }
track: { type: string }
sk: { type: string }
api_sig: { type: string }
responses:
'200': { description: OK, content: { application/json: { schema: { $ref: '#/components/schemas/WriteResponse' } } } }
/?method=track.removeTag:
post:
operationId: trackRemoveTag
summary: Remove Track Tag
tags: [Track]
description: Remove a user's tag from a track.
requestBody: { $ref: '#/components/requestBodies/TrackTagWrite' }
responses:
'200': { description: OK, content: { application/json: { schema: { $ref: '#/components/schemas/WriteResponse' } } } }
/?method=track.scrobble:
post:
operationId: trackScrobble
summary: Scrobble Track
tags: [Track]
description: |
Add a track-play to a user's profile (Scrobbling 2.0). Up to 50 scrobbles
may be sent in a single batch using array notation
(`artist[0]`, `track[0]`, `timestamp[0]` etc.). A track must be longer
than 30 seconds and listened to for at least half its duration or 4 minutes
(whichever comes first).
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
required: [method, api_key, artist, track, timestamp, sk, api_sig]
properties:
method: { type: string, enum: [track.scrobble] }
api_key: { type: string }
artist: { type: string, description: "Artist name. Use array notation (artist[i]) for batch." }
track: { type: string, description: "Track name. Use array notation (track[i]) for batch." }
album: { type: string }
timestamp: { type: integer, description: "Unix timestamp when track started. Use array notation for batch." }
albumArtist: { type: string }
trackNumber: { type: integer }
duration: { type: integer, description: Track length in seconds. }
mbid: { type: string }
streamId: { type: string }
chosenByUser: { type: integer, enum: [0, 1] }
context: { type: string }
sk: { type: string }
api_sig: { type: string }
responses:
'200':
description: Scrobble acceptance with per-scrobble status.
content:
application/json:
schema: { $ref: '#/components/schemas/ScrobbleResponse' }
/?method=track.search:
get:
operationId: trackSearch
summary: Search Tracks
tags: [Track]
description: Search for a track by name. Returns track matches sorted by relevance.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: track
in: query
required: true
schema: { type: string }
- name: artist
in: query
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 30 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Search results for tracks.
content:
application/json:
schema: { $ref: '#/components/schemas/SearchResponse' }
/?method=track.unlove:
post:
operationId: trackUnlove
summary: Unlove Track
tags: [Track]
description: UnLove a track for a user profile.
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
required: [method, api_key, artist, track, sk, api_sig]
properties:
method: { type: string, enum: [track.unlove] }
api_key: { type: string }
artist: { type: string }
track: { type: string }
sk: { type: string }
api_sig: { type: string }
responses:
'200': { description: OK, content: { application/json: { schema: { $ref: '#/components/schemas/WriteResponse' } } } }
/?method=track.updateNowPlaying:
post:
operationId: trackUpdateNowPlaying
summary: Update Now Playing
tags: [Track]
description: Used to notify Last.fm that a user has started listening to a track.
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
required: [method, api_key, artist, track, sk, api_sig]
properties:
method: { type: string, enum: [track.updateNowPlaying] }
api_key: { type: string }
artist: { type: string }
track: { type: string }
album: { type: string }
albumArtist: { type: string }
trackNumber: { type: integer }
context: { type: string }
duration: { type: integer }
mbid: { type: string }
sk: { type: string }
api_sig: { type: string }
responses:
'200': { description: OK, content: { application/json: { schema: { $ref: '#/components/schemas/WriteResponse' } } } }
# USER
/?method=user.getFriends:
get:
operationId: userGetFriends
summary: Get User Friends
tags: [User]
description: Get a list of the user's friends on Last.fm.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: recenttracks
in: query
schema: { type: integer, enum: [0, 1] }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: User friends list.
content:
application/json:
schema: { type: object, additionalProperties: true }
/?method=user.getInfo:
get:
operationId: userGetInfo
summary: Get User Info
tags: [User]
description: Get information about a user profile.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
responses:
'200':
description: User profile envelope.
content:
application/json:
schema: { $ref: '#/components/schemas/UserInfoResponse' }
/?method=user.getLovedTracks:
get:
operationId: userGetLovedTracks
summary: Get Loved Tracks
tags: [User]
description: Get the last 50 tracks loved by a user.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: User loved tracks.
content:
application/json:
schema: { type: object, additionalProperties: true }
/?method=user.getPersonalTags:
get:
operationId: userGetPersonalTags
summary: Get Personal Tags
tags: [User]
description: Get the user's personal tags for an artist, album, or track.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: tag
in: query
required: true
schema: { type: string }
- name: taggingtype
in: query
required: true
schema: { type: string, enum: [artist, album, track] }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Personal tags.
content:
application/json:
schema: { type: object, additionalProperties: true }
/?method=user.getRecentTracks:
get:
operationId: userGetRecentTracks
summary: Get Recent Tracks
tags: [User]
description: Get a list of the recent tracks listened to by this user. Also includes the currently playing track if there is one.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 50, maximum: 200 }
- name: page
in: query
schema: { type: integer, default: 1 }
- name: from
in: query
schema: { type: integer, description: Unix timestamp (UTC). }
- name: to
in: query
schema: { type: integer, description: Unix timestamp (UTC). }
- name: extended
in: query
schema: { type: integer, enum: [0, 1] }
responses:
'200':
description: Recent tracks for the user.
content:
application/json:
schema: { $ref: '#/components/schemas/RecentTracksResponse' }
/?method=user.getTopAlbums:
get:
operationId: userGetTopAlbums
summary: Get User Top Albums
tags: [User]
description: Get the top albums listened to by a user. You can stipulate a time period.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: period
in: query
schema: { type: string, enum: [overall, 7day, 1month, 3month, 6month, 12month] }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Top albums for the user.
content:
application/json:
schema: { $ref: '#/components/schemas/TopAlbumsResponse' }
/?method=user.getTopArtists:
get:
operationId: userGetTopArtists
summary: Get User Top Artists
tags: [User]
description: Get the top artists listened to by a user. You can stipulate a time period.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: period
in: query
schema: { type: string, enum: [overall, 7day, 1month, 3month, 6month, 12month] }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Top artists for the user.
content:
application/json:
schema: { $ref: '#/components/schemas/ChartResponse' }
/?method=user.getTopTags:
get:
operationId: userGetTopTags
summary: Get User Top Tags
tags: [User]
description: Get the top tags used by this user.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: limit
in: query
schema: { type: integer, default: 50 }
responses:
'200':
description: Top tags used by the user.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTagsResponse' }
/?method=user.getTopTracks:
get:
operationId: userGetTopTracks
summary: Get User Top Tracks
tags: [User]
description: Get the top tracks listened to by a user. You can stipulate a time period.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: period
in: query
schema: { type: string, enum: [overall, 7day, 1month, 3month, 6month, 12month] }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: page
in: query
schema: { type: integer, default: 1 }
responses:
'200':
description: Top tracks for the user.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTracksResponse' }
/?method=user.getWeeklyAlbumChart:
get:
operationId: userGetWeeklyAlbumChart
summary: Get Weekly Album Chart
tags: [User]
description: Get an album chart for a user profile, for a given date range. If no date range is supplied, it will return the most recent week.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: from
in: query
schema: { type: integer }
- name: to
in: query
schema: { type: integer }
responses:
'200':
description: Weekly album chart for the user.
content:
application/json:
schema: { $ref: '#/components/schemas/TopAlbumsResponse' }
/?method=user.getWeeklyArtistChart:
get:
operationId: userGetWeeklyArtistChart
summary: Get Weekly Artist Chart
tags: [User]
description: Get an artist chart for a user profile, for a given date range.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: from
in: query
schema: { type: integer }
- name: to
in: query
schema: { type: integer }
responses:
'200':
description: Weekly artist chart.
content:
application/json:
schema: { $ref: '#/components/schemas/ChartResponse' }
/?method=user.getWeeklyChartList:
get:
operationId: userGetWeeklyChartList
summary: Get Weekly Chart List
tags: [User]
description: Get a list of available charts for this user, expressed as date ranges that can be sent to the chart services.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
responses:
'200':
description: Available chart ranges.
content:
application/json:
schema:
type: object
additionalProperties: true
/?method=user.getWeeklyTrackChart:
get:
operationId: userGetWeeklyTrackChart
summary: Get Weekly Track Chart
tags: [User]
description: Get a track chart for a user profile, for a given date range.
parameters:
- { $ref: '#/components/parameters/ApiKeyParam' }
- { $ref: '#/components/parameters/FormatParam' }
- name: user
in: query
required: true
schema: { type: string }
- name: from
in: query
schema: { type: integer }
- name: to
in: query
schema: { type: integer }
responses:
'200':
description: Weekly track chart.
content:
application/json:
schema: { $ref: '#/components/schemas/TopTracksResponse' }
components:
securitySchemes:
ApiKeyAuth:
type: apiKey
in: query
name: api_key
description: Required on all calls. Obtain from https://www.last.fm/api/account/create.
SignedAuth:
type: apiKey
in: query
name: api_sig
description: |
MD5 signature of all request parameters (excluding format and callback)
sorted alphabetically by name, concatenated as name+value pairs, with
the shared secret appended. Required for all write/auth methods.
parameters:
MethodParam:
name: method
in: query
required: true
schema:
type: string
description: |
Method name in `package.method` format (e.g. `track.getInfo`,
`chart.getTopArtists`, `user.getRecentTracks`).
ApiKeyParam:
name: api_key
in: query
required: true
schema: { type: string }
description: Your Last.fm API key.
FormatParam:
name: format
in: query
schema:
type: string
enum: [xml, json]
default: xml
description: Response format. Defaults to XML.
CallbackParam:
name: callback
in: query
schema: { type: string }
description: Optional JSONP callback function name when `format=json`.
requestBodies:
AlbumTagWrite:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
required: [method, api_key, artist, album, tags, sk, api_sig]
properties:
method: { type: string, enum: [album.addTags, album.removeTag] }
api_key: { type: string }
artist: { type: string }
album: { type: string }
tags: { type: string, description: Comma-separated tag list (max 10 for addTags). }
tag: { type: string, description: Single tag (for removeTag). }
sk: { type: string }
api_sig: { type: string }
ArtistTagWrite:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
required: [method, api_key, artist, sk, api_sig]
properties:
method: { type: string, enum: [artist.addTags, artist.removeTag] }
api_key: { type: string }
artist: { type: string }
tags: { type: string }
tag: { type: string }
sk: { type: string }
api_sig: { type: string }
TrackTagWrite:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
required: [method, api_key, artist, track, sk, api_sig]
properties:
method: { type: string, enum: [track.addTags, track.removeTag] }
api_key: { type: string }
artist: { type: string }
track: { type: string }
tags: { type: string }
tag: { type: string }
sk: { type: string }
api_sig: { type: string }
responses:
ErrorResponse:
description: Error response (status='failed').
content:
application/json:
schema: { $ref: '#/components/schemas/ErrorPayload' }
application/xml:
schema:
type: string
description: '`message`'
schemas:
WriteRequestBody:
type: object
required: [method, api_key]
properties:
method: { type: string }
api_key: { type: string }
sk: { type: string, description: Session key returned by auth.getSession / auth.getMobileSession. }
api_sig: { type: string, description: MD5 signature of params + secret. }
additionalProperties: true
WriteResponse:
type: object
properties:
status: { type: string, example: ok }
ErrorPayload:
type: object
properties:
error:
type: integer
description: |
Numeric Last.fm error code. Common: 2 invalid service, 3 invalid method,
4 authentication failed, 5 invalid format, 6 invalid parameters,
7 invalid resource, 8 operation failed, 9 invalid session key,
10 invalid api key, 11 service offline, 13 invalid method signature,
16 service temporarily unavailable, 26 suspended api key, 29 rate limit exceeded.
message: { type: string }
Image:
type: object
properties:
size: { type: string, enum: [small, medium, large, extralarge, mega] }
'#text': { type: string, format: uri }
Tag:
type: object
properties:
name: { type: string }
url: { type: string, format: uri }
count: { type: integer }
Wiki:
type: object
properties:
published: { type: string }
summary: { type: string }
content: { type: string }
Album:
type: object
properties:
artist: { type: string }
name: { type: string }
mbid: { type: string }
url: { type: string, format: uri }
image:
type: array
items: { $ref: '#/components/schemas/Image' }
listeners: { type: string }
playcount: { type: string }
tracks:
type: object
properties:
track:
type: array
items: { $ref: '#/components/schemas/Track' }
tags:
type: object
properties:
tag:
type: array
items: { $ref: '#/components/schemas/Tag' }
wiki: { $ref: '#/components/schemas/Wiki' }
Artist:
type: object
properties:
name: { type: string }
mbid: { type: string }
url: { type: string, format: uri }
image:
type: array
items: { $ref: '#/components/schemas/Image' }
streamable: { type: string }
ontour: { type: string }
stats:
type: object
properties:
listeners: { type: string }
playcount: { type: string }
similar:
type: object
properties:
artist:
type: array
items: { $ref: '#/components/schemas/Artist' }
tags:
type: object
properties:
tag:
type: array
items: { $ref: '#/components/schemas/Tag' }
bio: { $ref: '#/components/schemas/Wiki' }
Track:
type: object
properties:
name: { type: string }
mbid: { type: string }
url: { type: string, format: uri }
duration: { type: string }
artist: { $ref: '#/components/schemas/Artist' }
album:
type: object
properties:
artist: { type: string }
title: { type: string }
mbid: { type: string }
url: { type: string, format: uri }
listeners: { type: string }
playcount: { type: string }
userplaycount: { type: string }
userloved: { type: string, enum: ['0', '1'] }
toptags:
type: object
properties:
tag:
type: array
items: { $ref: '#/components/schemas/Tag' }
wiki: { $ref: '#/components/schemas/Wiki' }
'@attr':
type: object
properties:
nowplaying: { type: string }
date:
type: object
properties:
uts: { type: string }
'#text': { type: string }
UserProfile:
type: object
properties:
name: { type: string }
realname: { type: string }
url: { type: string, format: uri }
country: { type: string }
age: { type: string }
gender: { type: string }
subscriber: { type: string }
playcount: { type: string }
playlists: { type: string }
bootstrap: { type: string }
registered:
type: object
properties:
unixtime: { type: string }
'#text': { type: string }
image:
type: array
items: { $ref: '#/components/schemas/Image' }
AlbumInfoResponse:
type: object
properties:
album: { $ref: '#/components/schemas/Album' }
ArtistInfoResponse:
type: object
properties:
artist: { $ref: '#/components/schemas/Artist' }
TrackInfoResponse:
type: object
properties:
track: { $ref: '#/components/schemas/Track' }
UserInfoResponse:
type: object
properties:
user: { $ref: '#/components/schemas/UserProfile' }
TagInfoResponse:
type: object
properties:
tag:
type: object
properties:
name: { type: string }
total: { type: integer }
reach: { type: integer }
wiki: { $ref: '#/components/schemas/Wiki' }
TopTagsResponse:
type: object
properties:
toptags:
type: object
properties:
tag:
type: array
items: { $ref: '#/components/schemas/Tag' }
TagListResponse:
type: object
properties:
tags:
type: object
properties:
tag:
type: array
items: { $ref: '#/components/schemas/Tag' }
TopAlbumsResponse:
type: object
properties:
topalbums:
type: object
properties:
album:
type: array
items: { $ref: '#/components/schemas/Album' }
TopTracksResponse:
type: object
properties:
toptracks:
type: object
properties:
track:
type: array
items: { $ref: '#/components/schemas/Track' }
ChartResponse:
type: object
properties:
artists:
type: object
properties:
artist:
type: array
items: { $ref: '#/components/schemas/Artist' }
GeoResponse:
type: object
properties:
topartists:
type: object
properties:
artist:
type: array
items: { $ref: '#/components/schemas/Artist' }
SearchResponse:
type: object
properties:
results:
type: object
properties:
'opensearch:Query': { type: object, additionalProperties: true }
'opensearch:totalResults': { type: string }
'opensearch:startIndex': { type: string }
'opensearch:itemsPerPage': { type: string }
albummatches:
type: object
properties:
album: { type: array, items: { $ref: '#/components/schemas/Album' } }
artistmatches:
type: object
properties:
artist: { type: array, items: { $ref: '#/components/schemas/Artist' } }
trackmatches:
type: object
properties:
track: { type: array, items: { $ref: '#/components/schemas/Track' } }
RecentTracksResponse:
type: object
properties:
recenttracks:
type: object
properties:
track:
type: array
items: { $ref: '#/components/schemas/Track' }
'@attr':
type: object
properties:
user: { type: string }
page: { type: string }
perPage: { type: string }
totalPages: { type: string }
total: { type: string }
SessionResponse:
type: object
properties:
session:
type: object
properties:
name: { type: string }
key: { type: string }
subscriber: { type: integer }
ScrobbleResponse:
type: object
properties:
scrobbles:
type: object
properties:
'@attr':
type: object
properties:
accepted: { type: integer }
ignored: { type: integer }
scrobble:
type: array
items:
type: object
properties:
artist: { type: object, properties: { '#text': { type: string }, corrected: { type: string } } }
album: { type: object, properties: { '#text': { type: string }, corrected: { type: string } } }
track: { type: object, properties: { '#text': { type: string }, corrected: { type: string } } }
timestamp: { type: string }
ignoredMessage:
type: object
properties:
code: { type: string }
'#text': { type: string }