Download OpenAPI specification:Download
Native immerle REST API (first-run setup, capability discovery, activity feed, collaborative playlists and synchronized Jam sessions) that complements the Subsonic / OpenSubsonic API served under /rest/.
Served under /api/v1. Authenticated endpoints require a Bearer token in the Authorization header — a device JWT (obtained from POST /auth/sessions) or a personal API token. Setup, capability discovery and session creation are unauthenticated.
[- {
- "createdAt": "string",
- "displayName": "string",
- "id": "string",
- "item": {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "coverArt": "string",
- "duration": 0,
- "title": "string",
- "year": 0
}, - "itemId": "string",
- "itemType": "artist",
- "privacy": "string",
- "type": "string",
- "userId": "string",
- "username": "string"
}
]Admin only. Enables or disables the background eviction sweep at runtime (persisted; hot).
Enable or disable the sweep
{ }{- "enabled": true,
- "intervalSeconds": 0,
- "maxAgeSeconds": 0
}Admin only. Partial update — only fields present are changed. API keys are write-only: the response never echoes them back.
Fields to change
{ }{- "country": "FR",
- "enabled": false,
- "skiddleConfigured": false,
- "ticketmasterConfigured": false
}Admin only. Deletes this instance's data on the hub (best-effort) and clears the locally stored hub identity, returning the instance to the unlinked state. Returns the refreshed runtime settings.
{- "pendingRestart": [
- "string"
], - "restartRequired": true,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 0
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 0,
- "maxAgeSeconds": 0
}, - "concerts": {
- "country": "string",
- "enabled": true,
- "skiddleApiKey": "string",
- "ticketmasterApiKey": "string"
}, - "discover": {
- "curatedPlaylists": true,
- "enabled": true,
- "instanceId": "string",
- "madeForYou": true,
- "privateKey": "string",
- "scrobble": true,
- "similarTracks": true
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "string",
- "instanceName": "string",
- "privateKey": "string",
- "sqid": "string",
- "syncPlaylists": true,
- "userId": "string"
}, - "hallOfFame": {
- "enabled": true
}, - "import": {
- "sources": {
- "property1": {
- "property1": "string",
- "property2": "string"
}, - "property2": {
- "property1": "string",
- "property2": "string"
}
}
}, - "lastFm": {
- "apiKey": "string",
- "apiSecret": "string",
- "enabled": true
}, - "ldap": {
- "bindDnTemplate": "string",
- "enabled": true,
- "url": "string"
}, - "logs": {
- "retentionDays": 0
}, - "offline": {
- "enabled": true
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 0
}, - "radio": {
- "enabled": true
}, - "scan": {
- "intervalSeconds": 0,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "string"
]
}, - "smartPlaylists": {
- "enabled": true
}, - "sonic": {
- "autoDj": true,
- "autoplay": true,
- "duplicates": true,
- "enabled": true,
- "moods": true,
- "radio": true,
- "workers": 0
}, - "transcode": {
- "ffmpegPath": "string",
- "ffprobePath": "string",
- "profiles": [
- {
- "bitRate": 0,
- "ffmpegArgs": "string",
- "format": "string",
- "name": "string"
}
]
}, - "wrapped": {
- "enabled": true
}
}
}Admin only. Fetches this instance's current name and sqid handle from the hub (the source of truth) and persists them, then returns the refreshed runtime settings. The HTTP exchange runs server-side.
{- "pendingRestart": [
- "string"
], - "restartRequired": true,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 0
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 0,
- "maxAgeSeconds": 0
}, - "concerts": {
- "country": "string",
- "enabled": true,
- "skiddleApiKey": "string",
- "ticketmasterApiKey": "string"
}, - "discover": {
- "curatedPlaylists": true,
- "enabled": true,
- "instanceId": "string",
- "madeForYou": true,
- "privateKey": "string",
- "scrobble": true,
- "similarTracks": true
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "string",
- "instanceName": "string",
- "privateKey": "string",
- "sqid": "string",
- "syncPlaylists": true,
- "userId": "string"
}, - "hallOfFame": {
- "enabled": true
}, - "import": {
- "sources": {
- "property1": {
- "property1": "string",
- "property2": "string"
}, - "property2": {
- "property1": "string",
- "property2": "string"
}
}
}, - "lastFm": {
- "apiKey": "string",
- "apiSecret": "string",
- "enabled": true
}, - "ldap": {
- "bindDnTemplate": "string",
- "enabled": true,
- "url": "string"
}, - "logs": {
- "retentionDays": 0
}, - "offline": {
- "enabled": true
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 0
}, - "radio": {
- "enabled": true
}, - "scan": {
- "intervalSeconds": 0,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "string"
]
}, - "smartPlaylists": {
- "enabled": true
}, - "sonic": {
- "autoDj": true,
- "autoplay": true,
- "duplicates": true,
- "enabled": true,
- "moods": true,
- "radio": true,
- "workers": 0
}, - "transcode": {
- "ffmpegPath": "string",
- "ffprobePath": "string",
- "profiles": [
- {
- "bitRate": 0,
- "ffmpegArgs": "string",
- "format": "string",
- "name": "string"
}
]
}, - "wrapped": {
- "enabled": true
}
}
}Admin only. Pushes the instance name and sqid (the editable, unique hub handle) to the hub, which validates sqid uniqueness, then persists the hub-canonical values. The HTTP exchange runs server-side. Returns the refreshed runtime settings.
Instance name and sqid
{ }{- "pendingRestart": [
- "string"
], - "restartRequired": true,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 0
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 0,
- "maxAgeSeconds": 0
}, - "concerts": {
- "country": "string",
- "enabled": true,
- "skiddleApiKey": "string",
- "ticketmasterApiKey": "string"
}, - "discover": {
- "curatedPlaylists": true,
- "enabled": true,
- "instanceId": "string",
- "madeForYou": true,
- "privateKey": "string",
- "scrobble": true,
- "similarTracks": true
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "string",
- "instanceName": "string",
- "privateKey": "string",
- "sqid": "string",
- "syncPlaylists": true,
- "userId": "string"
}, - "hallOfFame": {
- "enabled": true
}, - "import": {
- "sources": {
- "property1": {
- "property1": "string",
- "property2": "string"
}, - "property2": {
- "property1": "string",
- "property2": "string"
}
}
}, - "lastFm": {
- "apiKey": "string",
- "apiSecret": "string",
- "enabled": true
}, - "ldap": {
- "bindDnTemplate": "string",
- "enabled": true,
- "url": "string"
}, - "logs": {
- "retentionDays": 0
}, - "offline": {
- "enabled": true
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 0
}, - "radio": {
- "enabled": true
}, - "scan": {
- "intervalSeconds": 0,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "string"
]
}, - "smartPlaylists": {
- "enabled": true
}, - "sonic": {
- "autoDj": true,
- "autoplay": true,
- "duplicates": true,
- "enabled": true,
- "moods": true,
- "radio": true,
- "workers": 0
}, - "transcode": {
- "ffmpegPath": "string",
- "ffprobePath": "string",
- "profiles": [
- {
- "bitRate": 0,
- "ffmpegArgs": "string",
- "format": "string",
- "name": "string"
}
]
}, - "wrapped": {
- "enabled": true
}
}
}Admin only. Searches the hub for other instances by exact sqid or name (the hub excludes this instance and revoked ones). The HTTP exchange runs server-side.
| q required | string Search query (sqid or name) |
{- "instances": [
- {
- "id": "string",
- "lastSeenAt": "string",
- "name": "string",
- "region": "string",
- "sqid": "string"
}
]
}Admin only. Bootstraps the instance under the configured hub user id (federation.userId) and persists the hub-issued identity (instance UUID, sqid handle and private key). The full HTTP exchange runs server-side. Returns the refreshed runtime settings.
{- "pendingRestart": [
- "string"
], - "restartRequired": true,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 0
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 0,
- "maxAgeSeconds": 0
}, - "concerts": {
- "country": "string",
- "enabled": true,
- "skiddleApiKey": "string",
- "ticketmasterApiKey": "string"
}, - "discover": {
- "curatedPlaylists": true,
- "enabled": true,
- "instanceId": "string",
- "madeForYou": true,
- "privateKey": "string",
- "scrobble": true,
- "similarTracks": true
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "string",
- "instanceName": "string",
- "privateKey": "string",
- "sqid": "string",
- "syncPlaylists": true,
- "userId": "string"
}, - "hallOfFame": {
- "enabled": true
}, - "import": {
- "sources": {
- "property1": {
- "property1": "string",
- "property2": "string"
}, - "property2": {
- "property1": "string",
- "property2": "string"
}
}
}, - "lastFm": {
- "apiKey": "string",
- "apiSecret": "string",
- "enabled": true
}, - "ldap": {
- "bindDnTemplate": "string",
- "enabled": true,
- "url": "string"
}, - "logs": {
- "retentionDays": 0
}, - "offline": {
- "enabled": true
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 0
}, - "radio": {
- "enabled": true
}, - "scan": {
- "intervalSeconds": 0,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "string"
]
}, - "smartPlaylists": {
- "enabled": true
}, - "sonic": {
- "autoDj": true,
- "autoplay": true,
- "duplicates": true,
- "enabled": true,
- "moods": true,
- "radio": true,
- "workers": 0
}, - "transcode": {
- "ffmpegPath": "string",
- "ffprobePath": "string",
- "profiles": [
- {
- "bitRate": 0,
- "ffmpegArgs": "string",
- "format": "string",
- "name": "string"
}
]
}, - "wrapped": {
- "enabled": true
}
}
}Admin only. Returns the instances this one follows on the hub. The HTTP exchange runs server-side.
{- "subscriptions": [
- {
- "id": "string",
- "lastSeenAt": "string",
- "name": "string",
- "region": "string",
- "sqid": "string"
}
]
}Admin only. Follows a target instance on the hub by instanceId (UUID) or sqid. The HTTP exchange runs server-side.
Target instance id or sqid
{ }{- "ok": true
}Admin only. Stops following the instance with the given hub id (UUID). The HTTP exchange runs server-side.
| id required | string Target instance id (UUID) |
{- "ok": true
}Admin only. Partial update — only fields present are changed. The API key/secret are write-only: the response never echoes them back.
Fields to change
{ }{- "configured": false,
- "enabled": false
}Feed URL
{ }{- "description": "string",
- "episodes": [
- {
- "channelId": "string",
- "contentType": "string",
- "description": "string",
- "duration": 0,
- "id": "string",
- "publishDate": "string",
- "size": 0,
- "status": "string",
- "streamable": true,
- "suffix": "string",
- "title": "string"
}
], - "error": "string",
- "id": "string",
- "imageUrl": "string",
- "status": "string",
- "title": "string",
- "url": "string"
}{- "providers": [
- {
- "config": {
- "property1": "string",
- "property2": "string"
}, - "configured": true,
- "displayName": "string",
- "enabled": true,
- "fields": [
- {
- "key": "string",
- "label": "string",
- "required": true,
- "secret": true
}
], - "name": "string"
}
]
}| name required | string Provider name |
Enabled + config
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Admin only. Lists configured providers (built-in and dynamic) with their live status.
[- {
- "active": true,
- "builtin": true,
- "capabilities": [
- {
- "enabled": true,
- "key": "string"
}
], - "config": "string",
- "createdAt": "string",
- "deletable": true,
- "enabled": true,
- "endpoint": "string",
- "kind": "string",
- "name": "string",
- "sortOrder": 0,
- "updatedAt": "string",
- "version": 0
}
]Admin only. With only an endpoint (no name), creates an HTTP provider from its URL by probing /capabilities. With a name, updates it (HTTP config is validated against /capabilities).
Provider config
{ }{- "active": true,
- "builtin": true,
- "capabilities": [
- {
- "enabled": true,
- "key": "string"
}
], - "config": "string",
- "createdAt": "string",
- "deletable": true,
- "enabled": true,
- "endpoint": "string",
- "kind": "string",
- "name": "string",
- "sortOrder": 0,
- "updatedAt": "string",
- "version": 0
}Admin only. Sets the provider priority order (lower = higher priority). order lists every provider name, each exactly once. Order also decides which provider search falls back to when no explicit default is set.
Provider names in the desired order
{ }[- {
- "active": true,
- "builtin": true,
- "capabilities": [
- {
- "enabled": true,
- "key": "string"
}
], - "config": "string",
- "createdAt": "string",
- "deletable": true,
- "enabled": true,
- "endpoint": "string",
- "kind": "string",
- "name": "string",
- "sortOrder": 0,
- "updatedAt": "string",
- "version": 0
}
]Admin only. Removes a provider config and unregisters it.
| name required | string Provider name |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Admin only. Switches one capability (trackSearch, artists, playlists, playlistSearch) of a provider on or off, applied to the live registry immediately. A disabled capability is never called: e.g. with trackSearch off, global search sends no request to that provider.
| name required | string Provider name |
| capability required | string Capability key |
Enabled flag
{ }{- "active": true,
- "builtin": true,
- "capabilities": [
- {
- "enabled": true,
- "key": "string"
}
], - "config": "string",
- "createdAt": "string",
- "deletable": true,
- "enabled": true,
- "endpoint": "string",
- "kind": "string",
- "name": "string",
- "sortOrder": 0,
- "updatedAt": "string",
- "version": 0
}Admin only. Toggles a provider on or off; the change is applied to the live registry immediately.
| name required | string Provider name |
Enabled flag
{ }{- "active": true,
- "builtin": true,
- "capabilities": [
- {
- "enabled": true,
- "key": "string"
}
], - "config": "string",
- "createdAt": "string",
- "deletable": true,
- "enabled": true,
- "endpoint": "string",
- "kind": "string",
- "name": "string",
- "sortOrder": 0,
- "updatedAt": "string",
- "version": 0
}Admin only. Returns the most recent provider action failures (search/resolve/download), newest first.
| name required | string Provider name |
[- {
- "action": "string",
- "createdAt": "string",
- "id": "string",
- "level": "string",
- "message": "string",
- "provider": "string"
}
]Station
{ }{- "builtin": true,
- "country": "string",
- "coverUrl": "string",
- "deletable": true,
- "hasCover": true,
- "homepageUrl": "string",
- "id": "string",
- "liked": true,
- "name": "string",
- "streamUrl": "string"
}| id required | string Station id |
Station
{ }{- "builtin": true,
- "country": "string",
- "coverUrl": "string",
- "deletable": true,
- "hasCover": true,
- "homepageUrl": "string",
- "id": "string",
- "liked": true,
- "name": "string",
- "streamUrl": "string"
}Admin only. Returns the current runtime settings (provider behaviour, artist avatars, scan cadence, federation) plus whether a restart is pending.
{- "pendingRestart": [
- "string"
], - "restartRequired": true,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 0
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 0,
- "maxAgeSeconds": 0
}, - "concerts": {
- "country": "string",
- "enabled": true,
- "skiddleApiKey": "string",
- "ticketmasterApiKey": "string"
}, - "discover": {
- "curatedPlaylists": true,
- "enabled": true,
- "instanceId": "string",
- "madeForYou": true,
- "privateKey": "string",
- "scrobble": true,
- "similarTracks": true
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "string",
- "instanceName": "string",
- "privateKey": "string",
- "sqid": "string",
- "syncPlaylists": true,
- "userId": "string"
}, - "hallOfFame": {
- "enabled": true
}, - "import": {
- "sources": {
- "property1": {
- "property1": "string",
- "property2": "string"
}, - "property2": {
- "property1": "string",
- "property2": "string"
}
}
}, - "lastFm": {
- "apiKey": "string",
- "apiSecret": "string",
- "enabled": true
}, - "ldap": {
- "bindDnTemplate": "string",
- "enabled": true,
- "url": "string"
}, - "logs": {
- "retentionDays": 0
}, - "offline": {
- "enabled": true
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 0
}, - "radio": {
- "enabled": true
}, - "scan": {
- "intervalSeconds": 0,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "string"
]
}, - "smartPlaylists": {
- "enabled": true
}, - "sonic": {
- "autoDj": true,
- "autoplay": true,
- "duplicates": true,
- "enabled": true,
- "moods": true,
- "radio": true,
- "workers": 0
}, - "transcode": {
- "ffmpegPath": "string",
- "ffprobePath": "string",
- "profiles": [
- {
- "bitRate": 0,
- "ffmpegArgs": "string",
- "format": "string",
- "name": "string"
}
]
}, - "wrapped": {
- "enabled": true
}
}
}Admin only. Partial update (send a JSON body with the fields to change; omitted fields keep their current value). Provider behaviour and the scan interval apply immediately (hot reload); avatars, the scan watcher and federation only take effect after a restart — the response sets restartRequired=true and lists the pending fields.
Settings fields to change (partial)
{ }{- "pendingRestart": [
- "string"
], - "restartRequired": true,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 0
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 0,
- "maxAgeSeconds": 0
}, - "concerts": {
- "country": "string",
- "enabled": true,
- "skiddleApiKey": "string",
- "ticketmasterApiKey": "string"
}, - "discover": {
- "curatedPlaylists": true,
- "enabled": true,
- "instanceId": "string",
- "madeForYou": true,
- "privateKey": "string",
- "scrobble": true,
- "similarTracks": true
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "string",
- "instanceName": "string",
- "privateKey": "string",
- "sqid": "string",
- "syncPlaylists": true,
- "userId": "string"
}, - "hallOfFame": {
- "enabled": true
}, - "import": {
- "sources": {
- "property1": {
- "property1": "string",
- "property2": "string"
}, - "property2": {
- "property1": "string",
- "property2": "string"
}
}
}, - "lastFm": {
- "apiKey": "string",
- "apiSecret": "string",
- "enabled": true
}, - "ldap": {
- "bindDnTemplate": "string",
- "enabled": true,
- "url": "string"
}, - "logs": {
- "retentionDays": 0
}, - "offline": {
- "enabled": true
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 0
}, - "radio": {
- "enabled": true
}, - "scan": {
- "intervalSeconds": 0,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "string"
]
}, - "smartPlaylists": {
- "enabled": true
}, - "sonic": {
- "autoDj": true,
- "autoplay": true,
- "duplicates": true,
- "enabled": true,
- "moods": true,
- "radio": true,
- "workers": 0
}, - "transcode": {
- "ffmpegPath": "string",
- "ffprobePath": "string",
- "profiles": [
- {
- "bitRate": 0,
- "ffmpegArgs": "string",
- "format": "string",
- "name": "string"
}
]
}, - "wrapped": {
- "enabled": true
}
}
}Admin only. Whether local audio analysis can run (ffmpeg found) and is switched on (sonic.enabled setting), plus its progress over the local library.
{- "analyzed": 4210,
- "available": true,
- "enabled": true,
- "failed": 3,
- "total": 12000
}Admin only. Groups of analyzed tracks that sound identical and last about as long (within 3 s): the same recording under other tags, or in another format. Nothing is deleted; the admin picks which copy to keep. 404 when the sonic duplicates setting is off.
{- "groups": [
- [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
]
}Admin only. Lists downloaded (local) tracks, newest first, with optional search and pagination.
| query | string Case-insensitive search over title/artist/album |
| limit | integer Page size (default 50, max 200) |
| offset | integer Offset for pagination |
{- "limit": 0,
- "offset": 0,
- "total": 0,
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}Admin only. Removes the audio file and the track and all rows referencing it (annotations, shares, activity, downloads, playlist entries, scrobbles).
| id required | string Track id |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Admin only. Edits a track's title, genre, year and track/disc number. Album and artist links are not changed.
| id required | string Track id |
Fields to update (all optional)
{ }{- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}Admin only. Replaces a single track's cover art with an uploaded image (multipart form field "file").
| id required | string Track id |
Cover image (jpeg/png/gif/webp)
{- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}User
{ }{- "admin": true,
- "displayName": "string",
- "email": "string",
- "id": "string",
- "scrobblingEnabled": true,
- "username": "string"
}| username required | string Username |
Changes
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Returns albums filtered/sorted by type (newest, recent, frequent, random, alphabeticalByName, byGenre, byYear, starred) with paging.
| type | string Default: "alphabeticalByName" List type |
| size | integer Default: 10 Page size |
| offset | integer Offset |
| genre | string Genre (for byGenre) |
| fromYear | integer From year (for byYear) |
| toYear | integer To year (for byYear) |
{- "albums": [
- {
- "artist": "string",
- "artistId": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "name": "string",
- "songCount": 0,
- "starred": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
], - "year": 0
}
]
}Returns an album with its merged (local + remote) tracklist.
| id required | string Album id |
{- "artist": "string",
- "artistId": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "name": "string",
- "songCount": 0,
- "starred": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
], - "year": 0
}Returns every artist in the catalog with the caller's per-artist starred state.
{- "artists": [
- {
- "albumCount": 0,
- "albums": [
- {
- "artist": "string",
- "artistId": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "name": "string",
- "songCount": 0,
- "starred": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
], - "year": 0
}
], - "coverArt": "string",
- "id": "string",
- "name": "string",
- "starred": "string"
}
]
}Returns an artist with its (local + remote) albums. With ?songs=true each album's tracks are inlined.
| id required | string Artist id |
| songs | boolean Inline each album's tracks |
{- "albumCount": 0,
- "albums": [
- {
- "artist": "string",
- "artistId": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "name": "string",
- "songCount": 0,
- "starred": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
], - "year": 0
}
], - "coverArt": "string",
- "id": "string",
- "name": "string",
- "starred": "string"
}Returns the artists, albums and songs the caller has starred.
{- "albums": [
- {
- "artist": "string",
- "artistId": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "name": "string",
- "songCount": 0,
- "starred": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
], - "year": 0
}
], - "artists": [
- {
- "albumCount": 0,
- "albums": [
- {
- "artist": "string",
- "artistId": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "name": "string",
- "songCount": 0,
- "starred": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
], - "year": 0
}
], - "coverArt": "string",
- "id": "string",
- "name": "string",
- "starred": "string"
}
], - "songs": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}Searches artists, albums, songs, public playlists and radio stations (merging remote-provider results when enabled, plus public Spotify playlists when the built-in spotify-playlist provider is enabled), returned as one list ranked by relevance to the query. type scopes the search server-side to just that result type.
| q required | string Search query |
| type | string Scope to one result type: artist, album, song, playlist or radio (default: all) |
| artistCount | integer Default: 20 Max artists |
| albumCount | integer Default: 20 Max albums |
| songCount | integer Default: 20 Max songs |
{- "results": [
- {
- "album": {
- "artist": "string",
- "artistId": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "name": "string",
- "songCount": 0,
- "starred": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
], - "year": 0
}, - "artist": {
- "albumCount": 0,
- "albums": [
- {
- "artist": "string",
- "artistId": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "name": "string",
- "songCount": 0,
- "starred": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": null,
- "role": null
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
], - "year": 0
}
], - "coverArt": "string",
- "id": "string",
- "name": "string",
- "starred": "string"
}, - "playlist": {
- "autoPlaylistKind": "string",
- "changedAt": "string",
- "collaborative": true,
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "createdAt": "string",
- "duration": 0,
- "federated": true,
- "id": "string",
- "name": "string",
- "owner": "string",
- "public": true,
- "songCount": 0,
- "subscribed": true,
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}, - "radio": {
- "builtin": true,
- "country": "string",
- "coverUrl": "string",
- "deletable": true,
- "hasCover": true,
- "homepageUrl": "string",
- "id": "string",
- "liked": true,
- "name": "string",
- "streamUrl": "string"
}, - "song": {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}, - "spotifyPlaylist": {
- "coverArt": "string",
- "id": "37i9dQZF1DZ06evO2CNgSk",
- "name": "This Is Daft Punk",
- "owner": "Spotify"
}, - "type": "string"
}
]
}Returns songs tagged with the given genre (paged).
| genre required | string Genre name |
| count | integer Default: 200 Page size |
| offset | integer Offset |
{- "songs": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}Returns a single track by id.
| id required | string Track id |
{- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}Read-only, never downloads. Poll this while playing a remote (not-yet-local) track to know when it's safe to seek.
| id required | string Track id (remote or local) |
{- "local": true,
- "song": {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
}Returns a track's lyrics. When the stored tags carry [mm:ss.xx] timestamps the document is "synced" and every line has a startMs (ms).
| id required | string Track id |
{- "lines": [
- {
- "startMs": 0,
- "text": "string"
}
], - "synced": true
}| id required | string Item id (song, album or artist) |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Sets the caller's rating (0–5) on the item. The item type is detected from the id.
| id required | string Item id (song, album or artist) |
Rating
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}| id required | string Item id (song, album or artist) |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Sets the caller's rating (0–5) on the item. The item type is detected from the id.
| id required | string Item id (song, album or artist) |
Rating
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}| id required | string Item id (song, album or artist) |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Sets the caller's rating (0–5) on the item. The item type is detected from the id.
| id required | string Item id (song, album or artist) |
Rating
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Authenticates with username + password (or Subsonic token auth) and returns a device-session JWT carrying a unique id (jti). Use it as "Authorization: Bearer
Credentials
{ }{- "device": {
- "expiresAt": "string",
- "id": "string",
- "name": "string"
}, - "token": "string"
}Lists the caller's active device sessions (one per issued JWT), with last-seen time, IP, user agent, and whether it's currently connected (seen recently).
[- {
- "connected": true,
- "createdAt": "string",
- "expiresAt": "string",
- "id": "string",
- "lastIp": "string",
- "lastSeen": "string",
- "name": "string",
- "userAgent": "string"
}
]Revokes a device session by id — the associated JWT can no longer authenticate.
| id required | string Device id (jti) to revoke |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Unauthenticated. Lets clients detect supported immerle extensions and whether first-run setup is still needed.
{- "capabilities": {
- "property1": {
- "actions": [
- "string"
], - "admin": true,
- "auth": "string",
- "enabled": true,
- "fields": [
- "string"
], - "groups": [
- "string"
], - "kinds": [
- "string"
], - "needed": true,
- "privacy": [
- "string"
], - "properties": [
- "string"
], - "selfEditable": [
- "string"
], - "sources": [
- "string"
], - "subscribe": true,
- "transports": [
- "string"
], - "version": 0
}, - "property2": {
- "actions": [
- "string"
], - "admin": true,
- "auth": "string",
- "enabled": true,
- "fields": [
- "string"
], - "groups": [
- "string"
], - "kinds": [
- "string"
], - "needed": true,
- "privacy": [
- "string"
], - "properties": [
- "string"
], - "selfEditable": [
- "string"
], - "sources": [
- "string"
], - "subscribe": true,
- "transports": [
- "string"
], - "version": 0
}
}, - "protocolVersion": "string",
- "server": "string"
}Returns the cover image for a track or album id, optionally resized. The id "generator" instead builds a cover on the fly from its own query params (icon, title, subTitle, color, color2, angle); title/subTitle may be a known i18n key (e.g. "charts.top50") resolved via locale, or literal text.
| id required | string Track/album id, or \ |
| size | integer Square size in pixels |
| locale | string Label language for a generator cover's title/subTitle i18n keys (e.g. \ |
| icon | string Generator: Twemoji codepoint, e.g. \ |
| title | string Generator: title text or i18n key |
| subTitle | string Generator: subtitle text or i18n key |
| color | string Generator: background color, hex |
| color2 | string Generator: gradient end color, hex (empty = solid) |
| angle | number Generator: gradient angle, degrees |
Serves a track's original audio bytes (no transcoding).
| id required | string Track id |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Streams a track's audio. Supports HTTP range requests; maxBitRate/format transcode when set. Remote tracks are streamed progressively on first listen.
| id required | string Track id |
| maxBitRate | integer Transcode to at most this bit rate (kbps) |
| format | string Transcode format (or 'raw' for original) |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Returns short-lived signed stream and download URLs for the track (usable as a plain media src). They expire after a few minutes.
| id required | string Track id |
{- "download": "string",
- "stream": "string"
}{- "changedAt": "string",
- "createdAt": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}Track id
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Track ids, in rank order
{ }{- "changedAt": "string",
- "createdAt": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}| trackId required | string Track id |
Note
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Returns the caller's personal auto-generated playlists (top of the month, on repeat, forgotten favorites, random, recommended, made for you) that currently have at least one track, followed by the shared mood playlists when the sonic moods setting is on.
{- "playlists": [
- {
- "autoPlaylistKind": "string",
- "changedAt": "string",
- "collaborative": true,
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "createdAt": "string",
- "duration": 0,
- "federated": true,
- "id": "string",
- "name": "string",
- "owner": "string",
- "public": true,
- "songCount": 0,
- "subscribed": true,
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}
]
}Returns the playlists made by people (not charts) that immerle discover matches to the caller's recent listening, refreshed daily. Empty when the admin turned the feature off.
{- "playlists": [
- {
- "autoPlaylistKind": "string",
- "changedAt": "string",
- "collaborative": true,
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "createdAt": "string",
- "duration": 0,
- "federated": true,
- "id": "string",
- "name": "string",
- "owner": "string",
- "public": true,
- "songCount": 0,
- "subscribed": true,
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}
]
}Returns the playlists the caller owns, subscribes to or collaborates on.
{- "playlists": [
- {
- "autoPlaylistKind": "string",
- "changedAt": "string",
- "collaborative": true,
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "createdAt": "string",
- "duration": 0,
- "federated": true,
- "id": "string",
- "name": "string",
- "owner": "string",
- "public": true,
- "songCount": 0,
- "subscribed": true,
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}
]
}Playlist
{ }{- "autoPlaylistKind": "string",
- "changedAt": "string",
- "collaborative": true,
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "createdAt": "string",
- "duration": 0,
- "federated": true,
- "id": "string",
- "name": "string",
- "owner": "string",
- "public": true,
- "songCount": 0,
- "subscribed": true,
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}Lists public playlists (not owned by the caller) available to subscribe to. Each entry includes whether the caller is already subscribed.
[- {
- "autoPlaylistKind": "string",
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "duration": 0,
- "id": "string",
- "name": "string",
- "owner": "string",
- "songCount": 0,
- "subscribed": true
}
]{- "autoPlaylistKind": "string",
- "changedAt": "string",
- "collaborative": true,
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "createdAt": "string",
- "duration": 0,
- "federated": true,
- "id": "string",
- "name": "string",
- "owner": "string",
- "public": true,
- "songCount": 0,
- "subscribed": true,
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}Edits metadata and appends/removes tracks. Owner/admin/collaborator only.
| id required | string Playlist id |
Changes
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Owner-only. Marks the playlist collaborative and grants edit rights to another user.
| id required | string Playlist id |
User to grant edit rights
{ }{- "collaborator": "string"
}| id required | string Playlist id |
Cover image (jpeg/png/gif/webp)
{- "autoPlaylistKind": "string",
- "changedAt": "string",
- "collaborative": true,
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "createdAt": "string",
- "duration": 0,
- "federated": true,
- "id": "string",
- "name": "string",
- "owner": "string",
- "public": true,
- "songCount": 0,
- "subscribed": true,
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}| id required | string Playlist id |
Cover spec (JSON, covergen.Spec) | Background image
{- "autoPlaylistKind": "string",
- "changedAt": "string",
- "collaborative": true,
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "createdAt": "string",
- "duration": 0,
- "federated": true,
- "id": "string",
- "name": "string",
- "owner": "string",
- "public": true,
- "songCount": 0,
- "subscribed": true,
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}| id required | string Playlist id |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Adds a public playlist to the caller's library (read-only). It then appears in getPlaylists like a normal playlist. Idempotent.
| id required | string Playlist id to subscribe to |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}| id required | string Playlist id |
Track ids
{ }{- "autoPlaylistKind": "string",
- "changedAt": "string",
- "collaborative": true,
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "createdAt": "string",
- "duration": 0,
- "federated": true,
- "id": "string",
- "name": "string",
- "owner": "string",
- "public": true,
- "songCount": 0,
- "subscribed": true,
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}Resolves an unresolved federated-playlist entry (checks the local catalog first, then the on-demand providers if enabled). 404 if it can't be resolved.
| id required | string Playlist id |
| position required | integer Track position (0-based) |
{- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}Returns the local on-demand mirror of a public Spotify playlist (fetched from Spotify when missing or older than a week). Its tracks resolve lazily at play time like any federated playlist; subscribe to it to keep it in the library, refreshed weekly. 404 when the built-in spotify-playlist provider is disabled.
| spotifyId required | string Spotify playlist id |
{- "autoPlaylistKind": "string",
- "changedAt": "string",
- "collaborative": true,
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "createdAt": "string",
- "duration": 0,
- "federated": true,
- "id": "string",
- "name": "string",
- "owner": "string",
- "public": true,
- "songCount": 0,
- "subscribed": true,
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}Lists the caller's playlist imports (most recent first), without per-track items.
[- {
- "createdAt": "string",
- "doubtful": 0,
- "error": "string",
- "failed": 0,
- "id": "string",
- "items": [
- {
- "candidateCoverArt": "string",
- "candidateTrackId": "string",
- "confidence": 0,
- "createdAt": "string",
- "id": "string",
- "importId": "string",
- "matchedTrackId": "string",
- "note": "string",
- "position": 0,
- "resolvedArtist": "string",
- "resolvedTitle": "string",
- "sourceAlbum": "string",
- "sourceArtist": "string",
- "sourceTitle": "string",
- "status": "pending",
- "updatedAt": "string"
}
], - "matched": 0,
- "missing": 0,
- "playlistId": "string",
- "source": "string",
- "sourcePlaylistName": "string",
- "sourceRef": "string",
- "status": "queued",
- "total": 0,
- "updatedAt": "string",
- "userId": "string"
}
]Queues an import of an external playlist (by source + reference). Returns the import job; poll GET /imports/{id} for progress. The import creates a new immerle playlist and resolves each source track against the on-demand content providers.
Import source + reference
{ }{- "createdAt": "string",
- "doubtful": 0,
- "error": "string",
- "failed": 0,
- "id": "string",
- "items": [
- {
- "candidateCoverArt": "string",
- "candidateTrackId": "string",
- "confidence": 0,
- "createdAt": "string",
- "id": "string",
- "importId": "string",
- "matchedTrackId": "string",
- "note": "string",
- "position": 0,
- "resolvedArtist": "string",
- "resolvedTitle": "string",
- "sourceAlbum": "string",
- "sourceArtist": "string",
- "sourceTitle": "string",
- "status": "pending",
- "updatedAt": "string"
}
], - "matched": 0,
- "missing": 0,
- "playlistId": "string",
- "source": "string",
- "sourcePlaylistName": "string",
- "sourceRef": "string",
- "status": "queued",
- "total": 0,
- "updatedAt": "string",
- "userId": "string"
}Returns one import with its per-track items and their status (matched/doubtful/missing/failed) for a progress page.
| id required | string Import id |
{- "createdAt": "string",
- "doubtful": 0,
- "error": "string",
- "failed": 0,
- "id": "string",
- "items": [
- {
- "candidateCoverArt": "string",
- "candidateTrackId": "string",
- "confidence": 0,
- "createdAt": "string",
- "id": "string",
- "importId": "string",
- "matchedTrackId": "string",
- "note": "string",
- "position": 0,
- "resolvedArtist": "string",
- "resolvedTitle": "string",
- "sourceAlbum": "string",
- "sourceArtist": "string",
- "sourceTitle": "string",
- "status": "pending",
- "updatedAt": "string"
}
], - "matched": 0,
- "missing": 0,
- "playlistId": "string",
- "source": "string",
- "sourcePlaylistName": "string",
- "sourceRef": "string",
- "status": "queued",
- "total": 0,
- "updatedAt": "string",
- "userId": "string"
}Resolves a doubtful/missing/failed import item: downloads a track and adds it to the import's playlist, flipping the item to "matched". With no query, it validates the flagged candidate as-is; with a query, it re-searches the content providers with that corrected text and uses the best result.
| id required | string Import id |
| itemId required | string Import item id |
Optional corrected 'artist title' search
{ }{- "candidateCoverArt": "string",
- "candidateTrackId": "string",
- "confidence": 0,
- "createdAt": "string",
- "id": "string",
- "importId": "string",
- "matchedTrackId": "string",
- "note": "string",
- "position": 0,
- "resolvedArtist": "string",
- "resolvedTitle": "string",
- "sourceAlbum": "string",
- "sourceArtist": "string",
- "sourceTitle": "string",
- "status": "pending",
- "updatedAt": "string"
}Session name and initial track ids
{ }{- "participants": [
- {
- "joinedAt": "string",
- "sessionId": "string",
- "userId": "string",
- "username": "string"
}
], - "session": {
- "createdAt": "string",
- "currentTrackId": "string",
- "hostId": "string",
- "id": "string",
- "name": "string",
- "position": 0,
- "state": "string",
- "trackIds": [
- "string"
], - "updatedAt": "string"
}
}{- "invites": [
- {
- "createdAt": "string",
- "id": "string",
- "inviteeId": "string",
- "inviterDisplayName": "string",
- "inviterId": "string",
- "inviterUsername": "string",
- "sessionId": "string",
- "sessionName": "string"
}
]
}| id required | string Invite id |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}{- "participants": [
- {
- "joinedAt": "string",
- "sessionId": "string",
- "userId": "string",
- "username": "string"
}
], - "session": {
- "createdAt": "string",
- "currentTrackId": "string",
- "hostId": "string",
- "id": "string",
- "name": "string",
- "position": 0,
- "state": "string",
- "trackIds": [
- "string"
], - "updatedAt": "string"
}
}Ends and removes the session. Host only.
| id required | string Jam session id |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}| id required | string Jam session id |
{- "participants": [
- {
- "joinedAt": "string",
- "sessionId": "string",
- "userId": "string",
- "username": "string"
}
], - "session": {
- "createdAt": "string",
- "currentTrackId": "string",
- "hostId": "string",
- "id": "string",
- "name": "string",
- "position": 0,
- "state": "string",
- "trackIds": [
- "string"
], - "updatedAt": "string"
}
}Host-only. Updates the shared track/position/state (partial) and broadcasts it to participants over SSE.
| id required | string Jam session id |
Playback fields to change
{ }{- "participants": [
- {
- "joinedAt": "string",
- "sessionId": "string",
- "userId": "string",
- "username": "string"
}
], - "session": {
- "createdAt": "string",
- "currentTrackId": "string",
- "hostId": "string",
- "id": "string",
- "name": "string",
- "position": 0,
- "state": "string",
- "trackIds": [
- "string"
], - "updatedAt": "string"
}
}Invites a user to the session. Host only; re-inviting just refreshes the invite.
| id required | string Jam session id |
Invitee username
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}| id required | string Jam session id |
{- "participants": [
- {
- "joinedAt": "string",
- "sessionId": "string",
- "userId": "string",
- "username": "string"
}
], - "session": {
- "createdAt": "string",
- "currentTrackId": "string",
- "hostId": "string",
- "id": "string",
- "name": "string",
- "position": 0,
- "state": "string",
- "trackIds": [
- "string"
], - "updatedAt": "string"
}
}| id required | string Jam session id |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}{- "songs": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}Returns library-wide analytics: artist/album/track counts, total on-disk size (bytes) and total duration (seconds). Cached and refreshed at each scan.
{- "albums": 0,
- "artists": 0,
- "totalDuration": 0,
- "totalSize": 0,
- "tracks": 0,
- "updatedAt": "string"
}| id required | string Track id |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}| id required | string Track id |
New title
{ }{- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}| id required | string Track id |
Cover image
{- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}Ingests one audio file (max 200 MiB) into the catalog, owned by the caller.
Audio file
{- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}Returns the authenticated user's own account, including the private email.
{- "displayName": "string",
- "email": "string",
- "id": "string",
- "isAdmin": true,
- "language": "string",
- "listenBrainzToken": "string",
- "username": "string"
}Partial update — only fields present are changed. Lets a user set their display name, email and ListenBrainz token themselves.
Account fields to change
{ }{- "displayName": "string",
- "email": "string",
- "id": "string",
- "isAdmin": true,
- "language": "string",
- "listenBrainzToken": "string",
- "username": "string"
}Exchanges a token approved via the auth URL for a permanent session key, and stores it on the caller's account. Returns 400 not_authorized if the token hasn't been approved yet.
Approved auth token
{ }{- "connected": true,
- "username": "bob"
}Requests a fresh auth token and returns the URL the caller must open to approve it, the first step of Last.fm's desktop-auth handshake.
{- "authUrl": "string",
- "token": "string"
}Returns a user's profile — identity, recent activity visible to the caller (honoring privacy), their public playlists, all-time listening stats, and the top of their Hall of Fame (omitted when empty). Use "me" for the caller.
| username required | string Target username, or 'me' for the caller |
{- "activity": [
- {
- "createdAt": "string",
- "displayName": "string",
- "id": "string",
- "item": {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "coverArt": "string",
- "duration": 0,
- "title": "string",
- "year": 0
}, - "itemId": "string",
- "itemType": "artist",
- "privacy": "string",
- "type": "string",
- "userId": "string",
- "username": "string"
}
], - "hallOfFame": {
- "top": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
], - "total": 0
}, - "isSelf": true,
- "playlists": [
- {
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "duration": 0,
- "id": "string",
- "name": "string",
- "songCount": 0
}
], - "stats": {
- "listenSeconds": 0,
- "playlists": 0,
- "plays": 0
}, - "user": {
- "displayName": "string",
- "id": "string",
- "isAdmin": true,
- "username": "string"
}
}| username required | string Target username, or 'me' for the caller |
{- "changedAt": "string",
- "createdAt": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}Concert discovery matches your top-listened artists against Ticketmaster/Skiddle/Eventim near the admin-configured country, refreshed daily. Returns upcoming, non-dismissed matches, soonest first. Empty (not an error) when the feature is disabled, no country is configured, or nothing matched yet.
{- "concerts": [
- {
- "artistName": "string",
- "city": "string",
- "eventName": "string",
- "id": "string",
- "source": "ticketmaster",
- "startTime": "string",
- "url": "string",
- "venue": "string"
}
]
}| id required | string Concert id |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}New password
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Reports whether the caller has connected their Bandcamp account, and whether the stored cookie needs to be refreshed.
{- "connected": true,
- "fanId": "string",
- "lastSyncedAt": "2026-07-18T21:42:00Z",
- "needsReconnect": true
}Fetches the caller's purchase collection live from Bandcamp. Each item is annotated with its import job status, if any.
{- "items": [
- {
- "artUrl": "string",
- "artistName": "string",
- "itemTitle": "string",
- "itemType": "album",
- "jobId": "string",
- "jobStatus": "completed",
- "purchased": "2021-01-01T10:00:00Z",
- "saleItemId": "123456789",
- "saleItemType": "p"
}
]
}Validates the pasted session cookie against Bandcamp and stores it (encrypted), replacing any previous connection.
Bandcamp session cookie
{ }{- "connected": true,
- "fanId": "string",
- "lastSyncedAt": "2026-07-18T21:42:00Z",
- "needsReconnect": true
}| saleItemType required | string Bandcamp sale item type |
| saleItemId required | string Bandcamp sale item id |
Item display fields
{ }{- "artistName": "string",
- "attempts": 0,
- "createdAt": "2026-07-18T21:42:00Z",
- "error": "string",
- "format": "flac",
- "id": "string",
- "itemTitle": "string",
- "itemType": "album",
- "saleItemId": "string",
- "saleItemType": "string",
- "status": "completed",
- "trackIds": [
- "string"
], - "updatedAt": "2026-07-18T21:43:00Z"
}{- "jobs": [
- {
- "artistName": "string",
- "attempts": 0,
- "createdAt": "2026-07-18T21:42:00Z",
- "error": "string",
- "format": "flac",
- "id": "string",
- "itemTitle": "string",
- "itemType": "album",
- "saleItemId": "string",
- "saleItemType": "string",
- "status": "completed",
- "trackIds": [
- "string"
], - "updatedAt": "2026-07-18T21:43:00Z"
}
]
}Returns the tracks every user is currently playing, newest first.
{- "nowPlaying": [
- {
- "minutesAgo": 0,
- "song": {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}, - "username": "string"
}
]
}Returns the caller's saved cross-device play queue with its tracks.
| deviceId | string Polling device id, marked online (see targetOnline) |
{- "changedAt": "string",
- "changedBy": "string",
- "commandSeq": 0,
- "current": "string",
- "entries": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
], - "pendingCommand": {
- "forTarget": "string",
- "issuedBy": "string",
- "positionMs": 0,
- "queueIndex": 0,
- "toIndex": 0,
- "trackId": "string",
- "trackIds": [
- "string"
], - "type": "string"
}, - "playing": true,
- "position": 0,
- "repeat": "string",
- "shuffle": true,
- "targetDeviceId": "string",
- "targetOnline": true
}Replaces the caller's saved play queue (tracks, current track, position and playing state).
Play queue
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Sends a remote-control command (toggle, next, previous, seekTo, skipTo, toggleShuffle, cycleRepeat, playNext, enqueue, removeAt, move) for the active device (see targetDeviceId) to apply. Does not modify the saved queue state directly.
Command
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Server-Sent Events stream. Emits the current queue immediately, then again on every change (save, target change); also emits the caller's pending Jam invites (event "invites") on connect and whenever they change.
| deviceId | string Connecting device id, marked online while the stream is open (see targetOnline) |
Assigns (or, with an empty deviceId, clears) the sole device that should be actively playing the caller's queue.
Target device
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}{- "channels": [
- {
- "description": "string",
- "episodes": [
- {
- "channelId": "string",
- "contentType": "string",
- "description": "string",
- "duration": 0,
- "id": "string",
- "publishDate": "string",
- "size": 0,
- "status": "string",
- "streamable": true,
- "suffix": "string",
- "title": "string"
}
], - "error": "string",
- "id": "string",
- "imageUrl": "string",
- "status": "string",
- "title": "string",
- "url": "string"
}
]
}| count | integer Max episodes (default 20) |
{- "episodes": [
- {
- "channelId": "string",
- "contentType": "string",
- "description": "string",
- "duration": 0,
- "id": "string",
- "publishDate": "string",
- "size": 0,
- "status": "string",
- "streamable": true,
- "suffix": "string",
- "title": "string"
}
]
}{- "channelId": "string",
- "contentType": "string",
- "description": "string",
- "duration": 0,
- "id": "string",
- "publishDate": "string",
- "size": 0,
- "status": "string",
- "streamable": true,
- "suffix": "string",
- "title": "string"
}| id required | string Episode id |
{- "channelId": "string",
- "contentType": "string",
- "description": "string",
- "duration": 0,
- "id": "string",
- "publishDate": "string",
- "size": 0,
- "status": "string",
- "streamable": true,
- "suffix": "string",
- "title": "string"
}| id required | string Episode id |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}{- "description": "string",
- "episodes": [
- {
- "channelId": "string",
- "contentType": "string",
- "description": "string",
- "duration": 0,
- "id": "string",
- "publishDate": "string",
- "size": 0,
- "status": "string",
- "streamable": true,
- "suffix": "string",
- "title": "string"
}
], - "error": "string",
- "id": "string",
- "imageUrl": "string",
- "status": "string",
- "title": "string",
- "url": "string"
}{- "stations": [
- {
- "builtin": true,
- "country": "string",
- "coverUrl": "string",
- "deletable": true,
- "hasCover": true,
- "homepageUrl": "string",
- "id": "string",
- "liked": true,
- "name": "string",
- "streamUrl": "string"
}
]
}Records playback for one or more tracks (now-playing + optional submission).
Scrobble
{ }{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Unauthenticated, one-shot. Creates the initial admin. Self-locks once any user exists (also true when the admin was instead bootstrapped from ADMIN_USERNAME/ADMIN_PASSWORD at startup).
Initial admin credentials
{ }{- "displayName": "string",
- "id": "string",
- "isAdmin": true,
- "username": "string"
}{- "playlists": [
- {
- "createdAt": "string",
- "id": "string",
- "name": "string",
- "rules": {
- "conditions": [
- {
- "field": "string",
- "op": "string",
- "value": "string"
}
], - "limit": 0,
- "match": "all",
- "order": "asc",
- "sort": "string"
}, - "updatedAt": "string"
}
]
}Name + rules
{ }{- "createdAt": "string",
- "id": "string",
- "name": "string",
- "rules": {
- "conditions": [
- {
- "field": "string",
- "op": "string",
- "value": "string"
}
], - "limit": 0,
- "match": "all",
- "order": "asc",
- "sort": "string"
}, - "updatedAt": "string"
}Rules to preview
{ }{- "songs": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}| id required | string Smart playlist id |
Name + rules
{ }{- "createdAt": "string",
- "id": "string",
- "name": "string",
- "rules": {
- "conditions": [
- {
- "field": "string",
- "op": "string",
- "value": "string"
}
], - "limit": 0,
- "match": "all",
- "order": "asc",
- "sort": "string"
}, - "updatedAt": "string"
}| id required | string Smart playlist id |
{- "songs": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}Reorders tracks for smooth transitions from the local audio analysis: close tempos (a half or double tempo counts as close), harmonically compatible keys on the Camelot wheel, small energy jumps. Starts from ids[0] when keepFirst, else from the calmest track. Tracks not analyzed yet follow, in their original order. 404 when Auto-DJ is switched off.
Tracks to order
{ }{- "ids": [
- "string"
]
}Tracks that sound like the seeds, from the local audio analysis: the closest analyzed tracks, at most two per artist, with a little randomness so two radios differ. A seed is a track, album or artist id; several seeds blend into one radio (e.g. the last tracks played, to extend a queue). 404 when both the sonic radio and autoplay are switched off; an empty list when none of the seeds is analyzed yet.
| seed required | Array of strings Track, album or artist id (repeatable) |
| exclude | string Comma-separated track ids to leave out (e.g. the current queue) |
| count | integer Number of tracks (default 50, max 200) |
{- "songs": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "bitRate": 0,
- "bpm": 0,
- "comment": "string",
- "composer": "string",
- "contentType": "string",
- "coverArt": "string",
- "duration": 0,
- "genre": "string",
- "id": "string",
- "lyrics": "string",
- "movementName": "string",
- "movementNumber": 0,
- "participants": [
- {
- "name": "string",
- "role": "string"
}
], - "playCount": 0,
- "rating": 0,
- "remote": true,
- "replayGainAlbum": 0,
- "replayGainTrack": 0,
- "size": 0,
- "starred": "string",
- "suffix": "string",
- "title": "string",
- "titleSort": "string",
- "track": 0,
- "unresolved": true,
- "work": "string",
- "year": 0
}
]
}The tempo, key and energy the local audio analysis measured for a track (energy and danceability from 0 to 1). 404 when the analysis is switched off or the track isn't analyzed yet.
| id required | string Track id |
{- "bpm": 127.6,
- "camelot": "8A",
- "danceability": 0.64,
- "energy": 0.82,
- "key": "A",
- "mode": "minor"
}Partial update — omitted fields keep their stored value; pass an empty accentColor to clear it.
Theme fields to change
{ }{- "accentColor": "string"
}Lists the caller's active personal access tokens (no secrets).
[- {
- "connected": true,
- "createdAt": "string",
- "expiresAt": "string",
- "id": "string",
- "isDevice": true,
- "lastUsedAt": "string",
- "name": "string",
- "prefix": "string"
}
]Creates a personal access token scoped to the caller. The secret is returned ONCE — store it now. Use it as "Authorization: Bearer
Token name and optional expiry
{ }{- "id": "string",
- "name": "string",
- "prefix": "string",
- "token": "string"
}| id required | string Token id to revoke |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Returns the caller's listening stats for a calendar year: totals, top tracks/artists/genres and a per-month histogram. 404 when the feature is disabled.
| year | integer Calendar year (default: current) |
{- "byMonth": [
- 0
], - "topArtists": [
- {
- "name": "string",
- "plays": 0
}
], - "topGenres": [
- {
- "name": "string",
- "plays": 0
}
], - "topTracks": [
- {
- "artist": "string",
- "id": "string",
- "plays": 0,
- "title": "string"
}
], - "totalPlays": 0,
- "totalSeconds": 0,
- "year": 0
}