Synara REST API
Services: RPC_SERVICES.md · Models: MODELS.md · Guide: CLIENT_REST.md · Index: README.md
How to read this file
- Every route is derived from an RPC interface function; the derivation rules (method, path segment, parameter binding) are listed in How routes are derived below and explained with examples in CLIENT_REST.md.
- Parameters lists each parameter with its binding:
path(a path segment),query(a query parameter; collections repeat thename=pair, objects on GET are JSON-encoded) orbody(JSON; when a route has several body parameters the request body is one JSON object with one field per parameter).optionalmarks a parameter that has a default or is nullable, and the text after the colon is its documentation. - Response is
JSON <type>(a JSON body),SSE <item type>(Server-Sent Events, one JSON object perdata:line),FILE(served on GET and HEAD withAccept-Ranges: bytesandContent-Disposition: inline),BYTES(a raw binary body) or-(an empty200). - Auth is
public(no token needed),JWT(anAuthorization: Bearer <token>header or thesynara-authcookie),JWT + AdminorJWT + <CAPABILITY>for a required user capability. - The
serverStats,auth,handshakeservices are mounted without requiring a user, so all of their routes are reachable without a token and are listed aspublichere. - Errors are returned as a plain-text body with status
400,401,403,404or500.
How routes are derived
Nothing on this page is written by hand: every route below is derived from one function of an RPC service interface by the same rules the server's routing code is generated with.
Service prefix. The interface name without a leading I and a trailing Service, with the first letter lowercased: ISongService is mounted at /song, IPodcastService at /podcast.
Verb and path segment. They follow the function name. The first matching rule wins, and a prefix only matches as a whole word — the character after it must be an upper-case letter or a digit, or the name must be exactly the prefix. The segment keeps the name with its first letter lowercased.
| Method name starts with | Verb | Segment |
|---|---|---|
by |
GET |
the whole name |
all |
GET |
the whole name |
liked |
GET |
the whole name |
stream |
GET |
the whole name |
import |
GET |
the whole name |
download |
GET |
the whole name |
get |
GET |
the name without the prefix |
list |
GET |
the name without the prefix |
find |
GET |
the name without the prefix |
fetch |
GET |
the name without the prefix |
search |
GET |
the name without the prefix |
ranked |
GET |
the name without the prefix |
exists |
GET |
the whole name |
anything containing Exists |
GET |
the whole name |
add |
POST |
the whole name |
post |
POST |
the name without the prefix |
create |
POST |
the name without the prefix |
put |
PUT |
the name without the prefix |
set |
PUT |
the name without the prefix |
update |
PUT |
the name without the prefix |
delete |
DELETE |
the name without the prefix |
remove |
DELETE |
the name without the prefix |
| anything else | POST |
the whole name |
Explicit overrides. @RestGet, @RestPost, @RestPut and @RestDelete on the function replace the derived verb; @RestPath("segment") replaces the derived segment.
Path parameters. A parameter named type that is primitive, not nullable and has no default becomes a leading {type} segment. The first parameter named id or ending in Id that is primitive, not nullable and has no default becomes a trailing {name} segment. Every other parameter binds by its type and the route's verb.
| Parameter | Bound as |
|---|---|
a path parameter (type or the id, see above) |
a path segment |
| a primitive | a query parameter |
a List or Set of primitives |
repeated query values (name=a&name=b; one comma-separated value is also accepted) |
a non-primitive on a GET route |
a JSON-encoded query value |
a non-primitive on a POST, PUT or DELETE route |
the JSON request body |
| several body parameters | one JSON object with one field per parameter |
Response. The return type decides how the body is written.
| Return type | Response |
|---|---|
Flow<ByteArray> |
a byte stream |
anything annotated @RestFileResponse |
served on GET and HEAD with Accept-Ranges: bytes |
another Flow<T> |
SSE, one JSON item per data: line |
ByteArray |
raw bytes |
Unit |
an empty 200 |
| anything else | a JSON body |
Table of Contents
- /indexer (IIndexer)
- /album (IAlbumService)
- /animatedImage (IAnimatedImageService)
- /apiKey (IApiKeyService)
- /artist (IArtistService)
- /audioAnalysis (IAudioAnalysisService)
- /auth (IAuthService)
- /backup (IBackupService)
- /change (IChangeService)
- /chart (IChartService)
- /clientRequest (IClientRequestService)
- /clientSettings (IClientSettingsService)
- /collection (ICollectionService)
- /coverGeneration (ICoverGenerationService)
- /customAudio (ICustomAudioService)
- /dbManagement (IDbManagementService)
- /discovery (IDiscoveryService)
- /entityChange (IEntityChangeService)
- /favSync (IFavSyncService)
- /handshake (IHandshakeService)
- /hue (IHueService)
- /image (IImageService)
- /listenBackup (IListenBackupService)
- /listenBrainz (IListenBrainzService)
- /listeningStats (IListeningStatsService)
- /lyricsCandidate (ILyricsCandidateService)
- /lyricsSearch (ILyricsSearch)
- /lyrics (ILyricsService)
- /mirror (IMirrorService)
- /playback (IPlaybackService)
- /playlist (IPlaylistService)
- /podcast (IPodcastService)
- /queue (IQueueService)
- /radioChannel (IRadioChannelService)
- /radio (IRadioService)
- /recommendation (IRecommendationService)
- /release (IReleaseService)
- /remoteControl (IRemoteControlService)
- /remoteMirror (IRemoteMirrorService)
- /rpcMetrics (IRpcMetricsService)
- /scheduledTaskConfiguration (IScheduledTaskConfigurationService)
- /scheduledTaskLog (IScheduledTaskLogService)
- /scrobble (IScrobbleService)
- /serverStats (IServerStatsService)
- /session (ISessionService)
- /song (ISongService)
- /storage (IStorageService)
- /subsonicCredential (ISubsonicCredentialService)
- /timecodeTag (ITimecodeTagService)
- /ui (IUiService)
- /userPlaylistBackup (IUserPlaylistBackupService)
- /userPlaylist (IUserPlaylistService)
- /user (IUserService)
- /import (IImportService)
- /linkResolver (ILinkResolverService)
- /metadata (IMetadataService)
- /musicBrainz (IMusicBrainzService)
/indexer — IIndexer
Local file system media scanning.
RPC reference: IIndexer
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /indexer/start |
- | SSE String |
JWT + Admin | Start indexing files in the media library and stream progress updates. (start) |
/album — IAlbumService
Manages albums and their metadata.
RPC reference: IAlbumService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| PUT | /album/album |
album (body, Album): The album object with updated fields. |
JSON Album? | JWT + EDIT | Update album metadata. (updateAlbum) |
| DELETE | /album/albums |
ids (query, repeated, List<PlatformUUID>): Collection of album IDs to delete. |
JSON Boolean |
JWT + DELETE | Delete multiple albums from the library. (deleteAlbums) |
| GET | /album/allAlbums |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.explicit (query, Boolean?, optional): True prefers the explicit edition as the main one when an album exists in an explicit and a clean edition. False prefers the clean one. When it is not given, the explicit edition is preferred. |
JSON PaginatedResponse<Album> | JWT | Get all albums in the library, grouped into editions. Each entry is the main edition of an album and carries the other editions in versions. (allAlbums) |
| GET | /album/byArtist/{artistId} |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.artistId (path, PlatformUUID): The artist unique identifier.singles (query, Boolean, optional): Whether to include singles.explicit (query, Boolean?, optional): True prefers the explicit edition as the main one when an album exists in an explicit and a clean edition. False prefers the clean one. When it is not given, the explicit edition is preferred. |
JSON PaginatedResponse<Album> | JWT | List albums by artist, grouped into editions. Each entry is the main edition of an album and carries the other editions in versions. (byArtist) |
| GET | /album/byColor |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.color (query, Int): The target color in ARGB format.range (query, Int, optional): The allowed range (0-255). |
JSON PaginatedResponse<Album> | JWT | Search for albums by color. (byColor) |
| GET | /album/byId/{id} |
id (path, PlatformUUID): The album unique identifier. |
JSON Album? | JWT | Get album by ID. (byId) |
| GET | /album/byIds |
ids (query, repeated, List<PlatformUUID>): Collection of album IDs. |
JSON List<Album> |
JWT | Get multiple albums by their IDs. (byIds) |
| GET | /album/byMusicBrainzId/{mbId} |
mbId (path, PlatformUUID): The MusicBrainz release (or release-group) UUID. |
JSON List<Album> |
JWT | Get album by MusicBrainz ID. (byMusicBrainzId) |
| GET | /album/byMusicBrainzIds |
mbIds (query, repeated, List<PlatformUUID>): Collection of MusicBrainz release (or release-group) UUIDs. |
JSON List<Album?> |
JWT | Get multiple albums by their MusicBrainz IDs. (byMusicBrainzIds) |
| GET | /album/byName |
page (query, Int, optional): Page index (starting from 0).pageSize (query, Int, optional): Number of items per page.name (query, String): The album name to search for. |
JSON PaginatedResponse<Album> | JWT | Search albums by name. (byName) |
| GET | /album/byOriginalIds |
ids (query, repeated, Collection<PrefixedId>): Collection of original platform-specific album identifiers. |
JSON List<Album> |
JWT | Find albums by their original platform-specific unique identifiers. (byOriginalIds) |
| GET | /album/byOriginalUrls |
urls (query, repeated, Collection<String>): Collection of original platform URLs. |
JSON Map<String, Album?> |
JWT | Find albums by their original platform URLs, returning a mapping. (byOriginalUrls) |
| GET | /album/byVersionGroup/{versionGroupId} |
versionGroupId (path, PlatformUUID): The version group unique identifier, as carried by versionGroupId on an album.explicit (query, Boolean, optional): True prefers the explicit edition as the main one when an album exists in an explicit and a clean edition. False prefers the clean one. |
JSON List<Album> |
JWT | List all albums of a version group, main edition first. The albums come back as a flat list and their versions lists are empty. (byVersionGroup) |
| GET | /album/extendedMetadata/{id} |
id (path, PlatformUUID): The album unique identifier. |
JSON AlbumExtendedMetadata? | JWT | Get extended metadata for an album. (extendedMetadata) |
| POST | /album/musicBrainzId/{id} |
id (path, PlatformUUID): The album unique identifier. |
JSON Album? | JWT + EDIT | Fetch and link MusicBrainz ID for an album. (fetchMusicBrainzId) |
| PUT | /album/musicBrainzId/{id} |
id (path, PlatformUUID): The album unique identifier.musicBrainzId (query, PlatformUUID?, optional): The MusicBrainz Release UUID. |
JSON Album? | JWT + EDIT | Manually set MusicBrainz ID for an album. (setMusicBrainzId) |
| GET | /album/search |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.query (query, String): The search query. |
JSON PaginatedResponse<Album> | JWT | Ranked album search. (rankedSearch) |
| GET | /album/versions/{id} |
id (path, PlatformUUID): The album unique identifier. |
JSON List<Album> |
JWT | List the other editions of an album, main edition first. (versions) |
/animatedImage — IAnimatedImageService
Management of animated cover files (short looping videos).
RPC reference: IAnimatedImageService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /animatedImage/animatedImage |
bytes (body, ByteArray): The raw binary data of the animated image.origin (query, String, optional): The source or category of the animated image. |
JSON PlatformUUID |
JWT | Store a new animated image on the server. (createAnimatedImage) |
| POST | /animatedImage/batch |
images (body, List<InsertableAnimatedImage>): Collection of animated images to store. |
JSON Map<String, PlatformUUID> |
JWT | Store multiple animated images on the server in a single operation. (createBatch) |
| GET | /animatedImage/byHash |
hash (query, String): The unique hash of the animated image. |
JSON AnimatedImage? | JWT | Find animated image metadata by its content hash. (byHash) |
| GET | /animatedImage/byId/{id} |
id (path, PlatformUUID): The animated image unique identifier. |
JSON AnimatedImage? | JWT | Get animated image metadata by its unique ID. (byId) |
| GET | /animatedImage/coverHashes |
hashes (query, repeated, List<String>): Collection of animated image hashes. |
JSON Map<String, PlatformUUID> |
JWT | Map a list of animated image hashes to their existing internal UUIDs. (getCoverHashes) |
| GET | /animatedImage/imageData/{id} |
id (path, PlatformUUID): The animated image unique identifier. |
BYTES | public | Retrieve the raw binary data of an animated image. (getAnimatedImageData) |
/apiKey — IApiKeyService
Manages long-lived API keys for authenticating non-interactive clients (e.g. media players).
RPC reference: IApiKeyService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /apiKey/apiKey |
label (query, String): Human-readable label describing where the key will be used.scopes (query, repeated, List<String>): Identifiers of the scopes to grant to the key. Must be registered scopes. |
JSON String |
JWT | Create a new API key and return the raw secret. (createApiKey) |
| GET | /apiKey/apiKeyString/{id} |
id (path, PlatformUUID): The API key unique identifier. |
JSON String? |
JWT | Get the raw secret of one of the current user's API keys. Returns null for keys created before secrets were stored. (getApiKeyString) |
| GET | /apiKey/apiKeys |
- | JSON List<ApiKeyInfo> |
JWT | List metadata for all API keys belonging to the current user. Never returns the secrets. (listApiKeys) |
| GET | /apiKey/availableScopes |
- | JSON List<ApiKeyScopeInfo> |
JWT | List all scopes that can be granted to API keys. (listAvailableScopes) |
| POST | /apiKey/revokeApiKey/{id} |
id (path, PlatformUUID): The API key unique identifier. |
JSON Boolean |
JWT | Revoke an API key by its identifier. Returns true if a key was revoked. (revokeApiKey) |
/artist — IArtistService
Manages artist data and complex library maintenance.
RPC reference: IArtistService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| DELETE | /artist/alias/{artistId} |
artistId (path, PlatformUUID): The artist unique identifier.name (query, String): The alternative name. |
JSON Boolean |
JWT + EDIT | Remove an alias from an artist. (removeAlias) |
| POST | /artist/alias/{artistId} |
artistId (path, PlatformUUID): The artist unique identifier.name (query, String): The alternative name. |
JSON Boolean |
JWT + EDIT | Add an alias to an artist. (addAlias) |
| GET | /artist/aliases/{id} |
id (path, PlatformUUID): The artist unique identifier. |
JSON List<ArtistAlias> |
JWT | List aliases for an artist. (aliases) |
| GET | /artist/allArtists |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page. |
JSON PaginatedResponse<Artist> | JWT | Get all artists in the library, ordered by name without regard to case, artists with the same name by ID. (allArtists) |
| POST | /artist/artist |
name (query, String): Name of the artist.isGroup (query, Boolean, optional): Whether the artist is a group.about (query, String, optional): Optional biography or description.musicBrainzId (query, PlatformUUID?, optional): Optional MusicBrainz ID. |
JSON Artist | JWT + EDIT | Manually create an artist record. (createArtist) |
| GET | /artist/artistIdsWithoutMusicBrainzId |
- | SSE PlatformUUID |
JWT | Stream IDs of all artists that are missing a MusicBrainz ID. (artistIdsWithoutMusicBrainzId) |
| PUT | /artist/artistImageByUrl/{id} |
id (path, PlatformUUID): The artist unique identifier.url (query, String): The direct image URL. |
JSON Artist? | JWT + EDIT | Set an artist's image from a direct URL. (setArtistImageByUrl) |
| GET | /artist/artistOnMusicBrainz |
query (query, String): The search query.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page. |
JSON PaginatedResponse<MusicBrainzArtist> |
JWT | Search for an artist directly on MusicBrainz. (searchArtistOnMusicBrainz) |
| GET | /artist/artistsWithoutMusicBrainzId |
- | SSE Artist | JWT | Stream all artists that are missing a MusicBrainz ID. (artistsWithoutMusicBrainzId) |
| GET | /artist/byColor |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.color (query, Int): The target color in ARGB format.range (query, Int, optional): The allowed range (0-255). |
JSON PaginatedResponse<Artist> | JWT | Search for artists by color. (byColor) |
| GET | /artist/byGroup/{groupId} |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.groupId (path, PlatformUUID): The group artist unique identifier. |
JSON PaginatedResponse<Artist> | JWT | List artists in a group, ordered by name without regard to case, artists with the same name by ID. (byGroup) |
| GET | /artist/byId/{id} |
id (path, PlatformUUID): The artist unique identifier. |
JSON Artist? | JWT | Get artist by ID. (byId) |
| GET | /artist/byIds |
ids (query, repeated, List<PlatformUUID>): Collection of artist IDs. |
JSON List<Artist> |
JWT | Get multiple artists by their IDs. (byIds) |
| GET | /artist/byMusicBrainzId/{mbId} |
mbId (path, PlatformUUID): The MusicBrainz artist UUID. |
JSON List<Artist> |
JWT | Get artist by MusicBrainz ID. (byMusicBrainzId) |
| PUT | /artist/group/{id} |
id (path, PlatformUUID): The group artist unique identifier.artistIds (query, repeated, List<PlatformUUID>?, optional): Optional collection of sub-artist IDs. |
JSON Artist? | JWT + EDIT | Set sub-artists for a group. (setGroup) |
| POST | /artist/mergeArtists |
mergeArtists (body, MergeArtists): Configuration for merging artists. |
JSON Artist? | JWT + EDIT | Merge multiple artist records into one. (mergeArtists) |
| POST | /artist/musicBrainzId/{id} |
id (path, PlatformUUID): The artist unique identifier. |
JSON Artist? | JWT + EDIT | Fetch and link MusicBrainz ID for an artist. (fetchMusicBrainzId) |
| PUT | /artist/musicBrainzId/{id} |
id (path, PlatformUUID): The artist unique identifier.musicBrainzId (query, PlatformUUID?, optional): The MusicBrainz ID to link. |
JSON Artist? | JWT + EDIT | Link an artist record to a MusicBrainz ID. (setMusicBrainzId) |
| GET | /artist/search |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.query (query, String): The search query. |
JSON PaginatedResponse<Artist> | JWT | Ranked artist search. (rankedSearch) |
| POST | /artist/splitArtist |
splitArtist (body, SplitArtist): Configuration for splitting an artist. |
JSON List<Artist> |
JWT + EDIT | Split an artist record into multiple artists. (splitArtist) |
| GET | /artist/topSongs/{artistId} |
artistId (path, PlatformUUID): The artist unique identifier.limit (query, Int, optional): Maximum number of songs. Clamped to 1..100.order (query, ArtistTopSongOrder, optional): How the songs are ranked. |
JSON List<ArtistTopSong> |
JWT | List the artist's library songs ranked by popularity. The list holds the artist's most listened songs across all listeners and the artist's songs the current user has listened to. (topSongs) |
| GET | /artist/{type}/artistImages |
type (path, MetadataType): The metadata provider to use.query (query, String): The artist name to search for.limit (query, Int, optional): Maximum number of images to return. |
JSON List<Image> |
JWT | Search for artist images using a metadata provider. (searchArtistImages) |
/audioAnalysis — IAudioAnalysisService
Service for audio analysis and related data management.
RPC reference: IAudioAnalysisService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /audioAnalysis/analyzeSong/{songId} |
songId (path, PlatformUUID): The song unique identifier. |
- | JWT | Trigger analysis for a song. (analyzeSong) |
| GET | /audioAnalysis/audioData/{songId} |
songId (path, PlatformUUID): The song unique identifier. |
JSON SongAudioData? | JWT | Get audio analysis data for a song. (getAudioData) |
| GET | /audioAnalysis/audioTimeline/{songId} |
songId (path, PlatformUUID): The song unique identifier. |
JSON SongAudioTimeline? | JWT | Get the beat grid and loudness envelope of a song, or null when not extracted yet. Call analyzeSong to extract it. (getAudioTimeline) |
/auth — IAuthService
Handles user login and session security.
RPC reference: IAuthService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /auth/authenticate |
username (query, String): The username of the user.password (query, String): The password of the user. |
JSON AuthenticationResponse | public | Logs in a user and returns JWT token. (authenticate) |
| POST | /auth/deviceSession |
userAgent (query, String): The user agent of the device the session is created for. |
JSON AuthenticationResponse | public | Creates a new session for another device (e.g. Apple TV) on behalf of the authenticated user. (createDeviceSession) |
| POST | /auth/refreshToken |
refreshToken (query, String): The refresh token. |
JSON AuthenticationResponse | public | Refreshes an expired access token. (refreshToken) |
/backup — IBackupService
System-wide data persistence and disaster recovery.
RPC reference: IBackupService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| DELETE | /backup/backup |
fileName (query, String): The name of the backup file. |
- | JWT + Admin | Delete a system backup file from the server. (deleteBackup) |
| POST | /backup/backup |
- | JSON BackupResult | JWT + Admin | Trigger the creation of a full system backup. (createBackup) |
| GET | /backup/backups |
- | JSON List<BackupInfo> |
JWT + Admin | List all available system backup files. (listBackups) |
| POST | /backup/restoreBackup |
fileName (query, String): The name of the backup file. |
- | JWT + Admin | Restore the entire server state from a backup file. (loadBackup) |
/change — IChangeService
Tells a client which parts of the user's state changed, so it reads them again with the regular getters instead of polling or keeping one stream open per screen.
RPC reference: IChangeService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /change/observeChanges |
- | SSE Change | JWT | Watch the state of the user for changes. The stream stays silent until something changes and then emits the ChangeTopic that changed, which names the getter to call again. Bursts of changes to the same topic within a short window arrive as a single change. Nothing is replayed, so a client reads the current state after every (re)subscribe. (observeChanges) |
/chart — IChartService
Charts of popular music.
RPC reference: IChartService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /chart/appleChart |
country (query, String): Two-letter country code, for example us or de.kind (query, AppleChartKind): Whether to get the song chart or the album chart.limit (query, Int, optional): Maximum number of entries. Clamped to 1..100. |
JSON AppleChart | JWT | Get the current Apple Music chart of the most played songs or albums in a country. Every chart entry is returned, entries that are in the library carry the library song or album. (appleChart) |
/clientRequest — IClientRequestService
The connection a client keeps open to the server for the lifetime of the app. It carries the tasks the server asks the calling client to perform, which the client performs through the regular RPC services and reports back so the device that asked for it is unblocked, and it doubles as the presence of the client: a session that connects with a description is listed as an online device of the user, with the cross-device features it offers, for exactly as long as it keeps the stream open.
RPC reference: IClientRequestService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /clientRequest/complete/{requestId} |
requestId (path, PlatformUUID): The identifier of the request that was handled.status (query, ClientRequestStatus): Whether the request was performed or declined. |
- | JWT | Report the outcome of a request to the waiting requester. Only COMPLETED and REJECTED are accepted. The timed out and unreachable outcomes are determined by the server. (complete) |
| GET | /clientRequest/connect |
description (query, JSON, ClientDescription): How this client is listed on the other devices of the user and what it can do. |
SSE ClientRequest | JWT | Watch for requests addressed to the calling session and be listed as an online device of the user while the stream is open. The description is kept only for the duration of the stream, so a client that changes its name or its capabilities subscribes again. Requests that need a capability are only delivered to sessions that connected offering it. (connect) |
| GET | /clientRequest/observeRequests |
- | SSE ClientRequest | JWT | Watch for requests addressed to the calling session without announcing the device. A session that is not subscribed is reported as unreachable to the requester. (observeRequests) |
| GET | /clientRequest/onlineDevices |
- | JSON List<OnlineDevice> |
JWT | List the devices of the user that are connected right now, newest connection first. Sessions that only observe requests without a description are not listed. (getOnlineDevices) |
/clientSettings — IClientSettingsService
Stores the settings of the clients of a user as opaque key/value entries, where the value is an arbitrary JSON document in text form and the server never interprets what a setting means. Entries live either in the synced scope, which is shared by all devices of the user, or in the device scope of a single device, and the client decides per key which one it uses. Each scope carries a monotonically increasing version that every accepted write advances by one, and every entry remembers the version it was written at, so clients detect concurrent changes and can catch up incrementally instead of reading everything again.
RPC reference: IClientSettingsService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /clientSettings/changes |
scope (query, ClientSettingScope): The scope to read.sinceVersion (query, Long): The version the client is already up to date with. Entries written at a later version are returned.device (query, String?, optional): The device to read in the device scope. Required for the device scope and ignored in the synced scope.limit (query, Int, optional): Maximum number of entries to return. |
JSON ClientSettingsChanges | JWT | Read the entries a scope changed after a version the client already knows, tombstones included and ordered by the version they were written at. When more entries are available than the page holds, the client asks again with the version of the last entry it received. If tombstones the client never saw were already purged, the result asks for a full resync and the client re-reads the whole scope instead. (getChanges) |
| DELETE | /clientSettings/device/{deviceId} |
deviceId (path, String): The identifier of the device to forget. |
- | JWT | Forget a device together with its device-scoped settings and their history. The synced scope is not touched, so the other devices of the user keep their shared settings. (deleteDevice) |
| GET | /clientSettings/devices |
- | JSON List<ClientDevice> |
JWT | List the devices of the user that stored settings on the server, each with the current version of its device scope. (getDevices) |
| GET | /clientSettings/history |
scope (query, ClientSettingScope): The scope the key belongs to.key (query, String): The key to read the previous values of.device (query, String?, optional): The device to read in the device scope. Required for the device scope and ignored in the synced scope.limit (query, Int, optional): Maximum number of previous values to return. |
JSON List<ClientSetting> |
JWT | Read the previous values of a single key, newest first. The server keeps a bounded number of superseded values per key, so older values are dropped as new ones are written. (getHistory) |
| GET | /clientSettings/observeSettings |
- | SSE ClientSettingsChange | JWT | Watch the settings of the user for changes. Every accepted write emits the scope it changed, the version it advanced to and the keys it touched, including writes made by other devices, so a client pulls only what it needs. (observeSettings) |
| POST | /clientSettings/registerDevice/{deviceId} |
deviceId (path, String): The stable identifier the client chose for this device.name (query, String, optional): Human readable name of this device.platform (query, String, optional): Platform of this device, for example the operating system it runs on. |
JSON ClientDevice | JWT | Register a device or refresh the name and platform it is listed under. Calling this is optional, since reading or writing the device scope registers the device on its own, but it lets a client give its device a readable name before it stores anything. (registerDevice) |
| POST | /clientSettings/restore |
scope (query, ClientSettingScope): The scope the key belongs to.key (query, String): The key to restore.version (query, Long): The version of the historic value to write back.device (query, String?, optional): The device to write in the device scope. Required for the device scope and in the synced scope only recorded as the writer.force (query, Boolean, optional): Whether to apply the value even if the server moved past the version the entry currently has. |
JSON ClientSettingsWriteResult | JWT | Write a previous value of a key back as a new version. The value is taken from the history of the key and stored through the normal write path, so the scope advances by one and the value that was replaced moves into the history itself. The call fails if the requested version is not kept in the history any more. (restore) |
| GET | /clientSettings/settings |
scope (query, ClientSettingScope): The scope to read.device (query, String?, optional): The device to read in the device scope. Required for the device scope and ignored in the synced scope.includeDeleted (query, Boolean, optional): Whether the tombstones of deleted keys are returned as well. |
JSON List<ClientSetting> |
JWT | Read the entries of a scope. Tombstones of deleted keys are left out unless they are asked for explicitly. Reading the device scope registers the device or refreshes its last seen time. (getSettings) |
| PUT | /clientSettings/settings |
entries (body, List<ClientSettingWrite>): The entries to write, each with the version the client based its change on.scope (query, ClientSettingScope): The scope to write to.device (query, String?, optional): The writing device. Required for the device scope, and in the synced scope only recorded as the writer of the entries.force (query, Boolean, optional): Whether to apply the entries even if the server moved past the base versions supplied. |
JSON ClientSettingsWriteResult | JWT | Write a batch of entries into a scope. The batch is all-or-nothing: an entry is accepted only if its base version matches the version the stored entry was last written at, or is 0 for a key that does not exist or is only a tombstone, and as soon as one key conflicts nothing is written at all. Forcing the write skips that check. An entry with a null value deletes its key and leaves a tombstone behind so other devices learn about the deletion. Writing the device scope registers the device or refreshes its last seen time, while the device of a synced write is optional and only recorded as the writer. (setSettings) |
| GET | /clientSettings/snapshot/{deviceId} |
deviceId (path, String): The stable identifier the client chose for this device. |
JSON ClientSettingsSnapshot | JWT | Read the complete settings of a device in one call: the live entries of the synced scope and of the device scope with the current version of each. Reading a snapshot registers the device or refreshes its last seen time, so this is what a client calls right after it starts. (getSnapshot) |
/collection — ICollectionService
Management of user-owned downloadable collections.
RPC reference: ICollectionService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /collection/albumIds/{collectionId} |
collectionId (path, PlatformUUID): The collection unique identifier. |
SSE PlatformUUID |
JWT | Stream the IDs of albums explicitly added to a collection. (albumIds) |
| GET | /collection/allCollections |
- | JSON List<MediaCollection> |
JWT | Get all collections owned by the current user. (allCollections) |
| GET | /collection/artistIds/{collectionId} |
collectionId (path, PlatformUUID): The collection unique identifier. |
SSE PlatformUUID |
JWT | Stream the IDs of artists explicitly added to a collection. (artistIds) |
| GET | /collection/byId/{id} |
id (path, PlatformUUID): The collection unique identifier. |
JSON MediaCollection? | JWT | Get a collection by ID. (byId) |
| POST | /collection/collection |
collection (body, InsertableCollection): The initial collection data. |
JSON PlatformUUID |
JWT | Create a new collection owned by the current user. (createCollection) |
| DELETE | /collection/collection/{id} |
id (path, PlatformUUID): The collection unique identifier. |
JSON Boolean |
JWT | Delete a collection. (delete) |
| PUT | /collection/collection/{id} |
id (path, PlatformUUID): The collection unique identifier.collection (body, InsertableCollection): The new metadata. |
JSON Boolean |
JWT | Update a collection's metadata (name, description, image). (updateCollection) |
| PUT | /collection/collectionImage/{id} |
id (path, PlatformUUID): The collection unique identifier.imageId (query, PlatformUUID?, optional): The image unique identifier. |
JSON Boolean |
JWT | Set the cover image of a collection. (setCollectionImage) |
| DELETE | /collection/item/{id} |
id (path, PlatformUUID): The collection unique identifier.itemType (query, CollectionItemType): The kind of referenced entity.itemId (query, PlatformUUID): The referenced entity unique identifier. |
JSON Boolean |
JWT | Remove an item from a collection. (removeItem) |
| POST | /collection/item/{id} |
id (path, PlatformUUID): The collection unique identifier.itemType (query, CollectionItemType): The kind of referenced entity.itemId (query, PlatformUUID): The referenced entity unique identifier. |
JSON Boolean |
JWT | Add an item (song, album, artist or playlist) to a collection. (addItem) |
| GET | /collection/playlistIds/{collectionId} |
collectionId (path, PlatformUUID): The collection unique identifier. |
SSE PlatformUUID |
JWT | Stream the IDs of playlists explicitly added to a collection. (playlistIds) |
| GET | /collection/search/{collectionId} |
collectionId (path, PlatformUUID): The collection unique identifier.query (query, String): The search query.explicit (query, Boolean, optional): Whether to include explicit-content songs.page (query, Int, optional): The page index (starting from 0).pageSize (query, Int, optional): Items per page, applied per result type. |
JSON CollectionSearchResults | JWT | Ranked search within a single collection across songs, artists, albums and playlists. (rankedSearch) |
| GET | /collection/songIds/{collectionId} |
collectionId (path, PlatformUUID): The collection unique identifier. |
SSE PlatformUUID |
JWT | Stream the IDs of songs explicitly added to a collection. (songIds) |
/coverGeneration — ICoverGenerationService
Generates cover images for user playlists and collections from their content, asset packs and palette.
RPC reference: ICoverGenerationService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /coverGeneration/applyCover |
target (body, CoverTarget): The playlist or collection.params (body, CoverGenerationParams, optional): Generation parameters. |
JSON PlatformUUID |
JWT | Render, persist and set the cover, marking it as generated. Returns the new image id. Only the owner or an admin may call this. (applyCover) |
| GET | /coverGeneration/coverInfo |
target (query, JSON, CoverTarget): The playlist or collection. |
JSON CoverInfo | JWT | The current cover state of a playlist or collection. (coverInfo) |
| POST | /coverGeneration/generateMissing |
params (body, CoverGenerationParams, optional): Generation parameters applied to every item. |
JSON PlatformUUID |
JWT | Queue generation for every playlist and collection of the current user without a cover. Returns the job id. (generateMissing) |
| GET | /coverGeneration/options |
- | JSON CoverGenerationOptions | JWT | Styles and asset packs available to the current user. (options) |
| POST | /coverGeneration/previewCoverImage |
target (body, CoverTarget): The playlist or collection.params (body, CoverGenerationParams, optional): Generation parameters. |
BYTES | JWT | Render a 1024x1024 JPEG preview without persisting it. Only the owner or an admin may call this. (previewCoverImage) |
| POST | /coverGeneration/resetCover |
target (body, CoverTarget): The playlist or collection. |
JSON Boolean |
JWT | Clear a user-set cover so automatic generation may replace it. Returns false when there was nothing to reset. (resetCover) |
/customAudio — ICustomAudioService
Handles manual audio uploads.
RPC reference: ICustomAudioService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /customAudio/uploadCustomAudio |
fileData (body, ByteArray): The raw bytes of the audio file.fileName (query, String): The original name of the file.metadata (body, CustomMetadata?, optional): Optional metadata associated with the audio. |
JSON PlatformUUID? |
JWT + EDIT | Upload a custom audio file and its metadata. (uploadCustomAudio) |
/dbManagement — IDbManagementService
Direct database management and data migration.
RPC reference: IDbManagementService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /dbManagement/exportData |
- | BYTES | JWT + Admin | Export the entire system database as a binary blob. (exportData) |
| POST | /dbManagement/importData |
data (body, ByteArray): The raw database blob. |
- | JWT + Admin | Import a previously exported database blob to overwrite the current state. (importData) |
/discovery — IDiscoveryService
Service for content discovery and song recommendations.
RPC reference: IDiscoveryService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /discovery/albumMosaic |
image (body, ByteArray): The source image data.width (query, Int): Target grid width.height (query, Int): Target grid height.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.range (query, Int, optional): Search range for colors (0-255). |
JSON PaginatedResponse<Album> | JWT | Create a mosaic of albums matching the colors of an image. (createAlbumMosaic) |
| GET | /discovery/similarSongs |
seedSongIds (query, repeated, List<PlatformUUID>): List of song unique identifiers to use as a seed.limit (query, Int, optional): The maximum number of results to return. |
JSON List<UserSong> |
JWT | Get songs similar to the provided seed tracks. (getSimilarSongs) |
| GET | /discovery/similarSongsByBpm |
seedSongIds (query, repeated, List<PlatformUUID>): List of song unique identifiers to use as a seed.limit (query, Int, optional): The maximum number of results to return. |
JSON List<UserSong> |
JWT | Get songs with similar BPM to the provided seed tracks. (getSimilarSongsByBpm) |
| GET | /discovery/similarSongsByEnergy |
seedSongIds (query, repeated, List<PlatformUUID>): List of song unique identifiers to use as a seed.limit (query, Int, optional): The maximum number of results to return. |
JSON List<UserSong> |
JWT | Get songs with similar energy to the provided seed tracks. (getSimilarSongsByEnergy) |
| GET | /discovery/similarSongsByMood |
seedSongIds (query, repeated, List<PlatformUUID>): List of song unique identifiers to use as a seed.limit (query, Int, optional): The maximum number of results to return. |
JSON List<UserSong> |
JWT | Get songs with similar mood (valence) to the provided seed tracks. (getSimilarSongsByMood) |
| GET | /discovery/similarSongsByPlaylist/{playlistId} |
playlistId (path, PlatformUUID): The user playlist unique identifier to use as a seed.limit (query, Int, optional): The maximum number of results to return. |
JSON List<UserSong> |
JWT | Get songs similar to the songs in the provided user playlist. (getSimilarSongsByPlaylist) |
| POST | /discovery/songMosaic |
image (body, ByteArray): The source image data.width (query, Int): Target grid width.height (query, Int): Target grid height.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.range (query, Int, optional): Search range for colors (0-255). |
JSON PaginatedResponse<UserSong> | JWT | Create a mosaic of songs matching the colors of an image. (createSongMosaic) |
| GET | /discovery/songsBySameComposers |
seedSongIds (query, repeated, List<PlatformUUID>): List of song unique identifiers to use as a seed.limit (query, Int, optional): The maximum number of results to return. |
JSON List<UserSong> |
JWT | Get songs by the same composers as the provided seed tracks. (getSongsBySameComposers) |
| GET | /discovery/songsBySameLyricists |
seedSongIds (query, repeated, List<PlatformUUID>): List of song unique identifiers to use as a seed.limit (query, Int, optional): The maximum number of results to return. |
JSON List<UserSong> |
JWT | Get songs by the same lyricists as the provided seed tracks. (getSongsBySameLyricists) |
| GET | /discovery/songsBySameProducers |
seedSongIds (query, repeated, List<PlatformUUID>): List of song unique identifiers to use as a seed.limit (query, Int, optional): The maximum number of results to return. |
JSON List<UserSong> |
JWT | Get songs by the same producers as the provided seed tracks. (getSongsBySameProducers) |
/entityChange — IEntityChangeService
Answers which library entities changed since a time the client names, so a client that keeps library data reads only those again instead of everything. It is a pull the client starts and not a subscription. Every returned stream delivers the changes recorded so far and then completes, nothing is emitted afterwards. The live notifications are IChangeService.observeChanges. A result contains library changes plus the caller's own LIKE and TIMECODES changes, ordered by time. A filtered pull returns the changes of every object a client gets when it loads that artist, album, playlist or collection, including objects nested in others, such as the artists and the album of a song, the artists of an album and the member artists of an artist that is a group. A change is recorded once for the entity it happened to, so an object nested in several others is reported once as itself, and a client updates the copies it holds by id. A client calls IEntityChangeService.getWindow first, pulls with the time it kept from its last pull and keeps the new one for the next.
RPC reference: IEntityChangeService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /entityChange/allChanges |
since (query, Long): The time to read from (epoch milliseconds). Entries changed at or after it are returned. |
SSE EntityChange | JWT | Stream every recorded change since a time, ordered by time. The stream completes after the last entry. (allChanges) |
| GET | /entityChange/byAlbum/{albumId} |
albumId (path, PlatformUUID): The album unique identifier.since (query, Long): The time to read from (epoch milliseconds). Entries changed at or after it are returned. |
SSE EntityChange | JWT | Stream the recorded changes of everything a client gets when it loads an album since a time, ordered by time. These are the changes of the album itself, of its artists, of its songs, deleted ones included, of every artist credited on those songs, and of the member artists of credited groups. The caller's LIKE changes of the album, these songs and these artists and its TIMECODES changes of these songs are part of it. The stream completes after the last entry. (byAlbum) |
| GET | /entityChange/byArtist/{artistId} |
artistId (path, PlatformUUID): The artist unique identifier.since (query, Long): The time to read from (epoch milliseconds). Entries changed at or after it are returned. |
SSE EntityChange | JWT | Stream the recorded changes of everything a client gets when it loads an artist since a time, ordered by time. These are the changes of the artist itself, of its member artists when it is a group, of its albums and songs, deleted ones included, of the albums of those songs, of every artist credited on those albums and songs, and of the member artists of credited groups. The caller's LIKE changes of these songs, albums and artists and its TIMECODES changes of these songs are part of it. The stream completes after the last entry. (byArtist) |
| GET | /entityChange/byCollection/{collectionId} |
collectionId (path, PlatformUUID): The collection unique identifier.since (query, Long): The time to read from (epoch milliseconds). Entries changed at or after it are returned. |
SSE EntityChange | JWT | Stream the recorded changes of everything a client gets when it loads a collection since a time, ordered by time. These are the changes of the collection itself and of its direct members, which are songs, albums, artists and user playlists. The members are expanded to what they contain. A member album brings its songs, a member artist brings its albums, its songs and the songs of those albums, and a member playlist brings the songs it contains now. For every song reached that way the changes of its album and of its credited artists are returned as well, for every album those of its artists, and for every such artist that is a group those of its member artists. The caller's LIKE changes of these songs, albums and artists and its TIMECODES changes of these songs are part of it. The stream completes after the last entry. (byCollection) |
| GET | /entityChange/byPlaylist/{playlistId} |
playlistId (path, PlatformUUID): The unique identifier of the user playlist or global playlist.since (query, Long): The time to read from (epoch milliseconds). Entries changed at or after it are returned. |
SSE EntityChange | JWT | Stream the recorded changes of everything a client gets when it loads a playlist since a time, ordered by time. These are the changes of the playlist itself, its contents changing included, of the songs it contains now, of the albums of those songs, of every artist credited on those songs and albums, and of the member artists of credited groups. The caller's LIKE changes of these songs, albums and artists and its TIMECODES changes of these songs are part of it. It works for user playlists and global playlists alike. The stream completes after the last entry. (byPlaylist) |
| GET | /entityChange/window |
- | JSON EntityChangeWindow | JWT | Read the time frame around a pull. The client keeps serverTime as the since of its next pull and compares the since it is about to use with availableSince. If that since lies before availableSince the recorded changes no longer reach back far enough and the client reads everything again. (getWindow) |
/favSync — IFavSyncService
Tracks the history of favorite synchronization tasks.
RPC reference: IFavSyncService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /favSync/insertFavSync |
service (query, SyncServiceType): The service type.syncedAt (body, PlatformDate): The timestamp of synchronization. |
JSON Int |
JWT | Record a new successful synchronization timestamp. (insertFavSync) |
| GET | /favSync/latestFavSync |
service (query, SyncServiceType): The service type (e.g., TIDAL). |
JSON FavSync? | JWT | Get the timestamp of the last successful synchronization for a specific service. (getLatestFavSync) |
/handshake — IHandshakeService
Service for server reachability and handshake testing.
RPC reference: IHandshakeService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /handshake/handshake |
- | JSON HandshakeResponse | public | Perform a handshake test to check server reachability and protocol support. (handshake) |
/hue — IHueService
Philips Hue bridges paired by the current user and their light links, driven by now-playing changes.
RPC reference: IHueService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| DELETE | /hue/bridge/{bridgeId} |
bridgeId (path, PlatformUUID): Server-side bridge unique identifier. |
JSON Boolean |
JWT | Remove one of the current user's bridges together with the user's link to it. (removeBridge) |
| GET | /hue/bridges |
- | JSON List<HueBridgeInfo> |
JWT | Bridges paired by the current user. (listBridges) |
| GET | /hue/discoverBridges |
- | JSON List<HueBridgeCandidate> |
JWT | Discover Hue bridges on the local network via mDNS and the Hue cloud discovery endpoint. Paired is relative to the current user. (discoverBridges) |
| PUT | /hue/link |
link (body, HueUserLink): Link settings. bridgeId selects the bridge. |
JSON HueUserLink | JWT | Create or update the current user's link to a bridge. (setLink) |
| DELETE | /hue/link/{bridgeId} |
bridgeId (path, PlatformUUID): Server-side bridge unique identifier. |
JSON Boolean |
JWT | Remove the current user's link to a bridge. (removeLink) |
| GET | /hue/links |
- | JSON List<HueUserLink> |
JWT | The current user's light links. (getLinks) |
| GET | /hue/scenes/{bridgeId} |
bridgeId (path, PlatformUUID): Server-side bridge unique identifier. |
JSON List<HueScene> |
JWT | Scenes exposed by a bridge, each scoped to a room or zone that the bridge reports. (listScenes) |
| POST | /hue/startPairing |
ip (query, String): IP address of the bridge. |
SSE HuePairingStatus | JWT | Pair with a bridge. Press the link button on the bridge while this flow polls for up to 30 seconds. The bridge is stored for the current user. Other users pair it separately. (startPairing) |
| GET | /hue/status |
- | JSON HueStatus | JWT | Last command time, last error and current colors for the current user's links. (status) |
| GET | /hue/targets/{bridgeId} |
bridgeId (path, PlatformUUID): Server-side bridge unique identifier. |
JSON List<HueTarget> |
JWT | Lights, rooms and zones exposed by a bridge. (listTargets) |
| POST | /hue/test/{bridgeId} |
bridgeId (path, PlatformUUID): Server-side bridge unique identifier.targets (body, List<HueTarget>): Targets to test. |
JSON Boolean |
JWT | Flash the given targets with a test palette. (test) |
/image — IImageService
Management of image files for covers and profiles.
RPC reference: IImageService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /image/batch |
images (body, List<InsertableImage>): Collection of images to store. |
JSON Map<String, PlatformUUID> |
JWT | Store multiple images on the server in a single operation. (createBatch) |
| GET | /image/byHash |
hash (query, String): The unique hash of the image. |
JSON Image? | JWT | Find image metadata by its content hash. (byHash) |
| GET | /image/byId/{id} |
id (path, PlatformUUID): The image unique identifier. |
JSON Image? | JWT | Get image metadata by its unique ID. (byId) |
| GET | /image/coverHashes |
hashes (query, repeated, List<String>): Collection of image hashes. |
JSON Map<String, PlatformUUID> |
JWT | Map a list of image hashes to their existing internal UUIDs. (getCoverHashes) |
| POST | /image/generateMosaicImage |
image (body, ByteArray): The source image data.width (query, Int): Grid width (max width * height = 65,536).height (query, Int): Grid height (max width * height = 65,536).resultSize (query, Int, optional): The resolution of the resulting square image. |
SSE MosaicGenerationResponse | JWT | Generate a mosaic image from a source image where each pixel is replaced by a matching cover. (generateMosaicImage) |
| POST | /image/image |
bytes (body, ByteArray): The raw binary data of the image.origin (query, String, optional): The source or category of the image. |
JSON PlatformUUID |
JWT | Store a new image on the server. (createImage) |
| GET | /image/imageData/{id} |
id (path, PlatformUUID): The image unique identifier.size (query, Int, optional): Requested image size (width/height). 0 for original size. |
BYTES | public | Retrieve the raw binary data of an image. (getImageData) |
| POST | /image/moveImages |
oldPath (query, String): Path prefix to match.newPath (query, String): New base path. |
JSON Int |
JWT + Admin | Batch update image file paths. (moveImages) |
/listenBackup — IListenBackupService
Configure and control the backup of server-side listens to a remote listen-backup receiver.
RPC reference: IListenBackupService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| PUT | /listenBackup/config |
config (body, ListenBackupConfig): The new configuration. A null key keeps the stored key. |
JSON ListenBackupState | JWT + Admin | Update the backup configuration. (updateConfig) |
| GET | /listenBackup/observeState |
- | SSE ListenBackupState | JWT + Admin | Stream the backup state, re-emitting whenever the configuration or sync progress changes. (observeState) |
| POST | /listenBackup/resetCursor |
- | JSON ListenBackupState | JWT + Admin | Reset the sync cursor so the next run re-pushes every local listen. (resetCursor) |
| GET | /listenBackup/state |
- | JSON ListenBackupState | JWT + Admin | Get the current backup configuration and sync state. (getState) |
| POST | /listenBackup/syncNow |
- | JSON ListenBackupState | JWT + Admin | Run a backup sync now and return the resulting state. (syncNow) |
| POST | /listenBackup/testConnection |
config (body, ListenBackupConfig?, optional): Configuration to probe. Null uses the stored configuration. |
JSON ListenBackupConnectionTest | JWT + Admin | Probe a receiver. Uses the stored configuration when no config is given. (testConnection) |
/listenBrainz — IListenBrainzService
Manage the current user's ListenBrainz connection and listen-history sync.
RPC reference: IListenBrainzService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| DELETE | /listenBrainz/link |
- | - | JWT | Remove the current user's ListenBrainz link. (unlink) |
| POST | /listenBrainz/link |
username (query, String): The ListenBrainz username.token (query, String?, optional): Optional ListenBrainz user token, required for private listens. |
JSON ListenBrainzStatus | JWT | Link the current user to a ListenBrainz account and trigger an initial sync. (link) |
| GET | /listenBrainz/recentListens |
limit (query, Int): Maximum number of listens to return. Clamped to 1..1000. |
JSON List<ListenedSong> |
JWT | Return the current user's most recent listened songs (newest first), capped at 1000. (recentListens) |
| GET | /listenBrainz/status |
- | JSON ListenBrainzStatus? | JWT | Get the current user's ListenBrainz connection status, or null if not linked. (getStatus) |
| POST | /listenBrainz/syncNow |
- | JSON ListenBrainzStatus | JWT | Trigger an incremental sync of the current user's ListenBrainz listens now. (syncNow) |
/listeningStats — IListeningStatsService
Listening statistics over the current user's unified listen history (local scrobbles and ListenBrainz imports), deduplicated across sources.
RPC reference: IListeningStatsService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /listeningStats/linkUnmatchedTrack |
request (body, LinkUnmatchedTrackRequest): The unmatched track identity and the target library song. |
JSON LinkUnmatchedTrackResult | JWT | Link the current user's unmatched listens of a track to a library song, identified by recording MSID and/or MBID. The link persists, applies to future synced listens, and is submitted to ListenBrainz as a manual mapping when the song has a recording MBID. (linkUnmatchedTrack) |
| GET | /listeningStats/linkedListenGroups/{songId} |
songId (path, PlatformUUID): The library song. |
JSON List<LinkedListenGroup> |
JWT | List the groups of the current user's listens that are linked to a library song. Each group can be moved to another song with relinkSong. (getLinkedListenGroups) |
| POST | /listeningStats/relinkSong/{fromSongId} |
fromSongId (path, PlatformUUID): The library song the listens are linked to now.toSongId (query, PlatformUUID): The library song to link the listens to.groups (body, List<LinkedListenGroupKey>?, optional): The groups to move, as returned by getLinkedListenGroups. Null moves every group. |
JSON LinkUnmatchedTrackResult | JWT | Move the current user's listens from one library song to another, either all of them or only the given groups. The change persists for future listens of the moved groups, including local plays of the same song. It is submitted to ListenBrainz as a manual mapping when the target song has a recording MBID. (relinkSong) |
| GET | /listeningStats/stats |
range (query, StatsRange): The time range to aggregate.timezone (query, String): IANA timezone for range boundaries, e.g. Europe/Berlin. Invalid or blank falls back to UTC.topLimit (query, Int): Maximum entries per top list. Clamped to 1..100.topOrder (query, TopOrder, optional): Metric used to rank the top and discovery lists. |
JSON ListeningStats | JWT | Compute listen count, previous-range comparison, top songs/artists/albums, listen clock, streaks, unique counts and new discoveries for a time range. (getStats) |
| GET | /listeningStats/topSongs |
range (query, StatsRange): The time range to aggregate.timezone (query, String): IANA timezone for range boundaries, e.g. Europe/Berlin. Invalid or blank falls back to UTC.limit (query, Int): Maximum number of songs. Clamped to 1..500.order (query, TopOrder, optional): Metric used to rank the songs. |
JSON List<UserSong> |
JWT | Return the current user's most played songs in a time range as a playable list, ranked by the given metric. Songs that are not in the library are left out. (getTopSongs) |
/lyricsCandidate — ILyricsCandidateService
Lyrics of songs from several providers. Every provider answer is kept as a candidate so a client can choose which version to show.
RPC reference: ILyricsCandidateService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /lyricsCandidate/importSyncedLyrics/{songId} |
songId (path, PlatformUUID): The song unique identifier.file (body, LyricsImport): The file to import. |
JSON LyricsSearchResult | JWT + EDIT | Store synced lyrics parsed from a file as the manual candidate of a song. (importSyncedLyrics) |
| GET | /lyricsCandidate/lyrics/{songId} |
songId (path, PlatformUUID): The song unique identifier.candidateId (query, PlatformUUID?, optional): The candidate to return instead of the default one. |
JSON LyricsCandidate? | JWT | Get the lyrics a player shows. This is the default candidate or the given one, with the lyrics filled. Providers are not asked. (getLyrics) |
| POST | /lyricsCandidate/lyrics/{songId} |
songId (path, PlatformUUID): The song unique identifier.providers (query, repeated, List<String>?, optional): Identifiers of the providers to ask, or null for all enabled ones.refresh (query, Boolean, optional): Asks every provider again. Needs the edit capability. |
JSON LyricsSearchResult | JWT | Get the stored candidates of a song and ask the providers that have not answered yet or are due again. New answers are stored and ranked. (findLyrics) |
| POST | /lyricsCandidate/lyricsByQuery |
title (query, String): The title of the track.artist (query, String): The artist of the track.album (query, String?, optional): The album of the track.durationMs (query, Long?, optional): The duration of the track in milliseconds.providers (query, repeated, List<String>?, optional): Identifiers of the providers to ask, or null for all enabled ones. |
JSON LyricsSearchResult | JWT | Ask the providers for the lyrics of any track. Nothing is stored and the candidates are not tied to a song. (findLyricsByQuery) |
| GET | /lyricsCandidate/lyricsCandidate/{candidateId} |
candidateId (path, PlatformUUID): The candidate unique identifier. |
JSON LyricsCandidate? | JWT | Get one candidate with the lyrics filled. (getLyricsCandidate) |
| GET | /lyricsCandidate/lyricsCandidates/{songId} |
songId (path, PlatformUUID): The song unique identifier.includeContent (query, Boolean, optional): Whether to fill the lyrics of every candidate. |
JSON LyricsSearchResult | JWT | Get the stored candidates of a song. Providers are not asked. (getLyricsCandidates) |
| GET | /lyricsCandidate/lyricsInfo |
songIds (query, repeated, List<PlatformUUID>): The song unique identifiers. |
JSON Map<PlatformUUID, SongLyricsInfo> |
JWT | Get the lyrics summary of songs a client already has. (getLyricsInfo) |
| GET | /lyricsCandidate/lyricsProviders |
- | JSON List<LyricsProviderInfo> |
JWT | Get the enabled providers in priority order. (getLyricsProviders) |
| PUT | /lyricsCandidate/preferredLyrics/{songId} |
songId (path, PlatformUUID): The song unique identifier.candidateId (query, PlatformUUID?, optional): The candidate to pin, or null to use the best ranked one again. |
JSON LyricsSearchResult | JWT + EDIT | Pin the default candidate of a song for everyone. (setPreferredLyrics) |
| GET | /lyricsCandidate/streamLyrics/{songId} |
songId (path, PlatformUUID): The song unique identifier.providers (query, repeated, List<String>?, optional): Identifiers of the providers to ask, or null for all enabled ones. |
SSE LyricsCandidate | JWT | Ask the providers for the lyrics of a song and emit each candidate as soon as its provider answers. (streamLyrics) |
| PUT | /lyricsCandidate/syncedLyrics/{songId} |
songId (path, PlatformUUID): The song unique identifier.lyrics (body, SyncedLyrics?, optional): The synced lyrics, or null to remove the manual candidate. |
JSON LyricsSearchResult | JWT + EDIT | Store hand-edited synced lyrics as the manual candidate of a song. A null value removes the manual candidate. (setSyncedLyrics) |
/lyricsSearch — ILyricsSearch
Search for track lyrics using external providers.
RPC reference: ILyricsSearch
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /lyricsSearch/lyrics |
artist (query, String): The name of the artist.title (query, String): The title of the song.syncedOnly (query, Boolean, optional): Whether to only return time-synced lyrics. |
JSON List<String> |
JWT | Search for lyrics text on external services. (searchLyrics) |
/lyrics — ILyricsService
Syncing and management of track lyrics.
RPC reference: ILyricsService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /lyrics/startSyncWorker |
- | JSON Boolean |
JWT | Start the background lyrics synchronization worker. (startSyncWorker) |
| GET | /lyrics/syncedLyrics/{songId} |
songId (path, PlatformUUID): The song unique identifier. |
JSON SyncedLyrics? | JWT | Get time-synced lyrics for a song if they exist. (getSyncedLyrics) |
| POST | /lyrics/transcribeLyrics/{songId} |
songId (path, PlatformUUID): The song unique identifier.lyrics (query, String?, optional): Optional raw lyrics text to transcribe. |
JSON SyncedLyrics? | JWT | Trigger AI-based transcription or manual alignment of lyrics. (transcribeLyrics) |
/mirror — IMirrorService
Exposes local data for server-to-server mirroring.
RPC reference: IMirrorService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /mirror/albums |
- | SSE Album | JWT + Admin | Stream all local albums for mirroring. (getAlbums) |
| GET | /mirror/artistAliases |
- | SSE ArtistAlias | JWT + Admin | Stream all artist name aliases for mirroring. (getArtistAliases) |
| GET | /mirror/artistSplitAliases |
- | SSE ArtistSplitAlias | JWT + Admin | Stream all artist split-name mappings for mirroring. (getArtistSplitAliases) |
| GET | /mirror/artists |
- | SSE Artist | JWT + Admin | Stream all local artists for mirroring. (getArtists) |
| GET | /mirror/imageMetadata |
- | SSE Image | JWT + Admin | Stream all image metadata for mirroring. (getImageMetadata) |
| GET | /mirror/likedSongs/{userId} |
userId (path, PlatformUUID): The user unique identifier. |
SSE Song | JWT + Admin | Stream all songs liked by a specific user for mirroring. (getLikedSongs) |
| GET | /mirror/playlists |
- | SSE Playlist | JWT + Admin | Stream all local system playlists for mirroring. (getPlaylists) |
| GET | /mirror/serverPaths |
- | JSON RemoteServerPaths | JWT + Admin | Expose the local file system paths where media files are stored. (getServerPaths) |
| GET | /mirror/songData/{songId} |
songId (path, PlatformUUID): The song unique identifier.quality (query, Int, optional): Target audio quality level.chunkSize (query, Int, optional): Number of bytes per chunk in the stream.force (query, Boolean, optional): Whether to force re-transcoding and duration check. |
BYTES | JWT + Admin | Stream raw audio data for a song. (getSongData) |
| GET | /mirror/songs |
- | SSE Song | JWT + Admin | Stream all local songs with metadata for mirroring. (getSongs) |
| GET | /mirror/songsByPlaylist/{playlistId} |
playlistId (path, PlatformUUID): The playlist unique identifier. |
SSE Song | JWT + Admin | Stream all songs belonging to a specific system playlist for mirroring. (getSongsByPlaylist) |
| GET | /mirror/songsByUserPlaylist/{playlistId} |
playlistId (path, PlatformUUID): The playlist unique identifier. |
SSE Song | JWT + Admin | Stream all songs belonging to a specific user playlist for mirroring. (getSongsByUserPlaylist) |
| GET | /mirror/userPlaylists |
- | SSE UserPlaylist | JWT + Admin | Stream all local user playlists for mirroring. (getUserPlaylists) |
| GET | /mirror/users |
- | SSE User | JWT + Admin | Stream all local user accounts (profiles) for mirroring. (getUsers) |
/playback — IPlaybackService
Synchronize music playback status across multiple devices.
RPC reference: IPlaybackService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /playback/observePlaybackState/{sessionId} |
sessionId (path, PlatformUUID): The session unique identifier. |
SSE PlaybackState | JWT | Watch real-time playback state changes for a session. (observePlaybackState) |
| GET | /playback/playbackState/{sessionId} |
sessionId (path, PlatformUUID): The session unique identifier. |
JSON PlaybackState? | JWT | Retrieve the current playback state for a specific session. (getPlaybackState) |
| PUT | /playback/playbackState/{sessionId} |
sessionId (path, PlatformUUID): The session unique identifier.state (body, PlaybackState): The new playback state data. |
JSON Boolean |
JWT | Update the playback state for a specific session. (setPlaybackState) |
/playlist — IPlaylistService
Management of system playlists.
RPC reference: IPlaylistService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /playlist/allPlaylists |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page. |
JSON PaginatedResponse<Playlist> | JWT | Get all system playlists. (allPlaylists) |
| GET | /playlist/byId/{id} |
id (path, PlatformUUID): The playlist unique identifier. |
JSON Playlist? | JWT | Get system playlist by ID. (byId) |
| GET | /playlist/byIdFull/{id} |
id (path, PlatformUUID): The playlist unique identifier. |
JSON Pair<String, List<PlaylistEntry>>? |
JWT | Get system playlist with all track entries. (byIdFull) |
| GET | /playlist/byIds |
ids (query, repeated, List<PlatformUUID>): Collection of playlist IDs. |
JSON List<Playlist> |
JWT | Get multiple system playlists by their IDs. (byIds) |
| GET | /playlist/byName |
name (query, String): The name of the playlist. |
JSON Playlist? | JWT | Get system playlist by name. (byName) |
| DELETE | /playlist/playlist/{id} |
id (path, PlatformUUID): The playlist unique identifier. |
JSON Boolean |
JWT + DELETE | Delete a system playlist. (delete) |
| GET | /playlist/search |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.query (query, String): The search query. |
JSON PaginatedResponse<Playlist> | JWT | Search system playlists. (rankedSearch) |
/podcast — IPodcastService
Manages podcasts, which are kept completely apart from the music library: an episode is never a song, is never scrobbled and never shows up in music search or statistics. A show is either an RSS feed the server follows or a folder of the local podcast library, and a feed show is stored once and shared by everyone subscribing to it. Subscriptions and listening positions are private to each user and sync across their devices. Episode audio is always played through streamEpisode, no matter whether the server stores the file or relays its origin.
RPC reference: IPodcastService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /podcast/browseShows |
query (query, String, optional): Search term matched against title, author and description. Blank returns every show.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of shows per page, at most 500. |
JSON PaginatedResponse<PodcastShow> | JWT | Browse every show on the server, both feed shows and shows of the local podcast library, optionally narrowed down by a search term. (browseShows) |
| GET | /podcast/episode/{episodeId} |
episodeId (path, PlatformUUID): The episode to read. |
JSON PodcastEpisode? | JWT | Read a single episode together with the listening position of the user. Returns null if the episode does not exist. (getEpisode) |
| GET | /podcast/episodeWindow/{episodeId} |
episodeId (path, PlatformUUID): The episode the window is built around.older (query, Int, optional): How many episodes published before it to read, at most 500. Values below 0 count as none.newer (query, Int, optional): How many episodes published after it to read, at most 500. Values below 0 count as none. |
JSON List<PodcastEpisode> |
JWT | Read the episodes around one episode of its show: up to older episodes published before it and up to newer published after it, in chronological order with the episode itself included and the listening position of the user on each. Returns an empty list if the episode does not exist. (getEpisodeWindow) |
| GET | /podcast/episodes |
query (query, String): The search term. Must not be blank.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of episodes per page, at most 500. |
JSON PaginatedResponse<PodcastEpisode> | JWT | Search episodes of every show on the server by their title, their description and the title of their show. (searchEpisodes) |
| GET | /podcast/episodes/{showId} |
showId (path, PlatformUUID): The show to read the episodes of.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of episodes per page, at most 500.newestFirst (query, Boolean, optional): Whether the newest episode comes first. |
JSON PaginatedResponse<PodcastEpisode> | JWT | Read a page of episodes of a show, together with the listening position of the user for each of them. (getEpisodes) |
| GET | /podcast/episodesByIds |
episodeIds (query, repeated, List<PlatformUUID>): The episodes to read, at most 500. |
JSON List<PodcastEpisode> |
JWT | Read several episodes at once, in the order of the given identifiers, each with the listening position of the user. Unknown identifiers are skipped. At most 500 identifiers. (getEpisodesByIds) |
| DELETE | /podcast/import/{episodeId} |
episodeId (path, PlatformUUID): The episode whose stored audio is deleted. |
JSON PodcastEpisode | JWT + PODCAST_EDIT | Delete the stored audio of an episode of a feed show. The episode itself stays and is played from its origin afterwards. Episodes of the local podcast library cannot be removed this way, as that would delete the file of the user. (removeImport) |
| POST | /podcast/importEpisode/{episodeId} |
episodeId (path, PlatformUUID): The episode to store on the server. |
JSON PodcastEpisode | JWT + PODCAST_EDIT | Queue a single episode to be stored on the server. The transfer itself runs in the background, so the returned episode usually reports that its import is queued. (importEpisode) |
| GET | /podcast/inProgress |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of episodes per page, at most 500. |
JSON PaginatedResponse<PodcastEpisode> | JWT | Read the episodes the user started but did not finish, the most recently played one first. (getInProgress) |
| GET | /podcast/index |
query (query, String): The search term. Must not be blank.limit (query, Int, optional): Maximum number of results, clamped to 1 to 100.indexes (query, repeated, List<String>, optional): Identifiers of the directories to search, see getIndexes. Empty searches every configured directory. |
JSON List<PodcastIndexResult> |
JWT | Search the podcast directories the server is connected to, for example Podcast Index, for shows by name or topic. Every result carries the address of its feed, so subscribing to it is done with subscribe. Directories that are not configured are skipped, a directory that fails answers with no results, and feeds the server already follows are left out because browseShows lists them. (searchIndex) |
| GET | /podcast/indexes |
- | JSON List<PodcastIndexInfo> |
JWT | Read the podcast directories the server can search and whether each of them is configured. (getIndexes) |
| GET | /podcast/lastPlayed |
includeCompleted (query, Boolean, optional): Whether an episode the user already completed may be returned. When false only an unfinished episode with a position after the start counts. |
JSON PodcastEpisode? | JWT | Read the episode the user played most recently, with the listening position, so a client can offer to continue it. Returns null if the user never played an episode. (getLastPlayed) |
| GET | /podcast/latestEpisodes |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of episodes per page, at most 500. |
JSON PaginatedResponse<PodcastEpisode> | JWT | Read the newest episodes across the shows the user is subscribed to, newest first. (getLatestEpisodes) |
| GET | /podcast/observeProgress |
- | SSE PodcastEpisodeProgress | JWT | Watch the listening positions of the user for changes, so other devices follow along while an episode is played somewhere else. (observeProgress) |
| PUT | /podcast/played/{episodeId} |
episodeId (path, PlatformUUID): The episode to mark.played (query, Boolean): Whether the episode counts as listened. |
JSON PodcastEpisodeProgress | JWT | Mark an episode as listened or as unlistened. Marking it as listened moves the position to the end of the episode, marking it as unlistened resets the position to the beginning. (setPlayed) |
| POST | /podcast/refreshShow/{showId} |
showId (path, PlatformUUID): The show to refresh. |
JSON PodcastShow | JWT | Fetch the feed of a show right now and store what changed. The call runs to completion before it returns and is skipped when the feed was already fetched less than 60 seconds ago. (refreshShow) |
| POST | /podcast/reportPlayback |
report (body, EpisodePlaybackReport): What the client is playing and how far it has got. |
JSON PodcastEpisodeProgress | JWT | Store the listening position of the user for an episode. A client reports on play, on pause, after a seek and every 10 to 15 seconds while playing, the same way song playback is reported. The last report wins, and the server marks an episode as completed on its own once the remaining time is under 30 seconds or under 5 percent of its length. (reportPlayback) |
| POST | /podcast/scanLocal |
- | JSON PodcastScanResult | JWT + PODCAST_EDIT | Scan the local podcast library for new, changed and vanished shows and episodes. The call runs to completion before it returns. (scanLocal) |
| DELETE | /podcast/show/{showId} |
showId (path, PlatformUUID): The show to remove. |
JSON Boolean |
JWT + Admin | Remove a feed show from the server for everyone: its episodes, their transcripts, the listening positions of every user and every subscription to it are deleted, and the audio the server stored for it is deleted from disk. Returns false if the show does not exist. Shows of the local podcast library cannot be removed this way, as the server picks them up again on the next scan. (deleteShow) |
| GET | /podcast/show/{showId} |
showId (path, PlatformUUID): The show to read. |
JSON PodcastShow? | JWT | Read a single show. Returns null if the show does not exist. (getShow) |
| PUT | /podcast/showSettings/{showId} |
showId (path, PlatformUUID): The show to change.settings (body, PodcastShowSettings): The settings to store for the show. |
JSON PodcastShow | JWT + PODCAST_EDIT | Change how the server keeps the episodes of a show. Switching a show to import makes the server store new episodes on disk, and the number of episodes to keep must be at least 1 when it is given. With newest retention the server imports the newest episodes and deletes everything beyond that count, while unlistened retention, which needs import delivery, imports the episodes nobody has finished yet and only deletes an episode once every subscriber listened to it to the end, with the keep count capping how many episodes are stored or queued at once. (updateShowSettings) |
| GET, HEAD | /podcast/streamEpisode/{episodeId} |
episodeId (path, PlatformUUID): The episode to play.offset (query, Long, optional): Byte offset to start streaming from.chunkSize (query, Int, optional): Size of each data chunk. |
FILE | JWT | Stream the audio of an episode. This is the only way a client plays an episode: the server serves the file when the episode is stored on it or belongs to the local podcast library, and relays the audio from its origin otherwise. Returns null if the episode has no audio at all. (streamEpisode) |
| GET | /podcast/streamSize/{episodeId} |
episodeId (path, PlatformUUID): The episode to read the size of. |
JSON Long |
JWT | Get the total size of the audio of an episode in bytes, or 0 if the size cannot be determined. (getStreamSize) |
| POST | /podcast/subscribe |
feedUrl (query, String): The address of the RSS feed to subscribe to. Must be an http or https address of at most 2048 characters. |
JSON PodcastShow | JWT | Subscribe to an RSS feed. The feed is fetched and parsed while the call runs when the server does not know it yet, so the call fails if the feed cannot be reached or is not a podcast feed. Subscribing again to a known feed is cheap and does not fetch anything. (subscribe) |
| POST | /podcast/subscribeToShow/{showId} |
showId (path, PlatformUUID): The show to subscribe to. |
JSON PodcastShow | JWT | Subscribe to a show the server already knows, for example one found through browseShows. (subscribeToShow) |
| GET | /podcast/subscriptions |
- | JSON List<PodcastShow> |
JWT | Read the shows the user is subscribed to, ordered by title. (getSubscriptions) |
| GET | /podcast/transcript/{transcriptId} |
transcriptId (path, PlatformUUID): The transcript to read. |
JSON PodcastTranscriptContent? | JWT | Read a single transcript together with its text. A transcript that only exists as a remote address is fetched once on first read and kept afterwards. Returns null if the transcript does not exist or its text cannot be obtained. (getTranscript) |
| GET | /podcast/transcripts/{episodeId} |
episodeId (path, PlatformUUID): The episode to read the transcripts of. |
JSON List<PodcastTranscript> |
JWT | Read the transcripts known for an episode without their text. (getTranscripts) |
| DELETE | /podcast/unsubscribe/{showId} |
showId (path, PlatformUUID): The show to unsubscribe from. |
JSON Boolean |
JWT | End the subscription of the user to a show. Returns false if the user was not subscribed. The show itself and its episodes stay on the server for a while after the last subscriber leaves. (unsubscribe) |
/queue — IQueueService
Manages the server-stored play queue shared between the devices of a user. Every write carries the version the client based its change on. If the server has moved on since then the write is rejected with a conflict carrying the current state, unless the client forces it.
RPC reference: IQueueService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /queue/ackSynced |
version (query, Long): The queue version this device is now in sync with. |
- | JWT | Record that the calling session pulled the queue up to a version, so it can tell later whether the server state is newer than its own. (ackSynced) |
| POST | /queue/beginUpload |
baseVersion (query, Long): The queue version the upload is based on.force (query, Boolean, optional): Whether to start the upload even if the server is past the base version. |
JSON QueueUploadStart | JWT | Start a chunked upload that replaces the whole queue. Entries are staged in memory with uploadPage and become visible only on commitUpload. Starting an upload discards any previous staged upload of the user, and a staged upload expires after a while if it is not committed. (beginUpload) |
| POST | /queue/cancelUpload/{uploadId} |
uploadId (path, PlatformUUID): The upload identifier returned by beginUpload. |
- | JWT | Discard a staged upload without touching the stored queue. (cancelUpload) |
| POST | /queue/commitUpload/{uploadId} |
uploadId (path, PlatformUUID): The upload identifier returned by beginUpload.meta (body, QueueMeta): The playback metadata to store with the queue.requestId (query, PlatformUUID?, optional): The client request this upload answers, if any. |
JSON QueueWriteResult | JWT | Replace the queue with the staged entries and store the supplied playback metadata. Entries referring to unknown songs are dropped and both orders are renumbered. When the upload answers a queue request of another device, its request identifier is passed so the requester is notified. (commitUpload) |
| PUT | /queue/currentIndex |
baseVersion (query, Long): The queue version the change is based on.currentIndex (query, Int): Zero-based index in the active order.force (query, Boolean, optional): Whether to apply the change even if the server is past the base version. |
JSON QueueWriteResult | JWT | Set the entry that is currently playing, addressed by its index in the active order. The index is clamped to the size of the queue. (setCurrentIndex) |
| DELETE | /queue/entries |
baseVersion (query, Long): The queue version the change is based on.queueIds (query, repeated, List<Long>): The queue identifiers of the entries to remove.force (query, Boolean, optional): Whether to apply the change even if the server is past the base version. |
JSON QueueWriteResult | JWT | Remove entries from the queue by their queue identifiers. Unknown identifiers are ignored and the current index is adjusted to stay on the playing entry. (remove) |
| POST | /queue/insert |
baseVersion (query, Long): The queue version the change is based on.position (query, Int): Zero-based index in the active order at which the entries are inserted.items (body, List<QueueItem>): The entries to insert, in the order they should appear.force (query, Boolean, optional): Whether to apply the change even if the server is past the base version. |
JSON QueueWriteResult | JWT | Insert entries into the queue at a position of the active order (the shuffled order while shuffle is on, otherwise the original order). With shuffle on the entries are spliced into the shuffled order and appended to the end of the original order. (insert) |
| PUT | /queue/modes |
baseVersion (query, Long): The queue version the change is based on.shuffleMode (query, Boolean): Whether the queue is played in shuffled order.repeatMode (query, RepeatMode): The repetition mode to store.force (query, Boolean, optional): Whether to apply the change even if the server is past the base version. |
JSON QueueWriteResult | JWT | Set shuffle and repeat mode. Enabling shuffle makes the server generate a shuffled order that starts with the entry that is currently playing, so the current index becomes 0. Disabling it drops the shuffled order and puts the current index back on the original position of that entry. A player that shuffled on its own uploads its order instead. (setModes) |
| POST | /queue/move/{queueId} |
baseVersion (query, Long): The queue version the change is based on.queueId (path, Long): The queue identifier of the entry to move.toPosition (query, Int): Zero-based target index in the active order.force (query, Boolean, optional): Whether to apply the change even if the server is past the base version. |
JSON QueueWriteResult | JWT | Move a single entry to another position of the active order (the shuffled order while shuffle is on, otherwise the original order). (move) |
| GET | /queue/observeQueue |
- | SSE QueueInfo | JWT | Watch the queue of the user for changes. A new metadata snapshot is emitted after every successful write, including writes made by other devices. (observeQueue) |
| GET | /queue/queue |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.includeSongs (query, Boolean, optional): Resolve each entry's song. Leave false for large queues and fetch songs separately. |
JSON PaginatedResponse<QueueItem> | JWT | Read a page of queue entries, ordered by their position in the original order. Each entry also carries its shuffled position, and its song metadata only when the entries are requested with the songs resolved. (getQueue) |
| GET | /queue/queueInfo |
- | JSON QueueInfo | JWT | Get the metadata of the queue without its entries. A user without a stored queue is reported at version 0 with no entries. (getQueueInfo) |
| POST | /queue/requestUploadFrom/{sessionId} |
sessionId (path, PlatformUUID): The session unique identifier of the device to ask. |
JSON ClientRequestStatus | JWT | Ask another device of the same user to upload its current queue and wait for the outcome. The request is delivered over the client request channel. Sessions that are not listening are reported as unreachable and sessions that stay silent as timed out. (requestUploadFrom) |
| GET | /queue/syncDevices |
- | JSON List<QueueSyncDevice> |
JWT | List the devices of the user that take part in queue synchronization, including which entry is the calling session. (getSyncDevices) |
| PUT | /queue/syncEnabled |
enabled (query, Boolean): Whether this device takes part in queue synchronization.deviceName (query, String): Human readable name of this device. |
- | JWT | Opt the calling session in or out of queue synchronization and record the name it is listed under on other devices. (setSyncEnabled) |
| POST | /queue/uploadPage/{uploadId} |
uploadId (path, PlatformUUID): The upload identifier returned by beginUpload.items (body, List<QueueItem>): The entries of this page, in upload order. |
JSON Int |
JWT | Stage another page of entries for a started upload. Returns the total number of entries staged so far. (uploadPage) |
/radioChannel — IRadioChannelService
Admin-curated radio channels: browse and play for everyone, create and edit for admins.
RPC reference: IRadioChannelService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /radioChannel/channel |
channel (body, InsertableRadioChannel): The initial channel metadata. |
JSON PlatformUUID |
JWT + Admin | Create a new radio channel. (createChannel) |
| DELETE | /radioChannel/channel/{id} |
id (path, PlatformUUID): The channel unique identifier. |
JSON Boolean |
JWT + Admin | Delete a radio channel. (deleteChannel) |
| GET | /radioChannel/channel/{id} |
id (path, PlatformUUID): The channel unique identifier. |
JSON RadioChannel? | JWT | Get a radio channel by ID. Returns null for a draft channel when the caller is not an admin. (getChannel) |
| PUT | /radioChannel/channel/{id} |
id (path, PlatformUUID): The channel unique identifier.channel (body, InsertableRadioChannel): The new metadata. |
JSON Boolean |
JWT + Admin | Update a channel's metadata (name, description, enabled, position, discovery). (updateChannel) |
| PUT | /radioChannel/channelImage/{id} |
id (path, PlatformUUID): The channel unique identifier.bytes (body, ByteArray): The raw bytes of the image. |
- | JWT + Admin | Set the channel's cover image from raw bytes. (setChannelImage) |
| GET | /radioChannel/channels |
- | JSON List<RadioChannel> |
JWT | List radio channels. Non-admin users only see published channels. (listChannels) |
| GET | /radioChannel/search/{channelId} |
channelId (path, PlatformUUID): The channel unique identifier.query (query, String, optional): The search query. Empty to list all configured content.explicit (query, Boolean, optional): Whether to include explicit-content songs.page (query, Int, optional): The page index (starting from 0).pageSize (query, Int, optional): Items per page, applied per result type. |
JSON RadioChannelSearchResults | JWT | Ranked search across the songs, artists and albums configured on a channel. An empty query lists all configured content. (rankedSearch) |
| POST | /radioChannel/startChannel/{id} |
id (path, PlatformUUID): The channel unique identifier. |
JSON PlatformUUID |
JWT | Start playing a channel. Returns a radio session id to feed into IRadioService.observeRadio. (startChannel) |
| DELETE | /radioChannel/{type}/channelItem/{id} |
id (path, PlatformUUID): The channel unique identifier.type (path, RadioChannelItemType): The kind of referenced entity.itemId (query, PlatformUUID): The referenced entity unique identifier. |
JSON Boolean |
JWT + Admin | Remove a song, artist or album from a channel's configured content. (removeChannelItem) |
| POST | /radioChannel/{type}/channelItem/{id} |
id (path, PlatformUUID): The channel unique identifier.type (path, RadioChannelItemType): The kind of referenced entity.itemId (query, PlatformUUID): The referenced entity unique identifier. |
JSON Boolean |
JWT + Admin | Add a song, artist or album to a channel's configured content. (addChannelItem) |
/radio — IRadioService
Infinite radio stations seeded from listen history, a seed selection, or pure randomness.
RPC reference: IRadioService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /radio/observeRadio/{sessionId} |
sessionId (path, PlatformUUID): The radio session identifier, as returned by createRadioSession. |
SSE PlatformUUID |
JWT | Infinite stream of song identifiers for a radio session. Re-collecting the same session continues without repeating songs. (observeRadio) |
| POST | /radio/radioSession |
type (query, RadioType, optional): The strategy used to seed the station. Ignored when a seed is provided.seed (body, RadioSeed?, optional): Optional seed material. When set, the station plays songs similar to the seed. |
JSON PlatformUUID |
JWT | Create a radio session and return its identifier. The same identifier can be reused to resume the station where it left off. (createRadioSession) |
/recommendation — IRecommendationService
Personalized music recommendations from the learned embedding space.
RPC reference: IRecommendationService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /recommendation/mix |
window (query, RecommendationWindow, optional): Recency window used to seed the mix.limit (query, Int, optional): The maximum number of results to return. |
JSON List<UserSong> |
JWT | A personalized mix seeded from the user's recent listens over a time window. (getMix) |
| GET | /recommendation/moodPlaylist |
mood (query, String): The mood label, as returned by getMoods.limit (query, Int, optional): The maximum number of results to return. |
JSON List<UserSong> |
JWT | Songs belonging to a given mood cluster. (getMoodPlaylist) |
| GET | /recommendation/moods |
- | JSON List<MoodSummary> |
JWT | Available mood labels with their song counts. (getMoods) |
| GET | /recommendation/similarSongs |
seedSongIds (query, repeated, List<PlatformUUID>): Seed song unique identifiers.limit (query, Int, optional): The maximum number of results to return. |
JSON List<UserSong> |
JWT | Songs most similar to the given seed songs in the learned embedding space. (getSimilarSongs) |
/release — IReleaseService
Track and receive notifications for new music releases.
RPC reference: IReleaseService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /release/artistRecentReleases/{artistId} |
artistId (path, PlatformUUID): The artist unique identifier.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.includeHidden (query, Boolean, optional): Include entries that have been hidden from the feed. They carry hidden = true. |
JSON PaginatedResponse<RecentRelease> | JWT | Retrieve recent music releases for a specific artist. Editions of one release are folded into a single entry carrying the others in versions. (getArtistRecentReleases) |
| POST | /release/confirmRelease/{releaseId} |
releaseId (path, PlatformUUID): The provider release id of the flagged entry. |
JSON RecentRelease | JWT + EDIT | Confirm that a provider entry flagged as possibly belonging to another artist is correct: clears the flag and records the entry's copyright holder, record label and ISRC registrants as known sources of the artist so future catalog runs do not flag matching entries again. Returns the updated entry. (confirmRelease) |
| POST | /release/followArtist/{musicBrainzId} |
musicBrainzId (path, PlatformUUID): The MusicBrainz Artist UUID. |
JSON Boolean |
JWT | Follow an artist by their MusicBrainz ID to track their releases. (followArtist) |
| GET | /release/followedArtists |
- | JSON List<FollowedArtist> |
JWT | Get a list of all artists the current user is following. (getFollowedArtists) |
| GET | /release/recentReleases |
page (query, Int, optional): Page index, applied to every release type separately.pageSize (query, Int, optional): Number of entries per page for each release type. |
JSON PaginatedResponse<RecentRelease> | JWT | Retrieve a feed of recent and upcoming music releases from followed artists, merged from MusicBrainz and the Apple Music catalog. Editions of one release are folded into a single entry carrying the others in versions. Paging applies per release type: one page holds up to pageSize entries of every type, a folded group counting once, in one list sorted by date. (getRecentReleases) |
| GET | /release/recentReleasesByMusicBrainzId/{musicBrainzId} |
musicBrainzId (path, PlatformUUID): The MusicBrainz Artist UUID.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page. |
JSON PaginatedResponse<RecentRelease> | JWT | Retrieve recent music releases for an artist by their MusicBrainz ID. (getRecentReleasesByMusicBrainzId) |
| POST | /release/refreshRecentRelease/{releaseId} |
releaseId (path, PlatformUUID): The MusicBrainz release-group UUID of the recent release to refresh, or the provider release id for non-MusicBrainz sources. |
- | JWT + EDIT | Kick off a background refresh of the cached metadata, provider links and cover image for a single recent release, returning immediately. (refreshRecentRelease) |
| PUT | /release/releaseHidden/{releaseId} |
releaseId (path, PlatformUUID): The MusicBrainz release-group UUID of the recent release, or the provider release id for non-MusicBrainz sources.hidden (query, Boolean): true to hide the entry, false to show it again.includeRelated (query, Boolean, optional): Also apply the change to the artist's Apple Music entries sharing the copyright holder or record label and record or clear the block. Ignored for MusicBrainz entries. |
JSON Int |
JWT + EDIT | Hide an entry of the release feed for every user, or show it again. With includeRelated the other Apple Music entries of the same artist sharing the entry's copyright holder (or record label when no holder is known) are hidden or shown as well, and the holder or label is recorded as blocked (or unblocked) for the artist so future catalog runs hide matching entries automatically. Returns the number of entries whose visibility changed. The change applies to the whole display group, i.e. every edition the feed folds under one entry. (setReleaseHidden) |
| GET | /release/releaseImage/{releaseId} |
releaseId (path, PlatformUUID): The MusicBrainz release-group UUID of the recent release, or the provider release id for non-MusicBrainz sources.size (query, Int, optional): Requested image size (width/height). 0 for original size. |
BYTES | public | Retrieve the cover image for a recent release, served from local storage when persisted or proxied from the Cover Art Archive on demand. (getReleaseImage) |
| DELETE | /release/unfollowArtist/{artistId} |
artistId (path, PlatformUUID): The artist unique identifier. |
JSON Boolean |
JWT | Unfollow an artist and stop tracking their releases. (unfollowArtist) |
| DELETE | /release/unfollowArtistByMusicBrainzId/{musicBrainzId} |
musicBrainzId (path, PlatformUUID): The MusicBrainz Artist UUID. |
JSON Boolean |
JWT | Unfollow an artist by their MusicBrainz ID and stop tracking their releases. (unfollowArtistByMusicBrainzId) |
/remoteControl — IRemoteControlService
Controls playback on another device of the same user and watches what it is doing. Only devices that are connected to the request channel offering the remote control capability can be reported on or addressed, and a device is always addressed by its session. Nothing here is stored: a status lives as long as the device stays connected.
RPC reference: IRemoteControlService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /remoteControl/observeStatus/{sessionId} |
sessionId (path, PlatformUUID): The session unique identifier of the device to watch. |
SSE RemotePlaybackStatus | JWT | Watch what another device of the user is playing. The last reported status is replayed immediately, followed by every later report. (observeStatus) |
| POST | /remoteControl/reportStatus |
status (body, RemotePlaybackStatus): What this device is playing right now. The report timestamp is filled in by the server. |
- | JWT | Publish what the calling session is playing, which every device watching it receives. A client reports after every change and every few seconds while it is playing, so watchers can follow the position. The calling session must be connected offering remote control. (reportStatus) |
| POST | /remoteControl/sendCommand/{sessionId} |
sessionId (path, PlatformUUID): The session unique identifier of the device to control.command (body, PlaybackCommand): The transport command to apply on that device. |
JSON ClientRequestStatus | JWT | Send a transport command to another device of the user and wait for it to answer. The device must be connected offering remote control, and a volume command additionally requires the remote volume capability and a volume between 0 and 1. A device that stays silent is reported as timed out after ten seconds. (sendCommand) |
| GET | /remoteControl/status/{sessionId} |
sessionId (path, PlatformUUID): The session unique identifier of the device to read. |
JSON RemotePlaybackStatus? | JWT | Read the last status another device of the user reported, or null when it has not reported anything since it connected. (getStatus) |
/remoteMirror — IRemoteMirrorService
Instance-to-instance data synchronization.
RPC reference: IRemoteMirrorService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /remoteMirror/activeMirrorProgress |
- | SSE MirrorProgress | JWT + Admin | Stream real-time progress updates for the active mirroring task. (getActiveMirrorProgress) |
| POST | /remoteMirror/proxyInstances |
config (body, RemoteServerConfig): Remote connection configuration. |
JSON List<ProxyInstanceInfo> |
JWT + Admin | List available proxy instances on a remote Synara instance. (getProxyInstances) |
| POST | /remoteMirror/remoteImageData/{imageId} |
config (body, RemoteServerConfig): Remote connection configuration.imageId (path, PlatformUUID): The unique identifier of the image.size (query, Int): Requested image size (width/height). |
BYTES | JWT + Admin | Fetch raw image binary data from a remote Synara instance. (getRemoteImageData) |
| POST | /remoteMirror/remotePlaylists |
config (body, RemoteServerConfig): Remote connection configuration. |
JSON List<Playlist> |
JWT + Admin | List all system playlists on a remote Synara instance. (getRemotePlaylists) |
| POST | /remoteMirror/remoteStats |
config (body, RemoteServerConfig): Connection configuration for the remote server. |
JSON ServerStats | JWT + Admin | Get statistics from a remote Synara instance. (getRemoteStats) |
| POST | /remoteMirror/remoteUserPlaylists |
config (body, RemoteServerConfig): Remote connection configuration. |
JSON List<UserPlaylist> |
JWT + Admin | List all user playlists on a remote Synara instance. (getRemoteUserPlaylists) |
| POST | /remoteMirror/remoteUsers |
config (body, RemoteServerConfig): Remote connection configuration. |
JSON List<User> |
JWT + Admin | List all user accounts on a remote Synara instance. (getRemoteUsers) |
| POST | /remoteMirror/resetMirror |
- | - | JWT + Admin | Reset the internal mirroring state. (resetMirror) |
| POST | /remoteMirror/startMirror |
config (body, RemoteServerConfig): Mirroring configuration and credentials. |
- | JWT + Admin | Start mirroring content from another Synara instance. (startMirror) |
| POST | /remoteMirror/stopMirror |
- | - | JWT + Admin | Stop the active mirroring process. (stopMirror) |
/rpcMetrics — IRpcMetricsService
Admin-only access to RPC call usage metrics (how often each call is invoked, per user and over time).
RPC reference: IRpcMetricsService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /rpcMetrics/lifetimeTotals |
limit (query, Int, optional): Maximum number of rows to return.username (query, String?, optional): Optional username filter. Null returns totals across all users. |
JSON List<RpcCallTotal> |
JWT + Admin | Lifetime invocation totals per call, ordered by count descending. These counters are never pruned. (lifetimeTotals) |
| POST | /rpcMetrics/recentEvents |
limit (query, Int, optional): Maximum number of events to return. |
JSON List<RpcCallEvent> |
JWT + Admin | The most recent recorded invocations from the capped event log, newest first. (recentEvents) |
| POST | /rpcMetrics/timeSeries |
service (query, String): The RPC service (interface) name, e.g. "ISongService".method (query, String): The RPC method (call) name.sinceMillis (query, Long): Only include buckets at or after this epoch-millis timestamp. |
JSON List<RpcCallStat> |
JWT + Admin | Hourly time-series of invocation counts for a specific call, oldest first. (timeSeries) |
/scheduledTaskConfiguration — IScheduledTaskConfigurationService
Management of background task configurations.
RPC reference: IScheduledTaskConfigurationService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| PUT | /scheduledTaskConfiguration/configuration |
configuration (body, TaskConfiguration) |
- | JWT + Admin | Update a task configuration. (updateConfiguration) |
| GET | /scheduledTaskConfiguration/configurations |
- | JSON List<TaskConfiguration> |
JWT + Admin | Retrieve all background task configurations. (getConfigurations) |
| GET | /scheduledTaskConfiguration/observeConfigurations |
- | SSE List<TaskConfiguration> |
JWT + Admin | Stream real-time updates for all background task configurations. (observeConfigurations) |
| POST | /scheduledTaskConfiguration/triggerTask |
key (query, String) |
JSON Boolean |
JWT + Admin | Manually trigger a background task by its unique key. (triggerTask) |
/scheduledTaskLog — IScheduledTaskLogService
Monitoring and tracking of background scheduled tasks.
RPC reference: IScheduledTaskLogService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /scheduledTaskLog/groupedLogs |
- | JSON Map<String, List<ScheduledTaskLog>> |
JWT + Admin | Retrieve a snapshot of the most recent background task logs grouped by task name. (getGroupedLogs) |
| GET | /scheduledTaskLog/observeGroupedLogs |
- | SSE Map<String, List<ScheduledTaskLog>> |
JWT + Admin | Stream real-time updates for all background task progress and completion. (observeGroupedLogs) |
/scrobble — IScrobbleService
Submit playback scrobbles and observe the current user's recently listened songs, artists and albums.
RPC reference: IScrobbleService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /scrobble/clearNowPlaying |
- | - | JWT | Clear the current user's now-playing state, e.g. when playback stops. (clearNowPlaying) |
| POST | /scrobble/listened |
request (body, ScrobbleRequest): The completed listen. |
- | JWT | Record that the current user finished listening to a library song. (listened) |
| POST | /scrobble/nowPlaying/{songId} |
songId (path, PlatformUUID): The library song now playing. |
- | JWT | Report the library song the current user is now playing. Auto-clears after the song's duration unless reported again. (nowPlaying) |
| GET | /scrobble/recentAlbums |
limit (query, Int): Maximum number of albums to return. Clamped to 1..1000. |
JSON List<ListenedAlbum> |
JWT | Get the current user's recently listened albums, most recently played first. (recentAlbums) |
| GET | /scrobble/recentArtists |
limit (query, Int): Maximum number of artists to return. Clamped to 1..1000. |
JSON List<ListenedArtist> |
JWT | Get the current user's recently listened artists, most recently played first. (recentArtists) |
| GET | /scrobble/recentListens |
limit (query, Int): Maximum number of recent songs to return. Clamped to 1..1000. |
JSON RecentListens | JWT | Get the current user's recently listened songs and current now-playing once. (recentListens) |
| POST | /scrobble/reportPlayback |
report (body, PlaybackReport): The current playback state. |
JSON Long |
JWT | Report playback progress for the current user: call on play, pause, resume, seek and every 10-15 seconds while playing. Returns the server's epoch milliseconds at receipt so clients can align their clocks. (reportPlayback) |
/serverStats — IServerStatsService
Basic server health and performance monitoring.
RPC reference: IServerStatsService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /serverStats/health |
- | JSON Boolean |
public | Simple connectivity check to verify the server is responding. (health) |
| GET | /serverStats/proxyInfo |
- | JSON ProxyInfo? | public | Retrieve information about the reverse proxy status and configuration. (getProxyInfo) |
| GET | /serverStats/stats |
- | JSON ServerStats | public | Retrieve detailed system performance metrics and library statistics. (getStats) |
/session — ISessionService
Manages active user sessions and connected devices.
RPC reference: ISessionService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| DELETE | /session/deactivateSession/{sessionId} |
sessionId (path, PlatformUUID): The session unique identifier. |
- | JWT | Terminate a specific user session. (deactivateSession) |
| GET | /session/sessions |
- | JSON List<Session> |
JWT | List all sessions for the current user. (getSessions) |
/song — ISongService
The primary interface for song discovery, streaming, and metadata.
RPC reference: ISongService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /song/allSongIds |
explicit (query, Boolean): Whether to include explicit content.tags (query, repeated, List<SongTag>, optional): Only include songs that match any of these tags.excludeTags (query, repeated, List<SongTag>, optional): Exclude songs that match any of these tags. All filters combine with AND.titleTags (query, repeated, List<TitleTagKind>, optional): Only include songs whose title carries any of these title tag kinds.excludeTitleTags (query, repeated, List<TitleTagKind>, optional): Exclude songs whose title carries any of these title tag kinds. Songs without title tags are kept. |
SSE PlatformUUID |
JWT | Stream all song IDs with optional filtering. (allSongIds) |
| GET | /song/allSongs |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.explicit (query, Boolean): Whether to include explicit content.tags (query, repeated, List<SongTag>, optional): Only include songs that match any of these tags.excludeTags (query, repeated, List<SongTag>, optional): Exclude songs that match any of these tags. All filters combine with AND.titleTags (query, repeated, List<TitleTagKind>, optional): Only include songs whose title carries any of these title tag kinds.excludeTitleTags (query, repeated, List<TitleTagKind>, optional): Exclude songs whose title carries any of these title tag kinds. Songs without title tags are kept. |
JSON PaginatedResponse<UserSong> | JWT | Get all songs with optional filtering. (allSongs) |
| PUT | /song/artists/{id} |
id (path, PlatformUUID): The song unique identifier.artistIds (query, repeated, List<PlatformUUID>): Collection of artist IDs. |
JSON UserSong? | JWT + EDIT | Update song artists. (setArtists) |
| GET | /song/atmosStreamSize/{id} |
id (path, PlatformUUID): The song unique identifier. |
JSON Long |
JWT | Get the size of the song's Dolby Atmos stream, or 0 if the song has no Atmos variant. (getAtmosStreamSize) |
| GET | /song/byAlbum/{albumId} |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.albumId (path, PlatformUUID): The album unique identifier. |
JSON PaginatedResponse<UserSong> | JWT | List songs in an album. (byAlbum) |
| GET | /song/byArtist/{artistId} |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.artistId (path, PlatformUUID): The artist unique identifier. |
JSON PaginatedResponse<UserSong> | JWT | List songs by a specific artist. (byArtist) |
| GET | /song/byColor |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.color (query, Int): The target color in ARGB format.range (query, Int, optional): The allowed range (0-255).explicit (query, Boolean): Whether to include explicit content. |
JSON PaginatedResponse<UserSong> | JWT | Search for songs by color. (byColor) |
| GET | /song/byId/{id} |
id (path, PlatformUUID): The song unique identifier. |
JSON UserSong? | JWT | Get song by its unique identifier. (byId) |
| GET | /song/byIds |
ids (query, repeated, List<PlatformUUID>): Collection of song IDs. |
JSON List<UserSong> |
JWT | Get multiple songs by their unique identifiers. (byIds) |
| GET | /song/byLyrics |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.query (query, String): The search query.explicit (query, Boolean): Whether to include explicit content. |
JSON PaginatedResponse<UserSong> | JWT | Search for songs by their lyrics. (searchByLyrics) |
| GET | /song/byMusicBrainzId/{musicBrainzId} |
musicBrainzId (path, PlatformUUID): The MusicBrainz Recording UUID. |
JSON List<UserSong> |
JWT | Find songs by their MusicBrainz Recording ID. (byMusicBrainzId) |
| GET | /song/byOriginalIds |
ids (query, repeated, Collection<PrefixedId>): Collection of original platform-specific track identifiers. |
JSON List<UserSong> |
JWT | Find songs by their original platform-specific unique identifiers. (byOriginalIds) |
| GET | /song/byOriginalTracks |
tracks (query, JSON, Collection<Track>): Collection of track metadata. |
JSON List<UserSong> |
JWT | Find songs matching external metadata records. (byOriginalTracks) |
| GET | /song/byOriginalUrls |
urls (query, repeated, Collection<String>): Collection of original platform URLs. |
JSON Map<String, UserSong?> |
JWT | Find songs by their original platform URLs, returning a mapping. (byOriginalUrls) |
| GET | /song/byPlaylist/{playlistId} |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.playlistId (path, PlatformUUID): The playlist unique identifier. |
JSON PaginatedResponse<UserSong> | JWT | List songs in a system playlist. (byPlaylist) |
| GET | /song/byTitle |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.title (query, String): The song title to search for. |
JSON PaginatedResponse<UserSong> | JWT | Search for songs by title. (byTitle) |
| GET | /song/byUserPlaylist/{playlistId} |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.playlistId (path, PlatformUUID): The user playlist unique identifier. |
JSON PaginatedResponse<UserSong> | JWT | List songs in a user playlist. (byUserPlaylist) |
| GET | /song/downloadSize/{id} |
id (path, PlatformUUID): The song unique identifier.quality (query, Int): The requested quality.force (query, Boolean, optional): Whether to force re-transcoding and duration check.format (query, AudioFormat, optional): The target audio format. |
JSON Long |
JWT | Get the size of the song audio for a specific quality. (getDownloadSize) |
| GET | /song/downloadSizes |
ids (query, repeated, List<PlatformUUID>): The song unique identifiers.quality (query, Int): The requested quality in kbps, or a value <= 0 for the original file.format (query, AudioFormat, optional): The target audio format. |
JSON List<SongDownloadSize> |
JWT | Get the recorded download sizes of songs for a quality and format, without transcoding. Songs without a recorded size are left out. (getDownloadSizes) |
| GET, HEAD | /song/downloadSong/{id} |
id (path, PlatformUUID): The song unique identifier.quality (query, Int): Target audio quality.offset (query, Long, optional): Byte offset to start from.chunkSize (query, Int, optional): Size of each data chunk.force (query, Boolean, optional): Whether to force re-transcoding and duration check.format (query, AudioFormat, optional): The target audio format. |
FILE | JWT | Download song audio in specific quality. (downloadSong) |
| GET | /song/exportFavouritesAsCsv |
- | JSON String |
JWT | Export all favorited songs as a CSV string. (exportFavouritesAsCsv) |
| GET | /song/extendedMetadata/{id} |
id (path, PlatformUUID): The song unique identifier. |
JSON SongExtendedMetadata? | JWT | Get extended metadata for a song. (extendedMetadata) |
| PUT | /song/likeLevel/{id} |
id (path, PlatformUUID): The unique UUID of the song.level (query, LikeLevel): The new like level. NONE removes the like and the super like. |
JSON UserSong? | JWT | Set the like level of a song. A super like also counts as a like. Changing between LIKE and SUPER keeps the song's position among the liked songs. (setLikeLevel) |
| GET | /song/likedByArtist/{artistId} |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.artistId (path, PlatformUUID): The artist unique identifier.explicit (query, Boolean): Whether to include explicit content. |
JSON PaginatedResponse<UserSong> | JWT | List songs liked by the user for a specific artist. (likedByArtist) |
| GET | /song/likedSongIds |
explicit (query, Boolean): Whether to include explicit content. |
SSE PlatformUUID |
JWT | Stream all IDs of songs liked by the current user. (likedSongIds) |
| GET | /song/likedSongs |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.explicit (query, Boolean): Whether to include explicit content. |
JSON PaginatedResponse<UserSong> | JWT | Get all songs liked by the current user. (likedSongs) |
| PUT | /song/lyrics/{id} |
id (path, PlatformUUID): The song unique identifier.lyrics (query, repeated, List<String>): List of lyric lines. |
JSON UserSong? | JWT + EDIT | Manually set song lyrics. (setLyrics) |
| POST | /song/moveSongs |
oldPath (query, String): Path prefix to match.newPath (query, String): New base path.originalIdPrefix (query, String?, optional): Optional originalId prefix to filter by. |
JSON Int |
JWT + Admin | Batch update song file paths. (moveSongs) |
| POST | /song/musicBrainzId/{id} |
id (path, PlatformUUID): The song unique identifier. |
JSON UserSong? | JWT + EDIT | Trigger automatic MusicBrainz ID matching for a song. (fetchMusicBrainzId) |
| PUT | /song/musicBrainzId/{id} |
id (path, PlatformUUID): The song unique identifier.musicBrainzId (query, PlatformUUID?, optional): The MusicBrainz Recording UUID. |
JSON UserSong? | JWT + EDIT | Link a song to its MusicBrainz Recording record. (setMusicBrainzId) |
| GET | /song/search |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.query (query, String): The search query.explicit (query, Boolean): Whether to include explicit content.liked (query, Boolean, optional): Only search within liked songs. |
JSON PaginatedResponse<UserSong> | JWT | Perform a ranked search for songs. (rankedSearch) |
| PUT | /song/song |
song (body, Song): The song with its updated editable fields. |
JSON UserSong? | JWT + EDIT | Update a song's editable metadata (title, artists and their credited names, MusicBrainz link, album, release date, track and disc number). (updateSong) |
| GET | /song/songIdsByAlbum/{albumId} |
albumId (path, PlatformUUID): The album unique identifier. |
SSE PlatformUUID |
JWT | Stream song IDs belonging to an album. (songIdsByAlbum) |
| GET | /song/songIdsByArtist/{artistId} |
artistId (path, PlatformUUID): The artist unique identifier. |
SSE PlatformUUID |
JWT | Stream song IDs belonging to an artist. (songIdsByArtist) |
| GET | /song/songIdsByPlaylist/{playlistId} |
playlistId (path, PlatformUUID): The playlist unique identifier. |
SSE PlatformUUID |
JWT | Stream song IDs belonging to a system playlist. (songIdsByPlaylist) |
| GET | /song/songIdsByUserPlaylist/{playlistId} |
playlistId (path, PlatformUUID): The user playlist unique identifier. |
SSE PlatformUUID |
JWT | Stream song IDs belonging to a user playlist. (songIdsByUserPlaylist) |
| DELETE | /song/songs |
ids (query, repeated, List<PlatformUUID>): Collection of song IDs to delete. |
JSON Boolean |
JWT + DELETE | Delete multiple songs from the library. (deleteSongs) |
| GET | /song/streamSize/{id} |
id (path, PlatformUUID): The song unique identifier. |
JSON Long |
JWT | Get the total size of the song's audio stream. (getStreamSize) |
| GET, HEAD | /song/streamSong/{id} |
id (path, PlatformUUID): The song unique identifier.offset (query, Long, optional): Byte offset to start streaming from.chunkSize (query, Int, optional): Size of each data chunk. |
FILE | JWT | Stream song audio data for playback. (streamSong) |
| GET, HEAD | /song/streamSongAtmos/{id} |
id (path, PlatformUUID): The song unique identifier.offset (query, Long, optional): Byte offset to start streaming from.chunkSize (query, Int, optional): Size of each data chunk. |
FILE | JWT | Stream the Dolby Atmos (E-AC-3 JOC in MP4) variant of a song. Returns null if the song has no Atmos variant. (streamSongAtmos) |
| GET | /song/superLikedSongIds |
explicit (query, Boolean): Whether to include explicit content. |
SSE PlatformUUID |
JWT | Stream all IDs of songs super liked by the current user, most recently super liked first. (superLikedSongIds) |
| GET | /song/superLikedSongs |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.explicit (query, Boolean): Whether to include explicit content. |
JSON PaginatedResponse<UserSong> | JWT | Get all songs super liked by the current user, most recently super liked first. (superLikedSongs) |
/storage — IStorageService
Monitoring of physical disk usage for the media library.
RPC reference: IStorageService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /storage/totalStorage |
- | JSON Long |
JWT | Calculate and return the total storage space consumed by the music library in bytes. (getTotalStorage) |
/subsonicCredential — ISubsonicCredentialService
Manages the current user's dedicated Subsonic credential used by Subsonic/OpenSubsonic clients.
RPC reference: ISubsonicCredentialService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /subsonicCredential/regenerateSubsonicCredential |
- | JSON SubsonicCredentialInfo | JWT | Generate a new Subsonic credential for the current user, replacing any existing one. (regenerateSubsonicCredential) |
| DELETE | /subsonicCredential/revokeSubsonicCredential |
- | JSON Boolean |
JWT | Delete the current user's Subsonic credential. Returns true if a credential was deleted. (revokeSubsonicCredential) |
| GET | /subsonicCredential/subsonicCredential |
- | JSON SubsonicCredentialInfo? | JWT | Get the current user's Subsonic credential, or null if none exists. (getSubsonicCredential) |
/timecodeTag — ITimecodeTagService
Stores the tags a user attaches to a song at a position in milliseconds, either as a chapter that names a section, as a marker that points at a single moment or as a free-form note. Tags are private to the user who created them, so they are never visible to anyone else, and a tag disappears together with the song it belongs to. The text of a tag holds at most 1000 characters and a user keeps at most 500 tags on a single song.
RPC reference: ITimecodeTagService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| DELETE | /timecodeTag/tag/{tagId} |
tagId (path, PlatformUUID): The tag to delete. |
JSON Boolean |
JWT | Delete a single tag of the user. Returns false if the tag does not exist or belongs to another user. (deleteTag) |
| PUT | /timecodeTag/tag/{tagId} |
tagId (path, PlatformUUID): The tag to change.tagType (query, TimecodeTagType): How the tag is meant to be read by a client.text (query, String, optional): The text of the tag. May be blank.timestampMs (query, Long): Position in the song in milliseconds at which the tag starts.endMs (query, Long?, optional): Position in the song in milliseconds at which the tag ends, or null for a tag that marks a single point.action (query, TimecodeTagAction?, optional): What the playing client does when playback reaches the tag, or null to keep the stored action.fade (query, Boolean?, optional): Whether the client fades in from the tag and fades out towards the tag around the action, or null to keep the stored value. |
JSON TimecodeTag | JWT | Overwrite a single tag of the user with new values. The call fails if the tag does not exist or belongs to another user. An action or fade flag left out keeps the stored value, and the resulting action must fit the type: PLAY_ONLY and SKIP need a chapter with an end position, SKIP_TO and PLAY_UNTIL need a marker without one, and a note only takes NONE. (updateTag) |
| GET | /timecodeTag/tags |
tagType (query, TimecodeTagType?, optional): Only return tags of this kind, or null for every kind.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of tags per page, at most 500. |
JSON PaginatedResponse<TimecodeTag> | JWT | Read the tags of the user across all songs, newest first, optionally narrowed down to a single kind of tag. (listTags) |
| GET | /timecodeTag/tags/{songId} |
songId (path, PlatformUUID): The song to read the tags of. |
JSON List<TimecodeTag> |
JWT | Read the tags the user attached to a song, ordered by the position they start at. (getTags) |
| POST | /timecodeTag/tags/{songId} |
songId (path, PlatformUUID): The song to attach the tag to.tagType (query, TimecodeTagType): How the tag is meant to be read by a client.text (query, String, optional): The text of the tag. May be blank.timestampMs (query, Long): Position in the song in milliseconds at which the tag starts.endMs (query, Long?, optional): Position in the song in milliseconds at which the tag ends, or null for a tag that marks a single point.action (query, TimecodeTagAction, optional): What the playing client does when playback reaches the tag.fade (query, Boolean, optional): Whether the client fades in from the tag and fades out towards the tag around the action. |
JSON TimecodeTag | JWT | Create a single tag on a song. The position must not be negative and an end position, if one is given, must not lie before the position the tag starts at. The action must fit the type: PLAY_ONLY and SKIP need a chapter with an end position, SKIP_TO and PLAY_UNTIL need a marker without one, and a note only takes NONE. (createTag) |
| PUT | /timecodeTag/tags/{songId} |
songId (path, PlatformUUID): The song whose tags are replaced.tags (body, List<TimecodeTagInput>): The tags to store for the song. An empty list removes every tag of the song. |
JSON List<TimecodeTag> |
JWT | Replace every tag the user has on a song with the supplied ones. The write is all-or-nothing, so either all tags are stored or none of them are, and an empty list clears the tags of the song. Each tag carries its action and fade flag, which follow the same rules as in createTag. (replaceTags) |
/ui — IUiService
Server-driven UI: lists, renders and drives slot, page and home-card contributions from the server and plugins. Text is localized using the Accept-Language header. Component trees are shaped to the X-Ui-Schema-Version header. Authorization is enforced per contribution.
RPC reference: IUiService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /ui/contributions |
kind (query, UiContributionKind?, optional): Filter by kind.slot (query, String?, optional): Filter by slot name. |
JSON List<UiContributionInfo> |
JWT | List UI contributions visible to the current user. (listContributions) |
| POST | /ui/dispatchHook |
event (body, UiHookEvent): The event. |
JSON List<UiHookHandler> |
JWT | Forward an app-level event (e.g. a shared URL). Returns every contribution offering to handle it. Perform the single action directly or let the user choose. An empty list means no server-side handler. Fall back to native behaviour then. (dispatchHook) |
| PUT | /ui/homeCardOrder |
contributionIds (query, repeated, List<String>): Pinned contribution ids in display order. |
JSON UiHomeLayout | JWT | Persist the order of the current user's pinned home cards. (setHomeCardOrder) |
| PUT | /ui/homeCardPinned/{contributionId} |
contributionId (path, String): HOME_CARD contribution id.pinned (query, Boolean): Whether the card should be pinned. |
JSON UiHomeLayout | JWT | Pin or unpin a home card for the current user. (setHomeCardPinned) |
| GET | /ui/homeCards |
- | JSON UiHomeLayout | JWT | Home-card layout of the current user, including cards available for pinning. (getHomeCards) |
| GET | /ui/hookHandlers |
kind (query, UiHookKind?, optional): Only handlers serving this kind. Null lists all. |
JSON List<UiHookHandlerInfo> |
JWT | List every handler that may offer to take hook events for the current user, without an input. Intake resolvers serve every kind. Contributions list the kinds they declare. Whether a handler accepts a specific event is only known from dispatchHook. (listHookHandlers) |
| POST | /ui/intake |
items (body, List<IntakeItem>): Items to submit.resolverId (query, String?, optional): Handler to use, from a previous NEEDS_CHOICE result. Null lets the server decide. |
JSON UiIntakeResult | JWT | Hand items (links, codes, ids, text) to the server. Unambiguous items are submitted immediately. When several handlers offer, NEEDS_CHOICE returns them and the client calls intake again with the chosen handler's action. Items nobody accepts are returned as rejected. (intake) |
| POST | /ui/invoke/{contributionId} |
contributionId (path, String): Contribution id.actionId (query, String): Action id from UiAction.Invoke.payload (body, UiInvokePayload): Values and context. |
JSON UiInvokeResult | JWT | Dispatch an action declared by a contribution, with form values and/or action parameters. (invoke) |
| POST | /ui/render/{contributionId} |
contributionId (path, String): Contribution id.context (body, UiContext): Host context. |
JSON UiRender | JWT | Render a single contribution. (render) |
| POST | /ui/renderSlot |
slot (query, String): Slot name, see UiSlots.context (body, UiContext): Host context of the slot. |
JSON UiSlotRender | JWT | Render all contributions registered for a slot that the current user may see, in display order. (renderSlot) |
| POST | /ui/resolveIntake |
items (body, List<IntakeItem>): Items to resolve. |
JSON List<UiHookHandler> |
JWT | List the handlers offering to take the items without submitting anything. (resolveIntake) |
| POST | /ui/search/{contributionId} |
contributionId (path, String): Id of the contribution that rendered the SearchField.key (query, String): Key of the SearchField.query (query, String): Text typed by the user.context (body, UiContext): Host context the contribution was rendered with. |
JSON List<UiOption> |
JWT | Options for a SearchField of a contribution that match the typed query, at most 50. (search) |
| GET | /ui/subscribe/{contributionId} |
contributionId (path, String): Contribution id.entityId (query, PlatformUUID?, optional): Host entity id, if the contribution is rendered on an entity screen. |
SSE UiRender | JWT | Stream re-renders of a contribution. Emits the current render immediately, then on every change. (subscribe) |
| GET | /ui/subscribeLive/{contributionId} |
contributionId (path, String): Contribution id.key (query, String): Key of the Live node.entityId (query, PlatformUUID?, optional): Host entity id, if the contribution is rendered on an entity screen. |
SSE UiLiveUpdate | JWT | Stream updates for a Live node of a contribution. Subscribe once per Live node while it is on screen. (subscribeLive) |
| POST | /ui/subscribeLiveWithContext/{contributionId} |
contributionId (path, String): Contribution id.key (query, String): Key of the Live node.context (body, UiContext): Host context, the same one passed to render. |
SSE UiLiveUpdate | JWT | Stream updates for a Live node of a contribution rendered with a full host context, including the params a page was opened with. Subscribe once per Live node while it is on screen. Prefer it over IUiService.subscribeLive, which only carries the entity id. (subscribeLiveWithContext) |
| POST | /ui/subscribeWithContext/{contributionId} |
contributionId (path, String): Contribution id.context (body, UiContext): Host context, the same one passed to render. |
SSE UiRender | JWT | Stream re-renders of a contribution rendered with a full host context, including the params a page was opened with. Emits the current render immediately, then on every change. Prefer it over IUiService.subscribe, which only carries the entity id. (subscribeWithContext) |
/userPlaylistBackup — IUserPlaylistBackupService
Personal playlist backup and restoration for individual users.
RPC reference: IUserPlaylistBackupService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| DELETE | /userPlaylistBackup/backup |
fileName (query, String): The name of the backup file. |
- | JWT | Delete a personal playlist backup file. (deleteBackup) |
| POST | /userPlaylistBackup/backup |
- | - | JWT | Create a backup of all playlists owned by the current user. (createBackup) |
| GET | /userPlaylistBackup/backupContent |
fileName (query, String): The name of the backup file. |
JSON UserPlaylistBackup? | JWT | Peek into the contents of a specific user playlist backup. (getBackupContent) |
| GET | /userPlaylistBackup/backups |
- | JSON List<BackupInfo> |
JWT | List all available playlist backup files for the current user. (listBackups) |
| POST | /userPlaylistBackup/restoreBackup |
fileName (query, String?, optional): Optional name of the backup file. If null, the latest backup is used. |
- | JWT | Restore user playlists from a backup file. (restoreBackup) |
/userPlaylist — IUserPlaylistService
Management of personal (user-created) playlists.
RPC reference: IUserPlaylistService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| POST | /userPlaylist/addAlbumToPlaylist/{id} |
id (path, PlatformUUID): The playlist unique identifier.albumId (query, PlatformUUID): The album unique identifier. |
- | JWT | Add all songs of an album to a user playlist. (addAlbumToPlaylist) |
| POST | /userPlaylist/addPlaylistToPlaylist/{id} |
id (path, PlatformUUID): The target playlist unique identifier.sourcePlaylistId (query, PlatformUUID): The source playlist unique identifier. |
- | JWT | Add all songs of a playlist to a user playlist. (addPlaylistToPlaylist) |
| POST | /userPlaylist/addSongsToPlaylist/{id} |
id (path, PlatformUUID): The playlist unique identifier.songIds (query, repeated, List<PlatformUUID>): Collection of song IDs to add. |
- | JWT | Add songs to a user playlist. (addSongsToPlaylist) |
| POST | /userPlaylist/addToPlaylist/{id} |
id (path, PlatformUUID): The playlist unique identifier.songIds (body, List<Pair<Long, PlatformUUID>>): Collection of song IDs and their added timestamps. |
- | JWT | Add songs to a user playlist. (addToPlaylist) |
| POST | /userPlaylist/addUserPlaylistToPlaylist/{id} |
id (path, PlatformUUID): The target playlist unique identifier.sourcePlaylistId (query, PlatformUUID): The source user playlist unique identifier. |
- | JWT | Add all songs of a user playlist to a user playlist. (addUserPlaylistToPlaylist) |
| GET | /userPlaylist/allPlaylists |
creator (query, PlatformUUID?, optional): Optional creator ID to filter by.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page. |
JSON PaginatedResponse<UserPlaylist> | JWT | Get all user playlists. (allPlaylists) |
| GET | /userPlaylist/byColor |
creator (query, PlatformUUID?, optional): Optional creator ID to filter by.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.color (query, Int): The target color in ARGB format.range (query, Int, optional): The allowed range (0-255). |
JSON PaginatedResponse<UserPlaylist> | JWT | Search for user playlists by color. (byColor) |
| GET | /userPlaylist/byId/{id} |
id (path, PlatformUUID): The playlist unique identifier. |
JSON UserPlaylist? | JWT | Get user playlist by ID. (byId) |
| GET | /userPlaylist/byIds |
ids (query, repeated, List<PlatformUUID>): Collection of playlist IDs. |
JSON List<UserPlaylist> |
JWT | Get multiple user playlists by their IDs. (byIds) |
| POST | /userPlaylist/orAddPlaylist/{userId} |
userId (path, PlatformUUID): The user ID who owns the playlist.customIdentifier (query, String?, optional): Optional unique string identifier from an external source.playlist (body, InsertablePlaylist): The initial playlist data. |
JSON PlatformUUID |
JWT | Create a new user playlist or retrieve an existing one by a custom identifier. (getOrAddPlaylist) |
| DELETE | /userPlaylist/playlist/{id} |
id (path, PlatformUUID): The playlist unique identifier. |
JSON Boolean |
JWT | Delete a user playlist. (delete) |
| POST | /userPlaylist/playlistFromArtists/{userId} |
userId (path, PlatformUUID): The user ID who owns the playlist.name (query, String): The name of the playlist.artistIds (query, repeated, List<PlatformUUID>): Collection of artist IDs.maxSongsPerArtist (query, Int, optional): Maximum number of songs per artist.sortStrategy (query, ArtistPlaylistSortStrategy, optional): Sorting strategy. |
JSON PlatformUUID |
JWT | Create a smart playlist based on artists. (createPlaylistFromArtists) |
| PUT | /userPlaylist/playlistImage/{id} |
id (path, PlatformUUID): The playlist unique identifier.imageId (query, PlatformUUID?, optional): The image unique identifier. |
JSON Boolean |
JWT | Set the cover image for a user playlist. (setPlaylistImage) |
| PUT | /userPlaylist/public/{id} |
id (path, PlatformUUID): The playlist unique identifier.isPublic (query, Boolean): Whether the playlist is public. |
JSON Boolean |
JWT | Make a user playlist public or private. A public playlist can be found and opened by every user, a private one only by its owner and the users it is shared with. Returns false when the playlist does not exist. (setPublic) |
| GET | /userPlaylist/search |
creator (query, PlatformUUID?, optional): Optional creator ID to filter by.page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page.query (query, String): The search query. |
JSON PaginatedResponse<UserPlaylist> | JWT | Search user playlists. (rankedSearch) |
| DELETE | /userPlaylist/share/{id} |
id (path, PlatformUUID): The playlist unique identifier.userId (query, PlatformUUID): The unique identifier of the user to remove. |
JSON Boolean |
JWT | Stop sharing a user playlist with a user. The owner can remove any share, and a user can remove their own to leave the playlist. Returns false when the playlist was not shared with that user. (removeShare) |
| PUT | /userPlaylist/share/{id} |
id (path, PlatformUUID): The playlist unique identifier.userId (query, PlatformUUID): The unique identifier of the user to share the playlist with.access (query, PlaylistAccess): What the user may do with the playlist. |
- | JWT | Share a user playlist with a user, or change the access of a user it is already shared with. Only the owner can do this, and the owner cannot be given a share. (setShare) |
| GET | /userPlaylist/sharedPlaylists |
page (query, Int, optional): Page index.pageSize (query, Int, optional): Number of items per page. |
JSON PaginatedResponse<UserPlaylist> | JWT | Get the user playlists that other users shared with the current user. (sharedPlaylists) |
| DELETE | /userPlaylist/songs/{id} |
id (path, PlatformUUID): The playlist unique identifier.songIds (query, repeated, List<PlatformUUID>): Collection of song IDs to remove. |
JSON Int |
JWT | Remove songs from a user playlist. (removeFromPlaylist) |
| POST | /userPlaylist/transferOwnership/{id} |
id (path, PlatformUUID): The playlist unique identifier.newOwnerId (query, PlatformUUID): The unique identifier of the user who becomes the owner. |
JSON Boolean |
JWT | Hand a user playlist over to another user. The previous owner keeps write access through a share. Returns false when the playlist or the new owner does not exist or the user already owns the playlist. (transferOwnership) |
/user — IUserService
Manages user profiles and identities.
RPC reference: IUserService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /user/allProfiles |
- | JSON List<UserProfile> |
JWT | List the name and avatar of every user on the server, ordered by username. (allProfiles) |
| GET | /user/allUsers |
- | JSON List<User> |
JWT + Admin | List all users on the server. (allUsers) |
| GET | /user/byId/{id} |
id (path, PlatformUUID): The unique UUID of the user. |
JSON User? | JWT | Look up a user by their unique ID. (byId) |
| GET | /user/byUsername |
username (query, String): The username of the user. |
JSON User? | JWT | Look up a user by their username. (byUsername) |
| PUT | /user/capabilities/{id} |
id (path, PlatformUUID): The UUID of the user.capabilities (query, repeated, List<UserCapability>): The new list of capabilities. |
- | JWT + Admin | Update the capabilities for a specific user. (setCapabilities) |
| PUT | /user/displayName |
name (query, String?, optional): The new display name. |
- | JWT | Update the current user's display name. (setDisplayName) |
| GET | /user/me |
- | JSON User | JWT | Get the profile of the current authenticated user. (me) |
| PUT | /user/profileImage |
bytes (body, ByteArray): The raw bytes of the image. |
- | JWT | Update the current user's avatar. (setProfileImage) |
| POST | /user/user |
user (body, AuthenticationRequest): The user data.isAdmin (query, Boolean, optional): Whether the user is an admin.capabilities (query, repeated, List<UserCapability>, optional): The initial capabilities of the user. |
JSON User? | JWT + Admin | Create a new user. (createUser) |
/import — IImportService
Management of the integrated media importer.
RPC reference: IImportService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /import/allImportServices |
- | JSON List<ImportBackend> |
JWT | Get all available importer backends. (allImportServices) |
| GET | /import/authUrl |
- | JSON String |
JWT + Admin | Get the Tidal OAuth authorization URL. (getAuthUrl) |
| GET | /import/currentImport |
- | JSON ImportQueueEntry? | JWT | Get the currently active import task. (currentImport) |
| GET | /import/existsByOriginalId/{id} |
id (path, PrefixedId): The original ID to check.type (query, Type, optional): The type of content. |
JSON Boolean |
JWT | Check if content with a specific original ID is already present in the library. (existsByOriginalId) |
| GET | /import/finishedImports |
- | JSON List<FinishedImportQueueEntry> |
JWT | Get a list of recently completed or failed import tasks. (finishedImports) |
| GET | /import/importAuthorized |
- | JSON Boolean |
JWT | Check if the importer is authorized. (importAuthorized) |
| PUT | /import/importCredentials |
backend (body, ImportBackend): The importer backend to configure.credentials (body, ImporterCredentials): The credentials to supply. |
- | JWT + Admin | Provide credentials to an importer backend that supports credential injection. (setImportCredentials) |
| POST | /import/importIds |
ids (query, repeated, List<PrefixedId>): Collection of IDs.type (query, Type, optional): The type of content (SONG, ALBUM, etc.).importer (body, ImportBackend?, optional): The importer to use. |
- | JWT + IMPORT | Queue content for import by its IDs. (importIds) |
| POST | /import/importLogin |
- | SSE String |
JWT + IMPORT | Trigger the OAuth login flow and stream the login URL. (importLogin) |
| GET | /import/importQueue |
- | JSON List<ImportQueueEntry> |
JWT | Get the list of pending import tasks in the queue. (importQueue) |
| GET | /import/importService |
- | JSON ImportBackend | JWT | Get the currently active importer backend. (getImportService) |
| PUT | /import/importService |
service (body, ImportBackend): The importer service to use. |
- | JWT + Admin | Set the preferred importer backend. (setImportService) |
| POST | /import/importUrls |
urls (query, repeated, List<String>): Collection of URLs, ISRCs, or UPCs. |
- | JWT + IMPORT | Queue content for import. Each entry may be a URL, an ISRC (track), or a UPC (album barcode). Codes are resolved to a supported importer (preferring the default). (importUrls) |
| GET | /import/importerCapabilities |
- | JSON Map<String, Set<ImporterCapability>> |
JWT | Get the capabilities supported by each importer backend, keyed by backend id. (getImporterCapabilities) |
| GET | /import/importerForUrl |
url (query, String): The URL to check. |
JSON ImportBackend? | JWT | Get the appropriate importer backend for a given URL. (getImporterForUrl) |
| POST | /import/killAllChildProcesses |
- | - | JWT + Admin | Immediately stop all active importer processes. (killAllChildProcesses) |
| GET | /import/logs |
- | SSE LogLine | JWT | Stream real-time import logs from active processes. (logs) |
| POST | /import/syncFavourites |
- | - | JWT + IMPORT | Synchronize favorites with the local library. (syncFavourites) |
| GET | /import/syncFavouritesAvailable |
- | JSON Boolean |
JWT | Check if favorite synchronization is available. (syncFavouritesAvailable) |
| GET | /import/tidalSyncAuthorized |
- | JSON Boolean |
JWT | Check if Tidal favorite synchronization is authorized. (tidalSyncAuthorized) |
| GET | /import/tracks |
query (query, String?, optional): General search query.title (query, String?, optional): Filter by track title.artist (query, String?, optional): Filter by artist name.count (query, Int, optional): Maximum number of results. |
JSON List<ImportSong> |
JWT | Search for tracks directly. (search) |
/linkResolver — ILinkResolverService
Find links to a song or album on other streaming platforms.
RPC reference: ILinkResolverService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /linkResolver/resolvePlatformLinks |
urls (query, repeated, List<String>, optional): Links to the song or album on a streaming platform.isrc (query, String?, optional): The ISRC of the song.upc (query, String?, optional): The UPC or EAN barcode of the album. |
JSON List<String> |
JWT | Resolve links to the same song or album on other platforms without touching the library. The ISRC is tried first, then the UPC, then each seed URL in order. Returns an empty list when nothing resolves. (resolvePlatformLinks) |
/metadata — IMetadataService
Service for fetching metadata from external sources.
RPC reference: IMetadataService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /metadata/allMetadataTypes |
features (query, repeated, Set<Feature>, optional): Optional set of features that must be supported by the provider. |
JSON List<MetadataType> |
JWT | Get all registered metadata providers, optionally filtered by supported features. (allMetadataTypes) |
| GET | /metadata/{type}/albumByBarcode |
type (path, MetadataType): The metadata provider to use.barcode (query, String): The barcode. |
JSON Album? | JWT | Get an album by its barcode. (getAlbumByBarcode) |
| GET | /metadata/{type}/albumByMbId/{mbId} |
type (path, MetadataType): The metadata provider to use.mbId (path, PlatformUUID): The MusicBrainz Album (Release) UUID. |
JSON Album? | JWT | Get an album by its MusicBrainz ID. (getAlbumByMbId) |
| GET | /metadata/{type}/albumExistsById/{albumId} |
type (path, MetadataType): The metadata provider to use.albumId (path, String): The external album ID. |
JSON Boolean |
JWT | Check if an album exists by its external ID. (albumExistsById) |
| GET | /metadata/{type}/albumIdByTrackId/{trackId} |
type (path, MetadataType): The metadata provider to use.trackId (path, String): The external track ID. |
JSON String? |
JWT | Get the album ID for a given track ID. (getAlbumIdByTrackId) |
| GET | /metadata/{type}/albums |
type (path, MetadataType): The metadata provider to use.query (query, String): The search query.limit (query, Int, optional): Maximum number of results to return.includeTracks (query, Boolean, optional): Whether to include tracks in the album results. |
JSON List<Album> |
JWT | Search for albums on the specified metadata provider. (searchAlbums) |
| GET | /metadata/{type}/albumsByIds |
type (path, MetadataType): The metadata provider to use.albumIds (query, repeated, List<String>): List of external album IDs. |
JSON List<Album> |
JWT | Get multiple albums by their external IDs. (getAlbumsByIds) |
| GET | /metadata/{type}/artistByMbId/{mbId} |
type (path, MetadataType): The metadata provider to use.mbId (path, PlatformUUID): The MusicBrainz Artist UUID. |
JSON Artist? | JWT | Get an artist by their MusicBrainz ID. (getArtistByMbId) |
| GET | /metadata/{type}/artists |
type (path, MetadataType): The metadata provider to use.query (query, String): The search query.limit (query, Int, optional): Maximum number of results to return. |
JSON List<Artist> |
JWT | Search for artists on the specified metadata provider. (searchArtists) |
| GET | /metadata/{type}/artistsByIds |
type (path, MetadataType): The metadata provider to use.artistIds (query, repeated, List<String>): List of external artist IDs. |
JSON List<Artist> |
JWT | Get multiple artists by their external IDs. (getArtistsByIds) |
| GET | /metadata/{type}/imageUrlByAlbumId/{albumId} |
type (path, MetadataType): The metadata provider to use.albumId (path, String): The external album ID. |
JSON List<Image> |
JWT | Get image URLs for a given album ID. (getImageUrlByAlbumId) |
| GET | /metadata/{type}/imageUrlByAlbumMbId/{mbId} |
type (path, MetadataType): The metadata provider to use.mbId (path, PlatformUUID): The MusicBrainz Album (Release) UUID. |
JSON List<Image> |
JWT | Get image URLs for an album by its MusicBrainz ID. (getImageUrlByAlbumMbId) |
| GET | /metadata/{type}/imageUrlByArtistMbId/{mbId} |
type (path, MetadataType): The metadata provider to use.mbId (path, PlatformUUID): The MusicBrainz Artist UUID. |
JSON List<Image> |
JWT | Get image URLs for an artist by their MusicBrainz ID. (getImageUrlByArtistMbId) |
| GET | /metadata/{type}/imageUrlByImageId/{imageId} |
type (path, MetadataType): The metadata provider to use.imageId (path, PlatformUUID): The image UUID. |
JSON String? |
JWT | Get the URL for a cached image by its ID. (getImageUrlByImageId) |
| GET | /metadata/{type}/imageUrlByTrackMbId/{mbId} |
type (path, MetadataType): The metadata provider to use.mbId (path, PlatformUUID): The MusicBrainz Track (Recording) UUID. |
JSON List<Image> |
JWT | Get image URLs for a track by its MusicBrainz ID. (getImageUrlByTrackMbId) |
| GET | /metadata/{type}/imageUrlsByAlbumIds |
type (path, MetadataType): The metadata provider to use.albumIds (query, repeated, List<String>): List of external album IDs. |
JSON Map<String, List<Image>> |
JWT | Get image URLs for multiple album IDs. (getImageUrlsByAlbumIds) |
| GET | /metadata/{type}/supportedFeatures |
type (path, MetadataType): The metadata provider to check. |
JSON Set<Feature> |
JWT | Get the list of features supported by the specified metadata provider. (getSupportedFeatures) |
| GET | /metadata/{type}/trackById/{trackId} |
type (path, MetadataType): The metadata provider to use.trackId (path, String): The external track ID. |
JSON Track? | JWT | Get a track by its external ID. (getTrackById) |
| GET | /metadata/{type}/trackByIsrc |
type (path, MetadataType): The metadata provider to use.isrc (query, String): The ISRC. |
JSON Track? | JWT | Get a track by its ISRC. (getTrackByIsrc) |
| GET | /metadata/{type}/trackByMbId/{mbId} |
type (path, MetadataType): The metadata provider to use.mbId (path, PlatformUUID): The MusicBrainz Track (Recording) UUID. |
JSON Track? | JWT | Get a track by its MusicBrainz ID. (getTrackByMbId) |
| GET | /metadata/{type}/tracks |
type (path, MetadataType): The metadata provider to use.query (query, String): The search query.limit (query, Int, optional): Maximum number of results to return. |
JSON List<Track> |
JWT | Search for tracks on the specified metadata provider. (search) |
| GET | /metadata/{type}/tracksByIds |
type (path, MetadataType): The metadata provider to use.trackIds (query, repeated, List<String>): List of external track IDs. |
JSON List<Track> |
JWT | Get multiple tracks by their external IDs. (getTracksByIds) |
/musicBrainz — IMusicBrainzService
Fetch raw metadata records directly from the MusicBrainz database.
RPC reference: IMusicBrainzService
| Method | Path | Parameters | Response | Auth | Description |
|---|---|---|---|---|---|
| GET | /musicBrainz/artist/{id} |
id (path, PlatformUUID): The MusicBrainz Artist UUID. |
JSON MusicBrainzArtist? |
JWT | Retrieve a MusicBrainz Artist record. (getArtist) |
| GET | /musicBrainz/recording |
title (query, String): The title of the recording.artists (query, repeated, List<String>): The artists of the recording. |
JSON MusicBrainzRecording? |
JWT | Search for a recording on MusicBrainz. (searchRecording) |
| GET | /musicBrainz/recording/{id} |
id (path, PlatformUUID): The MusicBrainz Recording UUID. |
JSON MusicBrainzRecording? |
JWT | Retrieve a MusicBrainz Recording record by its MusicBrainz Recording UUID. (getRecording) |
| GET | /musicBrainz/recordingByIsrc |
isrc (query, String): The ISRC. |
JSON MusicBrainzRecording? |
JWT | Retrieve a MusicBrainz Recording record by its ISRC. (getRecordingByIsrc) |
| GET | /musicBrainz/release |
title (query, String): The title of the release.artists (query, repeated, List<String>): The artists of the release. |
JSON MusicBrainzRelease? |
JWT | Search for a release (album) on MusicBrainz. (searchRelease) |
| GET | /musicBrainz/release/{id} |
id (path, PlatformUUID): The MusicBrainz Release UUID. |
JSON MusicBrainzRelease? |
JWT | Retrieve a MusicBrainz Release record. (getRelease) |
| GET | /musicBrainz/releaseByBarcode |
barcode (query, String): The barcode (UPC/EAN).artists (query, repeated, List<String>): The artists of the release. |
JSON MusicBrainzRelease? |
JWT | Search for a release by barcode on MusicBrainz. (searchReleaseByBarcode) |
| GET | /musicBrainz/releaseGroup/{id} |
id (path, PlatformUUID): The MusicBrainz Release Group UUID. |
JSON MusicBrainzReleaseGroup? |
JWT | Retrieve a MusicBrainz Release Group record. (getReleaseGroup) |
| GET | /musicBrainz/releasesByReleaseGroup/{id} |
id (path, PlatformUUID): The MusicBrainz Release Group UUID. |
JSON List<MusicBrainzRelease> |
JWT | Retrieve all releases in a MusicBrainz Release Group. (getReleasesByReleaseGroup) |