Spotify Scraper—Play Counts, Monthly Listeners & Playlists
Pricing
from $0.60 / 1,000 scraped items
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
Maintained by CommunityActor stats
2
Bookmarked
103
Total users
34
Monthly active users
4.7 hours
Issues response
an hour ago
Last modified
Categories
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?
| Job | You paste | You get |
|---|---|---|
| Play counts | Track, album, playlist or artist links; ISRC codes | One 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 analytics | Artist links, or artist names | Monthly 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 & charts | Playlist links; country codes | Playlist 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
- Paste Spotify links,
spotify:URIs or IDs into Spotify links, IDs or keywords, one per line. You can mix tracks, albums, artists and playlists. - Leave Data category on Auto, or pick a category from the tables below. For example,
playlist_play_countsreturns every track of a playlist with its play count. - 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: paste any Spotify link
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):
| Line | Runs as | The row has |
|---|---|---|
| Track link | track | playCount, artists, album, release date, duration, ISRC, popularity |
| Album link | album | label, UPC, © and ℗ lines, album type, track count, popularity |
| Artist link | artist_overview | monthly listeners, followers, world rank, top cities, social links, discography counts |
| Playlist link | playlist | followers, owner, track count, description |
| Show or episode link | show or episode | publisher, episode count and languages; or duration, release date and the show |
| User or concert link | user_profile or partner_concert | followers and public playlists; or date, venue, lineup and tickets |
Plain text (Daft Punk) | Spotify's top search hit, scraped as its type | the matched entity (an artist here), with resolvedFrom: "search" and matchedName |
| Bare 22-character ID | The 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
| Category | Paste | One row per | Columns besides playCount |
|---|---|---|---|
track (also used by Auto) | Track links or IDs | track | artists, albumName, releaseDate, durationMs, isrc, popularity, explicit, trackNumber, imageUrl |
album_play_counts | Album links | track on the album | albumName, albumType, label, copyrightC, copyrightP, releaseDate, albumTotalPlayCount, trackNumber |
playlist_play_counts | Playlist links | track in the playlist | position, addedAt, playlistName, playlistOwner, albumName, artists, durationMs |
artist_discography_play_counts | Artist links | track on the artist's albums, singles, EPs and compilations (newest first, each track once) | albumName, albumType, label, releaseDate, albumTotalPlayCount, trackNumber |
artist_play_counts | Artist links | top track (up to 10) | topTrackRank, plus the artist's monthlyListeners, followers and worldRank |
isrc | ISRC codes (USUG11904206) | ISRC code | the first track Spotify lists for the code, with the track columns. Other tracks with the same ISRC are in metadata.otherTrackIds |
track_play_count | Track links or IDs | track | albumName, releaseDate, durationMs, explicit (one track per request; track is faster for long lists) |
playCountis an exact number, such as5631276067. Spotify shows0until 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_countsandartist_discography_play_counts, a track that Spotify returns without a play count is skipped and not charged.trackandisrcrows still arrive with their other columns if a play count cannot be read;RUN_SUMMARYcounts them underplayCounts.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.
| Category | One row per |
|---|---|
artist_overview | artist: the columns above, plus description (bio), headerImageUrl, galleryImageUrls and externalLinks |
artist_albums | album, with release date, type and track count |
artist_singles | single or EP |
artist_appears_on | release the artist appears on (Spotify returns up to 50) |
artist_discovered_on | playlist where listeners discovered the artist (up to 50) |
artist_featuring | playlist that features the artist |
artist_related | related artist ("Fans also like") |
artist_discography_overview | artist: album, single and compilation counts |
artist_concerts | upcoming concert, with venue, address, coordinates and ticket links |
artist | artist from Spotify's Web API: image and popularity. Spotify no longer returns followers there, so use artist_overview for them |
Playlists and charts
| Category | Paste | One row per |
|---|---|---|
playlist | Playlist links | playlist: followers, ownerName, totalTracks, description, snapshotId |
playlist_tracks | Playlist links | track: addedAt, artists, album, duration, and playCount when Spotify includes it |
playlist_play_counts | Playlist links | track: playCount, position, addedAt, playlist name and owner |
chart_top_200_tracks | Country codes | chart entry: rank, streams, previousRank, rankChange, peakRank, entryStatus, appearancesOnChart, peakDate, entryDate, artists, label |
chart_viral_tracks | Country codes | chart entry: the same columns, without streams |
chart_top_artists | Country codes | artist entry with rank movement |
chart_top_albums | Country codes | album entry with rank movement, artists and label |
chart_top_monthly_listeners | GLOBAL (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_followers | GLOBAL (the input is ignored) | one of the global Top 50 artists by followers |
new_releases | Country codes | new album or single in that country |
- Enter one country code per line, such as
US,GBorMX, orGLOBALfor the worldwide chart. Lines that are not country codes are skipped with a warning; if none is left, the Market setting is used.new_releasesneeds a country, soGLOBALdoes not work there. - Leave Chart date empty for the latest chart, or enter
YYYY-MM-DDfor a past one. - A chart comes in one request. Set Max results per query to
200to 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
| Category | Paste | One row per |
|---|---|---|
track_lyrics | Track links | track: lyrics as plain text, with time-synced lines in data.lines |
search_lyrics | Lyrics or song titles | the best-matching track, with its lyrics |
track_credits | Track links | track: performers, writers, producers; full credits in data |
audio_features | Track links or IDs (25 per request) | track: tempo, key, modality (major or minor), energy, danceability, valence, loudness, acousticness, instrumentalness, liveness, speechiness, timeSignature |
recommendations | A seed track | recommended track (up to 100) |
album, album_metadata | Album links | album: label, © and ℗ lines, type, track count, release date (album adds upc and popularity) |
album_tracks | Album links | track on the album, with playCount |
album_by_upc | UPC or EAN barcodes | the album with that barcode, with the album columns |
show, show_episodes, episode | Podcast show or episode links | show (publisher, episode count, languages); every episode of a show; one episode |
user_profile, user_followers | User links or usernames | profile (followers, public playlists); follower |
search_multi, search_tracks, search_artists, search_albums, search_playlists, search_users, search_podcasts, search_episodes, search_genres | Keywords | search result, paged up to Max results per query |
search_top_results, search_suggestions | Keywords | top result or autocomplete suggestion (up to 100) |
search_concert_locations | City or place names | location, with the geoHash to use in concerts_by_location |
concerts_by_location | Geohashes | concert in the next 12 months |
search_concert_artists | Artist names | upcoming concert of the best-matching artist |
partner_concert | Concert links | concert: date, venue, lineup, ticket providers |
partner_track, partner_album, partner_playlist, partner_artist_overview, partner_artist_discography | Links | Spotify's full app object under data, for developers |
Input
| Field | Default | What it does |
|---|---|---|
category | auto | What 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. |
defaultType | track | Auto only: how to read a bare 22-character ID (track, album, artist, playlist, show or episode). |
maxResultsPerQuery | 50 | Rows per input for list categories, 1 to 1,000. Long lists are paged automatically. |
concurrency | 5 | Inputs 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. |
delayMs | 0 | Pause after each input (or batch), in milliseconds. |
market | US | 2-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. |
concertDetailsLimit | 20 | Concerts enriched per input (1 to 50). |
parsedConcerts | false | Returns concert payloads in a simplified flat shape. |
includeRaw | false | Keeps 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 tier | Per result | Per 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) | Results | Cost |
|---|---|---|
| 1 track link | 1 | $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 links | 10,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_onandartist_discovered_onreturn at most 50 rows, because Spotify stops there.search_top_results,search_suggestionsandrecommendationsreturn 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 undertrackfails at once, without a request, with a hint to useautoorartist_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,permanentErrorsandinternalErrors, and the failed inputs; warningsfor 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.
Is it legal to scrape Spotify?
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 ApifyClientclient = 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.
Related
- Spotify Play Count Scraper: a simpler input form for play counts only.
- Service status of the Spotify data API behind this Actor.
- Need the same data from your own backend, outside Apify? The underlying API is available on RapidAPI or with a direct API key. See the API documentation.