Spotify podcast API: show metadata and episode archives without OAuth
Spotify's Web API will not give you monthlyListeners, worldRank, or a track playCount — those live on the web player, behind an app review if you want official access at all. One GET against /v1/spotify/artist (1 credit) or /v1/spotify/podcast (1 credit) returns the public Pathfinder payload as camelCase JSON, no OAuth app.
Every number below was captured on October 10, 2026. Artist and track first — those are the fields the official API withholds. Podcast show + episode archive after that.
What the official artist object omits
Daft Punk, fetched as spotify:artist:4tZwfgrHOc3mvqYlEYSvVi:
{
"platform": "spotify",
"type": "artist",
"id": "4tZwfgrHOc3mvqYlEYSvVi",
"name": "Daft Punk",
"followers": 11836431,
"monthlyListeners": 28325176,
"worldRank": 256,
"verified": true,
"topCities": [
{ "city": "Mexico City", "country": "MX", "listeners": 757121 },
{ "city": "London", "country": "GB", "listeners": 418077 }
]
}
Their track "One More Time" on the same session:
{
"type": "track",
"id": "0DiWol3AO6WpXZgp0goxAV",
"name": "One More Time",
"playCount": 984343332,
"durationMs": 320357,
"explicit": false,
"releaseDate": "2001-03-12T00:00:00Z",
"previewUrl": "https://p.scdn.co/mp3-preview/67a14210e33bf6d87d92faaed08ddf353d6b985f"
}
playCount is the listen metric on this surface. Spotify's 0–100 popularity and ISRC are often absent on getTrack — absence is not zero. Chain the track URI into /v1/spotify/track when a search hit omitted the count (Pathfinder search does not expose playCount).
The call — artist or show
JavaScript:
const headers = { Authorization: `Bearer ${process.env.CAPTAPI_KEY}` };
const artist = await fetch(
"https://api.captapi.com/v1/spotify/artist?url=" +
encodeURIComponent("https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi"),
{ headers },
).then((r) => r.json());
console.log(artist.data.monthlyListeners, artist.data.worldRank);
const show = await fetch(
"https://api.captapi.com/v1/spotify/podcast?url=" +
encodeURIComponent("https://open.spotify.com/show/0vvZeuKMlW81N8lUhLojf0"),
{ headers },
).then((r) => r.json());
console.log(show.data.name, show.data.totalEpisodes, show.data.publisher.name);
Python:
import httpx, os
h = {"Authorization": f"Bearer {os.environ['CAPTAPI_KEY']}"}
artist = httpx.get(
"https://api.captapi.com/v1/spotify/artist",
params={"url": "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi"},
headers=h, timeout=30,
).json()["data"]
print(artist["monthlyListeners"], artist["worldRank"])
eps = httpx.get(
"https://api.captapi.com/v1/spotify/podcast-episodes",
params={"url": "https://open.spotify.com/show/0vvZeuKMlW81N8lUhLojf0", "limit": 3},
headers=h, timeout=30,
).json()["data"]
for ep in eps["episodes"]:
print(ep["name"], ep["releaseDate"], ep.get("previewUrl"))
print("next", eps.get("nextCursor"), "hasMore", eps["hasMore"])
Podcast show vs episode archive
The show card from that URL — 1 credit — was:
{
"type": "podcast",
"id": "0vvZeuKMlW81N8lUhLojf0",
"name": "Elon Musk Thinking",
"publisher": { "name": "Astronaut Man" },
"totalEpisodes": 200,
"rating": { "average": 3.2, "totalRatings": 172 },
"topics": [{ "title": "Business" }, { "title": "Technology" }],
"explicit": true,
"mediaType": "AUDIO"
}
publisher is the show's publisher, not host names stuffed into artists[]. rating.average is one decimal. /v1/spotify/podcast-episodes is the archive (flat 2 credits, limit max 50). The same show returned three episodes with nextCursor: "3" and hasMore: true. The newest row had durationMs: 2215444, releaseDate: "2026-10-09T09:01:00Z", and a p.scdn.co/mp3-preview/… URL. totalEpisodes on the episodes response matched the show card (200) — same query, no drift.
Artist topCities[] is city / ISO country / region / listeners. Daft Punk's top five that day: Mexico City 757,121; London 418,077; Santiago 382,909; Sydney 307,093; Bogotá after that. Official Web API has no equivalent field. worldRank: 256 is the same Pathfinder rank the artist page shows — not a Captapi invention.
The trap: search is not a show lookup
/v1/spotify/search?type=podcasts&q=Lex Fridman Podcast on that session returned two hits via Pathfinder. The first was this show — not Lex Fridman's catalog ID 2MAi0BvDc6GTFvKFPXnkCL. Keyword search ranks Pathfinder's index; it does not resolve a canonical show. If you already have a show URL or URI, skip search and call /podcast directly.
A second trap on the artist side: the overview GraphQL only embeds a short discography sample. When albumsHasMore is true, chain release URIs into /v1/spotify/album instead of treating the sample as the catalog.
Preview MP3s on p.scdn.co are short clips, not the episode. Don't persist them as the audio asset. Signed social CDNs elsewhere expire — how each platform hides the expiry.
The podcast endpoint page and the artist page have the full field lists. A free key is 100 credits — enough to pull an artist, a show, and a page of episodes.