# Spotify Podcast Scraper: Episodes, Shows & Search (`eduair94/spotify-podcast-scraper`) Actor

Export Spotify podcast episodes and show data: titles, descriptions, release dates, durations, explicit flags, languages and publisher. Paste show links or search podcasts by keyword.

- **URL**: https://apify.com/eduair94/spotify-podcast-scraper.md
- **Developed by:** [Eduardo Airaudo](https://apify.com/eduair94) (community)
- **Categories:** Social media, News, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 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 episodes and show data, as clean rows: every episode's title, description, release date, duration and explicit flag, and every show's publisher, description, episode count and languages. Paste show links, show names or episode links, or search podcasts by keyword, and export the results to JSON, CSV or Excel. No Spotify account and no API key.

> Unofficial; not affiliated with Spotify. This Actor reads the public podcast information Spotify shows on show and episode pages. It downloads no audio and no transcripts.

### What does Spotify Podcast Scraper do?

For every show you enter or find by keyword, Spotify Podcast Scraper returns:

- **One show row** (`rowType` `show`): the show's name, `publisher`, `description`, `totalEpisodes`, `languages`, `mediaType` (audio, video or mixed), `explicit`, cover art (`imageUrl`) and Spotify link (`url`).
- **Its episodes** (`rowType` `episode`), newest first, up to **Max episodes per show**: title (`name`), `description`, `releaseDate`, `durationMs`, `explicit`, `languages`, Spotify's short audio preview link (`previewUrl`), cover art and link, plus the show they belong to (`showId`, `showName`).

Episode links return just that episode, with its show. Shows and episodes use the same columns, so one CSV holds both: filter by `rowType`.

### How to scrape Spotify podcast episodes

1. Paste your shows into **Shows or episodes**, one per line: Spotify show links, `spotify:show:` URIs, 22-character show IDs, show names (for example `The Joe Rogan Experience`) or episode links.
2. Set **Max episodes per show** (default 50; up to 10,000 for a whole back catalog; 0 for show rows only).
3. Click **Start** and open the **Shows and episodes** view in the Output tab, or download the rows as JSON, CSV, Excel or HTML.

A show name is looked up with Spotify's podcast search, and only a show whose name matches it is used (case, accents and punctuation aside). `matchedName` shows the show it matched. A name that matches no show is not charged; use the show's link for an exact match.

### Search Spotify podcasts by keyword

Put keywords in **Search terms** (`searchTerms`), one per line, as you would type them in Spotify (for example `true crime`, `startup`, `history`). Each term adds the first shows Spotify finds, in Spotify's order, up to **Max shows per search** (`maxShowsPerSearch`, default 10). Every show found gets its show row and its episodes, and says which term found it (`searchTerm`) and where it ranked (`searchRank`). A show found by two terms, or also entered as a link, is fetched and charged once.

### Get new episodes on a schedule

Set **Only episodes released since** (`sinceDate`) to an age such as `7 days` and schedule the Actor weekly in Apify: every run returns only the episodes released in the last week, so you never pay twice for the same back catalog. A fixed date such as `2026-10-01` works too. Spotify lists episodes newest first, so the Actor stops reading a show as soon as it reaches older episodes. A show with nothing new still gets its show row and is named in `showsWithoutNewEpisodes` in the run summary. Episode links you enter are always returned.

### Input

| Field | What it does | Default |
| --- | --- | --- |
| `shows` | Show links (open.spotify.com/show/…, spotify.link short links too), `spotify:show:` URIs, show IDs, show names or episode links, one per line. A bare ID is read as a show; enter episodes as links or `spotify:episode:` URIs. | none |
| `searchTerms` | Keywords that find podcasts, one per line. | none |
| `maxShowsPerSearch` | Shows each search term adds, in Spotify's order (1-100). | 10 |
| `maxEpisodesPerShow` | Episodes per show, newest first (0-10,000; 0 = show rows only). | 50 |
| `sinceDate` | Only episodes released on or after this day: `2026-10-01`, or an age such as `7 days`, `2 weeks`, `1 month`, `1 year`. | none |
| `market` | Two-letter country code: Spotify offers some shows and episodes only in some countries, and ranks search results per country. | US |

Fill in `shows`, `searchTerms` or both. Example input:

```json
{
    "shows": [
        "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk",
        "Crime Junkie"
    ],
    "searchTerms": ["true crime"],
    "maxShowsPerSearch": 2,
    "maxEpisodesPerShow": 10,
    "sinceDate": "30 days"
}
```

### Output

A show row (The Joe Rogan Experience on 2026-11-01):

```json
{
    "rowType": "show",
    "id": "4rOoJ6Egrf8K2IrywzwOMk",
    "showId": "4rOoJ6Egrf8K2IrywzwOMk",
    "showName": "The Joe Rogan Experience",
    "name": "The Joe Rogan Experience",
    "publisher": "Joe Rogan",
    "description": "The official podcast of comedian Joe Rogan.",
    "releaseDate": null,
    "durationMs": null,
    "explicit": true,
    "languages": ["en"],
    "mediaType": "mixed",
    "totalEpisodes": 2774,
    "previewUrl": null,
    "imageUrl": "https://i.scdn.co/image/ab6765630000ba8ae7c95712f4940a9bf439467e",
    "url": "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk",
    "input": "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk",
    "resolvedFrom": "url",
    "matchedName": null,
    "searchTerm": null,
    "searchRank": null,
    "scrapedAt": "2026-11-01T20:10:43.152Z"
}
```

One of its episode rows:

```json
{
    "rowType": "episode",
    "id": "3Lz9d1PXPIJA7yisUsrF6p",
    "showId": "4rOoJ6Egrf8K2IrywzwOMk",
    "showName": "The Joe Rogan Experience",
    "name": "#2574 - Francis Foster & Konstantin Kisin",
    "publisher": "Joe Rogan",
    "description": "Comedian Francis Foster and political commentator Konstantin Kisin host the \"TRIGGERnometry\" podcast. …",
    "releaseDate": "2026-10-31",
    "durationMs": 9494953,
    "explicit": true,
    "languages": ["en"],
    "mediaType": null,
    "totalEpisodes": null,
    "previewUrl": "https://p.scdn.co/mp3-preview/7725a14a06b2a632a9f4bbac2496db8761589c77.mp3",
    "imageUrl": "https://i.scdn.co/image/ab6765630000ba8aa00b583dd65ecf56393e28a1",
    "url": "https://open.spotify.com/episode/3Lz9d1PXPIJA7yisUsrF6p",
    "input": "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk",
    "resolvedFrom": "url",
    "matchedName": null,
    "searchTerm": null,
    "searchRank": null,
    "scrapedAt": "2026-11-01T20:10:43.158Z"
}
```

| Field | Meaning |
| --- | --- |
| `rowType` | `show` or `episode`. |
| `id`, `name`, `url` | The show's or episode's Spotify ID, name (episode title) and page. |
| `showId`, `showName` | The show: the row itself on a show row, the show the episode belongs to on an episode row. |
| `publisher` | Who publishes the show. |
| `description` | The description as plain text, at most 2,000 characters. |
| `releaseDate`, `durationMs` | Episode rows: release day (YYYY-MM-DD) and length in milliseconds. |
| `explicit`, `languages` | Spotify's explicit flag and language codes. |
| `mediaType`, `totalEpisodes` | Show rows: audio, video or mixed, and how many episodes the show has in the market. |
| `previewUrl`, `imageUrl` | Episode rows: Spotify's short audio preview link, when there is one; the cover art. |
| `input`, `resolvedFrom`, `matchedName` | The line you entered (or the search term); how it named the show (`url`, `uri`, `id`, `short_link`, `search` for a show name, `search_term` for a keyword hit); for a show name, the show it matched. |
| `searchTerm`, `searchRank` | The search term that found the show and its place in Spotify's results (on its episodes too). |
| `scrapedAt` | When the row was read. |

The Output tab has three views: **Shows and episodes**, **Shows** and **Episodes**. The run's key-value store also holds `RUN_SUMMARY` (counts, events charged, warnings) and, when an input failed, `ERRORS`.

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

You pay per row delivered: one price per show row and a lower one per episode row. Your price follows your Apify plan:

| Apify plan | Per show | Per 1,000 shows | Per episode | Per 1,000 episodes |
| --- | --- | --- | --- | --- |
| Free | $0.002 | $2.00 | $0.0008 | $0.80 |
| Bronze | $0.0018 | $1.80 | $0.0007 | $0.70 |
| Silver | $0.0016 | $1.60 | $0.0006 | $0.60 |
| Gold, Platinum and Diamond | $0.0014 | $1.40 | $0.0005 | $0.50 |

Each run also has Apify's start fee of $0.00005 (5 thousandths of a cent), and Apify covers the first 5 seconds of every run's compute. There is no monthly rental and no charge for platform usage.

| Example (Free plan) | Rows | Cost |
| --- | --- | --- |
| The prefilled input (3 shows, 10 episodes each) | 3 shows + up to 30 episodes | up to $0.03 + $0.00005 start |
| One show with its newest 50 episodes | 1 show + 50 episodes | $0.042 |
| 100 shows with their newest 50 episodes | 100 shows + 5,000 episodes | $4.20 |
| A weekly schedule of 20 shows, `sinceDate` 7 days (about 1 new episode each) | 20 shows + 20 episodes a week | about $0.056 a week |

Never charged: search hits themselves (you pay for the show rows they deliver), unknown shows and episodes, names that match no show, searches without results, links to tracks or albums, broken IDs, repeats, episodes Spotify does not offer in the market and episodes older than **Only episodes released since**. Set a maximum cost per run and the Actor stops at that amount without going over: shows come first, then as many episodes as the rest of the budget pays for.

### FAQ

#### Does it download audio or transcripts?

No. It returns the information Spotify publishes about shows and episodes, plus Spotify's own short preview link (`previewUrl`) when Spotify offers one. It never downloads, stores or transcribes episode audio.

#### How many episodes can I get per show?

Up to 10,000, newest first: set **Max episodes per show**. Spotify pages episodes 50 at a time, so a 2,000-episode back catalog takes about 40 requests and a minute or two.

#### Why do some shows have fewer episodes than I asked for?

Spotify offers some episodes only in some countries; those are skipped (and not charged) in the market you chose, and a show whose newest episodes are all unavailable there is named in the warnings of the run summary. Try another `market`. Shows with fewer episodes than **Max episodes per show** return all they have.

#### Why is `previewUrl` empty?

Spotify publishes no preview for some episodes (often video episodes or exclusive ones).

#### Can I mix links, IDs, names and search terms?

Yes. Links and IDs are fetched directly; show names are looked up with Spotify's podcast search first; search terms add the shows Spotify finds. `resolvedFrom` tells you how each show was found.

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

No. You only need an Apify account. The Actor never uses your Spotify login.

#### Is it legal to scrape Spotify podcasts?

The Actor reads public information that Spotify shows to every visitor of a show or episode page, and returns no personal data about listeners. Check that your use of the data complies with Spotify's terms and the laws that apply to you.

### Use it from the Apify API or MCP

Start a run, wait for it and get the rows in one call (synchronous calls wait up to 5 minutes):

```bash
curl -X POST "https://api.apify.com/v2/acts/eduair94~spotify-podcast-scraper/run-sync-get-dataset-items?maxTotalChargeUsd=1" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"shows": ["https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk"], "maxEpisodesPerShow": 20, "sinceDate": "30 days"}'
```

JavaScript, with the `apify-client` package:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('eduair94/spotify-podcast-scraper').call({
    searchTerms: ['true crime'],
    maxShowsPerSearch: 5,
    maxEpisodesPerShow: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const row of items.filter((item) => item.rowType === 'episode')) console.log(row.showName, row.releaseDate, row.name);
```

Python, with the `apify-client` package:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("eduair94/spotify-podcast-scraper").call(
    run_input={"shows": ["https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk"], "sinceDate": "7 days"}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["rowType"], row["name"], row.get("releaseDate"))
```

AI agents can call it too: add the Actor to Apify's MCP server and ask for a show's latest episodes in plain language.

### Use cases

- **Podcast research**: compare the shows of a niche by episode count, release rhythm, episode length and languages.
- **Guest booking and PR**: search a topic, read every show's latest episode titles and descriptions, and find who covers it.
- **Podcast ad sales**: build lists of active shows by keyword and market, with publisher and release frequency.
- **Media monitoring**: a weekly schedule with `sinceDate` delivers only the new episodes of the shows you follow.
- **Content and SEO teams**: export a full back catalog of titles and descriptions for analysis.

### Related Spotify scrapers

- [Spotify Scraper: Play Counts, Monthly Listeners & Playlists](https://apify.com/eduair94/spotify-scraper): tracks, albums, playlists, charts and artists from any link or keyword.
- [Spotify Play Count Scraper](https://apify.com/eduair94/spotify-play-count-scraper): stream counts for every track of an artist's discography, an album or a playlist.
- [Spotify Monthly Listeners Scraper](https://apify.com/eduair94/spotify-monthly-listeners-scraper): monthly listeners, followers, world rank and top cities for artist rosters.
- [Spotify Playlist Scraper](https://apify.com/eduair94/spotify-playlist-scraper): whole playlists with every track's play count, priced per playlist, with change tracking.
- [Spotify Artist Scraper](https://apify.com/eduair94/spotify-artist-scraper): full artist profiles with biography, social links, top tracks and related artists.
- [Spotify Charts Scraper](https://apify.com/eduair94/spotify-charts-scraper): Top 200, top artists and top albums by country, daily or weekly, with streams.
- [Spotify Related Artists Scraper](https://apify.com/eduair94/spotify-related-artists-scraper): "Fans also like" lists with each related artist's monthly listeners, followers and world rank, up to two levels deep.

# Actor input Schema

## `shows` (type: `array`):

One per line: an open.spotify.com/show/ link (spotify.link short links work too), a spotify:show: URI, a 22-character show ID, or a show name such as The Joe Rogan Experience; or an open.spotify.com/episode/ link or spotify:episode: URI for a single episode. A name is looked up with Spotify's podcast search and only a show named like it is used (`matchedName` says which). The same show or episode entered twice is fetched and charged once.

## `searchTerms` (type: `array`):

Keywords that find podcasts, one per line, as in Spotify's search box (for example true crime, startup, history). Each term adds the first shows Spotify finds, in Spotify's order; `searchTerm` and `searchRank` say which term found a show and where it ranked.

## `maxShowsPerSearch` (type: `integer`):

How many shows each search term adds, in Spotify's order (up to 100). Every show found is one show row, plus its episodes.

## `maxEpisodesPerShow` (type: `integer`):

How many of each show's episodes to return, newest first (up to 10,000; raise it to export a whole back catalog). 0 returns only the show rows. Episodes Spotify does not offer in the market are skipped and not charged.

## `sinceDate` (type: `string`):

Only episodes released on or after this day: a date (2026-10-01) or an age counted back from the run's day (7 days, 2 weeks, 1 month, 1 year). Ideal for a schedule: a weekly run with 7 days returns only the new episodes. Episode links you enter are always returned. Leave empty for no limit.

## `market` (type: `string`):

Two-letter country code (US, GB, DE, BR, MX…): Spotify offers some shows and episodes only in some countries, and ranks search results per country.

## Actor input object example

```json
{
  "shows": [
    "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk"
  ],
  "searchTerms": [
    "true crime"
  ],
  "maxShowsPerSearch": 2,
  "maxEpisodesPerShow": 10,
  "market": "US"
}
```

# Actor output Schema

## `results` (type: `string`):

Every show of this run with its publisher, description and episode count, and its episodes with release date, duration and description.

## `resultsCsv` (type: `string`):

The same rows as CSV for spreadsheets. Filter by rowType to split shows from episodes.

## `runSummary` (type: `string`):

Shows and episodes delivered, the events charged, search hits, repeats, failed inputs, warnings and the run outcome.

## `errors` (type: `string`):

Each show, episode or search term that delivered nothing, with the reason; written only when an input failed. Never charged.

# 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 = {
    "shows": [
        "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk"
    ],
    "searchTerms": [
        "true crime"
    ],
    "maxShowsPerSearch": 2,
    "maxEpisodesPerShow": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("eduair94/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 = {
    "shows": ["https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk"],
    "searchTerms": ["true crime"],
    "maxShowsPerSearch": 2,
    "maxEpisodesPerShow": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("eduair94/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 '{
  "shows": [
    "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk"
  ],
  "searchTerms": [
    "true crime"
  ],
  "maxShowsPerSearch": 2,
  "maxEpisodesPerShow": 10
}' |
apify call eduair94/spotify-podcast-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,eduair94/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/ElrUHOFY4XoFYFkkJ/builds/0Ox4HxCRwyhNOxjt1/openapi.json
