Tobias Reithmeier

Blog

The Subsonic API: Navidrome, Gonic and Ampache Compared

If you research self-hosted music servers, you will almost inevitably end up at Navidrome, and fair enough: it is lightweight, runs on a Raspberry Pi and is actively developed. The more interesting part, though, is the protocol it speaks, the Subsonic API. That API is the reason choosing a server and choosing an app are two separate decisions. Switch the server, keep the app. Switch the app, keep the server.

This post sorts out what that API actually is, what it guarantees, what it does not, and where you notice in everyday use that two "Subsonic compatible" servers are not identical after all.

Short answer

  • The Subsonic API is the REST-style protocol of the original Subsonic server. The last official release is version 1.16.1.
  • Navidrome, Gonic, Airsonic-Advanced, Ampache and others implement it independently, which is why the same app works with all of them.
  • Guaranteed are the basics: browsing the library, streaming, playlists, scrobble reports.
  • Not guaranteed are the details: transcoding formats, playlist storage, scrobbling targets, modern authentication.
  • OpenSubsonic is the community continuation that closes these gaps step by step, without breaking compatibility.
  • On the iPhone, this means you pick the app for your daily use, not for the server. CLAUDIO, my own app, plays Navidrome and other Subsonic servers alongside Jellyfin, Audiobookshelf and NAS shares in one library. Your own servers need Ultra (subscription) or the one-time Pro+ there.

Where the API comes from

Subsonic was a media server from the era before Spotify: self-hosted music, a web interface, mobile apps. So that third-party apps could talk to the server, there was a documented REST interface: requests as plain HTTP calls, responses as XML or JSON. The last version of the official API is 1.16.1, shipped with Subsonic 6.1.4. After that, little happened upstream; the server itself eventually required a premium license for API access.

The API outlived its server. Because it was documented, simple and stable over many years, free reimplementations appeared, first as direct forks and later as complete rewrites. The fork lineage can still be traced today: Subsonic became Libresonic, Libresonic became Airsonic, and in late 2019 that spawned Airsonic-Advanced. Navidrome and Gonic, by contrast, share no code with the original at all; they merely implement the same protocol.

Who speaks it today

The list is longer than you might expect. The best-known servers:

  • Navidrome is the most popular one, frugal with resources, with transcoding, smart playlists and scrobbling to Last.fm and ListenBrainz.
  • Gonic is a deliberately lean implementation in Go, with transcoding via ffmpeg and playlists stored as M3U files.
  • Airsonic-Advanced is the actively maintained branch of the fork lineage, Java-based, with podcast and Chromecast features.
  • Ampache is a web streaming project that has existed since 2001. It has its own API and offers the Subsonic API in addition, compatible with version 1.16.1.

According to the OpenSubsonic documentation, the list also includes Nextcloud Music, LMS and Supysonic, among others. The client side shows the same variety: from Amperfy to Symfonium to Feishin, plus, on iOS, the apps I compared in the Navidrome post. That matrix is the whole point: any app from one list fundamentally works with any server from the other.

What the API covers and what it does not

The guaranteed core is modest, and robust precisely because of that. The API defines endpoints for browsing the library (by folder structure or by ID3 tags), streaming and downloading tracks, creating, updating and deleting playlists, reporting played tracks ("scrobbling"), and searching across artists, albums and songs. Responses come as XML or JSON, and since API 1.13.0 authentication uses a token scheme: the app sends an MD5 hash of password plus a random salt instead of the password in cleartext.

What the API does not specify matters at least as much:

  • How a server transcodes. The stream endpoint has parameters for bitrate and target format, but whether and how the server honors them is up to the implementation.
  • Where playlists live. The API describes the operations, not the storage.
  • Where scrobbles go. The app only reports "this track was played". Whether that becomes an entry on Last.fm or ListenBrainz is the server's business.
  • Much of what modern apps need: lyrics, cover art in multiple resolutions, secure authentication. That is what OpenSubsonic is for.

OpenSubsonic: the living part of the standard

Because the original has been frozen at version 1.16.1, server and client projects agreed on a shared continuation: OpenSubsonic. The specification extends the old API without breaking it: an OpenSubsonic server keeps working with old apps, and an OpenSubsonic app keeps working with old servers.

The mechanism behind it is a single new endpoint: getOpenSubsonicExtensions. Through it, a server announces which extensions it supports, and the app adapts. The documentation currently lists 28 extensions, including API key authentication as a replacement for the old MD5 scheme, lyrics via dedicated endpoints, and more precise playback reporting. Every extension is optional, so support varies from server to server.

Where you notice the differences in practice

"Subsonic compatible" means the shared core works. Four areas still reveal which server is actually answering.

Transcoding. Navidrome transcodes on the fly and can be configured per user and per playing device, including Opus as a target format. Gonic transcodes too, but requires ffmpeg to be installed. If you stream on the go with a capped bitrate, this is where you first notice which server is on the other end, and whether it is configured correctly.

Playlists. Gonic stores playlists as M3U files in the file system; other servers keep them in their database. The app never sees the difference. But it decides whether other tools can read the same playlists and what a server migration takes along.

Scrobbling. Navidrome and Gonic forward playback reports to Last.fm and ListenBrainz if that is set up server-side. Some apps scrobble directly instead, bypassing the server. If you wonder why plays arrive twice or not at all, this seam is where to look.

Authentication and API flavors. The classic token scheme dates from another era; OpenSubsonic adds API keys as an alternative. How far implementations may drift apart is illustrated by Ampache: version 8 answers in the OpenSubsonic style by default and offers a switch back to plain Subsonic 1.16.1 responses for apps that do not expect the extensions.

What this means for your setup

The practical consequence is calm. You can start with Navidrome and later move to Gonic because resource usage starts to matter more. The app on your phone stays the same; only the server URL changes. Or you keep the server and try apps until one fits. Server and client are decoupled by the API; neither decision locks you in.

Which iOS app fits which setup is compared in detail in the Navidrome post. If you want the decoupling to reach all the way to your phone, CLAUDIO is the natural choice. My privacy-focused player treats Subsonic-compatible servers as one source next to Jellyfin, Audiobookshelf, NAS shares and local files. Even if you leave the Subsonic world entirely and move from Navidrome to Jellyfin, the app stays the same and only the source changes. Favorites sync with Navidrome in both directions. CLAUDIO reports played tracks to Navidrome and Subsonic servers once per playback, and if the server forwards to Last.fm or ListenBrainz, they arrive there too. Your own servers need Ultra (subscription) or Pro+ (one-time purchase); local files and iCloud Drive are free.

FAQ

Does every Subsonic app work with every Subsonic server? The shared core, yes: browsing, streaming, playlists, scrobble reports. Differences show up in transcoding, extensions and authentication.

Is OpenSubsonic a new protocol? No, a backward-compatible extension. Servers announce their additional capabilities via getOpenSubsonicExtensions; everything else stays as it was.

Do I have to set up my app again after switching servers? Only the connection: new URL, new credentials. Offline downloads and app-side settings depend on the individual app.

Do I still need the original Subsonic server? For a new setup, there is little reason. The free implementations cover the API and are actively developed.

Read on

Which iOS app fits your server? → Navidrome on iPhone: The Best iOS Apps Music sits directly on the NAS, no server software at all? → NAS music on iPhone Why self-host in the first place? → Music players without tracking

Sources


Full disclosure: I develop CLAUDIO, a privacy-focused audio player that supports Subsonic-compatible servers as one of its sources. This post is about the API and the server landscape; for the app comparison, see the Navidrome post.