# Songlink / Odesli Cross-Platform Music Resolver (`parseforge/songlink-odesli-cross-platform-scraper`) Actor

Generate cross platform music links via Songlink/Odesli: Spotify, Apple Music, YouTube, Tidal, Deezer, Amazon Music, Pandora, SoundCloud, and more. Get track, artist, album, artwork, ISRC, and per service URLs. Export to JSON, CSV, or Excel for music marketing and playlist research.

- **URL**: https://apify.com/parseforge/songlink-odesli-cross-platform-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.00 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 🎵 Songlink / Odesli Cross-Platform Music Resolver

> 🚀 **Turn any music URL into links on every major platform in seconds.** Paste a Spotify, Apple Music, or YouTube URL and get matching links on **14+ services** including Tidal, Deezer, Amazon Music, Pandora, SoundCloud, YouTube Music, and more.

> 🕒 **Last updated:** 2026-05-23 · **📊 27 fields** per record · **🎧 14+ music platforms** · **🌍 50 country contexts** · **🎼 Tracks, albums, singles**

The **Songlink / Odesli Cross-Platform Music Resolver** queries the Odesli public catalog to map a single music link onto every other streaming and download service that hosts the same song or album. It returns **27 fields per record**, including track title, artist name, primary artwork URL, the canonical Songlink page URL, and a parsed link for each supported platform.

The catalog covers Spotify, Apple Music, YouTube, YouTube Music, Tidal, Deezer, Amazon Music, Amazon Store, Pandora, SoundCloud, Anghami, Boomplay, Napster, and Yandex Music, plus the full raw entity map for advanced users. Pick a `userCountry` from **50 supported codes** to localize pricing and regional availability.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Music marketers, artist management, label digital teams, link-in-bio platforms, social media tool builders, music journalists, podcast producers | Pre-release link sheets, smart links for campaigns, cross-platform analytics, music-tech integrations, catalog audits, release-day automation |

---

### 📋 What the Songlink / Odesli Scraper does

Four resolution workflows in a single run:

- 🔗 **One link in, every link out.** Hand it a Spotify track URL, get back the Apple Music, YouTube, Tidal, Deezer, Amazon, Pandora, SoundCloud, and YouTube Music equivalents.
- 🎼 **Albums and singles.** Resolves tracks, singles, and full album URLs. Toggle `songIfSingle` to control how single-release URLs map.
- 🌍 **Regional context.** Set `userCountry` to one of 50 ISO codes so the returned platform links reflect the right storefront and availability window.
- 🧾 **Rich metadata.** Each record carries the track title, primary artist, type, thumbnail with width and height, and the canonical Songlink share page.

> 💡 **Why it matters:** every release-day campaign, link-in-bio page, and social post needs links for the platforms your audience actually uses. Stitching that list together by hand for every track is a tax on every marketing run. This Actor returns the whole link sheet in one call.

---

### 🎬 Full Demo

_🚧 Coming soon: a 3-minute walkthrough showing how to feed a batch of Spotify URLs and download a complete cross-platform link sheet._

---

### ⚙️ Input

<table>
<thead>
<tr><th>Input</th><th>Type</th><th>Default</th><th>Behavior</th></tr>
</thead>
<tbody>
<tr><td>maxItems</td><td>integer</td><td>10</td><td>Records to return. Free plan caps at 10, paid plan at 1,000,000.</td></tr>
<tr><td>trackUrls</td><td>array of strings</td><td>10 sample URLs</td><td>Music URLs to resolve. Spotify, Apple Music, YouTube, Tidal, Deezer all accepted.</td></tr>
<tr><td>userCountry</td><td>string</td><td>"US"</td><td>ISO 3166-1 alpha-2 from a set of 50 supported codes. Controls regional links.</td></tr>
<tr><td>songIfSingle</td><td>boolean</td><td>true</td><td>When true, single-release URLs resolve as songs (not albums).</td></tr>
</tbody>
</table>

**Example: resolve three Spotify tracks for a US audience.**

```json
{
    "maxItems": 3,
    "trackUrls": [
        "https://open.spotify.com/track/0Jcij1eWd5bDMU5iPbxe2i",
        "https://open.spotify.com/track/7qiZfU4dY1lWllzX7mPBI3",
        "https://open.spotify.com/track/3n3Ppam7vgaVa1iaRUc9Lp"
    ],
    "userCountry": "US",
    "songIfSingle": true
}
````

**Example: resolve an Apple Music album with UK pricing context.**

```json
{
    "maxItems": 1,
    "trackUrls": ["https://music.apple.com/us/album/blinding-lights/1499378108?i=1499378615"],
    "userCountry": "GB"
}
```

> ⚠️ **Good to Know:** the Odesli catalog matches releases by audio fingerprint and metadata, not by exact ID. Region-locked editions, deluxe variants, and remastered re-releases may resolve to a different SKU than the source URL. Set `userCountry` carefully when the destination market matters.

***

### 📊 Output

Each record contains **27 fields**. Download the dataset as CSV, Excel, JSON, or XML.

#### 🧾 Schema

| Field | Type | Example |
|---|---|---|
| 🖼️ `thumbnailUrl` | string | null | `"https://i.scdn.co/image/ab67616d0000b273..."` |
| 🎵 `title` | string | null | `"Blinding Lights"` |
| 🎤 `artistName` | string | null | `"The Weeknd"` |
| 🏷️ `type` | string | null | `"song"` |
| 🔗 `inputUrl` | string | `"https://open.spotify.com/track/0Jcij1eWd5bDMU5iPbxe2i"` |
| 🌐 `pageUrl` | string | `"https://song.link/s/0Jcij1eWd5bDMU5iPbxe2i"` |
| 🆔 `entityUniqueId` | string | `"SPOTIFY_SONG::0Jcij1eWd5bDMU5iPbxe2i"` |
| 🌍 `userCountry` | string | `"US"` |
| 📐 `thumbnailWidth` | number | null | `640` |
| 📐 `thumbnailHeight` | number | null | `640` |
| 🏢 `primaryApiProvider` | string | `"spotify"` |
| 📋 `availablePlatforms` | string\[] | `["spotify","appleMusic","youtube","tidal",...]` |
| 🔢 `platformCount` | number | `14` |
| 🟢 `spotifyUrl` | string | null | `"https://open.spotify.com/track/..."` |
| 🍎 `appleMusicUrl` | string | null | `"https://music.apple.com/us/album/..."` |
| ▶️ `youtubeUrl` | string | null | `"https://www.youtube.com/watch?v=..."` |
| 🎶 `youtubeMusicUrl` | string | null | `"https://music.youtube.com/watch?v=..."` |
| 🌊 `tidalUrl` | string | null | `"https://tidal.com/browse/track/..."` |
| 🇩 `deezerUrl` | string | null | `"https://www.deezer.com/track/..."` |
| 🛒 `amazonMusicUrl` | string | null | `"https://music.amazon.com/..."` |
| 🛍️ `amazonStoreUrl` | string | null | `"https://www.amazon.com/..."` |
| 📻 `pandoraUrl` | string | null | `"https://www.pandora.com/..."` |
| ☁️ `soundcloudUrl` | string | null | `"https://soundcloud.com/..."` |
| 🎙️ `napsterUrl` | string | null | `"https://us.napster.com/..."` |
| 🇷🇺 `yandexUrl` | string | null | `null` |
| 📦 `allPlatformLinks` | object | full map of platform key to URL |
| 🕒 `scrapedAt` | ISO 8601 | `"2026-05-23T00:00:00.000Z"` |

#### 📦 Sample records

<details>
<summary><strong>🎵 Pop hit: "Blinding Lights" by The Weeknd</strong></summary>

```json
{
    "inputUrl": "https://open.spotify.com/track/0Jcij1eWd5bDMU5iPbxe2i",
    "pageUrl": "https://song.link/s/0Jcij1eWd5bDMU5iPbxe2i",
    "entityUniqueId": "SPOTIFY_SONG::0Jcij1eWd5bDMU5iPbxe2i",
    "userCountry": "US",
    "title": "Blinding Lights",
    "artistName": "The Weeknd",
    "type": "song",
    "thumbnailUrl": "https://i.scdn.co/image/ab67616d0000b2738863bc11d2aa12b54f5aeb36",
    "thumbnailWidth": 640,
    "thumbnailHeight": 640,
    "primaryApiProvider": "spotify",
    "platformCount": 14,
    "spotifyUrl": "https://open.spotify.com/track/0Jcij1eWd5bDMU5iPbxe2i",
    "appleMusicUrl": "https://music.apple.com/us/album/blinding-lights/1499378108?i=1499378615",
    "youtubeUrl": "https://www.youtube.com/watch?v=fHI8X4OXluQ",
    "youtubeMusicUrl": "https://music.youtube.com/watch?v=fHI8X4OXluQ",
    "tidalUrl": "https://tidal.com/browse/track/130845192",
    "deezerUrl": "https://www.deezer.com/track/859468092",
    "amazonMusicUrl": "https://music.amazon.com/albums/B0833WCYP1?trackAsin=B0833WTCB6",
    "pandoraUrl": "https://www.pandora.com/TR:39548703",
    "soundcloudUrl": "https://soundcloud.com/theweeknd/blinding-lights",
    "scrapedAt": "2026-05-23T00:00:00.000Z"
}
```

</details>

<details>
<summary><strong>🎤 Classic rock track on Apple Music</strong></summary>

```json
{
    "inputUrl": "https://music.apple.com/us/album/blinding-lights/1499378108?i=1499378615",
    "pageUrl": "https://song.link/i/1499378615",
    "title": "Blinding Lights",
    "artistName": "The Weeknd",
    "type": "song",
    "primaryApiProvider": "itunes",
    "platformCount": 14,
    "userCountry": "GB"
}
```

</details>

***

### ✨ Why choose this Actor

| | Capability |
|---|---|
| 🔗 | **14+ platforms in one call.** Spotify, Apple Music, YouTube, YouTube Music, Tidal, Deezer, Amazon Music, Amazon Store, Pandora, SoundCloud, and more. |
| 🌍 | **50 country contexts.** Pick the right storefront for the audience you serve. |
| 🎼 | **Tracks, singles, and albums.** Resolves the full release graph, with a toggle for singles-as-songs. |
| 🖼️ | **Artwork included.** Primary thumbnail URL plus width and height for every record. |
| ⚡ | **Fast.** 10 URLs in under 10 seconds. |
| 🔁 | **Batch-ready.** Feed an array of URLs and get one record per input, in order. |
| 🚫 | **No authentication.** No login, no API key, no token rotation. |

> 📊 The platforms your fans use are a moving target. Smart-link infrastructure shouldn't be a side project for every release.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|---|---|---|---|---|---|
| **⭐ Songlink / Odesli Resolver** *(this Actor)* | $5 free credit, then pay-per-use | **14+ platforms** | **Live per run** | country, songIfSingle | ⚡ 2 min |
| Hosted smart-link products | $5-$30/month per artist | 10-15 platforms | Live | Many | ⏳ Manual setup per release |
| Direct platform APIs (Spotify, Apple) | Free tier limited | One platform each | Live | Many | 🐢 Auth, OAuth, retries |
| Manual link sheets | Free | Whatever you copy | Stale | None | 🕒 Days per release |

Pick this Actor when you need a programmatic link sheet for multiple platforms without standing up smart-link infrastructure.

***

### 🚀 How to use

1. 📝 **Sign up.** [Create a free account with $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp) (takes 2 minutes).
2. 🌐 **Open the Actor.** Go to the Songlink / Odesli Cross-Platform Music Resolver page on the Apify Store.
3. 🎯 **Set input.** Paste your music URLs in `trackUrls`, pick a `userCountry`, and set `maxItems`.
4. 🚀 **Run it.** Click **Start** and let the Actor resolve every link.
5. 📥 **Download.** Grab your results in the **Dataset** tab as CSV, Excel, JSON, or XML.

> ⏱️ Total time from signup to a downloaded link sheet: **3-5 minutes.** No coding required.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%" valign="top">

#### 🎤 Artist Marketing & Labels

- Pre-release link sheets for every territory
- Smart-link replacement for tour and merch posts
- Catalog audits across the back catalog
- Cross-platform availability reports for sync teams

</td>
<td width="50%" valign="top">

#### 📱 Link-in-bio & Social Tools

- Power smart-link features without standing up your own resolver
- Auto-populate share buttons with platform-correct URLs
- Localize storefront links by visitor geography
- Generate share cards with title, artist, and artwork

</td>
</tr>
<tr>
<td width="50%" valign="top">

#### 📊 Music Analytics & Research

- Build cross-platform availability matrices
- Track release coverage gaps by territory
- Feed dashboards with title, artist, and platform counts
- Power music intelligence products with canonical IDs

</td>
<td width="50%" valign="top">

#### 🎙️ Podcasts, Press & Editorial

- Auto-generate "listen on" buttons for show notes
- Add multi-platform players to music journalism
- Power newsletter playlists with one URL in, every URL out
- Build embeddable widgets for music blogs

</td>
</tr>
</table>

***

### 🔌 Automating Songlink / Odesli Resolver

Control the scraper programmatically for scheduled runs and pipeline integrations:

- 🟢 **Node.js.** Install the `apify-client` NPM package.
- 🐍 **Python.** Use the `apify-client` PyPI package.
- 📚 See the [Apify API documentation](https://docs.apify.com/api/v2) for full details.

The [Apify Schedules feature](https://docs.apify.com/platform/schedules) lets you trigger this Actor on any cron interval. Resolve a new batch of URLs each morning, push the results into a CMS, and keep your link sheets fresh automatically.

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Music distribution and platform-coverage research
- Cross-platform availability studies for media scholars
- Reproducible datasets for music industry papers
- Streaming economics coursework with real catalog data

</td>
<td width="50%">

#### 🎨 Personal and creative

- Build a personal smart-link page for indie projects
- Power fan sites with cross-platform listen buttons
- Hobbyist music libraries with canonical IDs
- DJ set sharing across platforms

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Cultural archives with multi-platform preservation links
- Music education projects with embedded players
- Public broadcasting playlists with audience-friendly links
- Cross-platform access for indigenous and minority-language music

</td>
<td width="50%">

#### 🧪 Experimentation

- Train music recommendation models with real availability data
- Prototype "listen on" widgets for any audience
- Test platform-coverage hypotheses across genres
- Build agent pipelines that resolve any music link

</td>
</tr>
</table>

***

### 🤖 Ask an AI assistant about this scraper

Open a ready-to-send prompt about this ParseForge actor in the AI of your choice:

- 💬 [**ChatGPT**](https://chat.openai.com/?q=How%20do%20I%20use%20the%20Songlink%20Odesli%20Resolver%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🧠 [**Claude**](https://claude.ai/new?q=How%20do%20I%20use%20the%20Songlink%20Odesli%20Resolver%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🔍 [**Perplexity**](https://perplexity.ai/search?q=How%20do%20I%20use%20the%20Songlink%20Odesli%20Resolver%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🅒 [**Copilot**](https://copilot.microsoft.com/?q=How%20do%20I%20use%20the%20Songlink%20Odesli%20Resolver%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)

***

### ❓ Frequently Asked Questions

#### 🧩 How does it work?

Hand the Actor a list of music URLs from any supported platform. For each URL, it queries the Odesli public catalog and returns a structured record with the title, artist, artwork, and a parsed link for every other platform that hosts the same release.

#### 🎧 Which platforms does it return?

Spotify, Apple Music, YouTube, YouTube Music, Tidal, Deezer, Amazon Music, Amazon Store, Pandora, SoundCloud, Anghami, Boomplay, Napster, and Yandex Music. The exact list per record depends on which platforms host that specific release.

#### 🌍 Does the country setting matter?

Yes. Some releases are region-locked or have different storefront URLs by territory. Set `userCountry` to the audience you care about so the returned links resolve in the right market.

#### 🎼 Can it resolve albums and singles, not just tracks?

Yes. Hand it an album URL and it returns the album-level mapping. Toggle `songIfSingle` to control how single-release URLs resolve.

#### ⏰ Can I schedule regular runs?

Yes. Use Apify Schedules to run this Actor on any cron interval. Common pattern: each release day, resolve every new track and post the link sheet into a marketing CMS.

#### ⚖️ Is this data legal to use?

Yes. The Actor uses Odesli's public link-mapping catalog. Review the downstream terms for your specific use case, but the link mappings themselves are publicly accessible.

#### 💼 Can I use this commercially?

Yes. Smart-link generation, marketing campaigns, link-in-bio products, and music intelligence dashboards are all valid commercial use cases.

#### 💳 Do I need a paid Apify plan?

No. The free Apify plan is enough for testing and small runs (10 records per run). A paid plan lifts the limit and gives you access to scheduling, higher concurrency, and larger batches.

#### 🔁 What happens if a URL fails to resolve?

The Actor pushes a record with the input URL and an `error` field. The rest of the batch continues, so a single bad URL never stops your run.

#### 🧾 What if a platform link is missing from the output?

That means the release is not available on that platform. The `availablePlatforms` array lists exactly which services returned a match for each record.

#### 🆘 What if I need help?

Our support team is here to help. Contact us through the Apify platform or use the Tally form linked below.

***

### 🔌 Integrate with any app

Songlink / Odesli Resolver connects to any cloud service via [Apify integrations](https://apify.com/integrations):

- [**Make**](https://docs.apify.com/platform/integrations/make) - Automate multi-step workflows
- [**Zapier**](https://docs.apify.com/platform/integrations/zapier) - Connect with 5,000+ apps
- [**Slack**](https://docs.apify.com/platform/integrations/slack) - Get run notifications in your channels
- [**Airbyte**](https://docs.apify.com/platform/integrations/airbyte) - Pipe music link data into your warehouse
- [**GitHub**](https://docs.apify.com/platform/integrations/github) - Trigger runs from release commits
- [**Google Drive**](https://docs.apify.com/platform/integrations/drive) - Export datasets straight to Sheets

You can also use webhooks to fire downstream actions when a run finishes. Push fresh link sheets into your release pipeline, or post them into Slack on every drop.

***

### 🔗 Recommended Actors

- [**🎙️ Podchaser Scraper**](https://apify.com/parseforge/podchaser-scraper) - Podcast catalog, ratings, and episode data
- [**📻 Spotify Podcasts Scraper**](https://apify.com/parseforge/spotify-podcasts-scraper) - Spotify show and episode data
- [**🎬 YouTube Channels Scraper**](https://apify.com/parseforge/youtube-channels-scraper) - YouTube channel and video metadata
- [**📰 Reddit Posts Scraper**](https://apify.com/parseforge/reddit-posts-scraper) - Subreddit posts and engagement data
- [**🌐 Nominatim OSM Scraper**](https://apify.com/parseforge/nominatim-osm-scraper) - Geocode addresses via OpenStreetMap

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more reference-data scrapers.

***

**🆘 Need Help?** [**Open our contact form**](https://tally.so/r/BzdKgA) to request a new scraper, propose a custom data project, or report an issue.

***

> **⚠️ Disclaimer:** this Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Songlink, Odesli, or any of the music platforms referenced. All trademarks mentioned are the property of their respective owners. Only publicly available link-mapping data is collected.

# Actor input Schema

## `maxItems` (type: `integer`):

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `trackUrls` (type: `array`):

List of music URLs from any supported platform (Spotify, Apple Music, YouTube, Deezer, Tidal, etc.). Each URL is resolved to links on all other platforms.

## `userCountry` (type: `string`):

ISO 3166-1 alpha-2 country code. Affects which regional links and pricing are returned.

## `songIfSingle` (type: `boolean`):

When true, single-release URLs are resolved as songs (not albums).

## Actor input object example

```json
{
  "maxItems": 10,
  "trackUrls": [
    "https://open.spotify.com/track/0Jcij1eWd5bDMU5iPbxe2i",
    "https://open.spotify.com/track/7qiZfU4dY1lWllzX7mPBI3",
    "https://music.apple.com/us/album/blinding-lights/1499378108?i=1499378615"
  ],
  "userCountry": "US",
  "songIfSingle": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "trackUrls": [
        "https://open.spotify.com/track/0Jcij1eWd5bDMU5iPbxe2i",
        "https://open.spotify.com/track/7qiZfU4dY1lWllzX7mPBI3",
        "https://music.apple.com/us/album/blinding-lights/1499378108?i=1499378615"
    ],
    "userCountry": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/songlink-odesli-cross-platform-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 10,
    "trackUrls": [
        "https://open.spotify.com/track/0Jcij1eWd5bDMU5iPbxe2i",
        "https://open.spotify.com/track/7qiZfU4dY1lWllzX7mPBI3",
        "https://music.apple.com/us/album/blinding-lights/1499378108?i=1499378615",
    ],
    "userCountry": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/songlink-odesli-cross-platform-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "trackUrls": [
    "https://open.spotify.com/track/0Jcij1eWd5bDMU5iPbxe2i",
    "https://open.spotify.com/track/7qiZfU4dY1lWllzX7mPBI3",
    "https://music.apple.com/us/album/blinding-lights/1499378108?i=1499378615"
  ],
  "userCountry": "US"
}' |
apify call parseforge/songlink-odesli-cross-platform-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/songlink-odesli-cross-platform-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Songlink / Odesli Cross-Platform Music Resolver",
        "description": "Generate cross platform music links via Songlink/Odesli: Spotify, Apple Music, YouTube, Tidal, Deezer, Amazon Music, Pandora, SoundCloud, and more. Get track, artist, album, artwork, ISRC, and per service URLs. Export to JSON, CSV, or Excel for music marketing and playlist research.",
        "version": "1.0",
        "x-build-id": "fjJ42uWipldOle5sn"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~songlink-odesli-cross-platform-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-songlink-odesli-cross-platform-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~songlink-odesli-cross-platform-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-songlink-odesli-cross-platform-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~songlink-odesli-cross-platform-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-songlink-odesli-cross-platform-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    },
                    "trackUrls": {
                        "title": "Track URLs",
                        "type": "array",
                        "description": "List of music URLs from any supported platform (Spotify, Apple Music, YouTube, Deezer, Tidal, etc.). Each URL is resolved to links on all other platforms.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "userCountry": {
                        "title": "User country",
                        "enum": [
                            "US",
                            "GB",
                            "CA",
                            "AU",
                            "DE",
                            "FR",
                            "IT",
                            "ES",
                            "NL",
                            "SE",
                            "NO",
                            "DK",
                            "FI",
                            "JP",
                            "KR",
                            "BR",
                            "MX",
                            "AR",
                            "CL",
                            "CO",
                            "PE",
                            "IN",
                            "ID",
                            "TH",
                            "VN",
                            "PH",
                            "MY",
                            "SG",
                            "HK",
                            "TW",
                            "CN",
                            "ZA",
                            "NG",
                            "EG",
                            "SA",
                            "AE",
                            "TR",
                            "IL",
                            "IE",
                            "BE",
                            "CH",
                            "AT",
                            "PT",
                            "PL",
                            "CZ",
                            "HU",
                            "RO",
                            "GR",
                            "NZ",
                            "RU"
                        ],
                        "type": "string",
                        "description": "ISO 3166-1 alpha-2 country code. Affects which regional links and pricing are returned."
                    },
                    "songIfSingle": {
                        "title": "Treat singles as songs",
                        "type": "boolean",
                        "description": "When true, single-release URLs are resolved as songs (not albums).",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
