Spotify Scraper - Artists, Playlists & Podcasts
Pricing
from $2.60 / 1,000 item scrapeds
Spotify Scraper - Artists, Playlists & Podcasts
Scrape Spotify artists, tracks, albums, playlists, and podcasts from URLs or search. Get monthly listeners, play counts, discography, and change monitoring — no API key or login.
Pricing
from $2.60 / 1,000 item scrapeds
Rating
0.0
(0)
Developer
Daniel Valev
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
What does Spotify Scraper do?
Spotify Scraper extracts public catalog data from Spotify — artists, albums, tracks, playlists, podcast shows, and episodes — from URLs or keyword search. It returns structured JSON with monthly listeners, play counts, followers, world rank, biographies, discography, and playlist tracks beyond the usual 100-item cap.
No Spotify API key, no login, and no sp_dc cookies. Anonymous web-player GraphQL over HTTP; Playwright starts only if auth or persisted-query hashes need a one-shot browser bootstrap.
Use it as a Spotify API alternative for metrics the official Web API does not expose (monthly listeners, world rank, stream play counts).
Why scrape Spotify?
Spotify is the largest music streaming catalog many teams track for:
- Music analytics — monthly listeners, play counts, follower trends
- Playlist research — editorial and user playlists past 100 tracks
- Artist monitoring — world rank, top tracks, related artists, scheduled deltas
- Podcast discovery — search shows and episodes by keyword (not URL-only)
- Product / RAG datasets — clean JSON for apps, agents, and MCP workflows
Apify schedules, webhooks, dataset exports (JSON/CSV/Excel), the REST API, and MCP make recurring runs straightforward.
What data can Spotify Scraper extract?
| Type | Key fields |
|---|---|
| Artist | monthlyListeners, followers, worldRank, topCities, biography, top tracks with play counts, related artists, discography counts |
| Album | track list with per-track play counts, label, release date, totalPlayCount |
| Track | playCount, artists, album art, duration, preview URL when Spotify exposes one |
| Playlist | owner, followers/saves, description, paginated tracks up to maxPlaylistTracks (use 0 for all) |
| Show | publisher, description, topics, episodes (up to maxEpisodesPerShow) |
| Episode | parent show link, release date, duration, explicit/playable/video flags, preview URL |
| Search result | typed hit (resultType) from tracks / artists / albums / playlists / shows / episodes |
Optional monitoringKey writes snapshots to a named key-value store (spotify-monitor-<key>) and adds previousSnapshotAt + deltas on later runs — ideal for Schedules.
How to scrape Spotify
- Open Spotify Scraper in Apify Console.
- Choose Mode:
urlsorsearch. - URLs — paste
open.spotify.comlinks (incl./intl-xx/),spotify:type:idURIs, orspotify.linkshort links. - Search — add
searchTerms, setsearchType(tracks, artists, albums, playlists, shows, episodes), andmaxResults. - Optional: enable
includeDiscography, raisemaxPlaylistTracks, or setmonitoringKeyfor change tracking. - Keep Apify Proxy enabled (automatic group; the Actor can escalate to RESIDENTIAL on blocks).
- Click Start, then download the Dataset (JSON, CSV, Excel, …).
URL mode example
{"mode": "urls","urls": ["https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02","https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M","spotify:track:5XeFesFbtLpXzIVDNQP22n","https://open.spotify.com/show/2MAi0BvDc6GTFvKFPXnkCL"],"maxPlaylistTracks": 500}
Search mode example (podcasts)
{"mode": "search","searchTerms": ["true crime", "lex fridman"],"searchType": "shows","maxResults": 20}
Monitor artist metrics over time
{"mode": "urls","urls": ["https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02"],"monitoringKey": "taylor-weekly"}
Schedule the same input daily. Later runs attach deltas (e.g. monthlyListeners, followers, playlist track adds/removes).
Full discography (charged per album)
{"mode": "urls","urls": ["https://open.spotify.com/artist/7Ln80lUS6He07XvHI8qqHH"],"includeDiscography": true,"discographyTypes": ["albums"]}
Each album record is a separate billed item. Prefer a narrow discographyTypes list for large catalogs.
How much does it cost to scrape Spotify?
Pay-per-event pricing. You pay for events, not a separate compute invoice for this Actor’s PPE setup.
| Event | Free plan | Description |
|---|---|---|
Actor start (apify-actor-start) | $0.00005 | Synthetic start (memory-scaled); keeps startup compute competitive |
Item scraped (item) | $0.004 | One top-level dataset record |
Volume discounts (USD per item):
| Plan | Per item | Per 1,000 items |
|---|---|---|
| Free | $0.0040 | $4.00 |
| Bronze | $0.0035 | $3.50 |
| Silver | $0.0030 | $3.00 |
| Gold / Platinum / Diamond | $0.0026 | $2.60 |
Not charged: nested arrays (tracks inside an album, cities on an artist), failed URLs, empty search shelves.
Cost examples (Free tier, ignore tiny start fee)
| Scenario | Items | ≈ cost |
|---|---|---|
| Health-check default (5 URLs) | 5 | ~$0.02 |
| Search 20 shows | 20 | ~$0.08 |
| 1 artist + discography of 8 albums | 9 | ~$0.036 |
| Playlist capped at 120 tracks (1 record) | 1 | ~$0.004 |
Set Maximum charge per run in Console if you want a hard stop.
Input
See the Input tab for the full schema. Important fields:
| Field | Notes |
|---|---|
mode | urls or search |
urls | Artist, album, track, playlist, show, episode — open.spotify, URI, or spotify.link |
searchTerms / searchType / maxResults | Search shelf; shows & episodes supported |
enrichSearchResults | Fetch full details per hit (each hit still + each enrichment = charged items) |
maxPlaylistTracks | Cap playlist pagination; 0 = all |
includeDiscography / discographyTypes | Expand artist releases as album items |
maxEpisodesPerShow | Episodes attached on show records; 0 skips listing |
monitoringKey | Named KV snapshots + deltas |
proxyConfiguration | Prefer Apify Proxy (automatic) |
Empty input runs a deterministic 5-URL health check (artist, track, album, show, episode).
Output
Results go to the default dataset. Download JSON, CSV, Excel, HTML, XML, or RSS, or read via the dataset API / MCP.
Artist example
{"type": "artist","id": "06HL4z0CvFAxyc27GXpf02","uri": "spotify:artist:06HL4z0CvFAxyc27GXpf02","url": "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02","name": "Taylor Swift","monthlyListeners": 102570645,"followers": 140000000,"worldRank": 1,"topCities": [{ "city": "Jakarta", "country": "ID", "listeners": 1200000 }],"topTracks": [{ "id": "1BxfuPKGuaTgP7aM0Bbdwr", "name": "Cruel Summer", "playCount": 3600000000 }],"scrapedAt": "2026-09-28T09:16:00.000Z","dataSource": "graphql","isPartial": false}
Track example
{"type": "track","id": "5XeFesFbtLpXzIVDNQP22n","name": "I Wanna Be Yours","playCount": 2500000000,"durationMs": 183066,"durationFormatted": "3:03","artists": [{ "id": "7Ln80lUS6He07XvHI8qqHH", "name": "Arctic Monkeys" }],"url": "https://open.spotify.com/track/5XeFesFbtLpXzIVDNQP22n","scrapedAt": "2026-09-28T09:16:00.000Z","dataSource": "graphql"}
Search / monitoring notes
- Search hits use
type: "searchResult"withresultTypeandsearchTerm. - With
monitoringKey, numeric entities may includepreviousSnapshotAtanddeltas.
Each run also writes RUN_STATS to the default key-value store (authPath, request/byte counts, failures) — not billed.
Tips
- Prefer URL mode when you need monthly listeners or play counts; plain search hits are lighter metadata unless
enrichSearchResultsis on. - Cap
maxPlaylistTracksanddiscographyTypesto control cost on huge catalogs. - Use
monitoringKey+ Schedule instead of downloading full history every day — deltas are cheaper to reason about. - Mix artists, playlists, and podcast URLs in one run when useful.
Limitations
- Public anonymous data only — no private playlists, no user library, no login cookies, no full audio download, no lyrics.
- Market-restricted or removed catalog entries may be empty or partial (
isPartial/ embed fallback). - Discography can emit many album items (each charged).
- Official Spotify Web API OAuth apps are out of scope; this Actor targets public web-player metrics.
FAQ
Do I need a Spotify developer app or API key?
No. The Actor uses anonymous web-player access — the same class of public metadata a logged-out browser can see.
Can I get Spotify monthly listeners and play counts?
Yes for artists (monthly listeners, world rank) and for tracks/albums when scraped in URL mode (and on discography albums). Search-only hits may omit play counts unless you enrich them.
Can I scrape Spotify podcasts by keyword?
Yes. Set mode: "search" and searchType to shows or episodes. Many scrapers only accept show/episode URLs.
How do I scrape a playlist with more than 100 tracks?
Set maxPlaylistTracks above 100 (or 0 for all). The Actor paginates playlist contents instead of stopping at the embed-sized window.
How do I track artist growth over time?
Set monitoringKey, schedule the run, and read deltas / previousSnapshotAt on subsequent outputs. Snapshots live in spotify-monitor-<key> on your account.
Is this legal?
The Actor only reads public Spotify pages/APIs available without login. You are responsible for complying with Spotify’s Terms, applicable law (including GDPR if personal data appears in public bios or names), and for having a lawful basis for your use case. Do not use it to download copyrighted audio.
The run failed or returned partial data
Check RUN_STATS.failures, try Apify Proxy / RESIDENTIAL, and confirm the URL is public in a normal browser. Open an issue on the Actor’s Issues tab with the run ID if it persists.
Integrations, API, and MCP
- Schedules — daily artist or playlist monitors
- Webhooks / Zapier / Make / Sheets — push new dataset items downstream
- Apify API —
POSTruns with the same JSON as Console - MCP — connect Apify MCP and allow
valev-lab/spotify-scraperfor agent workflows
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('valev-lab/spotify-scraper').call({mode: 'urls',urls: ['https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]?.name, items[0]?.monthlyListeners);
Python:
from apify_client import ApifyClientclient = ApifyClient()run = client.actor("valev-lab/spotify-scraper").call(run_input={"mode": "search","searchTerms": ["arctic monkeys"],"searchType": "artists","maxResults": 5,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["type"], item.get("name"))
Development (repository)
npm installnpm run buildnpm testcd actors/spotify-scraper && apify validate-schema && apify run --purge < /dev/null