# Podcast Episodes Scraper (`deriverge/podcast-episodes-scraper`) Actor

Episodes of any podcast from its RSS feed or Apple Podcasts link, with release time, length in seconds, season and episode number, audio URL and the show notes as text. Read whole archives, filter by date or keyword, or schedule it to get only new episodes.

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

## Pricing

from $0.25 / 1,000 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

## Podcast Episodes Scraper

Podcast Episodes Scraper returns the episodes of the podcasts you list, read from each show's RSS feed, one row per episode: title, release time, length in seconds, season and episode number where the feed has them, the audio file URL with its type and size, and the show notes as text. Paste Apple Podcasts links, Apple IDs or feed URLs and click **Start**. A feed holds only what its publisher keeps in it: on 11 October 2026 the feed of The Daily had 66 episodes. It costs $0.50 per 1,000 episodes on the Free plan ($0.25 on Business), and the $5 of monthly credit in Apify's Free plan covers about 10,000 episodes.

### What data does it return?

| Field | Description |
|---|---|
| `title`, `publishedAt` | Episode title and release time from the feed, ISO 8601 in UTC. |
| `durationSeconds` | Length in seconds, converted from whatever format the feed uses, such as `2337`. |
| `episodeNumber`, `seasonNumber`, `episodeType` | Episode and season number when the feed declares them, and `full`, `bonus` or `trailer`. |
| `audioUrl`, `audioType`, `audioBytes` | Link to the audio file, its type such as `audio/mpeg`, and its size in bytes when the feed states it. |
| `summary`, `content` | Show notes as plain text. `summary` is the episode description, cut at 300 characters unless **Full show notes** is on. With it on, `content` holds the full notes, which many feeds publish in a longer form with links; otherwise `content` is `null`. |
| `link`, `image` | The episode's web page and its artwork, or the show's artwork when the episode has none. |
| `author`, `explicit` | Author of the episode or show, such as `The New York Times`, and the explicit flag. |
| `categories` | Categories the feed gives the episode itself. Rarely filled. |
| `podcastName`, `podcastAppleId`, `podcastKey`, `feedUrl` | The show: its name, Apple Podcasts ID (`null` for a feed given directly), key and RSS feed. |
| `guid`, `key` | The episode's ID in the feed, and the row key `episode:<podcastKey>:<guid>` that new-only mode compares. |
| `appleUrl`, `episodeSource` | `rss` for an episode read from the feed. `apple` marks an episode taken from the Apple directory, which also has its `appleUrl`. |

### How to scrape podcast episodes

1. In **Podcasts**, add one show per line in any of three forms: an Apple Podcasts link such as `https://podcasts.apple.com/us/podcast/the-daily/id1200361736`, the number alone (`1200361736`), or an RSS feed URL such as `https://feeds.npr.org/510289/podcast.xml`.
2. Set **Maximum episodes per podcast**. Episodes are taken newest first, 100 by default.
3. To narrow the episodes, set **Episodes published after** (`YYYY-MM-DD`) or **Episode keywords (any of)**.
4. Turn on **Full show notes** if you need the complete notes, links and timestamps included, and click **Start**.
5. The episodes appear in the **Output** tab, from where you can export them as CSV, Excel or JSON. The `SUMMARY` record in the key-value store counts the episodes found and lists feeds that could not be read.

For an API call:

```json
{
  "podcasts": [
    "https://podcasts.apple.com/us/podcast/huberman-lab/id1545953110",
    "https://feeds.npr.org/510289/podcast.xml"
  ],
  "maxEpisodesPerPodcast": 1000,
  "episodesPublishedAfter": "2025-01-01",
  "includeContent": true
}
```

### Example output

The newest episode of The Daily in a run on 11 October 2026, with **Full show notes** off, so `summary` ends after 300 characters and `content` is `null`.

```json
{
  "type": "episode",
  "key": "episode:podcast:1200361736:9ccd9014-ddf7-4970-91f6-8bd9073646cb",
  "podcastKey": "podcast:1200361736",
  "podcastAppleId": "1200361736",
  "podcastName": "The Daily",
  "feedTitle": "The Daily",
  "feedUrl": "https://feeds.simplecast.com/Sl5CSM3S",
  "title": "Celine Dion’s Triumphant Return to the Stage",
  "link": "https://www.nytimes.com/the-daily",
  "appleUrl": null,
  "publishedAt": "2026-10-11T10:00:00.000Z",
  "durationSeconds": 2337,
  "episodeNumber": null,
  "seasonNumber": null,
  "episodeType": "full",
  "explicit": false,
  "author": "The New York Times",
  "summary": "A dramatic pop music comeback story is underway: Celine Dion is performing again.\nIn 2022, Dion, the renowned Canadian singer, announced that she had stiff person syndrome, a rare and incurable neurological disorder that causes painful muscle spasms and affects roughly one in a million people. Th...",
  "content": null,
  "categories": [],
  "image": "https://image.simplecastcdn.com/images/b8eb8df8-42ff-4c4a-ae8b-29af83f5fd23/3ec4dc1d-4c3b-476b-a5cd-076c32d53b2c/3000x3000/cropped_1791570210682.jpg?aid=rss_feed",
  "audioUrl": "https://dts.podtrac.com/redirect.mp3/pdst.fm/e/pfx.vpixl.com/6qj4J/pscrb.fm/rss/p/nyt.simplecastaudio.com/03d8b493-87fc-4bd1-931f-8a8e9b945d8a/episodes/dafc2cef-4446-423b-b47d-8df99312ac06/audio/128/default.mp3?aid=rss_feed&awCollectionId=03d8b493-87fc-4bd1-931f-8a8e9b945d8a&awEpisodeId=dafc2cef-4446-423b-b47d-8df99312ac06&feed=Sl5CSM3S",
  "audioType": "audio/mpeg",
  "audioBytes": 37393668,
  "guid": "9ccd9014-ddf7-4970-91f6-8bd9073646cb",
  "episodeSource": "rss"
}
```

### How much does it cost to scrape podcast episodes?

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 episodes | $0.50 | $0.40 | $0.325 | $0.25 |

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

Five shows with 2,486 episodes between them, the whole feed of four and the newest 1,000 of The Joe Rogan Experience, cost $1.243 on the Free plan and $0.6215 on Business, with full show notes at the same price. Episodes removed by the date or keyword filter and episodes a watch has already returned are not charged.

### Limits

- How far back a show goes depends on its feed. In the run above, Huberman Lab's feed had all 448 episodes since December 2020, Call Her Daddy's 617 since 2018 and Planet Money's 355 since June 2023, while The Joe Rogan Experience reached the cap of 1,000.
- Numbers and sizes are only as complete as the feed: Call Her Daddy numbered 614 of 617 episodes, The Daily and Planet Money none. `audioBytes` was filled for 1,037 of the 2,486 episodes, and `categories` for none.
- When a show has no public feed, or its feed cannot be read, episodes come from the Apple directory instead. That source gives at most the latest 200 episodes and no episode numbers, seasons or file sizes, and the rows say `episodeSource: "apple"`. A feed URL without an Apple ID has no such fallback: it is listed under `feedsFailed` in `SUMMARY` and adds no rows.
- The keyword filter, **Episode keywords (any of)**, matches whole words and phrases, ignoring case, and looks through the whole show notes even when only 300 characters are returned. `sleep` kept 130 of the 187 Huberman Lab episodes released since January 2025, most of them without the word in the title.
- Audio files are not downloaded. Many `audioUrl` links pass through the publisher's measurement redirects before reaching the file, as in the example.
- The run is quick: the five shows above, 2,486 episodes with full notes, took 6 seconds.

### New episode alerts

Turn on **Return only rows new since the last run**, add a **Watch name** or save the input as a task, and schedule a daily run. Each run returns and charges only episodes whose `key` no earlier run of the watch returned, and episodes held back by **Maximum rows** come in the next run. Republishing an episode under a new `guid` makes it new to the watch.

### FAQ

#### Is it legal to scrape podcast episodes?

Publishers put their RSS feeds online so that any podcast app can list and play the episodes, and the actor reads those feeds and Apple's public directory without an account. It returns episode metadata, show notes and links to the audio; it does not download or store audio, and it collects nothing about listeners. Show notes belong to their publishers, so you are responsible for how you reuse them.

#### Can I use a feed that is not on Apple Podcasts?

Yes. Any RSS or Atom feed URL works on its own, and its episodes come without an Apple ID. For an Apple link or ID, the actor finds the feed through Apple's lookup with the **Storefront** you set, `us` by default.

#### How do I get transcripts?

The actor does not transcribe audio. Pass the `audioUrl` values to a speech-to-text service, or check `content` with **Full show notes** on, since some publishers put a transcript link there.

### Related scrapers

- [Apple Podcasts Scraper](https://apify.com/deriverge/apple-podcasts-scraper)
- [Apple Podcast Charts Scraper](https://apify.com/deriverge/podcast-charts-scraper)
- [RSS Feed Scraper](https://apify.com/deriverge/rss-feed-scraper)

### Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the **Issues** tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the **API** tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.

# Changelog

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

# Actor input Schema

## `podcasts` (type: `array`):

Apple Podcasts links, numeric Apple IDs or RSS feed URLs, in any mix, for example https://podcasts.apple.com/us/podcast/the-daily/id1200361736 or https://feeds.npr.org/510289/podcast.xml.

## `country` (type: `string`):

Two-letter storefront used to resolve Apple links and IDs, for example us, gb, de.

## `maxEpisodesPerPodcast` (type: `integer`):

Newest first. Podcast feeds carry the whole archive, so this is what keeps a broad run affordable.

## `episodesPublishedAfter` (type: `string`):

Drop episodes older than this date (YYYY-MM-DD). Episodes without a date are kept. Dropped episodes are never charged.

## `keywords` (type: `array`):

Keep only episodes whose title, show notes or categories contain at least one of these words or phrases as whole words, case-insensitive. Dropped episodes are never charged.

## `includeContent` (type: `boolean`):

Return the complete show notes as plain text in the content field. Otherwise summary holds the first 300 characters and content is null.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only episodes that were not there before. Schedule it daily and you have a new-episode alert that bills only for what is new.

## `watchName` (type: `string`):

Name of the snapshot used by the new-only mode, for example "true-crime-us". Runs from a saved task get a snapshot automatically even without a name.

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

Hard cap on returned episodes across all podcasts in the run.

## Actor input object example

```json
{
  "podcasts": [
    "https://podcasts.apple.com/us/podcast/the-daily/id1200361736"
  ],
  "country": "us",
  "maxEpisodesPerPodcast": 100,
  "includeContent": false,
  "newOnly": false,
  "maxItems": 5000
}
```

# Actor output Schema

## `rows` (type: `string`):

One row per episode with title, date, duration in seconds, episode and season numbers, audio URL and type, and show notes as plain text.

## `changes` (type: `string`):

Episodes that appeared or disappeared compared with the previous snapshot of the same watch name or task.

## `summary` (type: `string`):

Counts per source, how many rows each filter dropped, feeds that could not be read and notes.

# 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 = {
    "podcasts": [
        "https://podcasts.apple.com/us/podcast/the-daily/id1200361736"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/podcast-episodes-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 = { "podcasts": ["https://podcasts.apple.com/us/podcast/the-daily/id1200361736"] }

# Run the Actor and wait for it to finish
run = client.actor("deriverge/podcast-episodes-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 '{
  "podcasts": [
    "https://podcasts.apple.com/us/podcast/the-daily/id1200361736"
  ]
}' |
apify call deriverge/podcast-episodes-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deriverge/podcast-episodes-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/fuTrSgg5sVxu5IPX5/builds/oafuCJda7oh328AzX/openapi.json
