How to Scrape Apple Music Charts and Playlists (2026)

Apple Music doesn’t hand out a public API, which makes scraping Apple Music charts and playlists more interesting than most music data projects. If you need chart rankings, editorial playlist metadata, or track-level data at scale in 2026, you have three realistic paths: the MusicKit JS/REST API (limited but legit), Apify actors built for Apple Music, or direct HTML scraping of the charts pages. Each has real tradeoffs worth understanding before you commit.

What Data Is Actually Extractable

Apple Music exposes more than most engineers expect — without a paid developer account.

The public charts at music.apple.com/us/charts render server-side HTML for top songs, albums, and music videos by country. Each chart entry includes track title, artist name, album name, chart position, artwork URL, and a canonical Apple Music URL. Playlist pages (editorial playlists like “Today’s Hits”) are similarly crawlable and include track order, contributor metadata, and playlist description.

What you won’t get without authentication: play counts, listener counts, skip rates, or any user-generated behavioral data. Apple Music keeps that locked behind their developer tier. If you need engagement signals, How to Scrape Last.fm Listening Data and Artist Metadata (2026) is worth reading alongside this — Last.fm’s scrobble data can proxy for listener behavior Apple doesn’t expose.

Option 1: MusicKit API (The Official Route)

Apple’s MusicKit REST API is available to registered Apple Developer Program members ($99/year). It returns clean JSON and covers charts, playlists, search, and catalog lookups.

A charts request looks like this:

import requests

headers = {
    "Authorization": f"Bearer {DEVELOPER_TOKEN}",
    "Music-User-Token": user_token  # optional, for personalized endpoints
}

resp = requests.get(
    "https://api.music.apple.com/v1/catalog/us/charts",
    params={"types": "songs", "limit": 50, "genre": "14"},  # genre 14 = pop
    headers=headers
)

data = resp.json()
for item in data["results"]["songs"][0]["data"]:
    print(item["attributes"]["name"], item["attributes"]["artistName"])

Rate limits are not publicly documented, but community reports suggest roughly 20 requests/second per token before you start seeing 429s. Developer tokens expire after 6 months and must be signed with your private key using ES256.

The main limitation: MusicKit only returns chart data for supported storefronts (about 60 countries), and playlist contents for editorial playlists require knowing the playlist ID in advance. There’s no endpoint to list all editorial playlists.

Option 2: HTML Scraping the Charts Pages

For teams without a developer account or needing broader coverage, the HTML route works reliably in 2026. Apple’s charts pages are server-rendered, which means requests + BeautifulSoup is sufficient — no headless browser needed for the initial data.

from bs4 import BeautifulSoup
import requests

url = "https://music.apple.com/us/charts"
headers = {"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"}

resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.text, "html.parser")

chart_items = soup.select(".chart-lockup__details")
for item in chart_items:
    title = item.select_one(".chart-lockup__title").get_text(strip=True)
    artist = item.select_one(".chart-lockup__subtitle").get_text(strip=True)
    print(title, "|", artist)

A few practical notes:

  • Apple does fingerprint user agents. Rotate between realistic browser UA strings, not generic bot strings.
  • Country-specific charts are at music.apple.com/{country-code}/chartsgb, au, jp, etc.
  • The selector structure changes 2-3 times per year. Build a selector test into your pipeline and alert on empty results.
  • For playlist pages, the track list is embedded as a JSON-LD
    Scroll to Top

    Resources

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

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