# Spotify Scraper - Play Counts, Playlists, Artists & Charts (`zaver.api/spotify-scraper`) Actor

Scrape Spotify without the Spotify API: track play counts, artist monthly listeners and followers, playlist tracks and followers, albums, podcasts, search results and top charts. No Spotify account, API key or cookies. No start fee. CSV, Excel or JSON.

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

## Pricing

from $2.99 / 1,000 scraped results

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

## Spotify Scraper — Play Counts, Monthly Listeners, Playlists, Artists and Charts

**Scrape Spotify without the Spotify API.** Paste track, playlist, artist, album or podcast links, or search by keyword, and get the numbers Spotify shows in its player: play counts, monthly listeners, followers, playlist tracks and top charts. No Spotify account, no developer app, no cookies. Pay per result, no start fee.

> ⭐ Track play counts · artist monthly listeners, followers and world rank · full playlists with play counts · albums with label and total plays · podcasts and episodes · keyword search · Top 50 charts · artist social links · API and MCP ready

### What does Spotify Scraper do?

It reads Spotify's public web player and returns clean rows. One Actor covers every public object type:

| You enter | You get |
|---|---|
| A **track** link | Play count, artists, album, length, release date, preview link |
| A **playlist** link | Every track with its play count and position, or the playlist's followers and totals |
| An **artist** link | Monthly listeners, followers, world rank, biography, top tracks, social links |
| An **album** link | Every track with play counts, or label, release date and total plays |
| A **podcast** link | Every episode with date and length, or the show's publisher and episode count |
| A **search query** | Top tracks, artists, albums, playlists, podcasts or episodes for the keyword |
| A **chart** | Top 50 Global, Top 50 USA, Top Songs Global or Today's Top Hits, ranked |

Mix links of any type in one run. Thousands of links are fine.

### What data does it extract?

#### Tracks

| Field | Description |
|---|---|
| `name`, `id`, `url` | Title, Spotify ID and link |
| `playCount` | Total streams, the number shown in the Spotify player |
| `artists`, `artistNames`, `artistIds` | All credited artists |
| `album`, `albumId`, `releaseDate`, `trackNumber` | Album details |
| `durationMs`, `duration`, `explicit`, `playable` | Length and flags |
| `previewUrl`, `coverUrl` | 30-second preview and cover art, when available |
| `position`, `playlistName`, `addedAt`, `chartName` | Where the track sits in the playlist, album, chart or search |

#### Artists

| Field | Description |
|---|---|
| `monthlyListeners`, `followers`, `worldRank` | The audience numbers on the artist page |
| `biography` | The artist's bio |
| `instagram`, `facebook`, `twitter`, `wikipedia`, `externalLinks` | Links the artist lists on Spotify |
| `topTracks` | Top ten tracks with play counts |
| `albums`, `singles` | Latest releases |
| `relatedArtists`, `concerts` | Optional: similar artists and upcoming concert dates |

#### Playlists, albums and podcasts

| Field | Description |
|---|---|
| Playlist | `name`, `description`, `owner`, `ownerUrl`, `followers`, `totalTracks`, `coverUrl` |
| Album | `name`, `albumType`, `artists`, `label`, `releaseDate`, `totalTracks`, `totalPlayCount`, `copyrights` |
| Podcast | `name`, `publisher`, `description`, `mediaType`, `totalEpisodes` |
| Episode | `name`, `description`, `showName`, `releaseDate`, `duration`, `explicit`, `previewUrl` |

### A Spotify API alternative

The official Spotify Web API does not return play counts or monthly listeners at all. It needs a developer app, OAuth tokens and rate-limit handling, and new apps no longer get related artists or Spotify's own editorial playlists.

This Actor is a **Spotify API alternative** for public data. It works **without the Spotify API**: no client ID, no OAuth, no quota extension request.

| | Spotify Web API | This Actor |
|---|---|---|
| Track play counts | Not available | Yes |
| Artist monthly listeners | Not available | Yes |
| Editorial playlists (Today's Top Hits, Top 50) | Blocked for new apps | Yes |
| Related artists | Blocked for new apps | Yes |
| Setup | Developer app, OAuth, token refresh | Paste links, press Start |
| Output | Nested API objects | Flat rows: CSV, Excel, JSON |

### Why use this Spotify scraper

#### Play counts on every track

Playlist, album and chart rows already include each track's play count. There is no second run to fetch them.

#### One Actor for six object types

Tracks, artists, albums, playlists, podcasts and episodes, plus search and charts. One input, one output format, one price.

#### Full playlists

Read every track of a playlist, not only the first hundred. Set **Max tracks per playlist** to 0.

#### Artist contact paths

Artist rows carry the Instagram, Facebook, X and Wikipedia links the artist lists on Spotify, which helps with A\&R research and outreach.

#### No start fee, and failures are free

You pay per result delivered. Removed tracks, private playlists and bad links return a free error row.

### How to scrape Spotify

1. Open the Actor and paste links into **Spotify links**, add **Search queries**, or pick **Charts**. Any one is enough.
2. For playlists, albums and podcasts, choose whether you want the tracks, a summary row, or both.
3. Press **Start**.
4. Export as CSV, Excel, JSON or XML, or read the dataset through the API.

> 💡 Searching for artists or playlists? Turn on **Full details for search results** to add followers and monthly listeners to each result.

### Input examples

A playlist with all of its tracks and play counts:

```json
{
  "urls": ["https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"],
  "maxItemsPerList": 0
}
```

Artists found by keyword, with monthly listeners and social links:

```json
{
  "searchQueries": ["indie folk", "lofi beats"],
  "searchTypes": ["artist"],
  "maxResultsPerQuery": 50,
  "searchDetails": true
}
```

Today's global chart:

```json
{
  "charts": ["top-50-global"]
}
```

| Field | Type | Description |
|---|---|---|
| `urls` | array | Spotify links or URIs of tracks, artists, albums, playlists, podcasts and episodes. |
| `listMode` | string | `tracks` (default), `summary` or `both` for playlists, albums and podcasts. |
| `maxItemsPerList` | integer | Tracks or episodes to read per list. 0 means all. Default `100`. |
| `charts` | array | `top-50-global`, `top-50-usa`, `top-songs-global`, `todays-top-hits`. |
| `searchQueries` | array | Keywords to search. |
| `searchTypes` | array | `track`, `artist`, `album`, `playlist`, `show`, `episode`. Default `["track"]`. |
| `maxResultsPerQuery` | integer | Top N results per query and type, up to 100. Default `20`. |
| `searchDetails` | boolean | Add play counts, followers and monthly listeners to search results. |
| `includeRelatedArtists` | boolean | Add similar artists to each artist row. |
| `includeConcerts` | boolean | Add upcoming concerts to each artist row. |
| `maxItems` | integer | Hard cap on results for the run. 0 means no cap. |

### Output examples

A track:

```json
{
  "type": "track",
  "id": "3C0nOe05EIt1390bVABLyN",
  "url": "https://open.spotify.com/track/3C0nOe05EIt1390bVABLyN",
  "name": "On The Floor",
  "artists": ["Jennifer Lopez", "Pitbull"],
  "artistNames": "Jennifer Lopez, Pitbull",
  "album": "Love?",
  "albumId": "3sysiYphqNRQw7VKLCg1yE",
  "durationMs": 284866,
  "duration": "4:44",
  "playCount": 1276735081,
  "explicit": false,
  "releaseDate": "2011-04-29",
  "trackNumber": 1,
  "source": "https://open.spotify.com/track/3C0nOe05EIt1390bVABLyN"
}
```

An artist:

```json
{
  "type": "artist",
  "id": "06HL4z0CvFAxyc27GXpf02",
  "url": "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
  "name": "Taylor Swift",
  "followers": 164963823,
  "monthlyListeners": 104253098,
  "worldRank": 5,
  "instagram": "https://instagram.com/taylorswift",
  "facebook": "https://facebook.com/TaylorSwift",
  "twitter": "https://twitter.com/taylorswift13",
  "topTracks": [{"name": "The Fate of Ophelia", "playCount": 1700630142}]
}
```

### Pricing

Pay per result. **No start fee, no monthly rental, no minimum.**

| Event | Charged for | Price |
|---|---|---|
| `result-scraped` | each track, artist, album, playlist, podcast or episode row delivered | **$2.99 / 1,000** |
| - | not-found items, private playlists, bad links and duplicates | **free** |

| You export | You pay |
|---|---|
| A Top 50 chart | **$0.15** |
| A 500-track playlist with play counts | **$1.50** |
| 1,000 artists with monthly listeners | **$2.99** |
| 10,000 tracks | **$29.90** |

You are charged right after each batch lands in your dataset, so a run you stop early costs only what it delivered. Proxies, when needed, are included.

### Use cases

#### Playlist pitching and curator research

Search playlists by genre or mood, turn on full details, and sort by followers to find the playlists worth pitching.

#### A\&R and artist discovery

Search artists by keyword, compare monthly listeners with followers, and collect social links for outreach.

#### Stream tracking for labels and managers

Schedule a daily run over your catalogue and chart play-count growth per track.

#### Chart and trend monitoring

Log the Top 50 every day to see which tracks enter, climb and drop.

#### Competitive analysis

Compare an artist's top tracks, release cadence and audience with their peers.

#### Podcast research

Export a show's full episode list with dates and lengths, or search podcasts by topic.

#### Music datasets for research and AI

Build datasets of tracks, albums and popularity for recommendation models and academic work.

### FAQ

**Do I need a Spotify account, API key or cookies?**
No. It works without the Spotify API and without logging in.

**Is scraping Spotify legal?**
This is general information, not legal advice. The Actor collects only information that Spotify shows publicly to every visitor of its web player, and never logs in. It does not download or copy music. Most of this data is about works and public figures, but artist pages can contain personal data, and Spotify's terms restrict automated access. Whether your use is lawful depends on where you are and what you do with the data. Use it for research and analytics, and ask a lawyer before building a commercial product on it.

**Does it download songs or podcasts?**
No. It returns data about them. The `previewUrl` field is the 30-second preview link Spotify itself publishes.

**Are the play counts accurate?**
They are the numbers Spotify displays in its player at the time of the run. Spotify updates them about once a day.

**Can it get lyrics, audio features or listener demographics?**
No. Lyrics need a logged-in account, and Spotify does not publish audio features or demographics on its public pages.

**Can it scrape user profiles or private playlists?**
No. Only public content is available. Private playlists return a free error row.

**How many tracks can it read from one playlist?**
All of them. Set **Max tracks per playlist** to 0, or to any number up to 10,000.

**Why do search results differ from what I see in my app?**
Spotify personalises search for logged-in users and by country. The Actor sees the logged-out results for the country of the server it runs on, usually the United States.

**How fast is it?**
A playlist of several hundred tracks takes a few seconds. Single track and artist links, and full details for search results, run at about 400 a minute.

**Can I run it on a schedule?**
Yes. Daily runs over the same links give you play-count and listener history.

### Integrations

- **Apify API** - start runs and fetch datasets from Python, Node.js, cURL or any HTTP client.
- **MCP server** - call this Actor as a tool from Claude, Cursor, ChatGPT agents and any MCP client.
- **No-code** - Make, Zapier, n8n, Google Sheets, Airtable, Slack, webhooks.
- **Schedules** - run hourly or daily and append to the same dataset to build history.
- **Exports** - JSON, JSONL, CSV, Excel (XLSX), XML, HTML table.

### Related actors

**Music, video and social**

- [TikTok Hashtag Scraper](https://apify.com/zaver.api/tiktok-hashtag-scraper) - videos by hashtag with views, likes and authors
- [Universal Video & Audio Transcriber](https://apify.com/zaver.api/universal-video-audio-transcriber) - turn podcasts and videos into text
- [Instagram Scraper](https://apify.com/zaver.api/instagram-scraper) - posts, reels, profiles and hashtags
- [Telegram Channel Scraper](https://apify.com/zaver.api/telegram-channel-scraper) - posts, views, reactions and media
- [Reddit Scraper](https://apify.com/zaver.api/reddit-scraper) - posts, comments, search, users and communities
- [Bilibili Scraper](https://apify.com/zaver.api/bilibili-scraper) - video stats, comments and keyword search

**Outreach**

- [Website Contact Extractor](https://apify.com/zaver.api/website-contact-extractor) - emails, phones and social profiles from websites
- [Instagram Email & Contact Extractor](https://apify.com/zaver.api/instagram-email-contact-extractor) - business emails from Instagram profiles

***

*Not affiliated with, endorsed by or sponsored by Spotify. This Actor reads only what Spotify shows publicly to a logged-out visitor and does not log in. You are responsible for using the data in line with applicable laws and Spotify's terms.*

# Actor input Schema

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

Links or URIs of tracks, artists, albums, playlists, podcasts (shows) and episodes, for example <code>https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M</code> or <code>spotify:track:3C0nOe05EIt1390bVABLyN</code>. Mix any types in one list.

## `listMode` (type: `string`):

<b>Tracks</b> returns one row per track (or episode) with its play count. <b>Summary</b> returns one row per playlist, album or podcast with followers and totals. <b>Both</b> returns the summary row followed by the tracks.

## `maxItemsPerList` (type: `integer`):

How many tracks or episodes to read from each list. 0 means all of them.

## `charts` (type: `array`):

Spotify's own top charts, returned as ranked tracks with play counts.

## `searchQueries` (type: `array`):

Keywords to search on Spotify, one per line: an artist name, a song title, a genre, a mood or a podcast topic.

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

Which kinds of results to return for each query.

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

Top N results of each selected type for each query.

## `searchDetails` (type: `boolean`):

Search results alone carry names and links. Turn this on to add play counts to tracks, followers and monthly listeners to artists, follower counts to playlists, and labels and totals to albums. Slower, same price per result.

## `includeRelatedArtists` (type: `boolean`):

Add the list of similar artists ("Fans also like") to each artist row.

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

Add upcoming concert dates and cities to each artist row.

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

Hard cap on results for the whole run. 0 means no cap.

## Actor input object example

```json
{
  "urls": [
    "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
  ],
  "listMode": "tracks",
  "maxItemsPerList": 100,
  "searchTypes": [
    "track"
  ],
  "maxResultsPerQuery": 20,
  "searchDetails": false,
  "includeRelatedArtists": false,
  "includeConcerts": false,
  "maxItems": 0
}
```

# Actor output Schema

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

All dataset items.

## `resultsCsv` (type: `string`):

CSV download.

## `runSummary` (type: `string`):

Counts for the run.

# 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/playlist/37i9dQZF1DXcBWIGoYBM5M"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaver.api/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/playlist/37i9dQZF1DXcBWIGoYBM5M"] }

# Run the Actor and wait for it to finish
run = client.actor("zaver.api/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/playlist/37i9dQZF1DXcBWIGoYBM5M"
  ]
}' |
apify call zaver.api/spotify-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zaver.api/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/emFdxY4rbQWaZwogU/builds/Gokq81WSQ3apVPZ7O/openapi.json
