# Spotify Scraper - Play Counts, Monthly Listeners & Playlists (`topapi/spotify-scraper`) Actor

Scrape Spotify tracks, albums, artists, playlists, podcasts and episodes by URL or search: play counts, monthly listeners, followers, world rank, top cities, label, track lists with streams, credits and concerts. Charts, one row per track, monitor mode. $2.80 per 1,000 rows. No login.

- **URL**: https://apify.com/topapi/spotify-scraper.md
- **Developed by:** [Top Api](https://apify.com/topapi) (community)
- **Categories:** Social media, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 spotify rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Spotify Scraper do?

**Spotify Scraper** extracts Spotify play counts and stats from [open.spotify.com](https://open.spotify.com): paste track, album, artist, playlist, podcast or episode links, or search terms, and get one row per item with its play count (streams), monthly listeners, followers, world rank, top cities, label, track list and more. Built for music marketers, A\&R scouts, labels, playlist pitchers and analysts who track streams without copying numbers from the app by hand.

Also known as: Spotify play count scraper, Spotify stream count scraper, Spotify API alternative, Spotify playlist scraper.

<a href="https://console.apify.com/actors/xgZtg3OkcshfU5Zvd"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/spotify-scraper-source.png" alt="Spotify artist page with monthly listeners and play counts that Spotify Scraper turns into rows" style="width:70%"></a>

- **Real Spotify play counts:** the exact stream count of every track, the number Spotify shows, not the 1-100 popularity score of the official Web API
- **Every Spotify object in one actor:** tracks, albums, artists, playlists, podcasts, episodes and audiobooks by link, `spotify:` URI, short link or bare id; user profiles from search
- **Search in eight result types:** songs, artists, albums, playlists, podcasts, episodes, audiobooks and profiles, each result with its full row (profiles: name, username and picture, as the search shows them)
- **Play counts on playlist tracks too:** every playlist track carries its play count, date added, BPM and musical key
- **Spotify Charts:** Weekly Top Songs, Top Albums and Top Artists with current, previous and peak rank
- **One row per track mode:** expand albums, playlists and artists into one row per track for play-count reporting
- **Monitor mode:** schedule it and get only what changed, with the previous value and the difference
- **No login, cookies or Spotify API key:** you paste links or keywords, nothing else
- **Export anywhere:** JSON, CSV, Excel, XML; schedules, webhooks, Make, Zapier, n8n, Google Sheets, Slack, the Apify API and MCP

### What data can you get from Spotify?

<table>
<tr>
<td>🎵 Track play count (<code>playCount</code>, <code>streamCount</code>)</td>
<td>👥 Monthly listeners (<code>monthlyListeners</code>)</td>
<td>❤️ Followers / playlist saves (<code>followers</code>)</td>
</tr>
<tr>
<td>🌍 World rank (<code>worldRank</code>)</td>
<td>🏙️ Top 5 cities with listeners (<code>topCities</code>)</td>
<td>✅ Verified artist (<code>verified</code>)</td>
</tr>
<tr>
<td>💿 Album label and copyright</td>
<td>📅 Release date and precision</td>
<td>🔢 Track and disc number, duration</td>
</tr>
<tr>
<td>📋 Album and playlist track lists with play counts</td>
<td>➕ Total album / playlist plays (<code>totalPlayCount</code>)</td>
<td>🥁 BPM, key and Camelot key of playlist tracks</td>
</tr>
<tr>
<td>🎧 30-second preview URL (<code>previewUrl</code>)</td>
<td>✍️ Songwriter and producer credits (<code>credits</code>)</td>
<td>🎤 Upcoming concerts: date, city and line-up</td>
</tr>
<tr>
<td>📖 Artist biography and social links</td>
<td>🔗 Related artists, discovered-on and appears-on</td>
<td>💽 Full discography, latest and upcoming release</td>
</tr>
<tr>
<td>📧 Playlist curator emails, handles and links</td>
<td>🎙️ Podcast publisher, rating, topics, episodes</td>
<td>🏆 Chart rank, previous and peak rank</td>
</tr>
</table>

On a 100-track test run every row had a play count, duration, album, release date and preview URL. On 400 artists found by search, 100% had followers, 81% monthly listeners (Spotify sends none for artists without listeners this month) and 28% a world rank (Spotify ranks its top 500 only).

### How to scrape Spotify with Spotify Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) — $5 of monthly credit, no card needed.
2. Open [Spotify Scraper](https://apify.com/TopApi/spotify-scraper) and click **Try for free**.
3. Paste Spotify links into **Spotify URLs, URIs or IDs**, or type keywords into **Search terms** and pick what to **Search for**.
4. Click **Start**. Rows stream into the dataset as they are found.
5. Open the **Storage** tab and **Export** as JSON, CSV or Excel — or let a schedule run it for you.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | |
| `urls` | List | Track, album, artist, playlist, show, episode or audiobook links, `spotify:` URIs, short links or bare ids. Mix them freely. |
| `searchTerms` | List | Keywords to search, e.g. `lofi beats`, `Taylor Swift`. |
| `searchType` | Select | `tracks`, `artists`, `albums`, `playlists`, `podcasts`, `episodes`, `audiobooks` or `users`. Default: songs (`tracks`). |
| `searchTypes` | Multi-select | Several result types at once, added to `searchType`. |
| `charts` | Boolean | Add the current Spotify Charts (global Weekly Top Songs, Albums, Artists; 50 each). Default `false` |
| `trackRows` | Boolean | One row per track instead of one row per album / playlist / artist. Default `false` |
| `idType` | Select | What a bare id is (`auto` detects it). Default `auto` |
| **🎯 Filters** (applied by Spotify) | | |
| `language` | Select | Language of search results and genre names, e.g. `en`, `es`, `de`. Default `en` |
| `searchLanguages` | Multi-select | Run each search again in these languages, on top of `language`, for more results. |
| `market` | Text | Two-letter country code, applied when the run uses an Apify proxy. |
| **✂️ Refine results** | | |
| `minPlayCount` | Integer | Keep only tracks with at least this many plays. |
| `minMonthlyListeners` | Integer | Keep only artists with at least this many monthly listeners. |
| `minFollowers` (`minSaves`) | Integer | Keep only artists and playlists with at least this many followers / saves. |
| `excludeSpotifyOwned` | Boolean | Skip Spotify's own editorial and algorithmic playlists. |
| `excludePlaylistIds` | List | Playlists you already have; they are skipped. |
| **➕ Extra data** | | |
| `includeTracks` | Boolean | Albums and playlists carry their tracks with play counts; podcasts their episodes. Default `true` |
| `maxTracksPerItem` | Integer | Tracks kept per album / playlist / podcast. Default `100`, `0` = all |
| `includeDiscography` | Boolean | Artist rows carry every release, not only the latest 10 of each kind. |
| `followAlbums`, `followSingles`, `followPopularReleases` | Boolean | Also return each of an artist's albums / singles / popular releases as its own album row, for artist links, artists found by search and chart artists. These rows carry `followedFrom` (the artist's link) and count toward `maxResults`, not `maxResultsPerQuery`. |
| `includeCredits` | Boolean | Songwriting and production credits on every track row, including the rows of `trackRows` (one small extra request per track). Not added to the track lists inside album and playlist rows. |
| `scrapePreviewUrls` | Boolean | 30-second preview links on tracks. Default `true` |
| `includeConcerts` | Boolean | Upcoming concerts on artist rows: date, city and line-up — charged as **concerts** ($0.001 per artist row with concerts). |
| `enrichConcertDetails`, `concertDetailsLimit` | Boolean, Integer | Add venue, country, coordinates, genres and ticket sellers with links and availability (doors-open time when Spotify lists it) to the first N concerts per artist (default `20`). No extra charge. |
| `maxAlbumsPerArtist`, `includeSingles` | Integer, Boolean | With `trackRows`: how many of an artist's newest releases become track rows. Defaults `3`, `true` |
| **🔁 Monitoring** | | |
| `monitorMode` | Boolean | Return only new rows and rows whose numbers changed since the last run. Pair with a daily schedule. |
| `monitorStoreName` | Text | Memory for monitor mode; one name per schedule. |
| **📦 Output** | | |
| `maxResults` | Integer | Most rows per run. Default `100`; `0` = no limit. |
| `maxResultsPerQuery` | Integer | Most results per search term and type. Default `50`; Spotify serves about 1,000 per search. |
| `compact` | Boolean | Core fields only, sized for AI agents and MCP. Add-ons you turn on (`concerts`, `credits`, `discography`, `raw`) stay on the row. |
| `includeRaw` | Boolean | Attach Spotify's full answer under `raw`. With `trackRows`, each track row gets Spotify's item for that track (its entry in the album or playlist; a track link gets the full track answer). |
| **⚙️ Advanced** | | |
| `proxyConfiguration` | Proxy | Not needed. Default: no proxy. |
| `maxConcurrency` | Integer | Requests in flight. Default `6`. |

#### Input JSON

```json
{
  "urls": [
    "https://open.spotify.com/artist/0TnOYISbd1XYRBk9myaseg",
    "https://open.spotify.com/album/4m2880jivSbbyEGAKfITCa",
    "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
  ],
  "maxResults": 50
}
```

#### Paste links for known items, search for new ones

A link always returns exactly that item. Search returns Spotify's own ranking for the keyword, and every result gets its full row with `searchTerm` and `searchRank` (profiles carry the name, username and picture the search shows). **Do:** `urls: ["https://open.spotify.com/track/4uLU6hMCjMI75M1A2tKUQC"]` · **Don't:** search for a song title when you already have its link (search can return covers and remixes first).

#### Use one row per track for play-count reports

With `trackRows: true`, an album, a playlist or an artist becomes one row per track with its play count, position, album and source. A 10,000-track playlist delivered 1,000 track rows in 8.3 seconds in testing. Leave it off when you want one row per album or playlist with the tracks inside.

#### Find playlist curators with filters

Search `playlists` with `minFollowers: 200` and `excludeSpotifyOwned: true` to keep playlists run by people and brands; `contactEmails`, `contactHandles` and `contactLinks` come from the playlist description. Add `searchLanguages` to find more playlists for the same keyword.

### ⬆️ Output

Every Spotify item becomes one dataset item. Here is a table view of a 100-track run:

<a href="https://console.apify.com/actors/xgZtg3OkcshfU5Zvd"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/spotify-scraper-output.png" alt="Spotify Scraper output table with Spotify play counts" style="width:70%"></a>

An artist row (shortened):

```json
{
  "type": "artist",
  "id": "0TnOYISbd1XYRBk9myaseg",
  "url": "https://open.spotify.com/artist/0TnOYISbd1XYRBk9myaseg",
  "name": "Pitbull",
  "verified": true,
  "followers": 13489461,
  "monthlyListeners": 78824416,
  "worldRank": 17,
  "topCities": [{ "city": "Mexico City", "country": "MX", "region": "CMX", "numberOfListeners": 1276357 }],
  "topTracks": [{ "name": "On The Floor", "playCount": 1287075338, "durationMs": 284866, "previewUrl": "https://p.scdn.co/mp3-preview/a4069c..." }],
  "albumCount": 20,
  "singleCount": 181,
  "concertCount": 11,
  "upcomingRelease": { "name": "PITCOIN", "type": "album", "releaseDate": "2026-10-09" }
}
```

A playlist track inside a playlist row:

```json
{
  "name": "Patient Zero",
  "playCount": 73769731,
  "durationMs": 225868,
  "addedAt": "2026-09-25T04:02:48.872Z",
  "bpm": 91.99,
  "key": "G",
  "mode": "major",
  "camelotKey": "9B",
  "artists": [{ "name": "Taylor Swift", "url": "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02" }]
}
```

Each run also saves `play_counts.csv` in the run's key-value store: one line per track seen (artist, album, track, play count, source), ready for a spreadsheet.

#### Fields

| Field | Rows | What it is | Fill on test runs |
|---|---|---|---|
| `playCount` / `streamCount` | track | Total plays as Spotify shows them; `playCountText` keeps Spotify's raw string | 100% (100 tracks) |
| `tracks[].playCount` | album, playlist | Play count of every track in the list | 13/13 album, 50/50 playlist |
| `totalPlayCount` | album, playlist | Sum over every track, when every track was read | album 3,108,388,224 |
| `monthlyListeners` | artist | Monthly listeners | 81% of 400 searched artists |
| `followers` | artist, playlist | Followers / saves | 100% |
| `worldRank` | artist | Rank among the top 500 on Spotify, null otherwise | 28% |
| `topCities` | artist | Top 5 cities with listener counts | 73% |
| `releaseDate` | track, album | Release date and `releaseDatePrecision` | 100% of tracks and albums |
| `label`, `copyright` | album | Record label and copyright lines. Rows from a track link carry the copyright under `album.copyright`; `trackRows` rows expanded from an album or artist carry `label` | 100% of albums |
| `bpm`, `key`, `mode`, `camelotKey` | playlist tracks | Tempo and musical key | 100% / 99.8% of 1,000 |
| `previewUrl` | tracks | 30-second MP3 preview | 100% of 100 track links |
| `credits` | every track row (`includeCredits`) | Writers, composers, producers, engineers, performers | 6-42 per track |
| `authors`, `narrators`, `genres`, `rating`, `price` | audiobook | Authors, narrators, publisher, genres, rating and rating count, price and currency | 3/3 test audiobooks |
| `concerts` | artist (add-on) | Date, city, line-up | artists with shows (Pitbull 11/11) |
| `concerts[].venue`, `country`, `latitude`, `tickets` | artist (`enrichConcertDetails`) | Venue, country, coordinates, ticket sellers with links and availability | first N concerts (3/3 with N = 3) |
| `chart` | chart rows | Chart name, rank, previous and peak rank | 150 chart entries |
| `isNew`, `changed`, `previous*`, `delta*` | monitor mode | What changed since the last run (kept with `compact` too) | monitor runs |
| `tracksAdded`, `tracksRemoved` | playlist (monitor mode, `includeTracks` on) | Tracks added to or removed from the playlist since the last run, compared over the whole playlist (up to 10,000 tracks) whatever `maxTracksPerItem` is | monitor runs |

### How can I use Spotify data?

- 🎯 **Music marketers** — track a release's play counts day by day and report growth per track
- 📊 **Labels and A\&R scouts** — compare artists by monthly listeners, followers, world rank and top cities before signing
- 📬 **Playlist pitching** — find curator playlists by keyword and follower count, with the contact details in their descriptions
- 🎧 **Playlist analysts** — see which tracks a playlist added or removed, with play counts, BPM and key
- 🎤 **Promoters** — list an artist's upcoming concerts by date, city and line-up; turn on `enrichConcertDetails` for venues and ticket links
- 🤖 **AI and research teams** — feed compact rows into an LLM or a dataset of artists, tracks and charts

### How much does it cost to scrape Spotify?

Spotify Scraper is pay-per-result: **$2.80 per 1,000 rows** ($0.0028 per track, album, artist, playlist, podcast, episode, audiobook or profile row), no start fee. One row per track mode is **$0.074 per 1,000 track rows**. The concerts add-on is $0.001 per artist row that carries concerts. Inputs that return nothing are not charged.

| Rows | Entity rows | Track rows (`trackRows`) |
|---:|---:|---:|
| 10 | $0.028 | $0.00074 |
| 100 | $0.28 | $0.0074 |
| 1,000 | $2.80 | $0.074 |
| 10,000 | $28.00 | $0.74 |

There is nothing else to pay: Apify platform usage is included in these prices. Measured on 256 MB: 100 track links in 9.7 s, 100 artists from a search in 14 s, 1,000 track rows from one playlist in 8.3 s.

### Integrations, API, scheduling & MCP

- **Schedules:** run Spotify Scraper hourly, daily or weekly from the **Schedules** tab; turn on `monitorMode` to get only new or changed rows.
- **Webhooks:** fire a URL when a run finishes — push rows to your CRM, Slack or a sheet.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable, Slack via [Apify integrations](https://docs.apify.com/integrations).
- **API:** call it from Node.js or Python with `apify-client` — code on the [API tab](https://apify.com/TopApi/spotify-scraper/api/python) and the [Apify API reference](https://docs.apify.com/api/v2).
- **MCP / AI agents:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/TopApi/spotify-scraper/api/mcp) and ask for Spotify play counts in plain language.

### More scrapers from TopApi

<table>
<tr>
<td>🎬 <a href="https://apify.com/TopApi/tiktok-scraper">TikTok Scraper</a> — videos, hashtags, profiles</td>
<td>📹 <a href="https://apify.com/TopApi/tiktok-video-scraper">TikTok Video Scraper</a> — stats by video URL</td>
<td>🔎 <a href="https://apify.com/TopApi/tiktok-user-search-scraper">TikTok User Search Scraper</a></td>
</tr>
<tr>
<td>▶️ <a href="https://apify.com/TopApi/youtube-shorts-scraper">YouTube Shorts Scraper</a> — views and channels</td>
<td>📸 <a href="https://apify.com/TopApi/instagram-scraper">Instagram Scraper</a> — posts, reels, hashtags</td>
<td>👤 <a href="https://apify.com/TopApi/instagram-profile-scraper">Instagram Profile Scraper</a></td>
</tr>
<tr>
<td>📇 <a href="https://apify.com/TopApi/instagram-contact-scraper">Instagram Contact Scraper</a></td>
<td>🐦 <a href="https://apify.com/TopApi/x-profile-scraper">Twitter Profile Scraper</a> — X followers and bio</td>
<td>📈 <a href="https://apify.com/TopApi/similarweb-scraper">SimilarWeb Scraper</a> — website traffic</td>
</tr>
<tr>
<td>🌐 <a href="https://apify.com/TopApi/website-content-crawler">Website Content Crawler</a></td>
<td></td>
<td>🧭 <a href="https://apify.com/TopApi">All TopApi actors</a></td>
</tr>
</table>

### Limits & empty runs

- **Search depth:** Spotify serves about 1,000 results per search term and type; use more terms or `searchLanguages` to go wider.
- **Playlists:** Spotify playlists hold up to 10,000 tracks. Preview URLs come from Spotify's embed player, which lists the first 100 tracks of a playlist (96 of 1,000 track rows had one on the 10,000-track test playlist; every album and track link had one).
- **Numbers Spotify does not publish:** `monthlyListeners` is null for artists with no listeners this month, `worldRank` is null outside the top 500. Lyrics and audio features (danceability, energy) are not shown to signed-out visitors, so they are not in the rows; `bpm` and `key` are available on playlist tracks.
- **Profiles:** user profiles are shown only to signed-in visitors; profiles come from search (`searchType: users`) with name, username and picture.
- **Audiobooks:** an audiobook row carries its authors, narrators, publisher, genres, rating, price and duration; chapters are not listed.
- **Empty dataset:** the run's status message says why — a link that does not exist (checked twice), filters that removed every row, or nothing new in monitor mode. Nothing is charged for an empty run.

### FAQ

#### How many rows can Spotify Scraper collect in one run?

As many as you set in `maxResults` (`0` = no limit). Each search term returns up to about 1,000 results per type, and one row per track mode reads playlists of up to 10,000 tracks. A run saves its progress, so a restart does not deliver or charge rows twice.

#### How do I get Spotify play counts for every track of an album or playlist?

Paste the album or playlist link: the row carries every track with its play count (`maxTracksPerItem: 0` for all of them). For one row per track, turn on `trackRows`.

#### Can I run Spotify Scraper on a schedule to track play counts and monthly listeners?

Yes. Save your input as a task, open **Schedules**, pick the cadence and turn on `monitorMode`. Each run returns only rows whose play count, monthly listeners, followers, world rank, track count or playlist tracks changed, with `previous*` and `delta*` fields, and bills only those rows.

#### Can I integrate Spotify Scraper with other apps?

Yes — Make, Zapier, n8n, Google Sheets, Slack and more via [Apify integrations](https://docs.apify.com/integrations), or use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger an action when a run finishes.

#### Can I use Spotify Scraper with the Apify API?

Yes. The API lets you start runs, fetch datasets and manage schedules. Use `apify-client` for [Node.js](https://apify.com/TopApi/spotify-scraper/api/javascript) or [Python](https://apify.com/TopApi/spotify-scraper/api/python); the API tab has ready-to-paste code.

#### Can I use Spotify Scraper through an MCP server?

Yes. Open the [MCP tab](https://apify.com/TopApi/spotify-scraper/api/mcp), connect your MCP client (Claude Desktop, Cursor, LibreChat…), and ask for Spotify data in plain language. Turn on `compact` to keep rows small.

#### Do I need a Spotify account, cookies or an API key?

No. Spotify Scraper reads what Spotify shows to any signed-out visitor; you pass links or keywords and nothing else.

#### How is Spotify Scraper different from Spotify's official Web API?

The official Web API needs a registered developer app and shows a relative 1-100 popularity score instead of play counts. Spotify Scraper returns the play count Spotify displays, plus monthly listeners, world rank and top cities.

#### Why did my Spotify Scraper run return no results?

The status message names the cause: a link that is not a track, album, artist, playlist, show, episode or audiobook (user profile links are skipped), an id that does not exist, filters that removed every row, or no changes in monitor mode. None of these is charged.

#### Is it legal to scrape Spotify?

Spotify Scraper reads only publicly available Spotify pages, the same data a signed-out visitor sees. Results may still contain personal data (for example a playlist owner's name), which is regulated (for example by GDPR); make sure you have a legitimate purpose. See [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

#### Your feedback

We keep improving Spotify Scraper. Found a bug or missing a field? Open an issue on the [Issues tab](https://apify.com/TopApi/spotify-scraper/issues/open).

# Actor input Schema

## `urls` (type: `array`):

Track, album, artist, playlist, podcast, episode or audiobook links, e.g. https://open.spotify.com/artist/0TnOYISbd1XYRBk9myaseg, spotify:track:4uLU6hMCjMI75M1A2tKUQC, a short link or a bare id.

## `searchTerms` (type: `array`):

Keywords to search on Spotify, e.g. "lofi beats", "Taylor Swift", "true crime". Each term is searched for every result type below.

## `searchType` (type: `string`):

What kind of results a search term returns (songs when empty). Every result gets its full row (play counts, followers...); profiles carry name, username and picture.

## `searchTypes` (type: `array`):

Search several result types at once, e.g. artists and playlists. Added to "Search for".

## `charts` (type: `boolean`):

Add the current Spotify Charts (Weekly Top Songs, Top Albums and Top Artists, global, 50 each) with rank, previous and peak rank on every row.

## `trackRows` (type: `boolean`):

Output one row per track (its play count) for every album, playlist, artist or track you give, instead of one row per album / playlist / artist. Charged per track row (see Pricing).

## `idType` (type: `string`):

What a bare 22-character id means. Links and spotify: URIs carry their own type and ignore this.

## `language` (type: `string`):

Language Spotify uses for search results and genre names, e.g. en, es, de, ja.

## `searchLanguages` (type: `array`):

Run every search again in these Spotify languages, on top of Language above. Each language returns partly different results (about 1 in 5 playlists were new per language in testing).

## `market` (type: `string`):

Two-letter country code, e.g. US, GB, BR. Spotify reads the market from the IP address, so this is applied when the run uses an Apify proxy (see Advanced).

## `minPlayCount` (type: `integer`):

Keep only tracks (and track rows) with at least this many plays, e.g. 1000000.

## `minMonthlyListeners` (type: `integer`):

Keep only artists with at least this many monthly listeners, e.g. 50000.

## `minFollowers` (type: `integer`):

Keep only artists and playlists with at least this many followers (a playlist's saves), e.g. 200. Also accepted as minSaves.

## `excludeSpotifyOwned` (type: `boolean`):

Leave out playlists run by Spotify itself (editorial, algorithmic and chart playlists), keeping those run by people and brands.

## `excludePlaylistIds` (type: `array`):

Playlist links or ids you already have, e.g. the id column of an earlier run. They are skipped.

## `includeTracks` (type: `boolean`):

Albums and playlists carry their tracks with each track's play count; podcasts carry their episodes.

## `maxTracksPerItem` (type: `integer`):

Tracks (or episodes) kept on each album, playlist or podcast row. 0 = all (Spotify playlists hold up to 10,000).

## `includeDiscography` (type: `boolean`):

Artist rows carry every release (albums, singles, EPs, compilations) with date, label and track count, not just the latest 10 of each.

## `followAlbums` (type: `boolean`):

For every artist (links, search results, chart artists), also return each of their albums as its own album row with per-track play counts. Counts toward Max results.

## `followSingles` (type: `boolean`):

For every artist (links, search results, chart artists), also return each single and EP as its own album row with play counts. Counts toward Max results.

## `followPopularReleases` (type: `boolean`):

For every artist (links, search results, chart artists), also return Spotify's popular releases as album rows with play counts. Counts toward Max results.

## `includeCredits` (type: `boolean`):

Every track row (One row per track too) carries its songwriting and production credits (writers, composers, producers, engineers, performers) and label source. One small request per track.

## `scrapePreviewUrls` (type: `boolean`):

Add the 30-second MP3 preview link to tracks (from Spotify's embed player).

## `includeConcerts` (type: `boolean`):

Artist rows carry their upcoming concerts (date, city, line-up). Charged as the concerts add-on per artist row that has concerts. Venue and tickets: turn on Concert details.

## `enrichConcertDetails` (type: `boolean`):

With Artist concerts: add each concert's venue, country, coordinates, genres, and ticket sellers with links and availability (doors-open time when Spotify lists it). Included in the concerts add-on.

## `concertDetailsLimit` (type: `integer`):

How many concerts per artist get the details above.

## `maxAlbumsPerArtist` (type: `integer`):

With One row per track: how many of an artist's releases (newest first) are expanded into track rows.

## `includeSingles` (type: `boolean`):

With One row per track: count singles and EPs among an artist's releases.

## `monitorMode` (type: `boolean`):

Return only rows that are new or whose play count, monthly listeners, followers, world rank, track count or playlist tracks changed since the last run, with the previous value and the difference.

## `monitorStoreName` (type: `string`):

Name of the key-value store that remembers the last values. Use a different name per schedule.

## `maxResults` (type: `integer`):

Most rows this run delivers (track rows with One row per track). 0 = no limit.

## `maxResultsPerQuery` (type: `integer`):

Most results per search term and result type. Spotify serves about 1,000 per search. 0 = as many as Spotify returns.

## `compact` (type: `boolean`):

Core fields only (name, link, play count, listeners, followers...), sized for AI agents and MCP. Add-ons you turn on (concerts, credits, discography, raw) stay on the row.

## `includeRaw` (type: `boolean`):

Attach Spotify's full answer for each row under raw. Track rows from One row per track get Spotify's item for that track (the album or playlist entry).

## `proxyConfiguration` (type: `object`):

Not needed: Spotify answers Apify's servers directly, and the run moves to the Apify proxy by itself if Spotify refuses. Set one to read another country's market.

## `maxConcurrency` (type: `integer`):

Requests in flight at once.

## Actor input object example

```json
{
  "urls": [
    "https://open.spotify.com/artist/0TnOYISbd1XYRBk9myaseg",
    "https://open.spotify.com/album/4m2880jivSbbyEGAKfITCa",
    "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
  ],
  "charts": false,
  "trackRows": false,
  "idType": "auto",
  "language": "en",
  "excludeSpotifyOwned": false,
  "includeTracks": true,
  "maxTracksPerItem": 100,
  "includeDiscography": false,
  "followAlbums": false,
  "followSingles": false,
  "followPopularReleases": false,
  "includeCredits": false,
  "scrapePreviewUrls": true,
  "includeConcerts": false,
  "enrichConcertDetails": false,
  "concertDetailsLimit": 20,
  "maxAlbumsPerArtist": 3,
  "includeSingles": true,
  "monitorMode": false,
  "monitorStoreName": "spotify-scraper-monitor",
  "maxResults": 50,
  "maxResultsPerQuery": 50,
  "compact": false,
  "includeRaw": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 6
}
```

# Actor output Schema

## `results` (type: `string`):

One item per track, album, artist, playlist, show, episode, user or audiobook (or per track with One row per track).

## `playCounts` (type: `string`):

play_counts.csv: one line per track seen in the run (artist, album, track, play count, source).

## `summary` (type: `string`):

Per-input status and counts (delivered, filtered, not found), requests and bytes.

# 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 = {
    "urls": [
        "https://open.spotify.com/artist/0TnOYISbd1XYRBk9myaseg",
        "https://open.spotify.com/album/4m2880jivSbbyEGAKfITCa",
        "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/spotify-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 = {
    "urls": [
        "https://open.spotify.com/artist/0TnOYISbd1XYRBk9myaseg",
        "https://open.spotify.com/album/4m2880jivSbbyEGAKfITCa",
        "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M",
    ],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/spotify-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://open.spotify.com/artist/0TnOYISbd1XYRBk9myaseg",
    "https://open.spotify.com/album/4m2880jivSbbyEGAKfITCa",
    "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
  ],
  "maxResults": 50
}' |
apify call topapi/spotify-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,topapi/spotify-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/xgZtg3OkcshfU5Zvd/builds/PI45bxN94sXDe3Anm/openapi.json
