Spotify Scraper—Play Counts, Monthly Listeners & Playlists avatar

Spotify Scraper—Play Counts, Monthly Listeners & Playlists

Pricing

from $0.60 / 1,000 scraped items

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

Spotify Scraper—Play Counts, Monthly Listeners & Playlists

Spotify play counts for tracks, albums, playlists and whole discographies, plus monthly listeners, world rank, charts with streams, lyrics and podcasts. Paste any link. Pay per result.

Pricing

from $0.60 / 1,000 scraped items

Rating

5.0

(1)

Developer

Eduardo Airaudo

Eduardo Airaudo

Maintained by Community

Actor stats

2

Bookmarked

103

Total users

34

Monthly active users

4.7 hours

Issues response

an hour ago

Last modified

Share

Spotify Scraper: Play Counts, Monthly Listeners & Playlists

Get Spotify play counts (all-time streams) for tracks, albums, playlists and whole artist discographies, artist analytics (monthly listeners, followers, world rank, top cities, social links), and playlists and Spotify Charts with daily streams. Paste any mix of Spotify links and each one is scraped according to its type. Lyrics, song credits, audio features, podcasts, concerts and search are included too.

No Spotify account or API key is needed. You pay only for the rows you get: $1.00 per 1,000 results, less on paid Apify plans.

What does Spotify Scraper do?

JobYou pasteYou get
Play countsTrack, album, playlist or artist links; ISRC codesOne row per track with a numeric playCount, plus album, label, release date and ISRC. Covers single tracks, every track on an album (with the album total), every track in a playlist, and an artist's whole discography.
Artist analyticsArtist links, or artist namesMonthly listeners, followers, world rank, top 5 cities, verified badge, bio, Instagram, X, Facebook and Wikipedia links, discography counts, latest release, top tracks with play counts, and related artists.
Playlists & chartsPlaylist links; country codesPlaylist followers, owner and track count, and full tracklists with play counts and add dates. Spotify Charts by country: Top 200 with daily streams, Viral, top artists and top albums, each with rank change, peak and days on chart.

It also covers time-synced lyrics, song credits (writers and producers), audio features (tempo, key, energy, danceability, valence), podcast shows and episodes, Spotify search, concerts, recommendations, user profiles, and ISRC and UPC lookups. It can also find the matching track, album or artist on YouTube Music, Apple Music, Amazon Music and other platforms.

How to use Spotify Scraper

  1. Paste Spotify links, spotify: URIs or IDs into Spotify links, IDs or keywords, one per line. You can mix tracks, albums, artists and playlists.
  2. Leave Data category on Auto, or pick a category from the tables below. For example, playlist_play_counts returns every track of a playlist with its play count.
  3. Click Start. Then open the dataset tabs (Overview, Tracks & play counts, Artists, Albums, Playlists, Charts, Concerts, Podcasts, Audio features) or export the results as CSV, Excel or JSON.

auto is the default category. Each line is scraped according to the type of link, and plain text is searched on Spotify:

{
"queries": [
"https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b",
"https://open.spotify.com/album/4yP0hdKOZPNshxUOjY0cZj",
"https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
"https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M",
"Daft Punk"
]
}

This input returns 5 rows (5 results, $0.005):

LineRuns asThe row has
Track linktrackplayCount, artists, album, release date, duration, ISRC, popularity
Album linkalbumlabel, UPC, © and ℗ lines, album type, track count, popularity
Artist linkartist_overviewmonthly listeners, followers, world rank, top cities, social links, discography counts
Playlist linkplaylistfollowers, owner, track count, description
Show or episode linkshow or episodepublisher, episode count and languages; or duration, release date and the show
User or concert linkuser_profile or partner_concertfollowers and public playlists; or date, venue, lineup and tickets
Plain text (Daft Punk)Spotify's top search hit, scraped as its typethe matched entity (an artist here), with resolvedFrom: "search" and matchedName
Bare 22-character IDThe type in Type of bare IDs (track by default)as above

Auto accepts open.spotify.com links (including /intl-xx/, /embed/ and ?si= links), spotify: URIs, spotify.link short links and bare IDs, also inside quotes or brackets or followed by a comma, as pasted from a CSV or JSON list. If you enter the same track, album or artist twice, it is scraped and charged once.

Auto returns one row per link. To get every track of an album, a playlist or an artist, use the play-count categories below.

Play counts

CategoryPasteOne row perColumns besides playCount
track (also used by Auto)Track links or IDstrackartists, albumName, releaseDate, durationMs, isrc, popularity, explicit, trackNumber, imageUrl
album_play_countsAlbum linkstrack on the albumalbumName, albumType, label, copyrightC, copyrightP, releaseDate, albumTotalPlayCount, trackNumber
playlist_play_countsPlaylist linkstrack in the playlistposition, addedAt, playlistName, playlistOwner, albumName, artists, durationMs
artist_discography_play_countsArtist linkstrack on the artist's albums, singles, EPs and compilations (newest first, each track once)albumName, albumType, label, releaseDate, albumTotalPlayCount, trackNumber
artist_play_countsArtist linkstop track (up to 10)topTrackRank, plus the artist's monthlyListeners, followers and worldRank
isrcISRC codes (USUG11904206)ISRC codethe first track Spotify lists for the code, with the track columns. Other tracks with the same ISRC are in metadata.otherTrackIds
track_play_countTrack links or IDstrackalbumName, releaseDate, durationMs, explicit (one track per request; track is faster for long lists)
  • playCount is an exact number, such as 5631276067. Spotify shows 0 until a track passes 1,000 streams.
  • Album, playlist and discography categories return up to Max results per query rows per input (default 50, maximum 1,000). Raise it for long playlists and big discographies.
  • In track_play_count, album_play_counts, playlist_play_counts, artist_play_counts and artist_discography_play_counts, a track that Spotify returns without a play count is skipped and not charged. track and isrc rows still arrive with their other columns if a play count cannot be read; RUN_SUMMARY counts them under playCounts.missing.

Every track of an artist's discography

{
"category": "artist_discography_play_counts",
"queries": ["https://open.spotify.com/artist/163tK9Wjr9P9DmM0AVK7lm"],
"maxResultsPerQuery": 1000
}

Album play counts output sample

{
"category": "album_play_counts",
"query": "https://open.spotify.com/album/4yP0hdKOZPNshxUOjY0cZj",
"name": "Alone Again",
"artists": ["The Weeknd"],
"playCount": 232644924,
"albumName": "After Hours",
"albumType": "album",
"label": "Republic Records",
"copyrightP": "℗ 2020 The Weeknd XO, Inc., marketed by Republic Records, a division of UMG Recordings, Inc.",
"releaseDate": "2020-03-20T00:00:00Z",
"trackNumber": 1,
"durationMs": 250053,
"explicit": true,
"albumTotalPlayCount": 14241532644,
"id": "6b5P51m8xx2XA6U7sdNZ5E",
"url": "https://open.spotify.com/track/6b5P51m8xx2XA6U7sdNZ5E",
"imageUrl": "https://i.scdn.co/image/ab67616d00001e028863bc11d2aa12b54f5aeb36"
}

A playlist_play_counts row adds the track's place in the playlist:

{
"category": "playlist_play_counts",
"name": "Stop The Wedding!",
"artists": ["Ashe"],
"playCount": 90942260,
"position": 1,
"addedAt": "2026-09-04T04:02:23.110Z",
"playlistId": "37i9dQZF1DXcBWIGoYBM5M",
"playlistName": "Today’s Top Hits",
"playlistOwner": "Spotify",
"albumName": "Stop The Wedding!",
"durationMs": 198840,
"url": "https://open.spotify.com/track/3zOYmiNOuyDL0ClxJcEJ0T"
}

Artist analytics

artist_overview (Auto uses it for artist links) returns one row per artist:

{
"category": "artist_overview",
"name": "Taylor Swift",
"monthlyListeners": 106764975,
"followers": 165400798,
"worldRank": 5,
"verified": true,
"topCities": [
{ "city": "London", "country": "GB", "region": "ENG", "listeners": 1714272 },
{ "city": "Quezon City", "country": "PH", "region": "00", "listeners": 1474171 }
],
"instagramUrl": "https://instagram.com/taylorswift",
"twitterUrl": "https://twitter.com/taylorswift13",
"albumsCount": 34,
"singlesCount": 80,
"compilationsCount": 1,
"latestRelease": { "id": "4hF2gTGuPYlykYuphDxi8J", "name": "The Life of a Showgirl: The Encore", "type": "album", "releaseDate": "2026-09-25" },
"topTracks": [
{ "id": "1BxfuPKGuaTgP7aM0Bbdwr", "name": "Cruel Summer", "playCount": 3509373490 },
{ "id": "1u8c2t2Cy7UBoG4ArRcF5g", "name": "Blank Space", "playCount": 2631900405 }
],
"relatedArtists": [
{ "id": "1McMsnEElThX1knmY4oliG", "name": "Olivia Rodrigo" },
{ "id": "74KM79TiuVKeVCqs8QtB0B", "name": "Sabrina Carpenter" }
],
"id": "06HL4z0CvFAxyc27GXpf02",
"url": "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02"
}

The sample is shortened. A real row has all 5 top cities, every link and gallery image, up to 10 top tracks and the related artists Spotify lists.

CategoryOne row per
artist_overviewartist: the columns above, plus description (bio), headerImageUrl, galleryImageUrls and externalLinks
artist_albumsalbum, with release date, type and track count
artist_singlessingle or EP
artist_appears_onrelease the artist appears on (Spotify returns up to 50)
artist_discovered_onplaylist where listeners discovered the artist (up to 50)
artist_featuringplaylist that features the artist
artist_relatedrelated artist ("Fans also like")
artist_discography_overviewartist: album, single and compilation counts
artist_concertsupcoming concert, with venue, address, coordinates and ticket links
artistartist from Spotify's Web API: image and popularity. Spotify no longer returns followers there, so use artist_overview for them

Playlists and charts

CategoryPasteOne row per
playlistPlaylist linksplaylist: followers, ownerName, totalTracks, description, snapshotId
playlist_tracksPlaylist linkstrack: addedAt, artists, album, duration, and playCount when Spotify includes it
playlist_play_countsPlaylist linkstrack: playCount, position, addedAt, playlist name and owner
chart_top_200_tracksCountry codeschart entry: rank, streams, previousRank, rankChange, peakRank, entryStatus, appearancesOnChart, peakDate, entryDate, artists, label
chart_viral_tracksCountry codeschart entry: the same columns, without streams
chart_top_artistsCountry codesartist entry with rank movement
chart_top_albumsCountry codesalbum entry with rank movement, artists and label
chart_top_monthly_listenersGLOBAL (the input is ignored)one of the global Top 50 artists by monthly listeners: monthlyListeners as a whole number (129,800,000) and monthlyListenersMillions (129.8)
chart_top_followersGLOBAL (the input is ignored)one of the global Top 50 artists by followers
new_releasesCountry codesnew album or single in that country
  • Enter one country code per line, such as US, GB or MX, or GLOBAL for the worldwide chart. Lines that are not country codes are skipped with a warning; if none is left, the Market setting is used. new_releases needs a country, so GLOBAL does not work there.
  • Leave Chart date empty for the latest chart, or enter YYYY-MM-DD for a past one.
  • A chart comes in one request. Set Max results per query to 200 to get the whole Top 200 (the default is 50).
  • The two Top 50 lists are the same worldwide, so each is fetched once per run whatever you enter.
  • When Spotify has not updated a country's new-releases list for more than 30 days, the run delivers nothing for that country and charges nothing.
{
"category": "chart_top_200_tracks",
"queries": ["US", "GB"],
"maxResultsPerQuery": 200
}

A Top 200 row:

{
"category": "chart_top_200_tracks",
"query": "US",
"country": "US",
"rank": 1,
"name": "Nicole Kidman",
"artists": ["ADÉLA"],
"streams": 1098450,
"previousRank": 1,
"rankChange": 0,
"peakRank": 1,
"entryStatus": "NO_CHANGE",
"appearancesOnChart": 38,
"consecutiveAppearancesOnChart": 38,
"peakDate": "2026-09-22",
"entryDate": "2026-09-04",
"label": "Capitol Records",
"releaseDate": "2026-09-04",
"id": "70cHKK8bHAfJrOGVnfRG9J",
"url": "https://open.spotify.com/track/70cHKK8bHAfJrOGVnfRG9J"
}

More Spotify data

CategoryPasteOne row per
track_lyricsTrack linkstrack: lyrics as plain text, with time-synced lines in data.lines
search_lyricsLyrics or song titlesthe best-matching track, with its lyrics
track_creditsTrack linkstrack: performers, writers, producers; full credits in data
audio_featuresTrack links or IDs (25 per request)track: tempo, key, modality (major or minor), energy, danceability, valence, loudness, acousticness, instrumentalness, liveness, speechiness, timeSignature
recommendationsA seed trackrecommended track (up to 100)
album, album_metadataAlbum linksalbum: label, © and ℗ lines, type, track count, release date (album adds upc and popularity)
album_tracksAlbum linkstrack on the album, with playCount
album_by_upcUPC or EAN barcodesthe album with that barcode, with the album columns
show, show_episodes, episodePodcast show or episode linksshow (publisher, episode count, languages); every episode of a show; one episode
user_profile, user_followersUser links or usernamesprofile (followers, public playlists); follower
search_multi, search_tracks, search_artists, search_albums, search_playlists, search_users, search_podcasts, search_episodes, search_genresKeywordssearch result, paged up to Max results per query
search_top_results, search_suggestionsKeywordstop result or autocomplete suggestion (up to 100)
search_concert_locationsCity or place nameslocation, with the geoHash to use in concerts_by_location
concerts_by_locationGeohashesconcert in the next 12 months
search_concert_artistsArtist namesupcoming concert of the best-matching artist
partner_concertConcert linksconcert: date, venue, lineup, ticket providers
partner_track, partner_album, partner_playlist, partner_artist_overview, partner_artist_discographyLinksSpotify's full app object under data, for developers

Input

FieldDefaultWhat it does
categoryautoWhat to scrape (see the tables above).
queries—Required. One input per line: links, URIs, IDs, keywords, country codes, ISRC or UPC codes, depending on the category.
defaultTypetrackAuto only: how to read a bare 22-character ID (track, album, artist, playlist, show or episode).
maxResultsPerQuery50Rows per input for list categories, 1 to 1,000. Long lists are paged automatically.
concurrency5Inputs processed at once (1 to 20). A batch of IDs fetched in one request counts as one. The Actor slows down by itself when Spotify throttles.
delayMs0Pause after each input (or batch), in milliseconds.
marketUS2-letter country for regional results, and for charts when the input has no country code.
chartDate—YYYY-MM-DD for a past chart (empty: the latest). Also the start date of concerts_by_location.
geoHash—Location filter for artist_concerts and search_concert_artists.
enrichConcertDetails—Adds venue, address, coordinates and tickets to each concert, at one extra request per concert. On for artist concert categories unless you turn it off.
concertDetailsLimit20Concerts enriched per input (1 to 50).
parsedConcertsfalseReturns concert payloads in a simplified flat shape.
includeRawfalseKeeps Spotify's full object under data and adds the whole response under raw (much larger rows).
enrichWithContrast—Adds the matching entity on ytmusic, applemusic, amazonmusic, pandora, gaana or tencent to track, album and artist rows, under contrast.

Output

Every row has category, query (the input as you entered it), scrapedAt, the flat columns shown above, and data, which holds Spotify's object for that row. Presentation-only blocks such as music videos and merch are left out of data unless includeRaw is on. Lists such as artists, topCities and topTracks stay as arrays in JSON. In CSV they become numbered columns.

The Output tab links the CSV without the nested data, raw, metadata and contrast payloads, the run summary, and the failed inputs. Through the API, add &omit=data,raw,metadata,contrast to the dataset items URL for the same lean CSV, or &fields=name,artists,playCount,url to pick columns.

Pricing

You pay per result. One result is one row in the dataset.

Discount tierPer resultPer 1,000 results
Free Apify plan$0.001$1.00
Bronze$0.0009$0.90
Silver$0.00075$0.75
Gold, Platinum and Diamond$0.0006$0.60

Your discount tier follows your Apify subscription; paid plans get the lower prices.

  • No start fee, no monthly rental and no platform usage charges.
  • Failed inputs, invalid links, repeated entities, empty results and Spotify placeholder entries are never charged.
  • Set a maximum cost per run, and the Actor stops at that amount without going over. The run summary says how many inputs were left.
Example run (Free plan prices)ResultsCost
1 track link1$0.001
The 4 prefilled links (track, album, artist, playlist)4$0.004
Every track of a 14-track album (album_play_counts)14$0.014
Every track of a 150-track playlist (playlist_play_counts, max results ≥ 150)150$0.15
An artist's discography with 85 tracks (artist_discography_play_counts)85$0.085
The US Top 200 (chart_top_200_tracks, max results 200)200$0.20
10,000 track links10,000$10.00 ($6.00 at Gold)

FAQ

What is a Spotify play count?

It is the all-time number of streams Spotify shows next to each track on artist and album pages. Spotify counts a stream after 30 seconds of listening. This Actor returns it as playCount, an exact whole number.

Why is the play count 0?

Spotify shows a play count only after a track passes 1,000 streams, and reports 0 below that. New or niche releases read 0 until they cross the threshold. The row is still what Spotify publishes.

How fresh is the data?

Every run reads Spotify live. Spotify refreshes play counts about once a day, so two runs on the same day usually return the same number. To track growth, schedule the Actor (for example daily) and compare playCount, monthlyListeners or followers per id across scrapedAt.

How many results can I get?

  • Up to 1,000 rows per input in list categories (Max results per query, default 50). Lists are paged automatically.
  • Single entities (a track, an album, an artist profile, a playlist) are one row per input.
  • artist_appears_on and artist_discovered_on return at most 50 rows, because Spotify stops there.
  • search_top_results, search_suggestions and recommendations return up to 100 rows.
  • There is no limit on inputs per run. A run stops early only at your maximum cost per run, or 30 seconds before its timeout, so the summary is always saved. Inputs left out are counted in RUN_SUMMARY.

Why did an input fail, and was I charged?

Failed inputs are never charged. Each one is listed in the ERRORS record of the run's key-value store, with the reason and a kind:

  • permanent: retrying cannot help. Spotify has no data for the input (an unknown ID, a track without lyrics, a search with no results), or the input does not fit the category. For example, an artist link under track fails at once, without a request, with a hint to use auto or artist_overview.
  • transient: a temporary problem on Spotify's side or ours. It is retried with backoff, and tried once more at the end of the run when time allows.
  • internal: a bug in this Actor. Please report it on the Issues tab.

The run's status message sums it up, for example "Delivered 4 items; 1 query had no data on Spotify … and was not charged." A run ends FAILED only when it delivered nothing and a temporary error remained, so Apify's retry and alert settings can react.

What is in RUN_SUMMARY?

RUN_SUMMARY lists:

  • the inputs planned, repeats removed and inputs ignored;
  • the categories that Auto routed to;
  • rows delivered;
  • failures split into transientErrors, permanentErrors and internalErrors, and the failed inputs;
  • warnings for inputs that delivered only part of their rows;
  • whether the maximum cost per run or the timeout cut the run short;
  • Spotify placeholder entries that were skipped;
  • the outcome and status message.

Find it on the Output tab or in the run's key-value store.

Why did I get fewer rows than expected?

  • Max results per query defaults to 50. Raise it for long playlists, discographies, charts and search.
  • Repeated entities are scraped and charged once.
  • Spotify sometimes puts placeholder entries (errors, unavailable items) in its lists. These are skipped and not charged.
  • Spotify personalizes some editorial playlists, so pages can overlap. Repeated tracks are left out and not charged, and a warning appears in RUN_SUMMARY.
  • In the play-count categories, tracks without a play count are skipped.

Why is followers empty on artist rows?

Spotify's Web API no longer returns artist followers or genres. Use artist_overview (Auto does this for artist links). It has followers, monthly listeners, world rank and top cities.

What does linkedFromId mean?

Spotify sometimes relinks a track to another version that is playable in your market. The row then describes the playable track (id), and linkedFromId is the ID you entered.

How fast is it?

Track and artist links are fetched 50 per request, albums 20 and audio features 25. Long lists are paged 3 pages at a time, and rows are saved in batches. Most runs finish within seconds. When Spotify throttles, the Actor slows down by itself and speeds up again afterwards.

Do I need a Spotify account or API key?

No. You only need an Apify account.

Is the service up?

Check the status page, which monitors the Spotify data API behind this Actor.

This Actor reads only what Spotify shows publicly: play counts, charts, artist pages, playlists. Some categories (user profiles, followers) return the public profile data of Spotify users. Make sure your use of the data complies with Spotify's terms and with the data-protection laws that apply to you, such as GDPR.

Use the API

This call starts a run, waits for it and returns the rows. Synchronous calls wait up to 5 minutes; for large runs, use the clients below.

curl -X POST "https://api.apify.com/v2/acts/eduair94~spotify-scraper/run-sync-get-dataset-items?omit=data,raw&maxTotalChargeUsd=1" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries": ["https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b", "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02"]}'

maxTotalChargeUsd caps the cost of the run.

JavaScript, with the apify-client package:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('eduair94/spotify-scraper').call({
category: 'artist_discography_play_counts',
queries: ['https://open.spotify.com/artist/163tK9Wjr9P9DmM0AVK7lm'],
maxResultsPerQuery: 1000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) console.log(item.albumName, item.name, item.playCount);

Python, with the apify-client package:

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("eduair94/spotify-scraper").call(
run_input={
"category": "playlist_play_counts",
"queries": ["https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"],
"maxResultsPerQuery": 100,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["position"], item["name"], item["playCount"])

You can also schedule runs, get a webhook when a run finishes, and send results to Google Sheets, Slack, Make, Zapier and other tools with Apify integrations.

Use cases

  • Music marketing: measure what a release, a playlist placement or a viral moment did to a track's streams.
  • A&R and talent scouting: compare artists by monthly listeners, world rank and top cities, and spot breakout tracks.
  • Royalty estimates and catalog valuation: sum the play counts of a whole discography or an album (albumTotalPlayCount) before buying, financing or licensing a catalog.
  • Playlist pitching: find the playlists that feature an artist or where listeners discover them, with each playlist's followers and owner.
  • Chart tracking: collect daily Top 200 streams and rank movement per country on a schedule.
  • Research: lyrics, credits, audio features and podcast catalogs as clean tables.