# Podcast Episodes Scraper - RSS Feeds & Apple Podcasts (`onescriptfix/podcast-episodes-scraper`) Actor

Export podcast episodes from Apple Podcasts links or any public RSS feed: titles, publish dates, durations, audio links, episode numbers and clean descriptions. Filter by date and cap the episodes per show.

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

## Pricing

from $1.20 / 1,000 results

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 - RSS Feeds and Apple Podcasts

Turn podcasts into a clean episode table. Paste Apple Podcasts links or IDs, or RSS feed URLs, and get every episode's
title, publish date, duration, audio file link, episode page, season and episode numbers, explicit flag and a
plain-text description, plus the show's details on each row.

Handy for tracking new episodes from a list of shows, building a podcast directory or newsletter, researching guests
and topics, or feeding audio links into a transcription pipeline.

### Quick start

```json
{
  "shows": ["https://podcasts.apple.com/us/podcast/houston-we-have-a-podcast/id1262594123"],
  "maxEpisodesPerShow": 50
}
```

An Apple Podcasts link or its numeric ID (`1262594123`) both work. If you already have the RSS feed, put it in
`feedUrls` instead.

### Input

| Field | Default | What it does |
| --- | --- | --- |
| `shows` | empty | Apple Podcasts show links or IDs. Each one is resolved to the show's public RSS feed. |
| `feedUrls` | empty | Public podcast RSS feed URLs. |
| `country` | `us` | Apple storefront used to look up shows. |
| `maxShows` | `5` | How many shows to read in one run (up to 50). |
| `maxEpisodesPerShow` | `20` | Episodes to keep per show, in the order the feed lists them, usually newest first (up to 1,000). |
| `publishedAfter` | empty | Keep only episodes published after this date, such as `2026-09-01`. |

Give at least one show or feed. Episodes with no date are skipped when `publishedAfter` is set.

### Output

One row per episode. Example:

```json
{
  "showTitle": "Houston We Have a Podcast",
  "showId": "1262594123",
  "feedUrl": "https://feeds.megaphone.fm/NATIONALAERONAUTICSANDSPACEADMINISTRATION1776343825",
  "showLanguage": "en-US",
  "showUrl": "https://www.nasa.gov/podcasts/houston-we-have-a-podcast/",
  "showGenres": ["Science", "Podcasts"],
  "episodeTitle": "Crew-13",
  "guid": "ca6e1f66-b8e5-11f1-a633-7f4c8f342395",
  "publishedAt": "2026-09-25T13:36:00Z",
  "durationSeconds": 3765,
  "audioUrl": "https://traffic.megaphone.fm/NATIONALAERONAUTICSANDSPACEADMINISTRATION2863054701.mp3",
  "episodeUrl": "https://www.nasa.gov/podcasts/houston-we-have-a-podcast/crew-13/",
  "description": "NASA’s SpaceX Crew-13 members discuss their journeys to becoming astronauts and their upcoming mission to the International Space Station. Episode 438",
  "seasonNumber": 1,
  "episodeNumber": 438,
  "explicit": false
}
```

Rows also include the show's author, description and explicit flag, and a stable `episodeKey` you can use to spot
new episodes between runs. Durations are converted to seconds whatever format the feed uses, and HTML is stripped from
descriptions.

### Pricing

$2.00 per 1,000 episodes on the Free plan, $1.80 on Starter, $1.50 on Scale and $1.20 on Business. Duplicates and
filtered-out episodes are free, and there is no start fee.

### FAQ

**Does it download the audio?** No. You get the link to each audio file.

**Can I search podcasts by keyword?** Not in this actor. Start from the shows you already know, using their Apple
Podcasts links or RSS feeds.

**Why do I get fewer episodes than the show has?** The actor reads what the feed lists. Most feeds list every
episode, but some publishers keep only the latest ones in the feed.

**Private or premium feeds?** Only public feeds are supported.

**Who owns the content?** Titles, descriptions and audio belong to each publisher. Keep the links and follow the
publisher's terms when you reuse them.

### Responsible use

The actor sends one request every few seconds, checks each feed host's robots.txt first and never downloads audio or
artwork.

# Actor input Schema

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

Apple Podcasts show IDs or show links, for example https://podcasts.apple.com/us/podcast/houston-we-have-a-podcast/id1262594123. Each one is resolved to the show's public RSS feed.

## `feedUrls` (type: `array`):

Public podcast RSS feed URLs. Each feed host's robots.txt is checked first, including redirects.

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

Two-letter Apple storefront code.

## `maxShows` (type: `integer`):

Global cap on unique discovered feed URLs.

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

Maximum matching unique episodes per feed, preserving feed order.

## `publishedAfter` (type: `string`):

Exclusive lower timestamp bound. Date-only input means midnight UTC. Unknown dates are excluded when filtering.

## `requestDelaySeconds` (type: `number`):

Minimum seconds between serial requests, including retries.

## `maxPages` (type: `integer`):

Safety bound on source pages scanned. Filters can result in fewer saved items.

## Actor input object example

```json
{
  "shows": [
    "1262594123"
  ],
  "feedUrls": [],
  "country": "us",
  "maxShows": 5,
  "maxEpisodesPerShow": 20,
  "requestDelaySeconds": 3.2,
  "maxPages": 100
}
```

# Actor output Schema

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

No description

## `stats` (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 = {
    "shows": [
        "1262594123"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("onescriptfix/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 = { "shows": ["1262594123"] }

# Run the Actor and wait for it to finish
run = client.actor("onescriptfix/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 '{
  "shows": [
    "1262594123"
  ]
}' |
apify call onescriptfix/podcast-episodes-scraper --silent --output-dataset

```

## MCP server setup

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