Odesli API Alternative: Migrate in 10 Minutes
The Odesli API (song.link) was/will be deprecated on July 31, 2026. If your app still calls api.song.link/v1-alpha.1/links, those requests (will) return 410 Gone. This guide shows the exact before-and-after — real request formats, real response shapes, real code changes.
#What the Old Odesli API Looked Like
Odesli's only endpoint was GET /v1-alpha.1/links. You passed the URL as a query param:
curl "https://api.song.link/v1-alpha.1/links?url=https%3A%2F%2Fopen.spotify.com%2Ftrack%2F4cOdK2wGLETKBW3PvgPWqT&key=YOUR_KEY"The response was a deeply nested structure with two separate lookup tables:
{
"entityUniqueId": "SPOTIFY_SONG::4cOdK2wGLETKBW3PvgPWqT",
"userCountry": "US",
"pageUrl": "https://song.link/s/4cOdK2wGLETKBW3PvgPWqT",
"linksByPlatform": {
"spotify": {
"url": "https://open.spotify.com/track/4cOdK2wGLETKBW3PvgPWqT",
"nativeAppUriDesktop": "spotify:track:4cOdK2wGLETKBW3PvgPWqT",
"entityUniqueId": "SPOTIFY_SONG::4cOdK2wGLETKBW3PvgPWqT"
},
"appleMusic": {
"url": "https://music.apple.com/us/album/never-gonna-give-you-up/1559885420?i=1559885421",
"nativeAppUriMobile": "music://music.apple.com/us/album/...",
"nativeAppUriDesktop": "itms://music.apple.com/us/album/...",
"entityUniqueId": "ITUNES_SONG::1559885421"
},
"youtube": {
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"entityUniqueId": "YOUTUBE_VIDEO::dQw4w9WgXcQ"
},
"youtubeMusic": {
"url": "https://music.youtube.com/watch?v=dQw4w9WgXcQ",
"entityUniqueId": "YOUTUBE_VIDEO::dQw4w9WgXcQ"
},
"deezer": {
"url": "https://www.deezer.com/track/15646529",
"entityUniqueId": "DEEZER_SONG::15646529"
},
"tidal": {
"url": "https://listen.tidal.com/track/491206012",
"entityUniqueId": "TIDAL_SONG::491206012"
}
},
"entitiesByUniqueId": {
"SPOTIFY_SONG::4cOdK2wGLETKBW3PvgPWqT": {
"id": "4cOdK2wGLETKBW3PvgPWqT",
"type": "song",
"title": "Never Gonna Give You Up",
"artistName": "Rick Astley",
"thumbnailUrl": "https://i.scdn.co/image/...",
"thumbnailWidth": 640,
"thumbnailHeight": 640,
"apiProvider": "spotify",
"platforms": ["spotify"]
},
"ITUNES_SONG::1559885421": {
"id": "1559885421",
"type": "song",
"title": "Never Gonna Give You Up",
"artistName": "Rick Astley",
"thumbnailUrl": "https://is4-ssl.mzstatic.com/...",
"apiProvider": "itunes",
"platforms": ["appleMusic", "itunes"]
}
}
}Reading the Apple Music URL required: data.linksByPlatform.appleMusic.url. All of that is gone now.
#The MusicLink Replacement
MusicLink has a ?q= endpoint that accepts the same URLs. Change one line:
# Before (Odesli - before)
curl "https://api.song.link/v1-alpha.1/links?url=ENCODED_URL&key=YOUR_KEY"
# After (MusicLink - after)
curl "https://api.ml.jadquir.com/v1/v1/lookup?q=ENCODED_URL" \
-H "Authorization: Bearer YOUR_KEY"The response is flatter:
{
"success": true,
"data": [{
"public_id": "huUKtw-D",
"url": "https://ml.jadquir.com/song/rick-astley/never-gonna-give-you-up",
"title": "Never Gonna Give You Up",
"artist": "Rick Astley",
"isrc": "GBARL9300135",
"image_url": "https://is4-ssl.mzstatic.com/image/thumb/...",
"links": {
"musiclink": "https://ml.jadquir.com/song/rick-astley/never-gonna-give-you-up",
"spotify": "https://open.spotify.com/track/4cOdK2wGLETKBW3PvgPWqT",
"apple_music": "https://music.apple.com/album/never-gonna-give-you-up/1559885420?i=1559885421",
"youtube": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"youtube_music":"https://music.youtube.com/watch?v=dQw4w9WgXcQ",
"deezer": "https://www.deezer.com/track/15646529",
"tidal": "https://listen.tidal.com/track/491206012",
"soundcloud": "https://soundcloud.com/rickastleyofficial/never-gonna-give-you-up",
"amazon_music": "https://music.amazon.com/albums/...",
"pandora": "https://www.pandora.com/...",
"qobuz": "https://open.qobuz.com/track/..."
}
}]
}#Migration Cheatsheet
| Odesli | MusicLink |
|---|---|
?url=ENCODED_URL&key=K | ?q=ENCODED_URL + Authorization: Bearer K |
?platform=spotify&type=song&id=ID | /v1/lookup/spotify/ID |
data.pageUrl | data.data[0].url |
data.linksByPlatform.spotify.url | data.data[0].links.spotify |
data.linksByPlatform.appleMusic.url | data.data[0].links.apple_music |
data.linksByPlatform.youtube.url | data.data[0].links.youtube |
data.linksByPlatform.youtubeMusic.url | data.data[0].links.youtube_music |
data.linksByPlatform.deezer.url | data.data[0].links.deezer |
data.linksByPlatform.tidal.url | data.data[0].links.tidal |
data.entitiesByUniqueId[id].thumbnailUrl | data.data[0].image_url |
data.entitiesByUniqueId[id].artistName | data.data[0].artist |
data.entitiesByUniqueId[id].title | data.data[0].title |
#TypeScript Migration
// Before - Odesli
const res = await fetch(
`https://api.song.link/v1-alpha.1/links?url=${encodeURIComponent(url)}&key=${KEY}`
);
const data = await res.json();
const appleLink = data.linksByPlatform?.appleMusic?.url;
const spotifyLink = data.linksByPlatform?.spotify?.url;
const pageUrl = data.pageUrl;
const thumbUrl = data.entitiesByUniqueId?.[data.entityUniqueId]?.thumbnailUrl;// After - MusicLink
const res = await fetch(
`https://api.ml.jadquir.com/v1/v1/lookup?q=${encodeURIComponent(url)}`,
{ headers: { Authorization: `Bearer ${KEY}` } }
);
const data = await res.json();
const track = data.data[0];
const appleLink = track.links.apple_music;
const spotifyLink = track.links.spotify;
const pageUrl = track.url;
const thumbUrl = track.image_url;#Getting Your Free API Key
- Sign up at ml.jadquir.com/sign-up - no credit card, 30 seconds
- Open your dashboard and copy your key
- Add it as
Authorization: Bearer <key>on every request
Free tier: 300 requests/month. Hobby plan: 5,000 req/month for $9.
#What's Better Than Odesli
The two biggest improvements: ISRC support (pass a bare GBARL9300135, get all links back) and the ?q= auto-detect endpoint that accepts any URL, ISRC, or MusicLink ID — no platform parameter needed.
#All Supported Inputs
# Auto-detect — pass any URL, ISRC, or MusicLink ID
https://api.ml.jadquir.com/v1/v1/lookup?q=https://open.spotify.com/track/4cOdK2wGLETKBW3PvgPWqT
https://api.ml.jadquir.com/v1/v1/lookup?q=https://music.apple.com/album/never-gonna-give-you-up/1559885420?i=1559885421
https://api.ml.jadquir.com/v1/v1/lookup?q=GBARL9300135
https://api.ml.jadquir.com/v1/v1/lookup?q=huUKtw-D
# Explicit platform (same response, explicit routing)
https://api.ml.jadquir.com/v1/v1/lookup/spotify/4cOdK2wGLETKBW3PvgPWqT
https://api.ml.jadquir.com/v1/v1/lookup/isrc/GBARL9300135
https://api.ml.jadquir.com/v1/v1/lookup/apple/1559885421
https://api.ml.jadquir.com/v1/v1/lookup/deezer/15646529
https://api.ml.jadquir.com/v1/v1/lookup/tidal/491206012#Embed Widget
<iframe
src="https://ml.jadquir.com/embed/ml/huUKtw-D"
width="100%"
height="180"
frameborder="0"
allow="autoplay"
></iframe>