# Spotify Podcast Scraper (`parsebird/spotify-podcast-scraper`) Actor

Scrape every episode of any Spotify podcast: titles, full descriptions, publish dates, durations, MP3 preview URLs, cover art, and explicit flags, plus show info and ratings. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/spotify-podcast-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 podcast episodes

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Spotify Podcast Scraper

Spotify Podcast Scraper exports every episode of any [Spotify](https://open.spotify.com/) podcast: titles, full descriptions, publish dates, durations, MP3 preview URLs, cover art, and explicit flags, plus show-level info like publisher, rating, and total episode count.

<table><tr>
<td style="border-left:4px solid #1DB954;padding:12px 16px;font-weight:600">
Paste one Spotify show URL or ID and get the full episode catalog, newest first, with 20 fields per episode. Long shows paginate automatically, and a NEXT_PAGE_ID cursor lets you continue in the next run, so you never re-pay for episodes you already have.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```text
Use Apify Actor parsebird/spotify-podcast-scraper to scrape Spotify podcast episodes. Example with ApifyClient: client.actor("parsebird/spotify-podcast-scraper").call(run_input={"show":"https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk","maxItems":100}). Inputs: show string required (Spotify show URL, spotify:show: URI, or 22-character show ID); maxItems integer default 100, 0 = unlimited; pageId string optional, the NEXT_PAGE_ID value (absolute episode offset) from a previous run's key-value store to resume; proxyConfiguration object default {"useApifyProxy":true}. Output: one dataset row per episode, newest first, with episodeId, url, title, description, htmlDescription, publishDate, durationMs, durationFormatted, audioPreviewUrl, imageUrl, explicit, isPlayable, playabilityReason, mediaTypes, hasVideo, isPaywalled, showName, showId, position, scrapedAt. Key-value store: SHOW_INFO (showId, url, showName, publisher, description, htmlDescription, totalEpisodes, imageUrl, mediaType, explicit, averageRating, totalRatings, topics, showTypes, consumptionOrder, contentType) and NEXT_PAGE_ID (null when the whole show was fetched). Price: $3.99 per 1,000 episodes on the Free plan. API docs: https://docs.apify.com/api/client/python/ and https://docs.apify.com/api/client/js/. Token: https://console.apify.com/account/integrations.
```

### What is Spotify Podcast Scraper?

**Spotify Podcast Scraper** is a Spotify podcast scraper and **Spotify podcast API alternative** that pulls a show's complete episode list as structured data. You don't need a Spotify account, developer app, or API key. Paste a show link such as `https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk` and the actor returns one row per episode.

The easiest way to try it is to open the actor, keep the prefilled Joe Rogan Experience URL, and click **Start**. You'll have 100 episodes in your dataset within seconds.

### What can Spotify Podcast Scraper do?

- 🎙️ **Scrape any public Spotify show** by URL, `spotify:show:` URI, or 22-character show ID. Locale URLs (`/intl-de/show/...`), embed URLs, and `?si=` share links work too.
- 📚 **Export the full episode archive.** Set Max Items to `0` and the actor paginates through the whole show. In our tests it fetched all 2,766 Joe Rogan Experience episodes in one run.
- 🔁 **Resume across runs** with the `NEXT_PAGE_ID` cursor, so you can split a large archive into budget-friendly chunks or collect only new episodes.
- 🧾 **Show-level metadata** saved as `SHOW_INFO`: publisher, description, total episodes, star rating and rating count, topics, and media type.
- 🔊 **30-second MP3 preview URLs** and the highest-resolution cover art for each episode.
- ⏱️ **Stops safely before timeouts and spending limits** and records where it stopped, so you don't lose progress.
- ⏰ Run on a schedule with [Apify schedules](https://docs.apify.com/platform/schedules) to track new episodes daily or weekly.
- 🔌 Use the [Apify API](https://docs.apify.com/api/v2), webhooks, and [integrations](https://apify.com/integrations) (Make, Zapier, Google Sheets, Slack, and more), and export datasets as JSON, CSV, Excel, XML, or HTML.

### What data can you extract from Spotify podcasts?

| Field | Description |
|-------|-------------|
| `episodeId` / `url` | Spotify episode ID and canonical episode URL |
| `title` | Episode title |
| `description` | Full plain-text episode description |
| `htmlDescription` | Episode description as HTML, with links and line breaks preserved |
| `publishDate` | Release date. `YYYY-MM-DD` when Spotify only gives the day, otherwise a full ISO timestamp |
| `durationMs` / `durationFormatted` | Episode length in milliseconds and as `1:23:45` or `42:30` |
| `audioPreviewUrl` | Direct ~30-second MP3 preview clip, when Spotify provides one |
| `imageUrl` | Highest-resolution episode cover art |
| `explicit` | `true` if Spotify marks the episode as explicit |
| `isPlayable` / `playabilityReason` | Whether the episode can be played, and Spotify's reason code |
| `mediaTypes` / `hasVideo` | `AUDIO`, `VIDEO`, or both. `hasVideo` is `true` for video podcasts |
| `isPaywalled` | `true` for paid or subscriber-only episodes |
| `showName` / `showId` | The parent show |
| `position` | Absolute position in the show's episode list (0 = newest) |
| `scrapedAt` | When the row was captured |

The `SHOW_INFO` record in the key-value store contains: `showId`, `url`, `showName`, `publisher`, `description`, `htmlDescription`, `totalEpisodes`, `imageUrl`, `mediaType` (`AUDIO`, `VIDEO`, or `MIXED`), `explicit`, `averageRating`, `totalRatings`, `topics`, `showTypes`, `consumptionOrder` (`EPISODIC` or `SEQUENTIAL`), and `contentType`.

### How to scrape Spotify podcast episodes

1. Open [Spotify Podcast Scraper](https://apify.com/parsebird/spotify-podcast-scraper) and go to the Input tab.
2. Paste a Spotify show URL or 22-character show ID into **Spotify Show URL or ID**. To get it, open the podcast on Spotify, click **Share → Copy link to show**, and paste the link.
3. Set **Max Items** (default 100). Use `0` to get every episode.
4. Leave **Page ID** empty on your first run.
5. Click **Start**. Episodes show up in the **Dataset** tab, newest first. Show metadata is saved to the **Key-value store** as `SHOW_INFO`.
6. To get the next batch, open the Key-value store tab, copy the `NEXT_PAGE_ID` value, and paste it into **Page ID** on your next run. If `NEXT_PAGE_ID` is empty or `null`, you already have the whole show.
7. Export the dataset as JSON, CSV, or Excel, or read it through the [Apify API](https://docs.apify.com/api/v2).

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `show` | string | **Yes** | — | Spotify show URL, `spotify:show:` URI, or 22-character show ID |
| `maxItems` | integer | No | `100` | Maximum episodes to return in this run. `0` = unlimited |
| `pageId` | string | No | — | `NEXT_PAGE_ID` from a previous run, used to resume. Leave empty to start from the newest episode |
| `proxyConfiguration` | object | No | `{"useApifyProxy": true}` | Proxy settings. The default Apify Proxy is enough |

Example input:

```json
{
  "show": "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk",
  "maxItems": 100
}
```

### Output example

One dataset row per episode (descriptions shortened here):

```json
{
  "episodeId": "24C6qd4r0IKDGkytUzYUnM",
  "url": "https://open.spotify.com/episode/24C6qd4r0IKDGkytUzYUnM",
  "title": "#2567 - Mariana van Zeller",
  "description": "Mariana van Zeller is a Peabody and Emmy Award-winning journalist whose credits include \"Trafficked with Mariana van Zeller,\" \"The OxyContin Express,\" and \"Insi...",
  "htmlDescription": "<p>Mariana van Zeller is a Peabody and Emmy Award-winning journalist whose credits include...",
  "publishDate": "2026-10-16T17:00:00Z",
  "durationMs": 8657854,
  "durationFormatted": "2:24:18",
  "audioPreviewUrl": "https://p.scdn.co/mp3-preview/c1e8996f1edecafc9bd636f95507f005d66d053e.mp3",
  "imageUrl": "https://i.scdn.co/image/ab6765630000ba8a11c7c3e1f347d56a883f02f9",
  "explicit": true,
  "isPlayable": true,
  "playabilityReason": "PLAYABLE",
  "mediaTypes": ["VIDEO", "AUDIO"],
  "hasVideo": true,
  "isPaywalled": false,
  "showName": "The Joe Rogan Experience",
  "showId": "4rOoJ6Egrf8K2IrywzwOMk",
  "position": 0,
  "scrapedAt": "2026-10-18T02:56:08.787Z"
}
```

`SHOW_INFO` in the key-value store:

```json
{
  "showId": "4rOoJ6Egrf8K2IrywzwOMk",
  "url": "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk",
  "showName": "The Joe Rogan Experience",
  "publisher": "Joe Rogan",
  "description": "The official podcast of comedian Joe Rogan.",
  "htmlDescription": "<p>The official podcast of comedian Joe Rogan.</p>",
  "totalEpisodes": 2766,
  "imageUrl": "https://i.scdn.co/image/ab6765630000ba8a8007f4df0a76e787cb94308a",
  "mediaType": "MIXED",
  "explicit": true,
  "averageRating": 4.65,
  "totalRatings": 955472,
  "topics": ["Comedy"],
  "showTypes": ["SHOW_TYPE_EXCLUSIVE"],
  "consumptionOrder": "EPISODIC",
  "contentType": "CONTENT_TYPE_PODCAST"
}
```

You can download the dataset in JSON, CSV, Excel, XML, or HTML from the run's Storage tab.

### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("parsebird/spotify-podcast-scraper").call(run_input={
    "show": "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk",
    "maxItems": 100,
})

for episode in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(episode["publishDate"], episode["durationFormatted"], episode["title"])

store = client.key_value_store(run["defaultKeyValueStoreId"])
show_info = store.get_record("SHOW_INFO")["value"]
next_page = store.get_record("NEXT_PAGE_ID")
print(show_info["showName"], show_info["totalEpisodes"], next_page and next_page["value"])
```

### JavaScript API example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('parsebird/spotify-podcast-scraper').call({
    show: 'https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk',
    maxItems: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((e) => `${e.publishDate} ${e.title}`));

const store = client.keyValueStore(run.defaultKeyValueStoreId);
const showInfo = await store.getRecord('SHOW_INFO');
console.log(showInfo.value.showName, showInfo.value.totalEpisodes);
```

See Apify's [Python client](https://docs.apify.com/api/client/python/) and [JavaScript client](https://docs.apify.com/api/client/js/) docs for more options.

### Use cases

- **Podcast research and analytics.** Load a full episode catalog into a spreadsheet to study release cadence, episode length, and topics.
- **Competitor analysis.** Compare podcasts by total episodes, average duration, publishing frequency, star rating, and rating count.
- **Content discovery and search.** Build a searchable index of episode titles and descriptions for a show or a whole category.
- **New-episode monitoring.** Schedule a daily run with a small Max Items to get notified when a show publishes something new.
- **Guest and sponsor research.** Find guest names in episode titles and sponsor links in descriptions for outreach or ad-market research.
- **Archiving.** Save episode metadata, preview clips, and cover art before a show is removed from Spotify.

### How it works

1. The actor reads your show URL or ID and checks that it's valid.
2. It loads the show's public metadata from Spotify's web player data, the same data [open.spotify.com](https://open.spotify.com/) shows to logged-out visitors, and saves it as `SHOW_INFO`.
3. It requests episodes in pages of up to 100, starting at the newest episode or at your `pageId` offset, and pushes each page to the dataset.
4. It stops when it reaches Max Items, the end of the show, your spending limit, or about 60 seconds before the run timeout. Then it writes `NEXT_PAGE_ID` so the next run can continue from that point.

### How much does it cost to scrape Spotify podcasts?

**What is the price per Spotify podcast episode?**

| Plan | Price per episode | Price per 1,000 episodes |
|------|-------------------|--------------------------|
| Free | $0.00399 | **$3.99** |
| Bronze | $0.00349 | **$3.49** |
| Silver | $0.00299 | **$2.99** |
| Gold | $0.00249 | **$2.49** |

You pay one `episode-scraped` event for each episode saved to the dataset. Compute and proxy usage are included in the event price. Fetching show metadata (`SHOW_INFO`) is free. For example, the prefilled run (100 episodes) costs $0.40 on the Free plan, and a complete 2,766-episode Joe Rogan Experience archive costs about $11.04 on Free or $6.89 on Gold.

**How do I cap my spend?**

Set a maximum cost per run in the run options. The actor stops at that limit, only charges for the episodes it saved, and writes `NEXT_PAGE_ID` so you can continue later.

### Is it legal to scrape Spotify podcasts?

**Is scraping Spotify legal?**

Spotify Podcast Scraper only collects publicly available podcast metadata that anyone can see on open.spotify.com without logging in. It does not access accounts, private data, or full episode audio. Scraping publicly available data is generally allowed in many jurisdictions, but you should review [Spotify's Terms of Use](https://www.spotify.com/legal/end-user-agreement/) and make sure your use case complies with applicable laws, especially if you republish content. For more background, read Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other podcast and music scrapers / Related Actors

| Actor | Best for |
|-------|----------|
| [Apple Podcasts Scraper](https://apify.com/parsebird/apple-podcasts-scraper) | Apple Podcasts episodes by search, iTunes ID, or RSS feed, including full audio URLs |
| [Podcast Directory Scraper](https://apify.com/parsebird/podcast-directory-scraper) | Finding podcasts on Apple Podcasts and Spotify, with host contact emails and websites from RSS feeds |
| [Spotify Play Count Scraper](https://apify.com/parsebird/spotify-play-count-scraper) | Exact Spotify stream counts, monthly listeners, and discographies for artists, albums, and tracks |
| [YouTube Transcript Scraper](https://apify.com/parsebird/youtube-transcript-scraper) | Transcripts of video podcasts published on YouTube |
| [SoundCloud Scraper](https://apify.com/parsebird/soundcloud-scraper) | SoundCloud tracks, playlists, and artist profiles with play and like counts |

### FAQ

**Do I need a Spotify account or API key?**

No. The actor works without logging in, without a Spotify developer app, and without any Spotify credentials.

**Can I scrape multiple podcasts in one run?**

One show per run. This keeps each show's dataset, `SHOW_INFO`, and `NEXT_PAGE_ID` cursor separate. To scrape many shows, call the actor once per show through the [API](https://docs.apify.com/api/v2) or set up an [Apify task](https://docs.apify.com/platform/actors/running/tasks) for each one.

**What order are episodes returned in?**

Spotify's default order, newest first. `position` 0 is the most recent episode.

**How does pagination work?**

`NEXT_PAGE_ID` is the absolute offset of the next episode to fetch. For example, `100` after a 100-episode first run. Paste it into Page ID to continue from there. When the actor reaches the end of the show, `NEXT_PAGE_ID` is empty or `null`.

**Can I download full podcast episodes?**

No. Spotify only gives logged-out visitors a ~30-second MP3 preview (`audioPreviewUrl`). Full audio requires a logged-in Spotify session, which this actor doesn't use. If you need full audio files for shows that also publish RSS feeds, use [Apple Podcasts Scraper](https://apify.com/parsebird/apple-podcasts-scraper).

**Why is audioPreviewUrl null for some episodes?**

Spotify doesn't provide a preview clip for every episode. In our full run of the Joe Rogan Experience, 2 of 2,766 episodes had no preview.

**What happens with geo-restricted or unavailable episodes?**

The episode still gets a row with `episodeId`, `url`, and `position`, so your index stays complete. Spotify doesn't return its metadata, so those fields are `null` and `isPlayable` is `false`.

**Does it return episode play counts or listener numbers?**

No. Spotify doesn't show play counts for podcast episodes publicly. The show's star rating (`averageRating`) and number of ratings (`totalRatings`) are in `SHOW_INFO`.

**Can I use Spotify Podcast Scraper as a Spotify podcast API?**

Yes. Start runs and read the results through the Apify API, the Python or JavaScript clients, webhooks, or [integrations](https://apify.com/integrations).

**Where can I report issues or request fields?**

Open the Issues tab on the actor page and include the show URL, run ID, and what you expected.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/spotify-podcast-scraper/changelog.md

# Actor input Schema

## `show` (type: `string`):

Either the full Spotify show URL (e.g. 'https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk') or the 22-character base62 show ID (e.g. '4rOoJ6Egrf8K2IrywzwOMk'). The ID will be extracted automatically.

## `maxItems` (type: `integer`):

Maximum episodes to return in this run. Set 0 for unlimited. The actor will auto-paginate within the run until done or the run is about to time out.

## `pageId` (type: `string`):

Paste NEXT_PAGE_ID from the previous run's Key-value store to resume from where the last run stopped. Leave empty to start from the most recent episode.

## `proxyConfiguration` (type: `object`):

Proxy for the Spotify requests. The default Apify Proxy works; residential proxies are not needed.

## Actor input object example

```json
{
  "show": "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `showInfo` (type: `string`):

No description

## `nextPageId` (type: `string`):

No description

# 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 = {
    "show": "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk",
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/spotify-podcast-scraper").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 = {
    "show": "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk",
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/spotify-podcast-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "show": "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/spotify-podcast-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/spotify-podcast-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/AKbfX5gh4Bho4qYWB/builds/rHvCOgpCif6puubSR/openapi.json
