# Spotify Playlist Tracker — Tracks Added & Removed, Top Tracks (`northbell/spotify-playlist-tracker`) Actor

Spotify playlist tracker: every track with its position, plus tracks added, removed and moved since your last run. Also an artist's top tracks with rank changes, and album tracklists. Public playlist, artist and album links, no login, no API key. Reads the first 100 tracks of a playlist.

- **URL**: https://apify.com/northbell/spotify-playlist-tracker.md
- **Developed by:** [Northbell](https://apify.com/northbell) (community)
- **Categories:** Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 tracks

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 Playlist Tracker — Tracks Added, Removed & Artist Top Tracks

Give it Spotify playlist links (and, if you like, artist or album links) and get one clean row per track: **position, track name, artists, length, explicit flag, track link and a 30-second preview link**, plus a summary of the playlist. **$0.50 per 1,000 tracks**, no login, no API key.

Run it again — or put it on a daily schedule — and every playlist also tells you **what changed since the last run**: which tracks were **added**, which were **removed**, and how far every track **moved up or down**. For artists you get the top 10 tracks with their **rank change**. Spotify only shows you today's list; this keeps the history for you.

### What you get

| Row `type` | What it is |
|---|---|
| `playlist-track` | one row per track in the playlist (first 100 tracks, see Notes) |
| `playlist-summary` | one free row per playlist: name, tracks read, and the **added / removed** lists since the last run |
| `artist-track` | one row per track in the artist's top 10 |
| `artist-summary` | one free row per artist: which tracks **entered** and **left** the top 10 since the last run |
| `album-track` | one row per track on an album |
| `error` | a link that could not be read (free) |

| Field | What it is |
|---|---|
| `playlistId`, `playlistName`, `playlistUrl` | the playlist (artist rows have `artistId`, `artistName`, `artistUrl`; album rows `albumId`, `albumName`, `albumArtist`, `albumUrl`) |
| `position` / `rank` | place in the playlist or album (1 = first) / place in the artist's top 10 |
| `trackId`, `trackUrl`, `trackName`, `itemType` | the track (`itemType` is `track`, or `episode` if a playlist contains podcast episodes) |
| `artists`, `artistsText` | the performers: a list (`["Tyler, The Creator", "Kali Uchis"]`) and one text line |
| `durationMs`, `explicit`, `previewUrl` | length, explicit flag and the 30-second preview MP3 (`null` when Spotify offers none) |
| `isNew`, `previousPosition`, `positionChange` | since your last run: is the track new in the playlist, where it was, and how many places it **moved up** (positive) or down (negative) |
| `isNew`, `previousRank`, `rankChange` | the same for an artist's top tracks |
| `tracksRead`, `embedLimitReached`, `ownerIsSpotify` | summary: how many tracks were read, whether the list reached Spotify's 100-track limit (`true` from 90 tracks up), and whether it is one of Spotify's own playlists |
| `added`, `removed`, `addedCount`, `removedCount` | summary: tracks added to / removed from the playlist since the last run (`trackId`, `trackName`, `artists`) |
| `entered`, `left`, `enteredCount`, `leftCount` | artist summary: tracks that entered / left the top 10 |
| `firstRun`, `previousRunAt`, `hoursSinceLastRun`, `note` | when the comparison run was, and a plain-language note when something needs explaining |

On the very first run for a playlist or artist, every change field is `null` (there is nothing to compare with yet) and `firstRun` is `true`.

### Use it for

- **Playlist placement checks** — is my song still on that playlist, and at which position today? Add the playlists you pitch to and read `position` and `positionChange`
- **Curator and competitor watching** — which tracks did a playlist add or drop this week? Schedule it daily and read the `playlist-summary` rows
- **Artist monitoring** — how an artist's top 10 shifts after a release, a viral moment or a tour announcement
- **Playlist exports** — a clean list of track names, artists and links for a spreadsheet or your own database

### Input

```json
{
  "playlists": ["https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"],
  "artists": ["https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02"],
  "albums": []
}
```

Links from "Share → Copy link", `spotify:playlist:…` links and bare 22-character IDs all work. A link is read as what it says it is, so an artist link pasted into the playlists box still works.

The previous list is remembered per playlist and per artist in a named key-value store in your Apify account, so the second run of the same Actor already shows changes. Schedule it (Apify → Schedules) for a daily history. The comparison is always with the **previous run**.

### Pricing

**$0.50 per 1,000 tracks** (one track row), plus $0.01 per run. A 100-track playlist costs about $0.06 per run. Summary rows and error rows are free. The $0.01 run-start fee is the one charge every run pays, even one that returns nothing.

### Notes

- **Playlists: the first 100 tracks only.** Spotify's public player page lists at most 100 tracks. Checked on 8 Oct 2026: playlists with 1,107 and 1,590 tracks came back with exactly 100, and two 10,000-track playlists with 100 and 98 (Spotify can leave a few tracks out of the first 100); shorter playlists (a 50-track chart, a 75-track mix) come back whole. When 90 or more tracks are read, `embedLimitReached` is `true`: "removed" can then also mean "moved below position 100", and "added" a track that moved up into the first 100. `position` is the place in the list the page shows.
- **Artists: the top 10 tracks** as Spotify's player page shows them.
- **What Spotify's public page does not carry, so this Actor does not return:** play counts, followers or saves, monthly listeners, release dates, the date a track was added, and album names for playlist tracks. It does not use Spotify's Web API or any login.
- **Playlist owners are not returned.** `ownerIsSpotify` tells you whether it is one of Spotify's own playlists; the name of a person who made a playlist is not output.
- **Not readable:** private playlists and anything Spotify does not serve as a public page. A link that cannot be read comes back as a free `error` row. Track and podcast-episode links are not accepted; give a playlist, artist or album.
- **No country setting.** The page is read from Apify's servers (in the US), and what Spotify shows there can differ from what you see in your own country. The Actor asks for the English version of the page, so names are in English. It does not claim per-country results.
- A track that is on a playlist twice is listed twice, and counted once in `added`.
- Tracks are matched by their Spotify track ID. When Spotify swaps a track for another release of the same song (a remaster, seen on a chart on 8 Oct 2026), the ID changes, so it shows up as one `removed` and one `added` track with the same name.
- Public data only: what anyone sees on a public Spotify page without signing in.

To follow **podcasts** the same way, see [Apple Podcasts Scraper](https://apify.com/northbell/apple-podcasts-scraper).

### For AI agents

`{"playlists": ["https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"]}` returns one `playlist-summary` row and one `playlist-track` row per track (up to 100). Rows have `type`: `playlist-track`, `playlist-summary`, `artist-track`, `artist-summary`, `album-track` or `error`. Run the same input again later and `isNew`, `previousPosition`, `positionChange` and the summary's `added` / `removed` lists are filled in.

# Actor input Schema

## `playlists` (type: `array`):

One playlist per line: a Spotify link (open.spotify.com/playlist/…, "Share → Copy link" in the app), a spotify:playlist:… link or the 22-character playlist ID. Public playlists only. Spotify shows the first 100 tracks of each playlist. Leave empty if you only want artists or albums.

## `artists` (type: `array`):

Optional. One artist per line: a Spotify link (open.spotify.com/artist/…), a spotify:artist:… link or the 22-character artist ID. You get the artist's top 10 tracks with their rank and the change since your last run.

## `albums` (type: `array`):

Optional. One album per line: a Spotify link (open.spotify.com/album/…), a spotify:album:… link or the 22-character album ID. You get the track list of the album.

## Actor input object example

```json
{
  "playlists": [
    "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
  ]
}
```

# Actor output Schema

## `tracks` (type: `string`):

Playlist tracks with position, artist top tracks with rank, album tracks, and the change since the last run.

## `changes` (type: `string`):

One summary row per playlist and artist: tracks added, removed, entered or left the top 10.

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

// Run the Actor and wait for it to finish
const run = await client.actor("northbell/spotify-playlist-tracker").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 = { "playlists": ["https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"] }

# Run the Actor and wait for it to finish
run = client.actor("northbell/spotify-playlist-tracker").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 '{
  "playlists": [
    "https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M"
  ]
}' |
apify call northbell/spotify-playlist-tracker --silent --output-dataset

```

## MCP server setup

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

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/RavZDjvmfhZc3gf6T/builds/d74D8zQS8gs1ZBo7x/openapi.json
