# Spotify Scraper - Play Counts, Artists & Playlists (`thirdwatch/spotify-scraper`) Actor

Export Spotify artists with monthly listeners, followers, world rank and top cities; playlists and albums with play counts on every track; podcasts with ratings and episodes; and keyword search. No login or API key.

- **URL**: https://apify.com/thirdwatch/spotify-scraper.md
- **Developed by:** [Thirdwatch](https://apify.com/thirdwatch) (community)
- **Categories:** Social media, Videos
- **Stats:** 6 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Spotify Scraper

> **Thirdwatch portfolio:** 5K users across 97 public Actors, 2M+ records delivered, and >99% run success. [Explore all Thirdwatch Actors](https://apify.com/thirdwatch).

> Export Spotify artists with monthly listeners, followers, world rank and top cities; playlists and albums with exact play counts on every track; podcasts with ratings and every episode — from Spotify links or keyword searches.

### What you get

Paste Spotify links, search by keyword, or both. Each link gives one summary row plus a row for each of its tracks or episodes; each search gives one full row per result.

- **Artists:** followers, monthly listeners, world rank, top cities with listener counts, verified status, biography, Instagram, X and Facebook links, related artists, latest release, and the top 10 tracks with play counts.
- **Playlists:** followers, owner, description and track count, plus every track (up to 10,000) with its exact play count, album, cover art, release date, artist links and the date it was added.
- **Albums:** label, release date, album type, copyright, cover art, and every track with its play count, track and disc number.
- **Tracks:** play count, album, release date, duration, explicit flag, artist links, copyright and a 30-second preview link.
- **Podcasts:** publisher, average rating and number of ratings, total episode count, topics, and every episode (up to 10,000) with release date, length, description and whether there is a video version.
- **Episodes:** show, publisher, release date, length, language and full description.
- **Search:** find tracks, artists, albums, playlists, podcasts or episodes by keyword. Every result comes back as a full row, so an artist search returns monthly listeners and a track search returns play counts.

### Spotify data without an API key

No Spotify account, developer app or API key is needed. Paste links or search terms and run.

### Output fields

| Field | Description |
|---|---|
| `entityType` | `artist`, `playlist`, `album`, `track`, `show` or `episode` |
| `title`, `artists`, `artistList` | Name, artists as text, and each artist with id and link |
| `id`, `uri`, `spotifyUrl` | Spotify id, URI and link |
| `playCount` | Total plays of the track |
| `followers`, `monthlyListeners`, `worldRank`, `topCities`, `isVerified` | Artist audience; playlist followers |
| `albumName`, `albumUri`, `albumType`, `label`, `releaseDate`, `copyright` | Album details for tracks; the show for episodes |
| `durationSec`, `isExplicit`, `trackNumber`, `discNumber`, `previewUrl` | Track details |
| `addedAt` | When a track was added to the playlist |
| `coverImage` | Largest cover or profile image |
| `description`, `ownerName`, `ownerUri`, `trackCount` | Playlist details |
| `biography`, `externalLinks`, `topTracks`, `relatedArtists`, `latestRelease` | Artist profile |
| `publisher`, `rating`, `ratingCount`, `episodeCount`, `language`, `topics`, `hasVideo` | Podcast and episode details |
| `parentName`, `parentType`, `parentUri`, `position` | The playlist, album, artist, podcast or search a row came from, and its place in it |
| `searchQuery` | The search term that found the row |
| `detailLevel`, `scrapedAt` | `full`, or `basic` when only title, artists and length were available, and collection time |

### Example output

An artist row:

```json
{
  "entityType": "artist",
  "title": "Taylor Swift",
  "followers": 165438906,
  "monthlyListeners": 106764975,
  "worldRank": 5,
  "topCities": [
    {"city": "London", "region": "ENG", "country": "GB", "listeners": 1714272},
    {"city": "Quezon City", "region": "00", "country": "PH", "listeners": 1474171}
  ],
  "isVerified": true,
  "externalLinks": [{"name": "instagram", "url": "https://instagram.com/taylorswift"}],
  "topTracks": [{"title": "The Fate of Ophelia", "uri": "spotify:track:53iuhJlwXhSER5J2IYYv1W", "playCount": 1726794234}],
  "spotifyUrl": "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02"
}
```

A playlist track row:

```json
{
  "entityType": "track",
  "title": "Oops!...I Did It Again",
  "artists": "Britney Spears",
  "playCount": 1290836963,
  "albumName": "Oops!... I Did It Again",
  "releaseDate": "2000-05-16",
  "durationSec": 211,
  "parentName": "All Out 2000s",
  "parentType": "playlist",
  "position": 1,
  "spotifyUrl": "https://open.spotify.com/track/6naxalmIoLFWR0siv8dnQQ"
}
```

### Input parameters

| Parameter | Required | Description |
|---|---|---|
| `urls` | One of these two | Spotify links (open.spotify.com, spotify.link or `spotify:` URIs) for artists, playlists, albums, tracks, podcasts and episodes |
| `searchQueries` | One of these two | Keywords to search for |
| `searchType` | No | `tracks` (default), `artists`, `albums`, `playlists`, `podcasts` or `episodes` |
| `maxSearchResults` | No | Results per search term, up to 1,000. Defaults to 20 |
| `maxTracksPerEntity` | No | Tracks per playlist or album and episodes per podcast, up to 10,000. Defaults to 100 |
| `includeEntityRows` | No | Save a summary row for each link. Defaults to on |

### Spotify data export use cases

- **Music marketing and A\&R:** track monthly listeners, world rank, top cities and play counts for artists you work with or scout.
- **Playlist pitching:** find playlists by keyword, see their followers, and check the plays behind every track and when it was added.
- **Labels and distributors:** export catalogue tracklists with play counts, labels, release dates and copyright.
- **Podcast research:** compare shows by rating, number of ratings and full episode history.
- **Dashboards and AI agents:** pull clean Spotify rows into spreadsheets, BI tools or LLM pipelines on a schedule.

### Limitations

Artists return their top 10 tracks rather than their full catalogue: add the artist's album links for every track. Search results follow Spotify's own ranking, and Spotify returns at most about 1,000 results per term. Private playlists, and links Spotify no longer serves, are reported as "not found or not public" in the log and produce no rows. If full details are briefly unavailable, the run still returns the fields Spotify shows publicly, marks those rows `detailLevel: "basic"` where needed, and caps playlists and albums at 100 tracks for that run.

### Compared to alternatives

Most Spotify Actors cover one thing: play counts, artists, playlists or podcasts. This one takes any mix of links and searches in one run and returns one consistent row format, with play counts on every playlist and album track, artist audience, world rank and top cities, and podcast ratings with every episode. Input that is not a supported Spotify link is rejected before a run starts, and a link that cannot be read is reported without failing the rest.

### Related Actors

- [YouTube Scraper](https://apify.com/thirdwatch/youtube-scraper) — video views, likes and channel data
- [TikTok Scraper](https://apify.com/thirdwatch/tiktok-scraper) — creator and video statistics

### FAQ

#### Do I need a Spotify account or API key?

No.

#### How do I get every track from a large playlist?

Paste the playlist link and set `maxTracksPerEntity` up to 10,000.

#### Can I search by keyword?

Yes. Add terms to `searchQueries` and choose what to search for in `searchType`.

#### How do I get an artist's full catalogue?

Run the artist link to get their latest release and top tracks, then add their album links.

Last verified: 2026-10

More scrapers at [thirdwatch.dev](https://thirdwatch.dev).

# Actor input Schema

## `urls` (type: `array`):

Spotify links for artists, playlists, albums, tracks, podcasts and episodes: open.spotify.com links, spotify.link short links or spotify: URIs. Each link becomes one summary row plus its tracks or episodes.

## `searchQueries` (type: `array`):

Keywords to search Spotify for, such as an artist name, a genre or a mood. Each result is saved as a full summary row. Use with or instead of links.

## `searchType` (type: `string`):

What each search term looks for.

## `maxSearchResults` (type: `integer`):

Spotify returns up to about 1,000 results per search; most terms return fewer.

## `maxTracksPerEntity` (type: `integer`):

Cap on tracks per playlist or album and on episodes per podcast. Artists return their top 10 tracks.

## `includeEntityRows` (type: `boolean`):

Also save one summary row per link: artist followers, monthly listeners, biography and social links; playlist followers and owner; album label and release date; podcast rating and episode count. Turn off to get only track and episode rows.

## Actor input object example

```json
{
  "urls": [
    "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
    "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
  ],
  "searchType": "tracks",
  "maxSearchResults": 20,
  "maxTracksPerEntity": 100,
  "includeEntityRows": true
}
```

# Actor output Schema

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

No description

# 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 = {
    "urls": [
        "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
        "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("thirdwatch/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 = { "urls": [
        "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
        "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M",
    ] }

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

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
    "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
  ]
}' |
apify call thirdwatch/spotify-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,thirdwatch/spotify-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/63swnfGSPpc4linjE/builds/AsMUUCYsmoPWBOizH/openapi.json
