·5 min read

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:

bash
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:

json
{
  "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.

MusicLink has a ?q= endpoint that accepts the same URLs. Change one line:

bash
# 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:

json
{
  "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

OdesliMusicLink
?url=ENCODED_URL&key=K?q=ENCODED_URL + Authorization: Bearer K
?platform=spotify&type=song&id=ID/v1/lookup/spotify/ID
data.pageUrldata.data[0].url
data.linksByPlatform.spotify.urldata.data[0].links.spotify
data.linksByPlatform.appleMusic.urldata.data[0].links.apple_music
data.linksByPlatform.youtube.urldata.data[0].links.youtube
data.linksByPlatform.youtubeMusic.urldata.data[0].links.youtube_music
data.linksByPlatform.deezer.urldata.data[0].links.deezer
data.linksByPlatform.tidal.urldata.data[0].links.tidal
data.entitiesByUniqueId[id].thumbnailUrldata.data[0].image_url
data.entitiesByUniqueId[id].artistNamedata.data[0].artist
data.entitiesByUniqueId[id].titledata.data[0].title

#TypeScript Migration

ts
// 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;
ts
// 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

  1. Sign up at ml.jadquir.com/sign-up - no credit card, 30 seconds
  2. Open your dashboard and copy your key
  3. 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

bash
# 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

html
<iframe
  src="https://ml.jadquir.com/embed/ml/huUKtw-D"
  width="100%"
  height="180"
  frameborder="0"
  allow="autoplay"
></iframe>

Get your free API key →