Odesli hat sein Entwickler-API geschlossen, und was das für uns bedeutet
Songlink/Odesli war jahrelang die Standardantwort auf die Frage, wie man einen Song auf allen Diensten findet. Zum 31. Juli 2026 ist das öffentliche Entwickler-API geschlossen worden, und es antwortet heute anders, als die Ankündigung es versprochen hat. Die Website läuft davon unberührt weiter, samt Freitextsuche und Live-Ergebnissen. Dieses Paper vergleicht deshalb nicht zwei Produkte, sondern zwei Angebote an Entwickler, und es sagt an jeder Stelle, worauf sich eine Aussage stützt. Vier der Befunde sprechen gegen uns.
Inhalt
- Gegenstand und Abgrenzung
- Was abgeschaltet wurde
- Was heute zurückkommt
- Was weiterhin läuft
- Der Vergleich auf Entwicklerebene
- Wo wir nicht besser sind
- Was aus diesem Paper nicht folgt
- Was daraus folgt
- Grundlage
Danach folgt der Anhang mit den geprüften Belegen und den Befehlen, mit denen sich jede Zahl nachstellen lässt.
1. Gegenstand und Abgrenzung
Unter dem Namen Odesli stehen drei verschiedene Dinge, und sie sind unterschiedlich zugänglich, unterschiedlich dokumentiert und unterschiedlich verbindlich. Wer sie in einem Satz zusammenfasst, sagt fast zwangsläufig etwas Falsches. Dieses Paper trennt sie deshalb von Anfang an und vergleicht ausschliesslich die erste Ebene.
| Ebene | Adresse | Dokumentiert | Zustand |
|---|---|---|---|
| Öffentliches Entwickler-API | api.song.link/v1-alpha.1 | ja, als Notion-Seite | geschlossen, antwortet mit 401 |
| Backend der eigenen Website | api.odesli.co | nein, in keiner auffindbaren Dokumentation | antwortet ohne Schlüssel |
| Die Website selbst | song.link, leitet auf odesli.co | entfällt | läuft unverändert |
Verglichen wird die erste Ebene, weil nur sie ein Angebot an Entwickler ist. Sie war dokumentiert, sie hatte Nutzungsbedingungen, eine Versionierung und eine Zusage über Änderungen, und auf so etwas baut man ein Produkt. Die zweite Ebene ist das Innere einer fremden Website. Sie ist erreichbar, aber sie ist niemandem versprochen, sie kann sich morgen ändern, und wer darauf baut, baut auf etwas, das ihm nicht angeboten wurde. Sie kommt in diesem Paper nur dort vor, wo ausdrücklich dabeisteht, dass es um sie geht.
Die dritte Ebene ist für den Vergleich unerheblich und für das Verständnis wesentlich, weil sie erklärt, warum Odesli für die meisten Menschen weiterhin funktioniert und die Schliessung trotzdem einschneidend ist.
Wofür dieses Paper gedacht ist
Aus diesen Befunden soll ein öffentlicher Text entstehen. Was hier steht, ist deshalb auch dort ausgeschrieben, wo es gegen uns spricht, und jede Aussage trägt die Ebene, auf der sie gilt. Die erste Gegenprobe eines Lesers ist ein Aufruf mit curl oder ein Besuch auf song.link, und beide muss der Text aushalten.
2. Was abgeschaltet wurde
Songlink/Odesli gehört seit August 2021 zu Linktree, und die API-Dokumentation liegt entsprechend in einem Notion-Bereich von Linktree. Sie trägt einen Hinweis, der den gesamten Namensraum v1-alpha.1 für stillgelegt erklärt, mit dem 31. Juli 2026 als Abschalttermin. Danach, so die Ankündigung, sollen alle Endpunkte dieses Namensraums mit 410 Gone antworten.
Der Zugang ist damit nicht enger, sondern zu. Die Seite sagt, dass keine API-Schlüssel mehr ausgegeben werden. Wer weiterarbeiten will, füllt ein Formular aus und muss einen dauerhaften, berechtigten Bedarf darlegen. Die Landingpages unter song.link und album.link sind ausdrücklich ausgenommen.
Was dort geschlossen wurde, war ein einziger Endpunkt, GET /links. Er nahm entweder eine URL oder ein Tripel aus Plattform, Typ und Kennung, kannte als Typ song und album, und war ohne Schlüssel auf zehn Anfragen pro Minute je Adresse begrenzt. Ein Schlüssel war optional und hob die Grenze.
3. Was heute zurückkommt
Angekündigt war 410 Gone. Geliefert wird etwas anderes. Drei Anfrageformen, am 4. September 2026 gegen den laufenden Dienst gestellt, antworten gleich.
| Anfrage | Status | Rumpf |
|---|---|---|
Spotify-URI als url | 401 | PUBLIC_API_ACCESS_DEPRECATED |
Apple-Music-URL als url | 401 | PUBLIC_API_ACCESS_DEPRECATED |
platform plus type plus id | 401 | PUBLIC_API_ACCESS_DEPRECATED |
Der Unterschied zwischen 401 und 410 ist für die betroffene Software erheblich. Ein 410 sagt einem Client, dass diese Ressource endgültig fort ist, und ein sorgfältig geschriebener Client hört daraufhin auf zu fragen. Ein 401 sagt, dass die Anmeldung fehlt, und darauf ist jede Wiederholungslogik ausgelegt: sie versucht es erneut. Der Fehlercode im Rumpf steht in keiner auffindbaren Dokumentation.
4. Was weiterhin läuft
Dieser Abschnitt steht hier, damit der Vergleich in Abschnitt 5 nicht mehr behauptet, als er trägt.
song.link leitet auf odesli.co weiter, und dort steht ein Suchfeld mit der Aufforderung, zu suchen oder eine Adresse einzufügen. Eine Freitextsuche liefert dort Ergebnisse, während man tippt. Eine Seite zu einer aufgelösten Aufnahme, abgerufen am 4. September 2026, führte siebzehn Einträge auf: Amazon Music, Anghami, Apple Music, Audiomack, Audius, Boomplay, Deezer, iTunes, Napster, Pandora, SoundCloud, Spinrilla, Spotify, Tidal, Yandex, YouTube und YouTube Music.
Die Suche wird von der zweiten Ebene bedient, also vom Backend der Website unter api.odesli.co. Dieser Endpunkt antwortete am 4. September 2026 ohne Schlüssel. Er ist in keiner Dokumentation beschrieben, die sich finden liess, und er ist damit kein Angebot an Entwickler, sondern das Innere einer fremden Anwendung.
Für einen Menschen mit einem Browser hat sich also nichts geändert. Für jedes Programm, das auf dem dokumentierten Weg gebaut hat, alles.
5. Der Vergleich auf Entwicklerebene
Alle Aussagen dieses Abschnitts beziehen sich auf das, was Entwicklern angeboten wurde und wird, also auf Ebene eins gegen unser eigenes API. Wo eine Aussage aus der Dokumentation stammt und nicht aus einer Messung, steht das dabei.
5.1 Ein Schlüssel ist zu bekommen
Das ist der Punkt, auf den es kurzfristig ankommt. Bei Odesli steht am Ende ein Formular und die Prüfung, ob der Bedarf berechtigt und dauerhaft ist. Bei uns entsteht jede Registrierung sofort, ohne dass ein Mensch dazwischensteht, und der Plan ist bis auf Weiteres kostenlos. Das ist die Entscheidung aus PAP-MC-003, Abschnitt 1.1: Missbrauch wird über Kontingente und über den Entzug einzelner Zugangsdaten begrenzt statt über eine Prüfung vorab.
5.2 Wir sagen, wie sicher ein Treffer ist
Die dokumentierte Antwort des Entwickler-API führt je Plattform eine Adresse. Ob ein Treffer über eine eindeutige Kennung gefunden oder über eine Textsuche geschätzt wurde, geht aus ihr nicht hervor, und ein Client kann es nicht unterscheiden. Die Antwortbeschreibung führt kein Feld, das darüber Auskunft gäbe.
Jeder Treffer bei uns trägt zwei Felder dafür: matchMethod nennt den Weg, confidence den Grad. Bei dem Titel, den Odeslis eigene Dokumentation als Beispiel führt, kamen am 4. September 2026 fünf Treffer über die ISRC mit Konfidenz 1 zurück und vier über eine Suche mit Werten zwischen 0,5 und 1. Ein Client, der nur Sicheres zeigen will, filtert und bekommt die fünf. Abschnitt 6.3 hält fest, warum diese Skala noch nicht hält, was sie verspricht.
5.3 Andere Weltregionen
Bei uns waren am 4. September 2026 achtzehn Dienste aktiv, abgefragt über unseren öffentlichen Endpunkt für aktive Dienste. Odeslis dokumentierte Plattformliste zählt einundzwanzig Kennungen, von denen mehrere denselben Dienst bedienen, weil ein Apple-Treffer zugleich itunes und appleMusic trägt und ein YouTube-Treffer zugleich youtube und youtubeMusic. Zusammengefasst bleiben siebzehn Dienste, und die Seite aus Abschnitt 4 führte dieselbe Zahl an Einträgen.
Die Zahlen liegen also nah beieinander, die Zusammensetzung nicht.
| Nur bei uns | Nur bei Odesli |
|---|---|
| Qobuz | Amazon Music und Amazon Store |
| NetEase Cloud Music (China) | Yandex Music |
| QQ Music (China) | Anghami |
| Melon (Korea) | Napster |
| Bugs! (Korea) | Spinrilla |
| JioSaavn (Indien) | |
| Beatport |
Amazon ist der einzige Eintrag in der rechten Spalte, den ich für einen echten Verlust halte. Die Dokumentation führt zusätzlich google und googleStore für Google Play Music, das Ende 2020 abgeschaltet wurde. Auf der abgerufenen Seite erscheinen beide nicht, es ist also die Dokumentation, die veraltet ist, und nicht das Produkt.
5.4 Angaben zur Aufnahme
Die linke Spalte beschreibt die dokumentierte Antwort des Entwickler-API, nicht das, was die Website ihrem eigenen Client liefert. Der Unterschied ist erheblich und steht in Abschnitt 7.
| Feld | Odesli, dokumentiert | musiccloud, gemessen |
|---|---|---|
| Titel und Künstler | ja | ja |
| Titelbild | ja | ja |
| ISRC | nein | ja |
| Albumname | nein | ja |
| Spieldauer | nein | ja |
| Erscheinungsdatum | nein | ja |
| Hörprobe | nein | ja |
| Explicit-Kennzeichen | nein | ja |
| Sicherheit des Treffers | nein | ja |
5.5 Anfrageformen
Das Entwickler-API kannte eine Anfrageform: eine Adresse oder ein Tripel aus Plattform, Typ und Kennung. Wer eine Aufnahme nur dem Namen nach kannte, konnte sie darüber nicht finden. Freitextsuche gehörte nicht zu dem, was Entwicklern angeboten wurde, obwohl die Website sie kann und immer konnte.
Unser Resolve nimmt zusätzlich freien Text sowie eine strukturierte Suche über title:, artist: und album:, und wo mehrere Aufnahmen in Frage kommen, kann ein Client sich die Kandidaten geben lassen und auswählen.
5.6 Partnerkennzeichen
In der dokumentierten Beispielantwort hängt an der Amazon-Adresse ein Partnerkennzeichen und an den beiden Apple-Adressen ebenfalls eines. Wer solche Adressen im eigenen Produkt anzeigt, verdient damit für den Anbieter mit, und in der Dokumentation steht das an keiner Stelle. Ob heute noch so ausgeliefert würde, lässt sich nicht prüfen, weil das API nicht mehr antwortet.
Eine Suche über unser gesamtes Repository nach Partnerkennzeichen und Affiliate-Parametern findet nichts. Unsere Apple-Adresse zum selben Titel trägt keine angehängten Parameter.
5.7 Ein maschinenlesbarer Vertrag
Das Entwickler-API war eine Notion-Seite ohne maschinenlesbare Beschreibung. Wir veröffentlichen ein OpenAPI-Dokument nach 3.1.0 unter einer festen Adresse, aus dem sich ein Client in jeder Sprache erzeugen lässt.
6. Wo wir nicht besser sind
Nachtrag vom 6. September 2026: die vier Befunde sind behoben
Die vier Abschnitte darunter beschreiben den Stand vom 4. September und bleiben so stehen, weil ein Befund einen Zeitpunkt festhält. Alle vier sind inzwischen umgesetzt und gegen die Produktion nachgemessen.
- 6.1 Ein wiederholter Resolve kostet 0,090 statt 3 bis 5 Sekunden und liegt damit auf dem Niveau des Share-Abrufs. Der Faktor dreissig ist weg.
- 6.2 Ein Treffer, dessen Adresse auf eine Suchseite zeigt, trägt jetzt
search-fallbackals Methode und ist damit vom echten Suchtreffer unterscheidbar. Auch die 5427 bereits gespeicherten Zeilen. - 6.3 Die Skala ist eindeutig: eine Konfidenz von 1 kommt nie aus einer Suche. 28157 gespeicherte Zeilen, die das behaupteten, sind umgestellt.
- 6.4 Das Portal bietet keine SDKs mehr an, und der Eintrag, der ins Leere führte, ist fort.
Zwei Dinge kamen dabei heraus, die niemand geplant hatte: der Herkunftslink war in allen drei Resolvern als Fundmethode etikettiert, die es nie gab, und der schlüssellose Resolve wies Album- und Artist-Adressen ab. Beides ist mit behoben.
6.1 Wir sind langsam
Das ist der Befund, der einem öffentlichen Text am gefährlichsten wird, weil ihn jeder Leser in fünf Sekunden nachmisst. Ein Resolve dauert bei uns drei bis fünf Sekunden, auch dann, wenn derselbe Titel bereits aufgelöst und gespeichert ist.
| Aufruf | Sekunden |
|---|---|
| Resolve, Titel zum ersten Mal | 4,74 |
| Resolve, derselbe Titel erneut | 3,52 |
| Resolve, derselbe Titel ein drittes Mal | 2,90 |
| Resolve, zweiter Titel zum ersten Mal | 5,32 |
| Resolve, zweiter Titel erneut | 3,44 |
| Share-Abruf desselben Datensatzes | 0,10 |
Die letzte Zeile ist der Massstab. Derselbe Datensatz, aus derselben Datenbank, über den Share-Endpunkt gelesen, braucht ein Zehntel einer Sekunde. Ein wiederholter Resolve auf eine bereits bekannte Adresse braucht das Dreissigfache. Wofür diese Zeit verbraucht wird, ist mit dieser Messung nicht bestimmt; dass sie verbraucht wird, schon. Zum Vergleich antwortete Odeslis Website-Backend auf eine Freitextsuche in 1,20 Sekunden, wobei das eine Suche ist und kein Resolve, also keine gleichartige Aufgabe.
6.2 Ein Treffer, der auf eine Suchseite zeigt
Bei dem Testtitel liefert unser YouTube-Treffer die Adresse music.youtube.com/search?q=Kid+Cudi+Kitchen in demselben Feld, in dem sonst die Adresse der Aufnahme steht. Das ist keine Aufnahme, das ist eine Suche danach. Ein Client, der das Feld anzeigt, schickt seinen Nutzer auf eine Ergebnisliste. Bei einem zweiten Titel liefert derselbe Adapter eine richtige Videoadresse, es ist also ein Rückfall und kein Dauerzustand. Odeslis Dokumentation führt für genau diesen Titel eine Videoadresse.
6.3 Konfidenz 1 aus einer Textsuche
Beim Testtitel kommt der NetEase-Treffer mit matchMethod: search und confidence: 1 zurück, beim zweiten Titel mit 0,968. Eine Eins aus einer Textsuche steht damit gleichauf mit einer Eins aus einem ISRC-Abgleich, obwohl das zwei verschiedene Grade von Gewissheit sind. Solange wir die Konfidenz als Vorzug führen, muss die Skala über alle Adapter dasselbe bedeuten.
6.4 Das Portal bietet SDKs an, die es nicht gibt
In der API-Referenz des Portals steht ein Navigationseintrag "SDK downloads". Sein Anker hat im gesamten Portal kein Ziel. Daneben liegt ein eingecheckter Katalog, der fünf Clients für TypeScript, Python, Swift, PHP und Go benennt, mitsamt Paketnamen. Keines dieser Pakete existiert: npm, PyPI und Packagist antworten mit 404, und unter unserem npm-Namensraum liegt nichts. Was es gibt, ist eine GitHub-Freigabe vom 20. Juli 2026 mit fünf Archiven, und nichts im Repository erzeugt den Katalog noch.
Für einen öffentlichen Text heisst das: wir werben nicht mit SDKs. Der veröffentlichte Vertrag aus Abschnitt 5.7 trägt das Argument allein.
7. Was aus diesem Paper nicht folgt
Dieser Abschnitt zieht die Grenzen der Aussagekraft, damit der öffentliche Text sie nicht überschreitet.
Es folgt nicht, dass Odesli keine Freitextsuche kann. Es kann sie, auf der Website, und konnte sie immer. Nicht anbieten und nicht können sind zwei verschiedene Dinge, und nur das Erste ist hier belegt.
Es folgt nicht, dass Odesli weniger über eine Aufnahme weiss als wir. Tabelle 4 vergleicht die dokumentierte Antwort des Entwickler-API. Das Backend der Website liefert ihrem eigenen Client mehr, unter anderem ISRC, Spieldauer, Erscheinungsdatum und ein Explicit-Kennzeichen, gemessen am 4. September 2026. Das Entwickler-API bot also weniger, als das Haus selbst zur Verfügung hatte. Wer aus Tabelle 4 schliesst, Odesli habe diese Daten nicht, liest sie falsch.
Es folgt nichts über die Qualität ihrer Treffer. Ein Vergleich dazu bräuchte eine Stichprobe über viele Titel und einen Massstab dafür, was ein richtiger Treffer ist. Beides gibt es hier nicht. Die Berichte über schlechte Ergebnisse, die uns erreichen, sind Erzählungen aus dem Umfeld und in diesem Paper keine Belege.
Es folgt nichts darüber, wie viele Entwickler betroffen sind. Das ist von aussen nicht messbar.
Es folgt nicht, dass ihre Adressen heute Partnerkennzeichen tragen. Belegt ist allein die Beispielantwort in der Dokumentation.
8. Was daraus folgt
Wer seit dem 31. Juli auf einen 401 läuft, sucht jetzt einen Ersatz und entscheidet in den nächsten Wochen. Das bestimmt die Reihenfolge: Sichtbarkeit und Einstieg gehen vor der Bezahlkette, weil ein kostenloser Plan niemanden kostet und ein fehlender Einstieg jeden.
Eine Umstiegsseite. Sie bildet die dokumentierte Antwortform des geschlossenen API auf unsere ab, Feld für Feld, und erklärt den Wechsel in einem Absatz. Sie ist das Einzige aus diesem Paper, das noch aussteht, und sie ist Produkttext, der phranck gehört.
Die vier Befunde aus Abschnitt 6 sind erledigt, wie der Kasten dort im Einzelnen sagt. Was sie gemeinsam hatten, ist der Grund, sie vor allem anderen zu machen: jeder von ihnen war in einem einzigen Aufruf nachprüfbar, und ein öffentlicher Text hätte keinen davon überlebt.
9. Grundlage
- Songlink/Odesli: API. Abschaltungshinweis, Zugangsbedingungen, Endpunkt, Parameter, Antwortform, Plattformliste.
- Linktree: Ankündigung der Übernahme von Songlink/Odesli, August 2021.
- Variety: Abschalttermine für Google Play Music, August 2020.
- musiccloud: PAP-MC-003, Abschnitt 1.1 und Abschnitt 1.2.
- Eigene Messungen gegen
api.song.link,api.odesli.co,song.linkundapi.musiccloud.ioam 4. September 2026.
Anhang
Die geprüften Belege und die Befehle, mit denen sich jede Zahl nachstellen lässt. Für den Text selbst braucht man das hier nicht.
A. Geprüfte Belege
Alle Aussagen dieses Papers, geprüft am 4. September 2026. Die Spalte Ebene verweist auf Tabelle 1.
| Aussage | Ebene | Beleg |
|---|---|---|
| Abschaltung zum 31. Juli 2026, angekündigt mit 410 | 1 | Abschaltungshinweis auf der Dokumentationsseite |
| Keine Schlüssel mehr, Freischaltung über ein Formular | 1 | derselbe Hinweis |
| Drei Anfrageformen antworten mit 401 | 1 | eigene Abrufe gegen api.song.link/v1-alpha.1/links |
Ein Endpunkt, Typen song und album, ohne Schlüssel 10 pro Minute | 1 | Abschnitte "GET /links endpoint", "Query Params" und "Rate Limiting" |
| Einundzwanzig Plattformkennungen, Paare auf denselben Dienst | 1 | Typ Platform; isrc und upc sind Kennungsschemata und nicht mitgezählt |
| Keine Angabe zur Sicherheit eines Treffers | 1 | Typ entitiesByUniqueId und linksByPlatform, kein entsprechendes Feld |
| Partnerkennzeichen in der Beispielantwort | 1 | Abschnitt "Example Response", Einträge amazonStore, appleMusic, itunes |
| Dokumentation als Notion-Seite ohne maschinenlesbare Beschreibung | 1 | die Seite selbst |
Suche und Resolve über api.odesli.co, ohne Schlüssel erreichbar | 2 | Adressen aus den JavaScript-Bündeln von odesli.co, danach eigene Abrufe |
| Die Suchantwort trägt ISRC, Spieldauer, Erscheinungsdatum, Explicit-Kennzeichen | 2 | eigener Abruf von /search-results |
| song.link leitet auf odesli.co, Suchfeld vorhanden | 3 | Abruf der Startseite, Platzhalter "Search or paste URL" |
| Siebzehn Einträge auf einer aufgelösten Seite, ohne Google Play | 3 | Abruf von song.link/us/i/1443109064 |
| Landingpage antwortet mit 200 | 3 | derselbe Abruf |
| Achtzehn Dienste bei uns aktiv | 4 | Abruf von api.musiccloud.io/api/v1/services/active |
| Einundzwanzig Resolve-Adapter im Build, MusicBrainz standardmässig aus | 4 | apps/backend/src/services/plugins/registry.ts, Feld PLUGINS, plus defaultEnabled je Manifest |
| Discogs und Last.fm lösen nicht auf, sie reichern an | 4 | beide fehlen in PLUGINS; discogs-enrich.ts und lastfm/artist-info.ts |
Jeder Treffer trägt confidence und matchMethod | 4 | Live-Resolve, Felder je Eintrag in links |
| Angaben zur Aufnahme bei uns | 4 | Feld track derselben Antwort |
| Keine Affiliate-Parameter im Repository | 4 | Suche über apps und packages, kein Treffer |
| OpenAPI 3.1.0 veröffentlicht, zwölf Pfade | 4 | Abruf von api.musiccloud.io/docs/json |
| Antwortzeiten | 4 | eigene Abrufe, Tabelle 5 |
| YouTube-Treffer auf eine Suchseite | 4 | Live-Resolve des Testtitels, Eintrag youtube |
| NetEase mit Konfidenz 1 aus einer Suche | 4 | dieselbe Antwort, Eintrag netease |
| Toter Navigationseintrag "SDK downloads" | 4 | ApiReferenceNav.astro, Anker ohne Ziel im gesamten Portal |
| Keines der fünf SDK-Pakete existiert | 4 | npm, PyPI und Packagist antworten mit 404 |
| Der Katalog wird von nichts mehr erzeugt | 4 | Suche nach sdk-catalog über Anwendungen, Pakete und Skripte |
Ebene 4 steht für unser eigenes Angebot und ergänzt die drei aus Tabelle 1.
B. Wie sich das nachstellen lässt
Der Testtitel ist derselbe, den Odeslis Dokumentation als Beispiel führt, damit der Vergleich an einer Aufnahme hängt.
| Was | Befehl |
|---|---|
| Entwickler-API, Ebene 1 | curl -i "https://api.song.link/v1-alpha.1/links?url=spotify%3Atrack%3A0Jcij1eWd5bDMU5iPbxe2i&userCountry=DE" |
| Website-Backend, Ebene 2 | curl -H "x-lt-caller: song.link/web-client" "https://api.odesli.co/search-results?providers=spotify&query=bohemian%20rhapsody&type=song&userCountry=DE" |
| Aufgelöste Seite, Ebene 3 | curl -L "https://song.link/us/i/1443109064" |
| Unser Resolve | curl "https://api.musiccloud.io/api/v1/resolve?query=https%3A%2F%2Fopen.spotify.com%2Ftrack%2F0Jcij1eWd5bDMU5iPbxe2i" |
| Antwortzeit | curl -o /dev/null -w '%{time_total}\n' <Adresse> |
| Aktive Dienste | curl "https://api.musiccloud.io/api/v1/services/active" |
| Veröffentlichter Vertrag | curl "https://api.musiccloud.io/docs/json" |