# Spotify Monthly Listeners Scraper: Followers & World Rank (`eduair94/spotify-monthly-listeners-scraper`) Actor

Spotify monthly listeners, followers, world rank and top 5 listener cities for any artist. Paste artist links, IDs or names; 50 artists per request. Track changes between runs. Pay per artist.

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

## Pricing

from $0.90 / 1,000 artists

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/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 Monthly Listeners Scraper

Spotify monthly listeners, followers, world rank and top cities for any artist, as one clean row per artist. Paste artist links, IDs or plain artist names, run it once or on a schedule, and export the numbers to JSON, CSV or Excel. No Spotify account and no API key.

> Unofficial; not affiliated with Spotify. This Actor reads the public numbers Spotify shows on artist pages.

### What does Spotify Monthly Listeners Scraper do?

For every artist you enter, Spotify Monthly Listeners Scraper returns:

- **Monthly listeners** (`monthlyListeners`): unique listeners over the last 28 days, the number on the artist's Spotify page, as an exact whole number.
- **Followers** (`followers`) and **world rank** (`worldRank`), Spotify's ranking of the most-listened artists.
- **Top cities** (`topCities`): the 5 cities with the most monthly listeners, each with country, region and listener count, plus the number one city as `topCity`, `topCityCountry` and `topCityListeners`.
- **Popularity** (`popularity`, 0-100), the profile picture (`imageUrl`) and the artist's Spotify link (`url`).

It is built for rosters: 50 artists are fetched per request, so a list of 1,000 artist links or IDs takes 20 requests (each artist name adds one search first). With **Track changes** on, every row also says how the artist moved since your previous run.

### How to scrape Spotify monthly listeners

1. Paste your artists into **Artists**, one per line: Spotify artist links, `spotify:artist:` URIs, 22-character artist IDs or artist names (for example `Bad Bunny`).
2. Click **Start**. Three artists take about two seconds; thousands take a few minutes.
3. Open the **Monthly listeners** view in the Output tab, or download the rows as JSON, CSV, Excel or HTML.

A name is looked up with Spotify's artist search, and only an artist whose name matches it is used: case, accents, punctuation, `&` versus "and", a leading "The" and a small typo don't matter ("Tyler The Creator" finds Tyler, The Creator; "Weeknd" finds The Weeknd). `matchedName` shows the artist it matched. A name that matches no artist is not charged, and its line in ERRORS names Spotify's top result so you can paste that artist's link instead. Links and IDs are always exact.

### Input

| Field | What it does | Default |
| --- | --- | --- |
| `artists` | Artist links (open.spotify.com/artist/…, spotify.link short links too), `spotify:artist:` URIs, artist IDs or artist names, one per line (a line with several links or IDs is read as one artist each). The same artist entered twice is fetched and charged once. | required |
| `includeTopCities` | Adds `topCities` and the number one city (`topCity`, `topCityCountry`, `topCityListeners`). | true |
| `trackChanges` | Compares each artist with its previous run and adds the change columns (see below). | false |
| `historyStoreName` | The key-value store in your account that keeps the previous values for **Track changes**. Use one name per roster. | spotify-monthly-listeners-history |

Example input:

```json
{
    "artists": [
        "https://open.spotify.com/artist/1Xyo4u8uXC1ZmMpatF05PJ",
        "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
        "https://open.spotify.com/artist/4q3ewBCX7sLwd24euuV69X",
        "Peso Pluma"
    ],
    "trackChanges": true
}
```

### Output example

One row per artist (The Weeknd on 2026-11-01, with **Track changes** on and a previous run a week earlier):

```json
{
    "artistId": "1Xyo4u8uXC1ZmMpatF05PJ",
    "name": "The Weeknd",
    "url": "https://open.spotify.com/artist/1Xyo4u8uXC1ZmMpatF05PJ",
    "monthlyListeners": 116457297,
    "followers": 129632964,
    "worldRank": 3,
    "topCity": "Mexico City",
    "topCityCountry": "MX",
    "topCityListeners": 1645614,
    "topCities": [
        { "city": "Mexico City", "country": "MX", "region": "CMX", "listeners": 1645614 },
        { "city": "London", "country": "GB", "region": "ENG", "listeners": 1489446 },
        { "city": "São Paulo", "country": "BR", "region": "SP", "listeners": 1393878 },
        { "city": "Los Angeles", "country": "US", "region": "CA", "listeners": 1084296 },
        { "city": "Sydney", "country": "AU", "region": "NSW", "listeners": 978781 }
    ],
    "popularity": 96,
    "imageUrl": "https://i.scdn.co/image/ab6761610000e5ebc1719ac9e6a75c1c25835018",
    "input": "https://open.spotify.com/artist/1Xyo4u8uXC1ZmMpatF05PJ",
    "resolvedFrom": "url",
    "matchedName": null,
    "scrapedAt": "2026-11-01T08:00:01.284Z",
    "previousMonthlyListeners": 114902551,
    "monthlyListenersChange": 1554746,
    "monthlyListenersChangePct": 1.35,
    "previousFollowers": 129401877,
    "followersChange": 231087,
    "previousWorldRank": 4,
    "worldRankChange": 1,
    "previousScrapedAt": "2026-10-25T08:00:02.512Z"
}
```

| Field | Meaning |
| --- | --- |
| `artistId`, `name`, `url` | The artist's Spotify ID, name and page. |
| `monthlyListeners` | Monthly listeners: unique listeners over the last 28 days. |
| `followers` | Spotify followers. |
| `worldRank` | Spotify world rank by monthly listeners; empty when the artist is not ranked. |
| `topCity`, `topCityCountry`, `topCityListeners` | The city with the most monthly listeners, its country code and its listeners. |
| `topCities` | Up to 5 cities: `{city, country, region, listeners}`, most listeners first. |
| `popularity`, `imageUrl` | Spotify popularity score (0-100) and profile picture. |
| `input`, `resolvedFrom`, `matchedName` | The line you entered; how it named the artist (`url`, `uri`, `id`, `short_link` or `search`); for a name, the artist it matched. |
| `scrapedAt` | When the numbers were read. |
| `previousMonthlyListeners`, `monthlyListenersChange`, `monthlyListenersChangePct` | **Track changes**: monthly listeners at the previous run, the difference and the difference in percent. |
| `previousFollowers`, `followersChange` | **Track changes**: followers at the previous run and the difference. |
| `previousWorldRank`, `worldRankChange` | **Track changes**: world rank at the previous run and the places gained (12 to 9 is +3). |
| `previousScrapedAt` | **Track changes**: when the previous numbers were read. |

The Output tab has three views: **Monthly listeners**, **Top cities**, and **Changes since the last run**. The CSV link leaves out the nested `topCities` list; the number one city stays in its own columns.

### Track Spotify monthly listeners over time

Spotify only shows today's number. To build your own monthly listeners history:

1. Turn on **Track changes** (`trackChanges`) and give your roster a **History store name** (`historyStoreName`).
2. Save the input as a task and schedule it daily or weekly in Apify.
3. Each run compares every artist with the last run that delivered it and fills `previousMonthlyListeners`, `monthlyListenersChange`, `monthlyListenersChangePct`, `followersChange` and `worldRankChange`. An artist's first run leaves them empty.

Every run's dataset stays in your account, so the datasets of a schedule are also a full time series. Send them to Google Sheets, Slack or a webhook with Apify integrations. Use a separate history store for each schedule: two schedules writing the same store at the same time overwrite each other's values.

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

You pay per artist delivered. Your price follows your Apify plan:

| Apify plan | Per artist | Per 1,000 artists |
| --- | --- | --- |
| Free | $0.0015 | $1.50 |
| Bronze | $0.00125 | $1.25 |
| Silver | $0.001 | $1.00 |
| Gold, Platinum and Diamond | $0.0009 | $0.90 |

Each run also has Apify's start fee of $0.00005 (5 thousandths of a cent), and Apify covers the first 5 seconds of every run's compute. There is no monthly rental and no charge for platform usage.

| Example (Free plan) | Artists | Cost |
| --- | --- | --- |
| The prefilled 3 artists | 3 | $0.0045 + $0.00005 start |
| A roster of 1,000 artists | 1,000 | $1.50 |
| 10,000 artists | 10,000 | $15.00 ($9.00 on Gold) |
| 500 artists weekly for a month (4 or 5 runs) | 2,000 to 2,500 | $3.00 to $3.75 |

Never charged: unknown artists, names that match no artist, links to tracks or albums, broken IDs, repeats, and artists whose monthly listeners Spotify did not return this time. Set a maximum cost per run and the Actor stops at that amount without going over: it does not even look up the names it could not pay for.

### FAQ

#### What are Spotify monthly listeners?

The number of unique people who played an artist at least once in the last 28 days, the figure on every artist's Spotify page. One listener who plays 50 songs counts once.

#### How often does Spotify update monthly listeners?

About once a day. Running this Actor more often than daily mostly returns the same numbers, so a daily or weekly schedule is enough for tracking.

#### Why is `worldRank` empty?

Spotify ranks only its most-listened artists, roughly the top 500 worldwide. Everyone else has no world rank, so the field is empty (null), not 0.

#### Why is `monthlyListeners` 0?

Nobody played the artist in the last 28 days. Spotify then shows no monthly listeners at all, and the row says 0. Followers are still filled in. Artists with very few listeners also have fewer than 5 top cities, or none.

#### Can I get historical monthly listeners?

Spotify publishes only the current number. Turn on **Track changes** and schedule the Actor: from your first run on, every run adds a data point and the change since the previous one.

#### What happens when Spotify does not answer for an artist?

The artist is asked for again right away and once more at the end of the run. If its monthly listeners still did not arrive, it is listed in the ERRORS record of the run's key-value store as temporary and is not charged. Run it again later.

When monthly listeners are missing for every artist of two requests in a row, Spotify's statistics are down for the moment: the Actor stops asking for the rest, tries them once more at the end of the run, and charges nothing for the artists it could not deliver (a run that delivered nothing ends as failed). Run it again later.

#### Do I need a Spotify account or API key?

No. You only need an Apify account, and the Actor never uses your Spotify login. Spotify's own Web API has never returned monthly listeners, world rank or top cities, and it stopped returning artist followers in 2026.

#### Can I mix links, IDs and names?

Yes. Links and IDs are fetched directly; names are looked up with Spotify's artist search first, 50 at a time, so the first rows arrive while a long list of names is still being looked up. When several artists share a name, Spotify's top-ranked one is used, so prefer links for exact results. `resolvedFrom` and `matchedName` tell you how each row was found.

#### Why did a name return no artist?

Spotify's search answers every text with its closest artists, even when none of them is the one you meant, so the Actor only accepts an artist whose name matches yours. Nicknames and other spellings ("Tupac" for 2Pac) don't match: the ERRORS record shows Spotify's top result for that line, and nothing is charged. Enter the artist's link or exact name instead.

#### Is it legal to scrape Spotify monthly listeners?

The Actor reads public statistics that Spotify shows to every visitor of an artist page. It returns no personal data about listeners. Check that your use of the data complies with Spotify's terms and the laws that apply to you.

### Use it from the Apify API or MCP

Start a run, wait for it and get the rows in one call (synchronous calls wait up to 5 minutes):

```bash
curl -X POST "https://api.apify.com/v2/acts/eduair94~spotify-monthly-listeners-scraper/run-sync-get-dataset-items?maxTotalChargeUsd=1" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"artists": ["https://open.spotify.com/artist/4q3ewBCX7sLwd24euuV69X", "Taylor Swift"]}'
```

JavaScript, with the `apify-client` package:

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('eduair94/spotify-monthly-listeners-scraper').call({
    artists: ['https://open.spotify.com/artist/1Xyo4u8uXC1ZmMpatF05PJ', 'Bad Bunny'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const artist of items) console.log(artist.name, artist.monthlyListeners, artist.worldRank, artist.topCity);
```

Python, with the `apify-client` package:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("eduair94/spotify-monthly-listeners-scraper").call(
    run_input={"artists": ["Karol G", "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02"], "trackChanges": True}
)
for artist in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(artist["name"], artist["monthlyListeners"], artist.get("monthlyListenersChange"))
```

AI agents can call it too: add the Actor to Apify's MCP server and ask for an artist's monthly listeners in plain language.

### Use cases

- **A\&R and talent scouting**: compare a shortlist of artists by monthly listeners, followers and world rank, and spot who is growing fastest with **Track changes**.
- **Label and roster monitoring**: a weekly snapshot of every signed artist, with the change since last week, straight into a spreadsheet.
- **Tour routing**: the top cities show where an artist's listeners are before you book venues.
- **Playlist pitching and marketing**: measure what a release, a playlist placement or a campaign did to an artist's monthly listeners.
- **Music market research**: bulk Spotify artist stats for a genre, a country scene or a festival lineup.

### Related Spotify scrapers

- [Spotify Scraper: Play Counts, Monthly Listeners & Playlists](https://apify.com/eduair94/spotify-scraper): tracks, albums, playlists, charts, lyrics and podcasts, plus full artist profiles with biography and social links.
- [Spotify Play Count Scraper](https://apify.com/eduair94/spotify-play-count-scraper): stream counts for every track of an artist's discography, an album or a playlist.
- [Spotify Playlist Scraper](https://apify.com/eduair94/spotify-playlist-scraper): whole playlists with every track's play count, priced per playlist, with change tracking.
- [Spotify Artist Scraper](https://apify.com/eduair94/spotify-artist-scraper): full artist profiles with biography, social links, top tracks and related artists.
- [Spotify Charts Scraper](https://apify.com/eduair94/spotify-charts-scraper): Top 200, top artists and top albums by country, daily or weekly, with streams.

# Actor input Schema

## `artists` (type: `array`):

One artist per line: an open.spotify.com/artist/ link (spotify.link short links work too), a spotify:artist: URI, a 22-character artist ID, or an artist name such as Bad Bunny. A name is looked up with Spotify's artist search and only an artist named like it is used (case, accents, punctuation and small typos aside); its row says which artist matched (`matchedName`), and a name that matches no artist is not charged. The same artist entered twice is fetched and charged once.

## `includeTopCities` (type: `boolean`):

Add the artist's top 5 listener cities (`topCities`, each with city, country, region and listeners) and the number one city as `topCity`, `topCityCountry` and `topCityListeners`. Spotify lists fewer cities for artists with very few listeners.

## `trackChanges` (type: `boolean`):

Compare each artist with the last run that delivered it and add the change columns: `previousMonthlyListeners`, `monthlyListenersChange`, `monthlyListenersChangePct`, `previousFollowers`, `followersChange`, `previousWorldRank`, `worldRankChange` and `previousScrapedAt`. The first run of an artist has them empty. The values are kept in the history store named below, in your Apify account.

## `historyStoreName` (type: `string`):

Name of the key-value store that keeps each artist's latest values between runs. Use one name per roster or schedule (lower-case letters, digits and hyphens). Only read and written when Track changes is on.

## Actor input object example

```json
{
  "artists": [
    "https://open.spotify.com/artist/1Xyo4u8uXC1ZmMpatF05PJ",
    "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
    "https://open.spotify.com/artist/4q3ewBCX7sLwd24euuV69X"
  ],
  "includeTopCities": true,
  "trackChanges": false,
  "historyStoreName": "spotify-monthly-listeners-history"
}
```

# Actor output Schema

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

Every artist of this run with its monthly listeners, followers, world rank and top cities.

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

The same rows as CSV for spreadsheets, without the nested top cities list (the number one city stays in topCity).

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

Artists requested and delivered, repeats, failed inputs and the run outcome. Failed inputs are never charged.

## `errors` (type: `string`):

Each input that delivered no artist, with the reason; written only when an input failed. Never charged.

# 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 = {
    "artists": [
        "https://open.spotify.com/artist/1Xyo4u8uXC1ZmMpatF05PJ",
        "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
        "https://open.spotify.com/artist/4q3ewBCX7sLwd24euuV69X"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("eduair94/spotify-monthly-listeners-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 = { "artists": [
        "https://open.spotify.com/artist/1Xyo4u8uXC1ZmMpatF05PJ",
        "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
        "https://open.spotify.com/artist/4q3ewBCX7sLwd24euuV69X",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("eduair94/spotify-monthly-listeners-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 '{
  "artists": [
    "https://open.spotify.com/artist/1Xyo4u8uXC1ZmMpatF05PJ",
    "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
    "https://open.spotify.com/artist/4q3ewBCX7sLwd24euuV69X"
  ]
}' |
apify call eduair94/spotify-monthly-listeners-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,eduair94/spotify-monthly-listeners-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/idren6djBWsNLreLX/builds/0baPKQ7Sw5DeSG0kq/openapi.json
