·4 min read

Universal Music Links API: One Endpoint for Every Platform

A universal music link solves a simple problem: you want to share a song, but your listeners are spread across Spotify, Apple Music, YouTube Music, Deezer, Tidal, and a dozen other platforms. Instead of sending a Spotify link that half your audience can't open, you send one URL — and each person taps the platform they already use.

MusicLink is a REST API that generates these universal links. Send it any platform URL or ISRC. Get back a shareable page URL and deep links for every supported platform.

#How It Works

Three steps:

  1. Input: A Spotify, Apple Music, Deezer, Tidal URL — or a bare ISRC — or anything the ?q= endpoint can detect
  2. Lookup: MusicLink identifies the recording and finds it on every platform
  3. Output: A JSON response with all platform links + a permanent shareable page
bash
curl "https://api.ml.jadquir.com/v1/v1/lookup?q=GBARL9300135" \
  -H "Authorization: Bearer YOUR_API_KEY"
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/...",
      "amazon_music": "https://music.amazon.com/...",
      "qobuz":        "https://open.qobuz.com/...",
      "pandora":      "https://www.pandora.com/...",
      "anghami":      "https://play.anghami.com/...",
      "audiomack":    "https://audiomack.com/...",
      "jiosaavn":     "https://www.jiosaavn.com/..."
    }
  }]
}

#How This Compares to Odesli

The Odesli API (song.link) used a deeply nested format with two lookup tables. Here's what the same request returned before it was deprecated:

json
{
  "entityUniqueId": "SPOTIFY_SONG::4cOdK2wGLETKBW3PvgPWqT",
  "userCountry": "US",
  "pageUrl": "https://song.link/s/4cOdK2wGLETKBW3PvgPWqT",
  "linksByPlatform": {
    "spotify":    { "url": "https://open.spotify.com/track/...", "entityUniqueId": "SPOTIFY_SONG::..." },
    "appleMusic": { "url": "https://music.apple.com/...",        "entityUniqueId": "ITUNES_SONG::..." },
    "youtube":    { "url": "https://www.youtube.com/watch?v=...", "entityUniqueId": "YOUTUBE_VIDEO::..." }
  },
  "entitiesByUniqueId": {
    "SPOTIFY_SONG::...": { "title": "Never Gonna Give You Up", "artistName": "Rick Astley", "thumbnailUrl": "..." }
  }
}

To get the Apple Music URL you needed data.linksByPlatform.appleMusic.url. The title was at data.entitiesByUniqueId[data.entityUniqueId].title. MusicLink flattens this into data.data[0].links.apple_music and data.data[0].title.

Odesli also only accepted platform URLs as input — no bare ISRCs, no MusicLink IDs. The ?q= endpoint accepts all of them.

#Supported Inputs

InputExampleVia
Any platform URLhttps://open.spotify.com/track/...?q=URL
ISRCGBARL9300135?q=ISRC or /v1/lookup/isrc/ISRC
Spotify track ID4cOdK2wGLETKBW3PvgPWqT/v1/lookup/spotify/ID
Apple Music track ID1559885421/v1/lookup/apple/ID
Deezer track ID15646529/v1/lookup/deezer/ID
Tidal track ID491206012/v1/lookup/tidal/ID
MusicLink public IDhuUKtw-D?q=ID or /v1/lookup/musiclink/ID

#Supported Output Platforms

MusicLink returns links for: Spotify, Apple Music, YouTube, YouTube Music, Deezer, Tidal, SoundCloud, Amazon Music, Qobuz, Pandora, Anghami, Audiomack, JioSaavn, Shazam, Boomplay.

Links are best-effort — regional availability varies by catalog.

#Reading the Response

All results are in data[0] (an array because some ISRCs have multiple versions — a single, an album cut, a remaster):

ts
const res = await fetch(
  `https://api.ml.jadquir.com/v1/v1/lookup?q=${encodeURIComponent(input)}`,
  { headers: { Authorization: `Bearer ${process.env.MUSICLINK_API_KEY}` } }
);
const { data } = await res.json();
const track = data[0];

// Metadata
console.log(track.title);      // "Never Gonna Give You Up"
console.log(track.artist);     // "Rick Astley"
console.log(track.isrc);       // "GBARL9300135"
console.log(track.image_url);  // album art URL

// Links
console.log(track.url);                  // shareable MusicLink page
console.log(track.links.spotify);        // Spotify deep link
console.log(track.links.apple_music);    // Apple Music deep link
console.log(track.links.youtube);        // YouTube URL
console.log(track.links.youtube_music);  // YouTube Music URL
console.log(track.links.deezer);         // Deezer URL
console.log(track.links.tidal);          // Tidal URL

#Embed Widget

Every track in MusicLink gets an embeddable iframe widget — useful for music blogs, artist websites, and review sites:

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

Supports compact and full mode, light and dark themes.

#Shareable Pages

The url field in every response is a permanent, SEO-indexed page:

https://ml.jadquir.com/song/rick-astley/never-gonna-give-you-up

These pages include all platform links, the track's album art, and the embed widget. They're generated automatically from your API lookups — no extra step needed.

#Compared to Alternatives

MusicLinkOdesli (dead)Manual scraping
StatusLiveDeprecated 2026Brittle
ISRC supportYesNoNo
Auto-detect ?q=YesNoNo
Embed widgetYesNoNo
Free tier300 req/moWas freeN/A
Shareable pagesYesYes (song.link)No

#Pricing

PlanRequests/monthPrice
Free300$0
Hobby5,000$9/month
Pro50,000$49/month

No credit card required for the free tier. Rate-limit responses include a Retry-After header.

Get your free API key → · Read the docs →