Spotify Scraper - Play Counts, Monthly Listeners & Playlists · Apify
Spotify Scraper: Play Counts, Monthly Listeners & Playlists avatar

Spotify Scraper: Play Counts, Monthly Listeners & Playlists

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Spotify Scraper: Play Counts, Monthly Listeners & Playlists

Spotify Scraper: Play Counts, Monthly Listeners & Playlists

Scrape Spotify play counts, streams, monthly listeners, followers, world rank, top cities, and biographies. Six modes: artist, track, album, playlist, search, and playlist discovery (find playlists by keyword with save counts). 180+ markets: K-pop, J-pop, Latin, Afrobeats. $2.79/1K on Starter.

Pricing

from $2.00 / 1,000 results

Rating

5.0

(1)

Developer

Sourabh Kumar

Sourabh Kumar

Maintained by Community

Actor stats

0

Bookmarked

393

Total users

83

Monthly active users

a day ago

Last modified

Categories

Features

Limited permissions

Share

Spotify scraper: artists, tracks, albums, playlists and more

Get Spotify play counts, monthly listeners, followers, world rank and top cities. Paste any Spotify link, or type keywords to find playlists to pitch, then download a clean spreadsheet.

From $2.00 to $3.00 per 1,000 results, depending on your Apify plan. No start fee, no proxy setup, no login.

Works for every Spotify market and script: K-pop, J-pop, Latin, Afrobeats, Arabic and Hindi names come back as Spotify shows them.


Top use cases


Pick a mode

Have Spotify links? Paste them into Spotify URLs or IDs (spotifyUrls) and press Start. You can mix artist, track, album and playlist links in one run: each link is read as what it is, whatever the mode says. The mode only matters for keywords and for bare IDs.

You wantmodePaste into
Monthly listeners, followers, world rank, top citiesartistspotifyUrls (artist links or IDs)
Play count, label and release date of a songtrackspotifyUrls (track links or IDs)
Every track of an album with its play countalbumspotifyUrls (album links or IDs)
A playlist's tracks, play counts and save countplaylistspotifyUrls (playlist links or IDs)
Tracks, artists, albums and playlists for a keywordsearchsearchTerm (one keyword)
Playlists to pitch, filtered by saves, with curator contactsplaylistDiscoverysearchTerms (keywords)

Max results (maxResults) is 50 by default. To scrape more than 50 links in one run, raise it or set it to 0 (no limit).

Every mode can be scheduled. Run it daily and you have a play count and monthly listener tracker.


Why this Spotify scraper?

  • 🎧 Exact play counts: every track on an album or playlist, not only the top songs.
  • 📈 Artist numbers the official API hides: monthly listeners, world rank and top 5 cities.
  • 💿 One row per link: an album with all its tracks costs the same as one song.
  • 🔎 Playlist discovery: about 1,000 playlists per keyword, filtered by saves, with curator contact links.
  • 🔑 Nothing to set up: no Spotify developer app, no login, no proxy.
  • 💸 Pay only for results: links that fail or don't exist are never charged.

1. Artist: monthly listeners, world rank and top cities

Paste artist links, spotify:artist: URIs or 22-character artist IDs.

Get one row per artist: monthly listeners, followers, world rank, top 5 cities with listener counts, top 10 tracks with play counts, biography, related artists and release counts.

OptionFieldDefaultWhat it does
Spotify URLs or IDsspotifyUrlsArtist links, URIs or IDs.
Include artist discographyincludeDiscographyoffAdds the full lists of albums, singles, compilations and popular releases. Off returns counts only.
Max resultsmaxResults50How many artists to scrape. 0 means no limit.

Input

{
"mode": "artist",
"spotifyUrls": ["https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4"]
}

Output (one real row, selected fields)

{
"type": "artist",
"spotifyId": "3TVXtAsR1Inumwj472S9r4",
"name": "Drake",
"monthlyListeners": 93853399,
"followers": 119227640,
"worldRank": 7,
"topCities": [
{
"city": "London",
"country": "GB",
"region": "ENG",
"listeners": 1766215
},
{
"city": "New York City",
"country": "US",
"region": "NY",
"listeners": 1438430
}
],
"topTracks": [
{
"spotifyId": "1zi7xx7UVEFkmKfv06H8x0",
"name": "One Dance",
"playCount": 4558412672,
"explicit": false
},
{
"spotifyId": "514joG57v4yKTsfQmz7stz",
"name": "Janice STFU",
"playCount": 403908869,
"explicit": true
}
],
"topTracksCount": 10,
"discography": {
"albumsCount": 22,
"singlesCount": 66,
"compilationsCount": 0
},
"spotifyUrl": "https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4"
}

worldRank is filled only for artists inside Spotify's global ranking and is null for everyone else.


2. Track: play count of any song

Paste track links, URIs or IDs.

Get one row per track: play count, artists, album, label, release date, duration, explicit flag and a preview link.

OptionFieldDefaultWhat it does
Spotify URLs or IDsspotifyUrlsTrack links, URIs or IDs.
Max resultsmaxResults50How many tracks to scrape. 0 means no limit.

Input

{
"mode": "track",
"spotifyUrls": ["https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b"]
}

Output (one real row, selected fields)

{
"type": "track",
"spotifyId": "0VjIjW4GlUZAMYd2vXMi3b",
"name": "Blinding Lights",
"artists": [
{
"name": "The Weeknd",
"spotifyId": "1Xyo4u8uXC1ZmMpatF05PJ",
"isPrimary": true
}
],
"album": {
"spotifyId": "4yP0hdKOZPNshxUOjY0cZj",
"name": "After Hours",
"type": "ALBUM",
"releaseDate": "2020-03-20T00:00:00Z",
"label": "Republic Records"
},
"playCount": 5674785648,
"durationMs": 200040,
"explicit": false,
"releaseDate": "2020-03-20T00:00:00Z",
"releaseDatePrecision": "DAY",
"spotifyUrl": "https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b"
}

Some older releases only have a year. Then releaseDate reads as January 1 and releaseDatePrecision is YEAR.


3. Album: every track with its play count

Paste album links, URIs or IDs.

Get one row per album: label, copyright, release date, track count, and every track with its play count. The whole album is one result.

OptionFieldDefaultWhat it does
Spotify URLs or IDsspotifyUrlsAlbum links, URIs or IDs.
Max resultsmaxResults50How many albums to scrape. 0 means no limit.

Input

{
"mode": "album",
"spotifyUrls": ["https://open.spotify.com/album/4yP0hdKOZPNshxUOjY0cZj"]
}

Output (one real row, 2 of 14 tracks shown)

{
"type": "album",
"spotifyId": "4yP0hdKOZPNshxUOjY0cZj",
"name": "After Hours",
"albumType": "ALBUM",
"artist": "The Weeknd",
"releaseDate": "2020-03-20T00:00:00Z",
"label": "Republic Records",
"trackCount": 14,
"tracks": [
{
"spotifyId": "6b5P51m8xx2XA6U7sdNZ5E",
"name": "Alone Again",
"trackNumber": 1,
"playCount": 234287046,
"durationMs": 250053
},
{
"spotifyId": "2K9Ovn1o2bTGqbsABGC6m3",
"name": "Too Late",
"trackNumber": 2,
"playCount": 233102228,
"durationMs": 239973
}
],
"spotifyUrl": "https://open.spotify.com/album/4yP0hdKOZPNshxUOjY0cZj"
}

4. Playlist: tracks, play counts and saves

Paste playlist links, URIs or IDs.

Get one row per playlist: name, owner, description, save count, and its tracks with play counts and the date each was added. The whole playlist is one result.

OptionFieldDefaultWhat it does
Spotify URLs or IDsspotifyUrlsPlaylist links, URIs or IDs.
Max resultsmaxResults50How many playlists to scrape. 0 means no limit.

Input

{
"mode": "playlist",
"spotifyUrls": ["https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"]
}

Output (one real row, 1 of 50 tracks shown)

{
"type": "playlist",
"spotifyId": "37i9dQZF1DXcBWIGoYBM5M",
"name": "Today’s Top Hits",
"description": "The hottest 50. Cover: Ashe",
"owner": "Spotify",
"itemCount": 50,
"saveCount": 33606554,
"tracks": [
{
"spotifyId": "3zOYmiNOuyDL0ClxJcEJ0T",
"name": "Stop The Wedding!",
"artists": [
{
"name": "Ashe",
"spotifyId": "6P5NO5hzJbuOqSdyPB7SJM"
}
],
"album": {
"spotifyId": "4dem9qxmFf4RD6fqoCH6wc",
"name": "Stop The Wedding!",
"releaseDate": null
},
"durationMs": 198840,
"playCount": 195641796,
"contentRating": "NONE",
"explicit": false,
"addedAt": "2026-11-06T05:02:41.791Z",
"itemType": "track"
}
],
"spotifyUrl": "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
}

5. Search: tracks, artists, albums and playlists for a keyword

Paste one keyword, in any language.

Get one row per search with four lists: tracks, artists, albums and playlists, up to 50 of each. Search results carry links and IDs but no play counts: paste the links you want into the other modes for full numbers.

OptionFieldDefaultWhat it does
Search termsearchTermThe keyword to search.
Max resultsmaxResults50Items per list, up to 50.

Input

{
"mode": "search",
"searchTerm": "lofi",
"maxResults": 20
}

Output (one real row, 1 item per list shown)

{
"type": "search",
"query": "lofi",
"tracks": [
{
"spotifyId": "5Y2FbfYRCaScEgpgdW9cB2",
"name": "Lofi",
"artists": [
"Ponder"
],
"album": "Lofi",
"playCount": null,
"durationMs": 144803,
"spotifyUrl": "https://open.spotify.com/track/5Y2FbfYRCaScEgpgdW9cB2"
}
],
"artists": [
{
"spotifyId": "1eDIWVJt7ZWKsrXw5WVNsN",
"name": "Lofi Girl",
"imageUrl": "https://i.scdn.co/image/ab6761610000e5ebb76821624d579822177cf3a3",
"spotifyUrl": "https://open.spotify.com/artist/1eDIWVJt7ZWKsrXw5WVNsN"
}
],
"albums": [
{
"spotifyId": "20V6pMz1lSwL8wE65ZoizM",
"name": "Lofi Girl - Halloween 2026",
"artist": "Lofi Girl",
"albumType": "ALBUM",
"imageUrl": "https://i.scdn.co/image/ab67616d0000b2732ca76f167c3946face910ad3",
"spotifyUrl": "https://open.spotify.com/album/20V6pMz1lSwL8wE65ZoizM"
}
],
"playlists": [
{
"spotifyId": "0vvXsWCC9xrXsKd4FyS8kM",
"name": "Lofi Girl - beats to relax/study to",
"owner": "Lofi Girl",
"description": "A daily selection of chill beats - perfect to help you relax & study 📚 Click here if you need lofi sleep 💤",
"imageUrl": "https://image-cdn-fa.spotifycdn.com/image/ab67706c0000da848bc80c95b9d248cf462c0bd1",
"spotifyUrl": "https://open.spotify.com/playlist/0vvXsWCC9xrXsKd4FyS8kM"
}
]
}

6. Playlist discovery: find playlists to pitch

Paste keywords such as a genre or mood.

Get one row per playlist: save count, owner, whether Spotify runs it, the description, and any email, social handle or submission link the curator wrote in it.

OptionFieldDefaultWhat it does
Search termssearchTermsKeywords. Each one finds up to about 1,000 playlists.
Minimum savesminSaves0Only return playlists with at least this many saves. You pay only for those.
Skip Spotify-owned playlistsexcludeSpotifyOwnedoffKeep only playlists run by people and brands.
Skip these playlistsexcludePlaylistIdsPlaylist links or IDs you already have. They are skipped and never charged.
Search countriessearchCountriesRepeat every keyword as if searching from up to 10 countries. Each country adds playlists.
Search languagessearchLanguagesRepeat every keyword in other Spotify languages.
Max resultsmaxResults50How many playlists to return. 0 means no limit.

Input

{
"mode": "playlistDiscovery",
"searchTerms": ["indie rock", "indie pop", "bedroom pop"],
"minSaves": 1000,
"excludeSpotifyOwned": true,
"maxResults": 100
}

Output (one real row, selected fields)

{
"type": "playlistDiscovery",
"spotifyId": "2zn5Uz49wyfb5RvIPxgify",
"name": "2000s Alternative & Indie Rock ",
"saveCount": 30254,
"owner": "PK",
"ownerUsername": "syk1v6v29x1oc1do8pmm4xyp0",
"isSpotifyOwned": false,
"description": "Indie & Alt Rock of the 21st century. For Submissions, go to melophobemusic.com",
"contactEmails": [],
"contactHandles": [],
"contactLinks": [
"melophobemusic.com"
],
"searchTerm": "indie rock",
"searchRank": 28,
"spotifyUrl": "https://open.spotify.com/playlist/2zn5Uz49wyfb5RvIPxgify"
}

A playlist found by several keywords or countries comes back once and is charged once. To get only new playlists next time, paste the spotifyId column of this run into Skip these playlists.


Input reference

FieldTypeDefaultNotes
modestringartistOne of artist, track, album, playlist, search, playlistDiscovery. Links decide their own type; the mode applies to bare IDs and keyword modes.
spotifyUrlsstring[]Links, spotify: URIs or 22-character IDs. Country links such as intl-ko work.
maxResultsinteger500 means no limit. Links: how many to scrape. Search: items per list, up to 50. Discovery: playlists returned.
includeDiscographybooleanfalseArtist: full lists of albums, singles, compilations and popular releases instead of counts.
searchTermstringSearch keyword, in any language. Discovery uses it when searchTerms is empty.
searchTermsstring[]Discovery keywords.
minSavesinteger0Discovery: only return, and charge for, playlists with at least this many saves.
excludeSpotifyOwnedbooleanfalseDiscovery: leave out playlists Spotify itself runs.
excludePlaylistIdsstring[]Discovery: playlist links or IDs to skip.
searchCountriesstring[]Discovery: up to 10 country codes (US, GB, MX, ...). Empty searches once from the United States.
searchLanguagesstring[]Discovery: language codes (en, de, ja, ...) to repeat each keyword in.

Spotify Web API or this scraper?

Spotify Web APIThis scraper
SetupRegister a developer app and handle OAuthNothing to set up
Play count per trackNot availableEvery track
Monthly listeners, world rank, top citiesNot availableAll three
Playlist save counts and curator contactsNot availableYes
ISRC, UPC, audio featuresAvailable (audio features only for older apps)Not included
popularity, genresRetired by Spotify in February 2026Not included

Use it from an AI agent (Claude, ChatGPT, MCP)

Connect Claude, ChatGPT, Cursor or any MCP client to Apify's MCP server with this scraper as a tool:

https://mcp.apify.com?tools=sourabhbgp/spotify-scraper

Then ask in plain words. The agent fills in the input, and you pay the same per result. For example:

  • "Get the play count of every track on https://open.spotify.com/album/4yP0hdKOZPNshxUOjY0cZj"
  • "How many monthly listeners does Bad Bunny have, and which cities listen most?"
  • "Find 100 indie rock playlists with at least 5,000 saves that Spotify doesn't run, with curator contacts."
  • "Search Spotify for lofi and list the top playlists and artists."

Notes for the agent:

QuestionModeMinimum input
Numbers for an artist, track, album or playlist you have a link or ID forany of artist, track, album, playlistspotifyUrls
Numbers for an artist you only know by namesearch, then artistsearchTerm, then the artist's spotifyUrl from the search row
Playlists for a genre or moodplaylistDiscoverysearchTerms (+ minSaves, excludeSpotifyOwned)
  • Keep the cost small: $3.00 per 1,000 results at most, and one link is one result however many tracks it holds. Set maxResults to what the question needs; in playlistDiscovery it is the number of playlists charged.
  • Links, not names: spotifyUrls takes links, spotify: URIs or 22-character IDs only. A name such as "Drake" is refused with [U_NOT_FOUND]: run search first and take the ID from its artists list.
  • Mixed links are fine: each link is read as its own type, whatever mode says. mode decides only bare IDs, search and playlistDiscovery.
  • More than 50 links: maxResults defaults to 50, so set it to the number of links or to 0.
  • Key output fields: playCount is all-time streams of one track. monthlyListeners is unique listeners over the last 28 days. saveCount is how many users saved the playlist. Search rows have playCount null by design.
  • Reading the result: the status message starts with a code when a run ends short: [U_...] means the input, [E_...] means our side. The RUN_SUMMARY record in the run's key-value store lists every input with its own outcome.
  • Time: links are read one after another, about 1 to 2 seconds each, so a few links take seconds. 100 discovery playlists from 3 keywords take under half a minute. Each search country adds time to a discovery run.

What people use it for

  • 🎤 Artists and managers: track monthly listeners, top cities and stream counts after each release.
  • 🏷️ Labels and A&R: compare artists and catalogues by real play counts.
  • 📬 Playlist pitching: build a list of playlists by genre and save count, with curator contact links.
  • 📊 Music analysts: schedule daily runs and chart how play counts and listeners move.
  • 📣 Marketers: check which songs and cities to put ad money behind.
  • 🌏 Regional markets: K-pop, J-pop, Latin, Afrobeats, Bollywood and Arabic artists, with names in their own script.
  • 📜 Editorial playlist watchers: follow save counts and track changes on playlists like Today's Top Hits.
  • 🧑‍💻 Developers and AI agents: pull Spotify numbers into Google Sheets, Make, Zapier, a database or an agent.

How much does it cost?

You pay per result, and each result is charged once. One result is one artist, track, album, playlist, search or discovered playlist. The price depends on your Apify plan:

Apify planPer 1,000 results
Free$3.00
Starter$2.79
Scale$2.50
Business and above$2.00

There is no start fee.

  • Free plan: your $5 monthly credit covers about 1,600 results.
  • Starter plan ($19): about 6,800 results a month.

Limitations

  • Playlists return up to 500 tracks, albums up to 1,000. itemCount still shows the playlist's full size.
  • Playlist tracks have no album release date: Spotify leaves it out of playlist data, so album.releaseDate is null there.
  • Search shows up to 50 items per list, without play counts.
  • About 1,000 playlists per keyword in discovery: add keywords or countries for more. Each country adds run time, so raise the run timeout for long keyword lists.
  • Curator contacts only when written: Spotify doesn't publish curator emails, so most playlists have none.
  • No genres, popularity score or audio features: Spotify retired them or keeps them for old developer apps.
  • No ISRC or UPC codes, and public data only: no private playlists or listening history.

FAQ

How do I scrape Spotify without coding?

Paste Spotify links, or pick a keyword mode and type keywords, then press Start. Download the results as Excel, CSV or JSON.

Can I track play counts and monthly listeners over time?

Yes. Save your input as a task and schedule it daily or weekly. Each run adds a dated snapshot you can compare.

Do I need a proxy or a Spotify account?

No. It works out of the box, with no Spotify developer app and no login.

That link returns no row and is not charged. The run still finishes, and the RUN_SUMMARY record says what happened to each link.

Does it work for K-pop, J-pop, Arabic and other scripts?

Yes. Names come back in the script Spotify uses, and country links such as open.spotify.com/intl-ko/artist/... work like plain links. Artist IDs to try:

RegionArtists
K-popBTS 3Nrfpe0tUJi4K4DXYWgMUX, BLACKPINK 41MozSoPIsD1dJM0CLPjZF, Stray Kids 2dIgFjalVxs4ThymZ67YCE
J-popYOASOBI 64tJ2EAv1R6UaZqc4iOCyj, Ado 6mEQK9m2krja6X1cfsAjfl
LatinBad Bunny 4q3ewBCX7sLwd24euuV69X, Karol G 790FomKkXshlbRYZFtlgla, Peso Pluma 12GqGscKJx3aE4t07u7eVZ
AfrobeatsBurna Boy 3wcj11K77LjEY1PkEazffa, Wizkid 3tVQdUvClmAT7URs9V3rsp, Tyla 3SozjO3Lat463tQICI9LcE
IndiaArijit Singh 4YRxDV8wJFPHPTeXepOstw, AP Dhillon 6LEG9Ld1aLImEFEVHdWNSB
ArabicAmr Diab 5abSRg0xN1NV3gLbuvX24M, Fairuz 0dwFxqYkvZLSA6U6XfQcDV

Can I use it from code or an AI agent?

Yes. Connect it to an AI agent through Apify's MCP server (see above), push results to Google Sheets, Make, Zapier or a webhook, or start a run through the Apify API:

curl -X POST "https://api.apify.com/v2/acts/sourabhbgp~spotify-scraper/runs?token=APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"spotifyUrls":["https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4"]}'

It collects only what Spotify shows any visitor, with no login. How you use the data is your responsibility, especially personal data such as curator names and contacts. This scraper is not affiliated with Spotify.

Your feedback

Something missing or wrong? Open an issue.