Spotify API Alternative After the 2026 Web API Changes
A Spotify API alternative for 2026: artist top tracks, albums and public playlist tracks as JSON with no developer app, OAuth or Premium. 1 credit a call.
By Scrape Everything team · · 13 min read
TL;DR: For public Spotify catalog data in 2026, the most direct Spotify API alternative is a scraper API that reads open.spotify.com, such as Scrape Everything: artist top tracks, albums, tracks and public playlists as JSON, 1 credit per call, with no developer app, OAuth or Premium. If you need open metadata rather than Spotify IDs, MusicBrainz is free.
Last updated: October 21, 2026. Spotify facts below were checked against developer.spotify.com on that date.
What are the alternatives to the Spotify Web API?
People who search for a Spotify API alternative usually want one of two things. Some want a different music database. Others want to keep reading Spotify data after the February 2026 cuts. This table covers both, using only what each provider documents.
| Option | Auth you need | Artist top tracks | Tracks of public playlists you don't own | Popularity data | Cost | Best for |
|---|---|---|---|---|---|---|
| Spotify Web API, Development Mode | Client ID, OAuth, owner with Premium | Removed for affected apps | Metadata only | popularity and followers removed | Free API, Premium for the owner | Personal, non-commercial projects with a logged-in user |
| Spotify Web API, Extended Quota Mode | Approved organization (at least 250k MAU) | Yes | Yes | Yes | Free API, approval needed | Launched commercial apps |
| Scrape Everything | One API key | Yes, spotify.artist | Yes, up to about 50 tracks per request | Not returned | $0.90 to $1.56 per 1,000 calls | Public catalog data without a developer app |
| MusicBrainz API | No key, User-Agent header required | No | No (not Spotify data) | No | Free, about 1 request per second | Open metadata, recording and release lookups |
| Last.fm API | API key | Last.fm's own data | No | Listener and play counts | Free key | A rough popularity signal |
Extended Quota Mode is the full official API, but Spotify's quota modes page accepts only organizations and lists "at least 250k MAUs" among the criteria. For a solo developer, that door is closed. MusicBrainz suits open metadata if you can live with its rate limit of about one request per second per IP.
What did Spotify change for developers in 2026?
Spotify announced the changes on February 6, 2026 in Update on Developer Access and Platform Security. The stated reason: "advances in automation and AI have fundamentally altered the usage patterns and risk profile of developer access." The details are in the February 2026 Web API Dev Mode migration guide and the February 2026 Web API changelog.
When do the Spotify Development Mode restrictions apply?
- February 11, 2026: new Development Mode Client IDs get the new restrictions.
- March 9, 2026: the same requirements were scheduled for existing Development Mode integrations.
- Later on March 9, Spotify updated the blog post. It said it had decided to "postpone endpoint access changes for existing integrations," while the Premium requirement, the user cap and the one Client ID limit "will take effect as planned." It promised "further details on updated timelines" and gave no date.
So an app created before February 11 may still reach the old endpoints today. Spotify called it a postponement. I wouldn't build anything new on that gap.
What are the account and app limits?
- The app owner needs an active Spotify Premium subscription. Per the migration guide, if it lapses the app stops working until the owner resubscribes.
- New apps were capped at one Client ID per developer. Spotify's July 23 post, Web API quota updates for Development Mode, raised that to 25.
- New apps get up to 5 authorized users. Existing apps keep the users and Client IDs they already had.
- Apps in Extended Quota Mode are not affected by any of it.
Which Spotify endpoints were removed?
The changelog lists 40 removed endpoints. These are the ones data projects relied on:
| What you used to call | Status in Spotify's changelog | Official replacement |
|---|---|---|
GET /artists/{id}/top-tracks | Removed | None listed |
GET /tracks, /albums, /artists (several IDs) | Removed | Single-ID forms like GET /tracks/{id} |
GET /browse/new-releases, /browse/categories | Removed | None listed |
GET /playlists/{id}/tracks | Removed, renamed to /items | GET /playlists/{id}/items |
GET /users/{id}/playlists | Removed | GET /me/playlists (current user only) |
GET /markets | Removed | None |
GET /search | limit max cut from 50 to 10, default from 20 to 5 | Same endpoint |
Two separate playlist changes hide in that table. The endpoint was renamed from /tracks to /items. Separately, the migration guide says playlist contents "are only returned for playlists the user owns or collaborates on." Everyone else's playlists come back as metadata, with no items.
The playlist one stings most.
Fields went too. The changelog removes popularity and available_markets from tracks, label and popularity from albums, and followers and popularity from artists. external_ids (where ISRC lives) was on that list, then marked reverted in the March 2026 changelog, which says it "will continue to be available."
Why am I getting 429 QUOTA_EXCEEDED from the Spotify API?
Since the July 2026 update, Development Mode quota is counted per developer account, not per app. All your Development Mode Client IDs share one budget, so spinning up a second app doesn't buy you more calls. When you hit it, the 429 now carries a JSON body with "reason": "QUOTA_EXCEEDED", which separates quota exhaustion from ordinary rate limiting. The July 2026 changelog has the details. Retrying faster won't fix a quota problem.
What about the November 2024 deprecations?
In November 2024, Spotify cut new Web API use cases off from Related Artists, Recommendations, Audio Features, Audio Analysis and Featured Playlists, among others (Spotify's announcement). We don't replace those. For tempo or key, compute them yourself with an open-source library like Essentia on audio you have the right to process.
Who is affected by the Spotify development mode restrictions?
New Development Mode apps get the restricted endpoint set from day one. Older ones already carry the Premium and user-cap rules and get the endpoint changes once Spotify publishes the postponed timeline.
The biggest losers never had end users at all: a script that pulls top tracks into a spreadsheet, a tracker that diffs editorial playlists every morning, a nightly enrichment job on Client Credentials. Spotify says Development Mode will keep supporting "learning, experimentation, and personal projects for non-commercial use by individual developers." A label's playlist monitor is none of those.
If you need a logged-in user's library or playback, stay on the official Web API. Nothing below replaces it.
Is there a Spotify API alternative without a developer app?
Yes, for public catalog data. A Spotify scraper API returns Spotify tracks, artists, albums and public playlists as JSON from a link, URI or ID, without a Spotify developer app.
Scrape Everything is a REST API for public social media data, returned as clean JSON. It covers 9 platforms: Instagram, TikTok, X, YouTube, Facebook, Telegram, Spotify, Pinterest and Twitch. You authenticate with one API key. No Client ID, no redirect URI, no token refresh, no Premium subscription. We're not affiliated with Spotify.
The Spotify scraper API has four endpoints:
| Endpoint | Input | Returns | Credits |
|---|---|---|---|
spotify.track | Track link, URI or 22-character ID | Title, artists, duration, release date, explicit flag, cover image, 30-second preview URL | 1 |
spotify.artist | Artist link, URI or ID | Name, image and the artist's top tracks (about 10) with durations and preview URLs | 1 |
spotify.album | Album link, URI or ID | Title, artists, release date, cover and the full track list | 1 |
spotify.playlist | Public playlist link, URI or ID | Title, owner, cover, total duration and up to about 50 tracks | 1 |
Why "about"? We return what the public page renders. top_tracks_count and track_count tell you exactly how many you got. Full params and response fields are in the Spotify endpoint docs.
How do I get an artist's top tracks now that the endpoint is gone?
Call spotify.artist. It returns the artist plus a top_tracks array and a top_tracks_count. One request, one credit.
curl -X POST https://api.scrapeeverything.com/v1/spotify/artist \
-H "Authorization: Bearer $SCRAPEEVERYTHING_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02"}'The response looks like this. We trimmed it to two tracks and swapped names, track IDs and counts for placeholders, so only the shape is literal:
{
"success": true,
"data": {
"id": "06HL4z0CvFAxyc27GXpf02",
"link": "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02",
"name": "example_artist",
"image_url": "https://i.scdn.co/image/...",
"top_tracks": [
{
"id": "example_track_id_1",
"title": "example_song",
"artists_text": "example_artist",
"duration_ms": 215000,
"is_explicit": false,
"preview_url": "https://p.scdn.co/mp3-preview/...",
"link": "https://open.spotify.com/track/example_track_id_1"
},
{
"id": "example_track_id_2",
"title": "another_example_song",
"artists_text": "example_artist, example_feature",
"duration_ms": 198000,
"is_explicit": true,
"preview_url": null,
"link": "https://open.spotify.com/track/example_track_id_2"
}
],
"top_tracks_count": 10
},
"meta": {
"request_id": "req_...",
"cached": false,
"credits_charged": 1,
"credits_remaining": 99
}
}One difference from the old endpoint: Spotify's top-tracks took a market parameter, and ours has none. If per-country top tracks matter to you, spot-check results for the markets you report on before you switch.
Monthly listeners, followers and genres are not publicly available and are not returned. Spotify removed followers and popularity for affected apps too, so neither route gives them back. For a rough signal, Last.fm's artist.getInfo returns listener and play counts from Last.fm's own users. Different audience, so treat it as a trend line.
How do I get album metadata and the full track list?
spotify.album takes a link, a spotify:album: URI or the bare ID and returns title, artists_text, release_date, is_explicit, image_url, track_count and a tracks array. Each track has id, title, artists_text, duration_ms, is_explicit, preview_url and link.
For a single track, spotify.track adds release_date, is_playable, has_video and an artists array with IDs and links. Short links (spotify.link, spoti.fi) aren't supported, so resolve them first. ISRC isn't in any of our Spotify responses; if you match on ISRC, external_ids is still in the official API.
How do I read public Spotify playlist data?
The Spotify playlist scraper API returns a public playlist's title, owner, image_url, total_duration_ms and up to about 50 tracks per request. track_count is the number of tracks returned, not necessarily the playlist's full length.
That cap matters. For most curated playlists it covers the top of the list, which is usually the part a placement tracker watches. For a 400-track archive playlist, it won't get you everything, and we'd rather tell you that here than in a support ticket.
Private playlists don't work. Public only.
How do I migrate a Client Credentials script to a Spotify API alternative?
A common case is a Python script that used Client Credentials to pull top tracks for a list of artists.
Before: the official Web API
This won't run as-is (CLIENT_ID, CLIENT_SECRET and artist_id come from your old config), and on an affected app the second call no longer works anyway.
# Old flow: token + /artists/{id}/top-tracks (removed for affected apps)
import requests
token = requests.post("https://accounts.spotify.com/api/token",
data={"grant_type": "client_credentials"},
auth=(CLIENT_ID, CLIENT_SECRET)).json()["access_token"]
r = requests.get(f"https://api.spotify.com/v1/artists/{artist_id}/top-tracks",
params={"market": "US"},
headers={"Authorization": f"Bearer {token}"})
tracks = r.json()["tracks"]After: Scrape Everything
- Sign up and copy your API key from the dashboard. You get 100 free credits, no payment details needed.
- Export it:
export SCRAPEEVERYTHING_API_KEY=ssk_live_... - Delete the token request and the
CLIENT_ID/CLIENT_SECRETconfig. - Swap the endpoint and map the fields (table below).
- Add
cache_days(1 to 14) so reruns of the same artist inside that window come from cache for free. See caching.
| Old Web API field (top-tracks) | Scrape Everything field (spotify.artist) |
|---|---|
tracks | top_tracks |
tracks[].name | top_tracks[].title |
tracks[].artists[].name | top_tracks[].artists_text (one string) |
tracks[].duration_ms | top_tracks[].duration_ms |
tracks[].explicit | top_tracks[].is_explicit |
tracks[].preview_url | top_tracks[].preview_url |
tracks[].external_urls.spotify | top_tracks[].link |
tracks[].popularity | Not available |
tracks[].external_ids | Not available |
import os
import requests
API = "https://api.scrapeeverything.com"
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPEEVERYTHING_API_KEY']}"}
def spotify(action: str, **body):
r = requests.post(f"{API}/v1/spotify/{action}", json=body, headers=HEADERS, timeout=60)
try:
payload = r.json()
except ValueError:
raise RuntimeError(f"{r.status_code}: non-JSON response") from None
if not payload.get("success"):
raise RuntimeError(f"{r.status_code} {payload.get('code')}: {payload.get('message')}")
return payload["data"]
artist_ids = ["06HL4z0CvFAxyc27GXpf02"] # your list
for artist_id in artist_ids:
artist = spotify("artist", id=artist_id, cache_days=1)
for t in artist["top_tracks"]:
print(artist["name"], "|", t["title"], "|", t["duration_ms"])
# Same helper for playlists and albums
playlist = spotify("playlist", url="https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M", cache_days=1)
print(playlist["title"], playlist["track_count"], "tracks returned")The same artist call in Node 18+, with built-in fetch:
const res = await fetch("https://api.scrapeeverything.com/v1/spotify/artist", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SCRAPEEVERYTHING_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ id: "06HL4z0CvFAxyc27GXpf02", cache_days: 1 }),
});
const { success, data, code } = await res.json();
if (!success) throw new Error(`${res.status} ${code}`);
console.log(data.name, data.top_tracks.map((t) => t.title));Branch on code, not on message. The errors reference lists every code and whether it's billed. Failures on our side (TARGET_BLOCKED, PARSE_ERROR, TIMEOUT and the like) are refunded automatically. A NOT_FOUND is a final answer for that target and is charged, so cache it instead of retrying.
Can I run hundreds of artists in parallel?
Up to your account's limits. Each account has a per-minute limit and a concurrency limit, shared by all its keys, both listed in the rate limits docs. Going over returns a 429 with RATE_LIMITED or CONCURRENCY_LIMIT, and rejected requests are never charged. Wait for RateLimit-Reset, then retry. Spotify dropped its batch endpoints too, so one request per object is the norm on both sides now.
Does it work with AI agents?
Yes. The same endpoints are exposed through our MCP server (@scrapeeverything/mcp, listed in the official MCP Registry), the CLI (npx scrapeeverything), an n8n node (n8n-nodes-scrapeeverything) and Agent Skills. If you'd rather generate a client, the OpenAPI spec is at https://scrapeeverything.com/openapi.json.
What can't a Spotify API alternative replace?
Plainly, so nobody migrates the wrong thing. We don't offer:
- User data: no
/me, saved tracks, followed artists or listening history. - Playback: no Web Playback SDK, player controls or queue.
- Private playlists, or collaborative ones that aren't public.
- Write actions, such as creating playlists or saving to a library.
- Audio files. You get the 30-second
preview_urlwhen Spotify provides one, nothing more. - Audio features, audio analysis or recommendations.
- Popularity, followers, genres, monthly listeners or ISRC.
If you need any of those, you need the official Web API with OAuth, and for commercial scale, Extended Quota Mode. We only read what a logged-out visitor can see on open.spotify.com.
Is it allowed to read public Spotify data this way?
This isn't legal advice. The Spotify Developer Terms govern the Spotify Platform, which they define as Spotify's developer tools (APIs, SDKs, widgets) and their documentation. Reading public pages through a third party is a different question, and the answer depends on your jurisdiction and what you do with the data. We return public data only, as a logged-out visitor sees it, and never log in to anyone's account. Playlist owner names can be personal data, so collect only what you need. You're responsible for how you use the results. Our overview of whether scraping public social media data is legal covers access laws, platform terms and GDPR in more depth.
How much does a Spotify API alternative cost per 1,000 calls?
Every Spotify endpoint costs 1 credit per request. Credits come in one-time packs and never expire:
| Pack | Price | Credits | Per 1,000 |
|---|---|---|---|
| Builder | $39 | 25,000 | $1.56 |
| Growth | $119 | 100,000 | $1.19 |
| Scale | $449 | 500,000 | $0.90 |
A worked example. Say you snapshot 200 editorial playlists every day and refresh 500 artists every week. That's 200 x 30 = 6,000 playlist calls plus 500 x about 4.3 = 2,150 artist calls, so roughly 8,150 credits a month. One Builder pack (25,000 credits, $39) lasts about three months, which works out to around $12.70 a month. Note that cache_days saves nothing on a job that wants fresh data every day; it pays off on reruns and retries of the same targets. Failed requests are refunded and cache hits are free.
Details are on the pricing page, you can model your own volume in the pricing calculator, and our pricing comparison of social media scraping APIs shows how per-call prices stack up across providers. Payment is in crypto.
Get 100 free credits and run the artist call above against one of your own IDs before you rewrite anything.
FAQ
Is there a free Spotify API alternative?
MusicBrainz is free and needs no key, but it serves open metadata at about one request per second, not Spotify IDs, playlists or top tracks. Last.fm's API is free with a key and gives listener and play counts. Scrape Everything gives you 100 free credits on signup, which is 100 Spotify calls, with no payment details needed.
Why does the Spotify API return no tracks for a playlist?
Since February 2026, Development Mode apps only get playlist contents for playlists the user owns or collaborates on. Other playlists return metadata without items, per Spotify's migration guide. For public playlists you don't own, the Scrape Everything playlist endpoint returns up to about 50 tracks per request.
Do I need a Spotify developer app or Premium to use Scrape Everything?
No. Send a Spotify link, URI or ID with your Scrape Everything key. There's no Client ID, no OAuth flow and no Spotify Premium requirement on your side.
Is this an official Spotify API?
No. Scrape Everything is not affiliated with Spotify. It reads public catalog data only: no logins, no private accounts. For user libraries and playback, use the official Web API.
What happens if a request fails?
You get a stable error code and an HTTP status. Failures on our side, like blocks and timeouts, are refunded automatically. A not-found or private target is charged because it is a final answer. The FAQ and the errors reference have the full list.