openapi: 3.0.3
info:
title: Last.fm Web Services API (2.0) Album Track API
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)
security:
- ApiKeyAuth: []
- SignedAuth: []
tags:
- name: Track
description: Track metadata, scrobbling, love/unlove, tagging, search.
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:
- Track
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:
- Track
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'
/?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'
components:
responses:
ErrorResponse:
description: Error response (status='failed').
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorPayload'
application/xml:
schema:
type: string
description: '`message`'
schemas:
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'
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'
Image:
type: object
properties:
size:
type: string
enum:
- small
- medium
- large
- extralarge
- mega
'#text':
type: string
format: uri
ChartResponse:
type: object
properties:
artists:
type: object
properties:
artist:
type: array
items:
$ref: '#/components/schemas/Artist'
AlbumInfoResponse:
type: object
properties:
album:
$ref: '#/components/schemas/Album'
ArtistInfoResponse:
type: object
properties:
artist:
$ref: '#/components/schemas/Artist'
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
TopTagsResponse:
type: object
properties:
toptags:
type: object
properties:
tag:
type: array
items:
$ref: '#/components/schemas/Tag'
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
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
TrackInfoResponse:
type: object
properties:
track:
$ref: '#/components/schemas/Track'
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'
Tag:
type: object
properties:
name:
type: string
url:
type: string
format: uri
count:
type: integer
TagListResponse:
type: object
properties:
tags:
type: object
properties:
tag:
type: array
items:
$ref: '#/components/schemas/Tag'
Wiki:
type: object
properties:
published:
type: string
summary:
type: string
content:
type: string
GeoResponse:
type: object
properties:
topartists:
type: object
properties:
artist:
type: array
items:
$ref: '#/components/schemas/Artist'
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'
UserInfoResponse:
type: object
properties:
user:
$ref: '#/components/schemas/UserProfile'
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
TagInfoResponse:
type: object
properties:
tag:
type: object
properties:
name:
type: string
total:
type: integer
reach:
type: integer
wiki:
$ref: '#/components/schemas/Wiki'
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`).
'
FormatParam:
name: format
in: query
schema:
type: string
enum:
- xml
- json
default: xml
description: Response format. Defaults to XML.
ApiKeyParam:
name: api_key
in: query
required: true
schema:
type: string
description: Your Last.fm API key.
CallbackParam:
name: callback
in: query
schema:
type: string
description: Optional JSONP callback function name when `format=json`.
requestBodies:
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
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.
'