# Spotify Scraper (`sourabhbgp/spotify-scraper`) Actor

Scrape Spotify play counts, streams, monthly listeners, followers, world rank, top cities, and biographies. Five modes: artist, track, album, playlist with save counts, and search. Track artists daily across all 180+ Spotify markets: K-pop, J-pop, Latin, Afrobeats. $3 per 1,000 results.

- **URL**: https://apify.com/sourabhbgp/spotify-scraper.md
- **Developed by:** [Sourabh Kumar](https://apify.com/sourabhbgp) (community)
- **Categories:** Social media
- **Stats:** 46 total users, 15 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

### Spotify Scraper: play counts, monthly listeners, tracks, albums & playlists

Scrape any Spotify artist, track, album, playlist, or keyword search in seconds. No Spotify developer app, no OAuth, no login, no proxy setup. You get the numbers other scrapers can't touch: exact play counts, monthly listeners, followers, world rank, and top cities.

**$3.00 per 1,000 results. No per-run fee. One actor, five modes.**

Works on every Spotify market (180+ countries). K-pop 🇰🇷, J-pop 🇯🇵, Latin 🇲🇽🇧🇷🇨🇴, Afrobeats 🇳🇬🇬🇭, Bollywood 🇮🇳, French rap 🇫🇷, German hip-hop 🇩🇪, Arabic 🇸🇦🇦🇪, C-pop 🇨🇳🇹🇼, Russian 🇷🇺: all in native script.

---

### Why this scraper?

- 🎯 **Exact play counts on every track**, down to the single play: the number people actually search for.
- 📊 **Monthly listeners, world rank, and top 5 cities** on every artist record: fields the official API doesn't expose.
- 🧰 **One actor, five modes** (artist, track, album, playlist, search) instead of stitching 3 to 6 separate scrapers together.
- 🔑 **No app registration, no OAuth, no API keys.** Paste a URL and click Start.
- ⚡ **No browser.** A single artist finishes in 2 to 5 seconds; a batch of 500 finishes in minutes.
- 🛡️ **Built-in fallback** keeps runs alive when Spotify hiccups, so batches don't die midway.
- 💸 **Bad input costs $0.** Deleted artists, private playlists, and typo'd URLs log a warning and are never billed.
- 🌍 **180+ markets, every script.** Hangul, Kanji, Cyrillic, Arabic, Devanagari returned untouched.

---

### Spotify Scraper vs. the official Web API

| Concern | Spotify Web API | Other Spotify actors | This actor |
|---|---|---|---|
| App registration | Required, manual approval for extended quota | Not needed | **Not needed** |
| Per-track play count | ❌ Not exposed | Partial (play-count-only actors) | ✅ Every track |
| Monthly listeners, world rank, top cities | ❌ Not available | ❌ Mostly not available | ✅ All three |
| `popularity`, `genres` | Deprecated Feb 2026 (returns stale data) | Some still return dead fields | Skipped on purpose |
| Audio features (tempo, key, danceability) | Locked to pre-Nov-2024 grandfathered apps | Rarely available, and pricier when offered | Not included (honestly unavailable) |
| Number of actors to install | N/A | Often split into 3 to 6 separate scrapers | **One actor, five modes** |
| Per-run start fee | N/A | $5 on many competitors | **$0** |
| Price per 1,000 results | Free (but rate-limited) | $3 to $5 | **$3** |
| Locale URLs (`intl-ko`, `intl-ja`, etc.) | N/A | Often break | Handled |

The short version: if you want **play counts, followers, world rank, and top cities in one actor** without juggling app keys or stitching six scrapers together, this is built for that.

---

### Global & multi-language support

Spotify publishes names and metadata in the artist's native script. This scraper returns them untouched: no transliteration, no dropped characters. It handles Hangul, Kanji, Katakana, Hiragana, Simplified and Traditional Chinese, Cyrillic, Arabic, Hebrew, Devanagari, Gurmukhi, Tamil, Thai, Greek, and every other Unicode script Spotify indexes.

#### Locale URLs supported

Paste any country-prefixed Spotify link, the scraper auto-strips the locale:

- `https://open.spotify.com/intl-ko/artist/...` (Korean)
- `https://open.spotify.com/intl-ja/artist/...` (Japanese)
- `https://open.spotify.com/intl-de/artist/...` (German)
- `https://open.spotify.com/intl-fr/artist/...` (French)
- `https://open.spotify.com/intl-es/artist/...` (Spanish)
- `https://open.spotify.com/intl-pt/artist/...` (Portuguese / Brazilian)
- `https://open.spotify.com/intl-it/artist/...` (Italian)
- `https://open.spotify.com/intl-tr/artist/...` (Turkish)
- `https://open.spotify.com/intl-ar/artist/...` (Arabic)
- `https://open.spotify.com/intl-hi/artist/...` (Hindi)
- ...every other `intl-XX/` locale variant

#### Search accepts any language

```json
{ "mode": "search", "searchTerm": "米津玄師" }   // J-pop
{ "mode": "search", "searchTerm": "أم كلثوم" }   // Arabic
{ "mode": "search", "searchTerm": "방탄소년단" }  // Korean (BTS in Hangul)
{ "mode": "search", "searchTerm": "Bad Bunny" }  // Latin
{ "mode": "search", "searchTerm": "Rammstein" }  // German
````

#### Top artist IDs by region (paste these to try)

| Region | Artists & IDs |
|---|---|
| 🇰🇷 **K-pop** | BTS `3Nrfpe0tUJi4K4DXYWgMUX` · BLACKPINK `41MozSoPIsD1dJM0CLPjZF` · Stray Kids `2dIgFjalVxs4ThymZ67YCE` · NewJeans `6HvZYsbFfjnjFrWF950C9d` · SEVENTEEN `7nqOGRxlXj7N2JYbgNEjYH` · TWICE `7n2Ycct7Beij7Dj7meI4X0` |
| 🇯🇵 **J-pop** | YOASOBI `64tJ2EAv1R6UaZqc4iOCyj` · Ado `6mEQK9m2krja6X1cfsAjfl` · Kenshi Yonezu `1snhtMLeb2DYoMOcVbb8iB` · Official HIGE DANdism `5Vo1hnCRmCM6M4thZCInCj` · Aimyon `5kVZa4lFUmAQlBogl1fkd6` |
| 🇲🇽🇧🇷🇨🇴 **Latin** | Bad Bunny `4q3ewBCX7sLwd24euuV69X` · Karol G `790FomKkXshlbRYZFtlgla` · Peso Pluma `12GqGscKJx3aE4t07u7eVZ` · Feid `2LRoIwlKmHjgvigdNGBHNo` · Rauw Alejandro `1mcTU81TzQhprhouKaTkpq` · Anitta `7FNnA9vBm6EKceENgCGRMb` |
| 🇳🇬🇬🇭🇿🇦 **Afrobeats** | Burna Boy `3wcj11K77LjEY1PkEazffa` · Wizkid `3tVQdUvClmAT7URs9V3rsp` · Tyla `3SozjO3Lat463tQICI9LcE` · Asake `3a1tBryiczPAZpgoZN9Rzg` · Rema `46pWGuE3dSwY3bMMXGBvVS` · Davido `0Y3agQaa6g2r0YmHPOO9rh` |
| 🇮🇳 **Bollywood & Indian** | Arijit Singh `4YRxDV8wJFPHPTeXepOstw` · AP Dhillon `6LEG9Ld1aLImEFEVHdWNSB` · Diljit Dosanjh `2FKWNmZWDBZR4dE5KX4plR` · Shreya Ghoshal `0oOet2f43PA68X5RxKobEy` |
| 🇫🇷 **French** | Aya Nakamura `7IlRNXHjoOCgEAWN5qYksg` · Orelsan `4FpJcNgOvIpSBeJgRg3OfN` · PNL `3NH8t45zOTqzlZgBvZRjvB` |
| 🇩🇪 **German** | Apache 207 `1qQLhymHXFPtP5U8KNKsm6` · Rammstein `6wWVKhxIU2cEi0K81v7HvP` · RAF Camora `0Dvx6p8JDyzeOPGmaCIH1L` |
| 🇨🇳🇹🇼 **C-pop** | Jay Chou `2elBjNSdBE2Y3f0j1mjrql` · JJ Lin `7Dx7RhX0mFuXhCOUgB01uM` · Jolin Tsai `1r9DuPTHiQ7hnRRZ99B8nL` |
| 🇸🇦🇦🇪🇪🇬 **Arabic / MENA** | Amr Diab `5abSRg0xN1NV3gLbuvX24M` · Fairuz `0dwFxqYkvZLSA6U6XfQcDV` · Elissa `68rvMwPL0yMbYR5cv0pzCR` |

Every one of these returns the full field set: monthly listeners, followers, world rank, top 5 cities, biography, top 10 tracks with play counts, related artists, and discography counts.

***

### Scraping modes

#### 🎤 Artist mode

Per-artist record with every demand-side metric Spotify shows the public: **monthly listeners** (active 30-day), **followers**, **world rank**, **top 5 cities** with per-city listener counts, **top 10 tracks with exact play counts**, related artists ("fans also like"), full biography in native language, external links (Instagram, Facebook, Wikipedia, TikTok), and discography counts. Set `includeDiscography: true` for full album, single, and popular-release lists.

```json
{ "mode": "artist", "spotifyUrls": ["3TVXtAsR1Inumwj472S9r4"], "maxResults": 1 }
```

Pull every BLACKPINK album with full track listings and labels:

```json
{ "mode": "artist", "spotifyUrls": ["41MozSoPIsD1dJM0CLPjZF"], "includeDiscography": true, "maxResults": 1 }
```

Bulk compare K-pop followers and world rank:

```json
{
  "mode": "artist",
  "spotifyUrls": [
    "3Nrfpe0tUJi4K4DXYWgMUX",
    "41MozSoPIsD1dJM0CLPjZF",
    "6HvZYsbFfjnjFrWF950C9d",
    "2dIgFjalVxs4ThymZ67YCE",
    "7nqOGRxlXj7N2JYbgNEjYH"
  ],
  "maxResults": 5
}
```

#### 🎵 Track mode

**Exact play count**, all artists (primary and featured, each with Spotify ID), album context (name, type, release date, label, copyright C and P lines), track number, content rating (`EXPLICIT` / `NONE`), duration, 30-second preview MP3 URL, and cover image.

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

#### 💿 Album mode

Name, **album type** (`ALBUM` / `SINGLE` / `COMPILATION`), **label** (e.g., "Republic Records"), **copyright lines**, release date, and the **full track listing**: each track with play count, track and disc number, duration, content rating, and all artists. Multi-artist albums supported.

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

#### 📜 Playlist mode

Name, **save count**, owner, description, item count, and the full track listing paginated automatically up to 500 tracks. Per track: name, artists, album, duration, **play count**, content rating, and the **`addedAt` timestamp** (great for tracking editorial adds).

```json
{ "mode": "playlist", "spotifyUrls": ["37i9dQZF1DXcBWIGoYBM5M"], "maxResults": 1 }
```

#### 🔍 Search mode

One request returns matching tracks, artists, albums, and playlists in a single grouped record. Accepts any Unicode input.

```json
{ "mode": "search", "searchTerm": "米津玄師", "maxResults": 10 }
```

***

### How to scrape Spotify: step by step

1. [Create a free Apify account](https://console.apify.com/sign-up). Takes 30 seconds, no card needed.
2. Open [Spotify Scraper](https://console.apify.com/actors/aM1fknsJVV253fDqf?addFromActorId=aM1fknsJVV253fDqf) in the Apify Console.
3. Paste Spotify URLs, `spotify:` URIs, or bare IDs. Or pick search mode and type a keyword.
4. Click **Start**. Single entities finish in seconds; big batches in minutes.
5. Export as JSON, CSV, or Excel, or fetch results via the API.

***

### How much does Spotify Scraper cost?

Spotify Scraper charges **$3.00 per 1,000 results** ($0.003 per entity scraped). No per-run fee, no subscription. The Apify Free plan includes $5 in usage credits every month, enough for roughly **1,666 results free**. The $29/month Starter plan stretches to about **9,666 results per month**. Platform compute adds roughly $0.10 to $0.50 per 1,000 results since no browser is involved.

Pay-per-use. Pause whenever. One run or ten million, same price per result.

***

### Input

```json
{
  "mode": "artist",
  "spotifyUrls": [
    "https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4",
    "spotify:artist:06HL4z0CvFAxyc27GXpf02",
    "1Xyo4u8uXC1ZmMpatF05PJ"
  ],
  "maxResults": 5,
  "includeDiscography": true
}
```

| Field | Type | Default | Notes |
|---|---|---|---|
| `mode` | string | `"artist"` | One of `artist`, `track`, `album`, `playlist`, `search`. Auto-detected from URL if omitted. |
| `spotifyUrls` | string\[] | `[]` | Full URLs, `spotify:` URIs, or bare 22-character IDs. Used for every mode except `search`. |
| `searchTerm` | string | `""` | Only used when `mode=search`. Any Unicode. |
| `maxResults` | integer | `50` | `0` means unlimited. |
| `includeDiscography` | boolean | `false` | Artist mode: include full album/single/popular-release lists instead of just counts. |

***

### Output

#### Artist record (Drake, real values 2026-04-23)

```json
{
  "type": "artist",
  "spotifyId": "3TVXtAsR1Inumwj472S9r4",
  "name": "Drake",
  "monthlyListeners": 88887197,
  "followers": 109756415,
  "worldRank": 9,
  "biography": "Aubrey Drake Graham (born October 24, 1986) is a Canadian rapper, singer, and actor...",
  "imageUrl": "https://i.scdn.co/image/ab6761610000e5eb...",
  "topCities": [
    { "city": "London", "country": "GB", "region": "ENG", "listeners": 1961434 },
    { "city": "Toronto", "country": "CA", "region": "ON", "listeners": 1287104 },
    { "city": "Los Angeles", "country": "US", "region": "CA", "listeners": 1022891 },
    { "city": "New York", "country": "US", "region": "NY", "listeners": 921483 },
    { "city": "Sydney", "country": "AU", "region": "NSW", "listeners": 612775 }
  ],
  "topTracks": [
    { "spotifyId": "1zi7xx7UVEFkmKfv06H8x0", "name": "One Dance", "durationMs": 173986, "playCount": 4181959064, "explicit": false, "previewUrl": "https://p.scdn.co/mp3-preview/..." },
    { "spotifyId": "5mCPDVBb16L4XQwDdbRUpz", "name": "Passionfruit", "durationMs": 298941, "playCount": 2206537432, "explicit": false, "previewUrl": "https://p.scdn.co/mp3-preview/..." }
  ],
  "topTracksCount": 10,
  "relatedArtists": [
    { "spotifyId": "1RyvyyTE3xzB2ZywiAwp0i", "name": "Future", "imageUrl": "..." },
    { "spotifyId": "5K4W6rqBFWDnAN6FQUkS6x", "name": "Kanye West", "imageUrl": "..." }
  ],
  "discography": { "albumsCount": 19, "singlesCount": 61, "compilationsCount": null, "albums": [], "singles": [], "popularReleases": [] },
  "externalLinks": [],
  "spotifyUrl": "https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4",
  "dataSource": "partner"
}
```

#### Track record (Blinding Lights, 5.38 billion plays)

```json
{
  "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": null,
    "copyright": []
  },
  "durationMs": 200040,
  "playCount": 5379788459,
  "trackNumber": 9,
  "contentRating": "NONE",
  "explicit": false,
  "previewUrl": "https://p.scdn.co/mp3-preview/...",
  "releaseDate": "2020-03-20T00:00:00Z",
  "imageUrl": "https://i.scdn.co/image/...",
  "spotifyUrl": "https://open.spotify.com/track/0VjIjW4GlUZAMYd2vXMi3b",
  "dataSource": "partner"
}
```

#### Playlist record (Today's Top Hits, 34M saves)

```json
{
  "type": "playlist",
  "spotifyId": "37i9dQZF1DXcBWIGoYBM5M",
  "name": "Today's Top Hits",
  "description": "The hottest 50...",
  "owner": "Spotify",
  "itemCount": 50,
  "saveCount": 34361871,
  "tracks": [
    {
      "spotifyId": "...",
      "name": "DAISIES",
      "artists": [{ "name": "Justin Bieber", "spotifyId": "1uNFoZAHBGtllmzznpCI3s" }],
      "album": { "spotifyId": "...", "name": "SWAG", "releaseDate": "2025-06-20" },
      "durationMs": 200000,
      "playCount": 693387695,
      "contentRating": "NONE",
      "addedAt": "2025-07-11T04:00:32.382Z"
    }
  ],
  "imageUrl": "https://i.scdn.co/image/...",
  "spotifyUrl": "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M",
  "dataSource": "partner"
}
```

#### Search record (query "drake")

```json
{
  "type": "search",
  "query": "drake",
  "tracks": [{ "spotifyId": "6DCZcSspjsKoFjzjrWoCdn", "name": "God's Plan", "artists": ["Drake"], "album": "Scorpion", "durationMs": 198973, "spotifyUrl": "..." }],
  "artists": [{ "spotifyId": "3TVXtAsR1Inumwj472S9r4", "name": "Drake", "imageUrl": "...", "spotifyUrl": "..." }],
  "albums": [{ "spotifyId": "...", "name": "Take Care (Deluxe)", "artist": "Drake", "albumType": "ALBUM", "imageUrl": "...", "spotifyUrl": "..." }],
  "playlists": [{ "spotifyId": "...", "name": "BEST OF DRAKE", "owner": "Spotify", "description": "...", "imageUrl": "...", "spotifyUrl": "..." }],
  "dataSource": "partner"
}
```

#### Field availability by mode

| Field | artist | track | album | playlist | search |
|---|:-:|:-:|:-:|:-:|:-:|
| `name`, `spotifyId`, `spotifyUrl`, `imageUrl` | ✅ | ✅ | ✅ | ✅ | ✅ |
| `monthlyListeners`, `followers`, `worldRank`, `biography`, `topCities` | ✅ | - | - | - | - |
| `topTracks`, `relatedArtists`, `discography`, `externalLinks` | ✅ | - | - | - | - |
| `playCount`, `trackNumber`, `contentRating`, `previewUrl` | (top tracks) | ✅ | ✅ (per track) | ✅ (per track) | - |
| `discNumber` | - | - | ✅ (per track) | - | - |
| `album`, `artists`, `durationMs`, `releaseDate`, `explicit` | - | ✅ | - | ✅ (per track) | ✅ |
| `albumType`, `label`, `copyright`, `trackCount`, `tracks` | - | (album obj) | ✅ | - | - |
| `saveCount`, `owner`, `description`, `itemCount`, `addedAt` | - | - | - | ✅ | - |
| `tracks`, `artists`, `albums`, `playlists`, `query` (grouped results) | - | - | - | - | ✅ |

***

### Use cases

- 🇰🇷 **K-pop analytics.** BTS, BLACKPINK, NewJeans, Stray Kids, SEVENTEEN, TWICE, ATEEZ: monthly listeners, world rank, and top cities for fandom mapping, plus per-song play counts.
- 🇯🇵 **J-pop & anime OST pipeline.** YOASOBI, Ado, Kenshi Yonezu, Official HIGE DANdism, Aimyon: release calendars for anime content sites.
- 🇲🇽🇧🇷🇨🇴 **Latin music trend tracking.** Bad Bunny, Karol G, Peso Pluma, Feid, Rauw Alejandro, Anitta: reggaeton, corridos tumbados, funk carioca.
- 🇳🇬🇬🇭🇿🇦 **Afrobeats discovery.** Burna Boy, Wizkid, Davido, Tyla, Asake, Rema: top cities (Lagos, Accra, London) and regional chart data.
- 🇮🇳 **Bollywood & Indian music.** Arijit Singh, AP Dhillon, Diljit Dosanjh, Shreya Ghoshal: Hindi, Punjabi, Tamil, Telugu catalogs in native script.
- 🇫🇷🇩🇪🇮🇹🇪🇸 **European markets.** French rap, German hip-hop, Italian pop, Spanish flamenco-pop: native-script names preserved.
- 🇨🇳🇹🇼🇭🇰 **C-pop & Chinese markets.** Jay Chou, JJ Lin, Jolin Tsai: Simplified and Traditional Chinese names for Mandarin-language analytics.
- 🇸🇦🇦🇪🇪🇬 **Arabic music research.** MENA artists, Khaleeji, Egyptian pop, Rai in Arabic script.
- 📜 **Editorial playlist monitoring.** Today's Top Hits, RapCaviar, Viva Latino, Tomorrow's Hits: track save counts and per-track play movement daily.
- 📡 **Regional chart scraping.** Daily Top 50 per country (France, Japan, Brazil, Germany, Korea, Mexico), Viral 50, Global Top 50, RADAR editorial lists.
- 💿 **Artist catalog audits.** Every album, single, and compilation for a roster, with full track listings, labels, and copyright lines for rights workflows.
- 🎧 **A\&R and sync licensing.** Surface breakout artists in any language market before they chart globally, with cover art, release dates, and labels for clearance.
- 📈 **Competitor benchmarking.** Compare followers, monthly listeners, world rank, and top cities across a label's roster or a DSP playlist.
- 📊 **Market research dashboards.** Feed monthly listener and follower trends into Looker, Tableau, or Metabase.
- 🗞️ **Newsletter and content automation.** Push Spotify metadata into Google Sheets, Airtable, Webflow, Ghost, or any webhook-driven pipeline.

***

### Limitations

- **No `popularity`, `genres`, or audio features.** Spotify deprecated `popularity` and `genres` in Feb 2026, and audio features (tempo, key, danceability) are locked to legacy developer apps. Any scraper still returning these hands you stale or fake numbers. I'd rather ship nothing than fake it.
- **No ISRC or UPC yet.** Both require a registered Spotify developer app. An opt-in enrichment flag is planned; follow the Issues tab for the ship date.
- **Playlists return up to 500 tracks each**, paginated automatically.
- **Album track listings cap at 50 tracks.** Standard albums fit comfortably; very long compilations truncate.
- **Search returns up to 20 items per category** (tracks, artists, albums, playlists) per query.
- **Public data only.** The actor sees what a logged-out visitor sees: no private playlists, no user listening history.

***

### Other scrapers you might like

<table>
  <tr>
    <td><a href="https://apify.com/sourabhbgp/apple-podcast-scraper">Apple Podcast Scraper</a></td>
    <td><a href="https://apify.com/sourabhbgp/google-play-scraper">Google Play Store Scraper</a></td>
    <td><a href="https://apify.com/sourabhbgp/apple-app-store-scraper">Apple App Store Scraper</a></td>
  </tr>
  <tr>
    <td><a href="https://apify.com/sourabhbgp/threads-scraper">Threads Scraper</a></td>
    <td><a href="https://apify.com/sourabhbgp/shopify-scraper">Shopify Scraper</a></td>
    <td><a href="https://apify.com/sourabhbgp/similarweb-scraper">SimilarWeb Traffic Scraper</a></td>
  </tr>
</table>

***

### Frequently asked questions

#### Is it legal to scrape Spotify?

Scraping public data is generally allowed in the US and most of the EU, as long as you don't collect personal data that falls under GDPR or CCPA without a lawful basis. This actor only touches publicly accessible Spotify pages: the same pages a logged-out visitor sees in a browser. You're responsible for how you use the output. Apify has a detailed breakdown: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

#### How does it compare to Spotify's official Web API?

The official Web API requires you to register a developer app, manage OAuth, handle rate limits, and live with deprecations. It also doesn't expose per-track play counts, monthly listeners, world rank, or top cities. This actor gives you those fields with zero setup. The tradeoff: no ISRC, UPC, or audio features, which live behind the official API.

#### What happens on bad URLs, deleted artists, or private playlists?

The run succeeds with zero results for that specific URL plus a warning line in the log. You're billed $0 for failed lookups. No run-level failures on input mistakes. And if your account credit runs out mid-run, the actor stops cleanly instead of failing.

#### Does it work on K-pop, J-pop, Arabic, Hindi, and other non-Latin scripts?

Yes. Names come back in whatever script Spotify publishes: Hangul, Kanji, Cyrillic, Arabic, Devanagari, Thai, Hebrew, Simplified and Traditional Chinese. `intl-ko/`, `intl-ja/`, `intl-de/`, `intl-ar/`, and every other locale prefix is accepted. BTS (`3Nrfpe0tUJi4K4DXYWgMUX`), Arijit Singh (`4YRxDV8wJFPHPTeXepOstw`), and Amr Diab (`5abSRg0xN1NV3gLbuvX24M`) all return the full field set.

#### How fast is it?

2 to 5 seconds per entity at default memory (512 MB). A batch of 500 artists finishes in a few minutes. Playlists of up to 500 tracks paginate automatically in a single run.

#### What's the rate limit?

None you have to manage. The actor paces requests internally. No Spotify API quota to track, no 429s to retry, no OAuth to babysit.

#### Can I integrate Spotify Scraper with other tools?

Push results straight into **Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive**, and any webhook consumer. The Apify platform treats every actor as a webhook source. See [Apify integrations](https://docs.apify.com/platform/integrations).

#### Can I use it with the Apify API?

Yes. Minimal start-run call:

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

Full docs: [Apify API reference](https://docs.apify.com/api/v2).

#### Can I use it through an MCP server (Claude Desktop, Cursor)?

Yes. Apify ships an MCP server that exposes every actor as a tool. Setup: [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).

***

### Your feedback

Ran into a bug, want a new field, or need a different market covered? Drop a note in the [Issues tab](https://console.apify.com/actors/aM1fknsJVV253fDqf/issues). Every report goes to a human and fixes usually ship the same week.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. Auto-detected from URL if not set.

## `searchTerm` (type: `string`):

Keyword to search Spotify catalog. Only used when mode=search.

## `includeDiscography` (type: `boolean`):

For artist mode: include full albums, singles, and popular releases lists in output. Default: off (returns counts only).

## `spotifyUrls` (type: `array`):

Spotify URLs, URIs, or raw IDs. Examples: https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4, spotify:artist:3TVXtAsR1Inumwj472S9r4, or just 3TVXtAsR1Inumwj472S9r4

## `maxResults` (type: `integer`):

Maximum number of entities to scrape. 0 = unlimited.

## Actor input object example

```json
{
  "mode": "artist",
  "includeDiscography": false,
  "spotifyUrls": [
    "https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4"
  ],
  "maxResults": 50
}
```

# Actor output Schema

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

Scraped Spotify data.

# 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 = {
    "mode": "artist",
    "searchTerm": "",
    "spotifyUrls": [
        "https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sourabhbgp/spotify-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 = {
    "mode": "artist",
    "searchTerm": "",
    "spotifyUrls": ["https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4"],
}

# Run the Actor and wait for it to finish
run = client.actor("sourabhbgp/spotify-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "artist",
  "searchTerm": "",
  "spotifyUrls": [
    "https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4"
  ]
}' |
apify call sourabhbgp/spotify-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sourabhbgp/spotify-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Spotify Scraper",
        "description": "Scrape Spotify play counts, streams, monthly listeners, followers, world rank, top cities, and biographies. Five modes: artist, track, album, playlist with save counts, and search. Track artists daily across all 180+ Spotify markets: K-pop, J-pop, Latin, Afrobeats. $3 per 1,000 results.",
        "version": "0.0",
        "x-build-id": "uJjgzccwAjr1ayxbf"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sourabhbgp~spotify-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sourabhbgp-spotify-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sourabhbgp~spotify-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sourabhbgp-spotify-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sourabhbgp~spotify-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sourabhbgp-spotify-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "artist",
                            "track",
                            "album",
                            "playlist",
                            "search"
                        ],
                        "type": "string",
                        "description": "What to scrape. Auto-detected from URL if not set.",
                        "default": "artist"
                    },
                    "searchTerm": {
                        "title": "Search Term",
                        "type": "string",
                        "description": "Keyword to search Spotify catalog. Only used when mode=search."
                    },
                    "includeDiscography": {
                        "title": "Include Artist Discography",
                        "type": "boolean",
                        "description": "For artist mode: include full albums, singles, and popular releases lists in output. Default: off (returns counts only).",
                        "default": false
                    },
                    "spotifyUrls": {
                        "title": "Spotify URLs or IDs",
                        "type": "array",
                        "description": "Spotify URLs, URIs, or raw IDs. Examples: https://open.spotify.com/artist/3TVXtAsR1Inumwj472S9r4, spotify:artist:3TVXtAsR1Inumwj472S9r4, or just 3TVXtAsR1Inumwj472S9r4",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of entities to scrape. 0 = unlimited.",
                        "default": 50
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
