How to Scrape Spotify Public Data (2026): Playlists, Artists, Charts

Spotify exposes more public data than most engineers realize, and scraping it in 2026 is a two-track problem: you can use the official Web API for structured data up to its rate limits, or you can go direct to the frontend endpoints for data the API simply doesn’t surface. This guide covers both tracks for playlists, artist pages, and chart data.

What Spotify Actually Makes Public

Before writing a single line of code, know what you’re targeting. Spotify’s public surface breaks down into three tiers:

  • Web API (official): artist metadata, album/track objects, playlist tracks, audio features, search. Rate-limited at ~180 requests per minute on client credentials flow.
  • Open Browse endpoints: charts, genre playlists, editorial content at open.spotify.com. No auth required, rendered server-side with embedded JSON.
  • Partner/Chartmetric-style data: listener counts, streaming velocity, playlist reach. Not in the public API. Requires scraping the web UI or using third-party aggregators.

Charts specifically live at open.spotify.com/charts/overview and regional URLs like /charts/country/sg/weekly/artists. These pages embed a __NEXT_DATA__ JSON blob in the HTML, the same pattern used by most Next.js apps. That blob is your extraction target.

Scraping via the Official Spotify Web API

For artist metadata and playlist tracks, the Web API is the right starting point. Get a client credentials token first (no user login needed):

import httpx
import base64

CLIENT_ID = "your_client_id"
CLIENT_SECRET = "your_client_secret"

def get_token():
    creds = base64.b64encode(f"{CLIENT_ID}:{CLIENT_SECRET}".encode()).decode()
    r = httpx.post(
        "https://accounts.spotify.com/api/token",
        headers={"Authorization": f"Basic {creds}"},
        data={"grant_type": "client_credentials"},
    )
    return r.json()["access_token"]

def get_playlist_tracks(playlist_id: str, token: str):
    url = f"https://api.spotify.com/v1/playlists/{playlist_id}/tracks"
    headers = {"Authorization": f"Bearer {token}"}
    items = []
    while url:
        r = httpx.get(url, headers=headers, params={"limit": 100}).json()
        items.extend(r["items"])
        url = r.get("next")
    return items

The next field handles pagination automatically. A 500-track playlist resolves in 5 requests. For audio features (tempo, danceability, valence), hit /v1/audio-features?ids=comma,separated,ids with up to 100 IDs per call.

Rate limits are per-app, not per-IP, so rotating tokens across multiple app registrations is the standard scale-out trick. Spotify does not currently block client credentials token generation by IP, but hammering a single app ID past 180 rpm triggers 429s with a Retry-After header. Honor it.

Scraping Charts and Editorial Playlists

The Web API does not expose Spotify’s own chart rankings. For that, you target the HTML directly. Regional weekly charts follow this URL pattern:

https://open.spotify.com/charts/country/{country_code}/weekly/songs

The page ships with a

Scroll to Top

Resources

Proxy Signals Podcast
Operator-level insights on mobile proxies and access infrastructure.

Multi-Account Proxies: Setup, Types, Tools & Mistakes (2026)