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": "2026-06-15T09:00:00Z",
- "displayName": "Bob Marley",
- "id": "string",
- "item": {
- "album": "Discovery",
- "albumId": "string",
- "artist": "Daft Punk",
- "artistId": "string",
- "coverArt": "string",
- "duration": 320,
- "title": "One More Time",
- "year": 2001
}, - "itemId": "string",
- "itemType": "track",
- "privacy": "public",
- "type": "listen",
- "userId": "string",
- "username": "bob"
}
]Admin only. Enables or disables the background eviction sweep at runtime (persisted; hot).
Enable or disable the sweep
{ }{- "enabled": true,
- "intervalSeconds": 21600,
- "maxAgeSeconds": 2592000
}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": false,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 2592000
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 21600,
- "maxAgeSeconds": 2592000
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "3f1c2d4e-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
- "instanceName": "My living-room immerle",
- "sqid": "my-node",
- "syncPlaylists": true,
- "userId": "6f1c2b8e-1f0a-4f9b-9c3a-1e2d3c4b5a6f"
}, - "ldap": {
- "bindDnTemplate": "uid=%s,ou=people,dc=example,dc=com",
- "enabled": false,
- "url": "ldaps://ldap.example.com:636"
}, - "logs": {
- "retentionDays": 30
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 3
}, - "scan": {
- "intervalSeconds": 3600,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "*"
]
}, - "transcode": {
- "ffmpegPath": "ffmpeg",
- "ffprobePath": "ffprobe",
- "profiles": [
- {
- "bitRate": 192,
- "ffmpegArgs": "string",
- "format": "mp3",
- "name": "mp3"
}
]
}
}
}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": false,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 2592000
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 21600,
- "maxAgeSeconds": 2592000
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "3f1c2d4e-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
- "instanceName": "My living-room immerle",
- "sqid": "my-node",
- "syncPlaylists": true,
- "userId": "6f1c2b8e-1f0a-4f9b-9c3a-1e2d3c4b5a6f"
}, - "ldap": {
- "bindDnTemplate": "uid=%s,ou=people,dc=example,dc=com",
- "enabled": false,
- "url": "ldaps://ldap.example.com:636"
}, - "logs": {
- "retentionDays": 30
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 3
}, - "scan": {
- "intervalSeconds": 3600,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "*"
]
}, - "transcode": {
- "ffmpegPath": "ffmpeg",
- "ffprobePath": "ffprobe",
- "profiles": [
- {
- "bitRate": 192,
- "ffmpegArgs": "string",
- "format": "mp3",
- "name": "mp3"
}
]
}
}
}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": false,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 2592000
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 21600,
- "maxAgeSeconds": 2592000
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "3f1c2d4e-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
- "instanceName": "My living-room immerle",
- "sqid": "my-node",
- "syncPlaylists": true,
- "userId": "6f1c2b8e-1f0a-4f9b-9c3a-1e2d3c4b5a6f"
}, - "ldap": {
- "bindDnTemplate": "uid=%s,ou=people,dc=example,dc=com",
- "enabled": false,
- "url": "ldaps://ldap.example.com:636"
}, - "logs": {
- "retentionDays": 30
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 3
}, - "scan": {
- "intervalSeconds": 3600,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "*"
]
}, - "transcode": {
- "ffmpegPath": "ffmpeg",
- "ffprobePath": "ffprobe",
- "profiles": [
- {
- "bitRate": 192,
- "ffmpegArgs": "string",
- "format": "mp3",
- "name": "mp3"
}
]
}
}
}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": "3f1c2d4e-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
- "lastSeenAt": "string",
- "name": "A friend's immerle",
- "region": "eu",
- "sqid": "other-node"
}
]
}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": false,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 2592000
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 21600,
- "maxAgeSeconds": 2592000
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "3f1c2d4e-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
- "instanceName": "My living-room immerle",
- "sqid": "my-node",
- "syncPlaylists": true,
- "userId": "6f1c2b8e-1f0a-4f9b-9c3a-1e2d3c4b5a6f"
}, - "ldap": {
- "bindDnTemplate": "uid=%s,ou=people,dc=example,dc=com",
- "enabled": false,
- "url": "ldaps://ldap.example.com:636"
}, - "logs": {
- "retentionDays": 30
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 3
}, - "scan": {
- "intervalSeconds": 3600,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "*"
]
}, - "transcode": {
- "ffmpegPath": "ffmpeg",
- "ffprobePath": "ffprobe",
- "profiles": [
- {
- "bitRate": 192,
- "ffmpegArgs": "string",
- "format": "mp3",
- "name": "mp3"
}
]
}
}
}Admin only. Returns the instances this one follows on the hub. The HTTP exchange runs server-side.
{- "subscriptions": [
- {
- "id": "3f1c2d4e-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
- "lastSeenAt": "string",
- "name": "A friend's immerle",
- "region": "eu",
- "sqid": "other-node"
}
]
}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
}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"
}| 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": false,
- "config": "{\"headers\":{\"Authorization\":\"Bearer x\"}}",
- "deletable": true,
- "enabled": true,
- "kind": "http",
- "name": "manual",
- "sortOrder": 3,
- "version": 1
}
]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": false,
- "config": "{\"headers\":{\"Authorization\":\"Bearer x\"}}",
- "deletable": true,
- "enabled": true,
- "kind": "http",
- "name": "manual",
- "sortOrder": 3,
- "version": 1
}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": false,
- "config": "{\"headers\":{\"Authorization\":\"Bearer x\"}}",
- "deletable": true,
- "enabled": true,
- "kind": "http",
- "name": "manual",
- "sortOrder": 3,
- "version": 1
}
]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. 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": false,
- "config": "{\"headers\":{\"Authorization\":\"Bearer x\"}}",
- "deletable": true,
- "enabled": true,
- "kind": "http",
- "name": "manual",
- "sortOrder": 3,
- "version": 1
}Admin only. Returns the most recent provider action failures (search/resolve/download), newest first.
| name required | string Provider name |
[- {
- "action": "download",
- "createdAt": "2026-06-18T20:00:00Z",
- "id": "string",
- "level": "error",
- "message": "unexpected status 404",
- "provider": "free-music-archive"
}
]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": false,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 2592000
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 21600,
- "maxAgeSeconds": 2592000
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "3f1c2d4e-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
- "instanceName": "My living-room immerle",
- "sqid": "my-node",
- "syncPlaylists": true,
- "userId": "6f1c2b8e-1f0a-4f9b-9c3a-1e2d3c4b5a6f"
}, - "ldap": {
- "bindDnTemplate": "uid=%s,ou=people,dc=example,dc=com",
- "enabled": false,
- "url": "ldaps://ldap.example.com:636"
}, - "logs": {
- "retentionDays": 30
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 3
}, - "scan": {
- "intervalSeconds": 3600,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "*"
]
}, - "transcode": {
- "ffmpegPath": "ffmpeg",
- "ffprobePath": "ffprobe",
- "profiles": [
- {
- "bitRate": 192,
- "ffmpegArgs": "string",
- "format": "mp3",
- "name": "mp3"
}
]
}
}
}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": false,
- "settings": {
- "auth": {
- "deviceTokenTtlSeconds": 2592000
}, - "cleanup": {
- "enabled": true,
- "intervalSeconds": 21600,
- "maxAgeSeconds": 2592000
}, - "federation": {
- "exportScrobbles": true,
- "instanceId": "3f1c2d4e-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
- "instanceName": "My living-room immerle",
- "sqid": "my-node",
- "syncPlaylists": true,
- "userId": "6f1c2b8e-1f0a-4f9b-9c3a-1e2d3c4b5a6f"
}, - "ldap": {
- "bindDnTemplate": "uid=%s,ou=people,dc=example,dc=com",
- "enabled": false,
- "url": "ldaps://ldap.example.com:636"
}, - "logs": {
- "retentionDays": 30
}, - "providers": {
- "autoDownloadOnPlay": true,
- "searchTimeoutSeconds": 3
}, - "scan": {
- "intervalSeconds": 3600,
- "watch": true
}, - "server": {
- "corsAllowedOrigins": [
- "*"
]
}, - "transcode": {
- "ffmpegPath": "ffmpeg",
- "ffprobePath": "ffprobe",
- "profiles": [
- {
- "bitRate": 192,
- "ffmpegArgs": "string",
- "format": "mp3",
- "name": "mp3"
}
]
}
}
}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": 50,
- "offset": 0,
- "total": 1560,
- "tracks": [
- {
- "album": "Discovery",
- "albumId": "string",
- "artist": "Daft Punk",
- "artistId": "string",
- "contentType": "audio/flac",
- "coverArt": "string",
- "duration": 320,
- "genre": "House",
- "id": "string",
- "size": 8123456,
- "suffix": "flac",
- "title": "One More Time",
- "track": 1,
- "year": 2001
}
]
}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": "Discovery",
- "albumId": "string",
- "artist": "Daft Punk",
- "artistId": "string",
- "contentType": "audio/flac",
- "coverArt": "string",
- "duration": 320,
- "genre": "House",
- "id": "string",
- "size": 8123456,
- "suffix": "flac",
- "title": "One More Time",
- "track": 1,
- "year": 2001
}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": "Discovery",
- "albumId": "string",
- "artist": "Daft Punk",
- "artistId": "string",
- "contentType": "audio/flac",
- "coverArt": "string",
- "duration": 320,
- "genre": "House",
- "id": "string",
- "size": 8123456,
- "suffix": "flac",
- "title": "One More Time",
- "track": 1,
- "year": 2001
}{- "property1": [
- {
- "admin": true,
- "displayName": "string",
- "email": "string",
- "id": "string",
- "scrobblingEnabled": true,
- "username": "string"
}
], - "property2": [
- {
- "admin": true,
- "displayName": "string",
- "email": "string",
- "id": "string",
- "scrobblingEnabled": true,
- "username": "string"
}
]
}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) |
{- "property1": [
- {
- "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",
- "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
}
], - "property2": [
- {
- "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",
- "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",
- "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.
{- "property1": [
- {
- "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",
- "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"
}
], - "property2": [
- {
- "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",
- "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",
- "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",
- "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",
- "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",
- "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), 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",
- "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",
- "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": {
- "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",
- "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",
- "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
}, - "type": "string"
}
]
}Returns songs tagged with the given genre (paged).
| genre required | string Genre name |
| count | integer Default: 200 Page size |
| offset | integer Offset |
{- "property1": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "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
}
], - "property2": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "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",
- "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",
- "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
}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": {
- "connected": true,
- "createdAt": "string",
- "expiresAt": "string",
- "id": "string",
- "lastIp": "string",
- "lastSeen": "string",
- "name": "Pixel 8",
- "userAgent": "string"
}, - "token": "eyJhbGciOiJIUzI1Ni..."
}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": "Pixel 8",
- "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": {
- "version": 1
}, - "property2": {
- "version": 1
}
}, - "protocolVersion": "1.0.0",
- "server": "immerle"
}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",
- "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",
- "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) that currently have at least one track.
{- "property1": [
- {
- "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",
- "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
}
]
}
], - "property2": [
- {
- "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",
- "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.
{- "property1": [
- {
- "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",
- "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
}
]
}
], - "property2": [
- {
- "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",
- "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
{ }{- "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",
- "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.
[- {
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "duration": 0,
- "id": "string",
- "name": "Editorial Picks",
- "owner": "alice",
- "songCount": 0,
- "subscribed": true
}
]{- "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",
- "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
{ }{- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}| 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
{ }{- "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",
- "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",
- "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.
[- {
- "doubtful": 2,
- "error": "string",
- "failed": 0,
- "id": "string",
- "items": [
- {
- "candidateCoverArt": "string",
- "candidateTrackId": "string",
- "confidence": 0.62,
- "id": "string",
- "matchedTrackId": "string",
- "note": "string",
- "position": 0,
- "resolvedArtist": "string",
- "resolvedTitle": "string",
- "sourceAlbum": "string",
- "sourceArtist": "Daft Punk",
- "sourceTitle": "Da Funk",
- "status": "matched"
}
], - "matched": 38,
- "missing": 2,
- "playlistId": "string",
- "source": "spotify",
- "sourcePlaylistName": "string",
- "sourceRef": "string",
- "status": "completed",
- "total": 42
}
]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
{ }{- "doubtful": 2,
- "error": "string",
- "failed": 0,
- "id": "string",
- "items": [
- {
- "candidateCoverArt": "string",
- "candidateTrackId": "string",
- "confidence": 0.62,
- "id": "string",
- "matchedTrackId": "string",
- "note": "string",
- "position": 0,
- "resolvedArtist": "string",
- "resolvedTitle": "string",
- "sourceAlbum": "string",
- "sourceArtist": "Daft Punk",
- "sourceTitle": "Da Funk",
- "status": "matched"
}
], - "matched": 38,
- "missing": 2,
- "playlistId": "string",
- "source": "spotify",
- "sourcePlaylistName": "string",
- "sourceRef": "string",
- "status": "completed",
- "total": 42
}Returns one import with its per-track items and their status (matched/doubtful/missing/failed) for a progress page.
| id required | string Import id |
{- "doubtful": 2,
- "error": "string",
- "failed": 0,
- "id": "string",
- "items": [
- {
- "candidateCoverArt": "string",
- "candidateTrackId": "string",
- "confidence": 0.62,
- "id": "string",
- "matchedTrackId": "string",
- "note": "string",
- "position": 0,
- "resolvedArtist": "string",
- "resolvedTitle": "string",
- "sourceAlbum": "string",
- "sourceArtist": "Daft Punk",
- "sourceTitle": "Da Funk",
- "status": "matched"
}
], - "matched": 38,
- "missing": 2,
- "playlistId": "string",
- "source": "spotify",
- "sourcePlaylistName": "string",
- "sourceRef": "string",
- "status": "completed",
- "total": 42
}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.62,
- "id": "string",
- "matchedTrackId": "string",
- "note": "string",
- "position": 0,
- "resolvedArtist": "string",
- "resolvedTitle": "string",
- "sourceAlbum": "string",
- "sourceArtist": "Daft Punk",
- "sourceTitle": "Da Funk",
- "status": "matched"
}Session name and initial track ids
{ }{- "participants": [
- {
- "joinedAt": "2026-06-15T09:00:00Z",
- "sessionId": "string",
- "userId": "string",
- "username": "bob"
}
], - "session": {
- "currentTrackId": "string",
- "hostId": "string",
- "id": "string",
- "name": "Friday Night",
- "position": 42000,
- "state": "playing",
- "trackIds": [
- "string"
]
}
}{- "property1": [
- {
- "createdAt": "2026-06-15T09:00:00Z",
- "id": "string",
- "inviteeId": "string",
- "inviterDisplayName": "Bob Marley",
- "inviterId": "string",
- "inviterUsername": "bob",
- "sessionId": "string",
- "sessionName": "Friday Night"
}
], - "property2": [
- {
- "createdAt": "2026-06-15T09:00:00Z",
- "id": "string",
- "inviteeId": "string",
- "inviterDisplayName": "Bob Marley",
- "inviterId": "string",
- "inviterUsername": "bob",
- "sessionId": "string",
- "sessionName": "Friday Night"
}
]
}| id required | string Invite id |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}{- "participants": [
- {
- "joinedAt": "2026-06-15T09:00:00Z",
- "sessionId": "string",
- "userId": "string",
- "username": "bob"
}
], - "session": {
- "currentTrackId": "string",
- "hostId": "string",
- "id": "string",
- "name": "Friday Night",
- "position": 42000,
- "state": "playing",
- "trackIds": [
- "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": "2026-06-15T09:00:00Z",
- "sessionId": "string",
- "userId": "string",
- "username": "bob"
}
], - "session": {
- "currentTrackId": "string",
- "hostId": "string",
- "id": "string",
- "name": "Friday Night",
- "position": 42000,
- "state": "playing",
- "trackIds": [
- "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": "2026-06-15T09:00:00Z",
- "sessionId": "string",
- "userId": "string",
- "username": "bob"
}
], - "session": {
- "currentTrackId": "string",
- "hostId": "string",
- "id": "string",
- "name": "Friday Night",
- "position": 42000,
- "state": "playing",
- "trackIds": [
- "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": "2026-06-15T09:00:00Z",
- "sessionId": "string",
- "userId": "string",
- "username": "bob"
}
], - "session": {
- "currentTrackId": "string",
- "hostId": "string",
- "id": "string",
- "name": "Friday Night",
- "position": 42000,
- "state": "playing",
- "trackIds": [
- "string"
]
}
}| id required | string Jam session id |
{- "error": {
- "code": "string",
- "fields": [
- {
- "field": "string",
- "message": "string"
}
], - "message": "string",
- "params": {
- "property1": null,
- "property2": null
}
}
}Returns library-wide analytics: artist/album/track counts, total on-disk size (bytes) and total duration (seconds). Cached and refreshed at each scan.
{- "albums": 128,
- "artists": 42,
- "totalDuration": 432000,
- "totalSize": 9663676416,
- "tracks": 1560,
- "updatedAt": "2026-06-17T09:00:00Z"
}Returns the authenticated user's own account, including the private email.
{- "displayName": "Bob Marley",
- "email": "bob@example.com",
- "id": "string",
- "isAdmin": false,
- "language": "fr",
- "username": "bob"
}Partial update — only fields present are changed. Lets a user set their display name and email themselves.
Account fields to change
{ }{- "displayName": "Bob Marley",
- "email": "bob@example.com",
- "id": "string",
- "isAdmin": false,
- "language": "fr",
- "username": "bob"
}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": "2026-06-15T09:00:00Z",
- "displayName": "Bob Marley",
- "id": "string",
- "item": {
- "album": "Discovery",
- "albumId": "string",
- "artist": "Daft Punk",
- "artistId": "string",
- "coverArt": "string",
- "duration": 320,
- "title": "One More Time",
- "year": 2001
}, - "itemId": "string",
- "itemType": "track",
- "privacy": "public",
- "type": "listen",
- "userId": "string",
- "username": "bob"
}
], - "hallOfFame": {
- "top": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "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": 12
}, - "isSelf": false,
- "playlists": [
- {
- "comment": "string",
- "coverArt": "string",
- "coverArts": [
- "string"
], - "duration": 5400,
- "id": "string",
- "name": "Summer vibes",
- "songCount": 24
}
], - "stats": {
- "listenSeconds": 432000,
- "playlists": 5,
- "plays": 1234
}, - "user": {
- "displayName": "Bob Marley",
- "id": "string",
- "isAdmin": false,
- "username": "bob"
}
}| username required | string Target username, or 'me' for the caller |
{- "changedAt": "string",
- "createdAt": "string",
- "tracks": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "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": "Daft Punk",
- "city": "Paris",
- "eventName": "Daft Punk World Tour",
- "id": "string",
- "source": "ticketmaster",
- "startTime": "2026-09-12T19:00:00Z",
- "venue": "Accor Arena"
}
]
}| 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.
{- "property1": [
- {
- "minutesAgo": 0,
- "song": {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "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"
}
], - "property2": [
- {
- "minutesAgo": 0,
- "song": {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "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.
{- "changedAt": "string",
- "changedBy": "string",
- "commandSeq": 0,
- "current": "string",
- "entries": [
- {
- "album": "string",
- "albumId": "string",
- "artist": "string",
- "artistId": "string",
- "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,
- "trackId": "string",
- "type": "string"
}, - "playing": true,
- "position": 0,
- "repeat": "string",
- "shuffle": true,
- "targetDeviceId": "string"
}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) 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
}
}
}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
}
}
}{- "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"
}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": "Kilian Smiti",
- "id": "string",
- "isAdmin": true,
- "username": "kilian"
}Name + rules
{ }{- "id": "string",
- "name": "Heavy rotation",
- "rules": {
- "conditions": [
- {
- "field": "genre",
- "op": "is",
- "value": "House"
}
], - "limit": 100,
- "match": "all",
- "order": "desc",
- "sort": "playCount"
}
}| id required | string Smart playlist id |
Name + rules
{ }{- "id": "string",
- "name": "Heavy rotation",
- "rules": {
- "conditions": [
- {
- "field": "genre",
- "op": "is",
- "value": "House"
}
], - "limit": 100,
- "match": "all",
- "order": "desc",
- "sort": "playCount"
}
}| 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
}
}
}Partial update — omitted fields keep their stored value; pass an empty accentColor to clear it.
Theme fields to change
{ }{- "accentColor": "#3b82f6"
}Lists the caller's active personal access tokens (no secrets).
[- {
- "connected": true,
- "createdAt": "2026-06-15T09:00:00Z",
- "expiresAt": "string",
- "id": "string",
- "isDevice": true,
- "lastUsedAt": "string",
- "name": "my-cli",
- "prefix": "gsk_AbC12"
}
]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": "my-cli",
- "prefix": "gsk_AbC12",
- "token": "gsk_AbC12...full-secret"
}| 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": "Daft Punk",
- "plays": 120
}
], - "topGenres": [
- {
- "name": "Daft Punk",
- "plays": 120
}
], - "topTracks": [
- {
- "artist": "Daft Punk",
- "id": "string",
- "plays": 42,
- "title": "One More Time"
}
], - "totalPlays": 1234,
- "totalSeconds": 987654,
- "year": 2025
}