# Free Spotify Charts Tracker (`s-r/free-spotify-charts`) Actor

- **URL**: https://apify.com/s-r/free-spotify-charts.md
- **Developed by:** [SR](https://apify.com/s-r) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

## Free Spotify Charts Scraper — Global Top 50 Tracks, Albums & Artists with Rank Deltas

Scrape Spotify's official Global Weekly charts — Top Tracks, Top
Albums, Top Artists — with `current_rank`, `previous_rank`,
`peak_rank`, `appearances_on_chart`, and an automatic
climbers/fallers/new-entry classification. Run-over-run diff layer
included. $0.0015 per chart entry.

### What you get

- `chart_alias` (e.g. `REGIONAL_GLOBAL_WEEKLY`), `title`, `description`,
  `entity_type` (`track` / `album` / `artist`), `country` (GLOBAL),
  `recurrence` (WEEKLY), `date`, `latest_date`, `earliest_date`
- `entries[]` — typically 50-200 per chart with:
  - `current_rank`, `previous_rank`, `peak_rank`
  - `appearances_on_chart`, `consecutive_appearances`
  - `entry_status_raw` (Spotify's own `NEW_ENTRY` / `RE_ENTRY` / etc.)
    plus a normalized `entry_status` (`new`, `re_entry`, `dropped`,
    `climber` (≥10 spots up), `faller` (≥10 down), `moved_up`,
    `moved_down`, `unchanged`)
  - For tracks: `name`, `uri`, `artists[]`, `image_url`, `labels[]`,
    `release_date`
  - For albums: `name`, `uri`, `artists[]`, `image_url`, `release_date`
  - For artists: `name`, `uri`, `image_url`
- `diff` block — when `trackDiffs` is on, every run after the first
  emits `added`, `removed`, `moved`, `summary` with counts plus
  per-entry detail vs the previous snapshot

### Why scrape Spotify charts

Spotify shut down its public Charts CSV downloads in early 2024 and
deprecated the chart-related Web API endpoints in November 2024. The
`charts.spotify.com` web app is now the only public surface for the
Top 50 / Top 200 / Viral charts data — and it's a JS-rendered SPA
with an undocumented bearer-token-protected JSON catalog endpoint
behind it.

This actor hits that catalog endpoint directly (`charts-spotify-com-
service.spotify.com/public/v0/charts`) using anonymous embed-token
auth scoped to `charts.spotify.com`. You get the same data the web
app renders — every entry's current rank, previous rank, peak rank,
weeks on chart, and Spotify's own `entry_status` classifications —
without scraping a browser-rendered page.

The diff layer is the differentiator. The Spotify Charts UI shows
this week vs last week. This actor stores every run as a snapshot, so
on the second run forward you also get added / removed / moved
deltas computed against your last poll, not just against the chart
position from the prior week. Useful when you want to track
intra-week movement or your own custom comparison windows.

### Input

| Field | Default | Description |
|---|---|---|
| `only` | `["REGIONAL_GLOBAL_WEEKLY"]` | Restrict to specific chart aliases. Common values: `REGIONAL_GLOBAL_WEEKLY` (Top Tracks Global), plus the album and artist variants surfaced by Spotify's catalog. Pass a list to fetch multiple. |
| `trackDiffs` | `true` | If true, persist chart snapshots and emit added/removed/moved per run vs the previous one. |

**Important:** Country-level charts (e.g. US Top 50, UK Top 50, Top
50 Indonesia) are auth-walled by Spotify — only the Global Weekly
charts are anonymously available. If the catalog returns it, this
actor surfaces it; if Spotify locks it behind login, no anonymous
scraper can return it.

### Output

```json
{
  "chart_uri": "spotify:chart:regional-global-weekly",
  "chart_alias": "REGIONAL_GLOBAL_WEEKLY",
  "title": "Top Songs - Global - Weekly",
  "entity_type": "track",
  "country": "GLOBAL",
  "chart_type": "TOP_TRACK",
  "recurrence": "WEEKLY",
  "date": "2026-04-24",
  "latest_date": "2026-04-24",
  "entries": [
    {
      "position": 0,
      "current_rank": 1,
      "previous_rank": 3,
      "peak_rank": 1,
      "appearances_on_chart": 12,
      "consecutive_appearances": 12,
      "entry_status_raw": "MOVED_UP",
      "entry_status": "moved_up",
      "uri": "spotify:track:abc123...",
      "id": "abc123...",
      "name": "Example Track Name",
      "image_url": "https://i.scdn.co/image/...",
      "artists": [{"name": "Artist Name", "uri": "spotify:artist:..."}],
      "labels": ["Republic Records"],
      "release_date": "2026-02-14"
    }
  ],
  "diff": {
    "is_first_snapshot": false,
    "summary": {"added": 5, "removed": 5, "moved": 12, "unchanged": 33},
    "added": [{"position": 0, "uri": "spotify:track:...", "name": "..."}]
  }
}
````

### Use cases

**Music journalist / Substack writer doing a "this week on Spotify
Global" column.** The full Top 50 with `previous_rank`, `peak_rank`,
and `entry_status: climber` already classified saves the manual
diffing. Run on Friday after the chart refresh. Filter
`entry_status` to `new` and `climber` and you have your lede tracks.
$0.075 per Top 50 weekly run.

**Label marketing manager tracking their roster's chart positions.**
Run the global weekly track + album + artist charts every Friday,
filter `entries[]` by your roster's artist URIs, log
`current_rank` deltas to BigQuery. Build a weekly dashboard for
the C-suite without paying Chartmetric Pro at $140/month for
data that's anonymously available anyway.

**Music data researcher / academic** building a longitudinal dataset
of chart movement. The `appearances_on_chart` and
`consecutive_appearances` fields give you durability metrics out of
the box, and the diff store gives you week-over-week added/removed/
moved without you having to write the join.

**Sync-licensing supervisor** monitoring chart climbers as a leading
signal of which tracks are about to break mainstream — too late once
they hit Top 10, but `entry_status: climber` (≥10 positions up
week-over-week) inside the Top 100 is exactly the band where licensing
is still affordable. $0.0015 per entry × 50 = $0.075 a week.

### How it compares

| Actor / Source | Price | Top Tracks | Top Albums | Top Artists | Rank Delta | Run-over-Run Diff |
|---|---|---|---|---|---|---|
| **This actor** | **$0.0015 / entry** | yes | yes | yes | built-in | yes |
| `eduair94/spotify-scraper` (#5 SERP for `spotify charts scraper`) | per-result | yes | partial | partial | partial | no |
| Bright Data Spotify scraper | enterprise | partial | partial | partial | no | no |
| Spotify official Web API | n/a | **deprecated Nov 2024** | n/a | n/a | n/a | n/a |
| `charts.spotify.com` web UI | free (manual) | yes | yes | yes | yes (vs. last week) | no |
| Chartmetric Pro | $140+ / month flat | yes (all regions) | yes | yes | yes | yes |

The serious paid alternatives — Chartmetric, Soundcharts, Spotontrack
— start at $90-300/month flat-rate and cover country charts that
Spotify auth-walls from anonymous scrapers. They're the right answer
if you need US/UK/Brazil/etc. charts. For Global Weekly tracking
specifically, this actor is the cheapest pay-per-use path with the
diff layer included.

### Pricing

- `$0.0015` per chart entry returned
- All pricing is **pay-per-event** — you only pay per result. No
  actor-start fee. A 50-entry Top 50 chart costs `$0.075` per run.
  Three charts × 50 entries × weekly = ~$0.45/month.

### Limits and gotchas

- **Anonymous scraping** — no Spotify account or Premium needed.
- **Country charts are auth-walled** — Spotify only allows anonymous
  access to the Global Weekly charts. Region-specific Top 50s (US,
  UK, BR, ID, etc.) require login and aren't returned by the
  anonymous catalog endpoint. This is a Spotify policy, not a
  scraper limit.
- **Chart refresh cadence** — Spotify publishes the weekly charts
  every Friday (typically 00:00 UTC). Running the actor outside that
  window returns the prior week's data unchanged.
- **Diff state** — first run is always `is_first_snapshot: true` with
  empty diff arrays. Run twice to see the first real diff.
- **`labels[]`** field for tracks is sometimes empty for indie
  releases — that's Spotify not having the metadata, not a scraper
  bug.
- **Entry status semantics** — `entry_status: climber` and `faller`
  in this actor mean ≥10 positions of movement (our normalization).
  Spotify's raw `entry_status_raw` uses different buckets; both are
  surfaced so you can pick.
- **Cold-start time** is ~3-5s; the catalog endpoint returns all
  available charts in one shot.

### FAQ

**Can I scrape Spotify charts after the official charts API was deprecated?**
Yes. The Spotify Web API charts endpoints were deprecated in November
2024, but `charts.spotify.com` is still publicly accessible. This
actor hits the same JSON catalog the web UI calls, with anonymous
embed-token auth. No Spotify account or developer-app required.

**How often does Spotify update the Top 50 chart?**
Weekly, every Friday. The cadence has been stable for years. Daily
charts (Top 200 / Viral 50) are not currently in the anonymous
catalog response — only the weekly cuts.

**Can I get the US Top 50 or UK Top 50 with this actor?**
Not anonymously. Country-level charts on `charts.spotify.com` require
a logged-in session. This actor returns whatever the anonymous
catalog endpoint surfaces, which today is the Global Weekly Top
Tracks / Albums / Artists.

**What's the cost to track all global charts weekly?**
Approximately $0.45/month for the three flagship Global Weekly
charts (50 entries each × 4 weeks × $0.0015). Trivial compared to
Chartmetric Pro at $140/month.

**How do I detect chart climbers and breakouts?**
Filter `entries[]` where `entry_status: "climber"` (≥10 spots up
week-over-week) or `entry_status: "new"` (just entered the chart).
The `diff.added` array gives you the same view but computed against
your previous run rather than against last week's chart.

### Related Actors

- [Free Spotify Artist Analytics](https://apify.com/s-r/free-spotify-artist-analytics) — monthly listeners, world rank, top tracks with playcount per chart-climbing artist
- [Free Spotify Playlist Intelligence](https://apify.com/s-r/free-spotify-playlist-intelligence) — playlist tracklists, follower count, editorial flag, run-over-run diff
- [Free Spotify Podcast Catalog](https://apify.com/s-r/free-spotify-podcast-catalog) — podcast show metadata, episodes, ratings, publisher

# Actor input Schema

## `only` (type: `array`):

Restrict output to specific chart aliases (e.g. REGIONAL\_GLOBAL\_WEEKLY). Leave at default to fetch the global weekly top tracks chart.

## `trackDiffs` (type: `boolean`):

If true, persist chart snapshots and emit added/removed/moved per run vs the previous one.

## Actor input object example

```json
{
  "only": [
    "REGIONAL_GLOBAL_WEEKLY"
  ],
  "trackDiffs": true
}
```

# 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 = {
    "only": [
        "REGIONAL_GLOBAL_WEEKLY"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/free-spotify-charts").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 = { "only": ["REGIONAL_GLOBAL_WEEKLY"] }

# Run the Actor and wait for it to finish
run = client.actor("s-r/free-spotify-charts").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 '{
  "only": [
    "REGIONAL_GLOBAL_WEEKLY"
  ]
}' |
apify call s-r/free-spotify-charts --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Free Spotify Charts Tracker",
        "version": "0.1",
        "x-build-id": "FTWcZMDzfwVISh3Fh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/s-r~free-spotify-charts/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-s-r-free-spotify-charts",
                "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/s-r~free-spotify-charts/runs": {
            "post": {
                "operationId": "runs-sync-s-r-free-spotify-charts",
                "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/s-r~free-spotify-charts/run-sync": {
            "post": {
                "operationId": "run-sync-s-r-free-spotify-charts",
                "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",
                "required": [
                    "only"
                ],
                "properties": {
                    "only": {
                        "title": "Filter to specific chart aliases",
                        "type": "array",
                        "description": "Restrict output to specific chart aliases (e.g. REGIONAL_GLOBAL_WEEKLY). Leave at default to fetch the global weekly top tracks chart.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "trackDiffs": {
                        "title": "Track diffs across runs",
                        "type": "boolean",
                        "description": "If true, persist chart snapshots and emit added/removed/moved per run vs the previous one.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
