# Apple Podcasts Scraper (`parsebird/apple-podcasts-scraper`) Actor

Scrape Apple Podcasts episodes by search term, iTunes ID, or RSS feed. Extract titles, show notes, audio URLs, durations, transcripts, and show metadata. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/apple-podcasts-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Social media, Videos, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Apple Podcasts Scraper

Apple Podcasts Scraper extracts podcast episode data from [Apple Podcasts](https://podcasts.apple.com/) by search term, iTunes collection ID, or direct RSS feed, including episode titles, show notes, audio URLs, durations, release dates, transcripts, and show metadata.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Discover shows by keyword or pull specific podcasts by iTunes ID or RSS feed, then extract every episode's audio URL, duration, description, and Podcast 2.0 fields like transcripts and chapters — well beyond Apple's ~200-episode lookup cap.
</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/apple-podcasts-scraper to scrape Apple Podcasts episodes. Example with ApifyClient: client.actor("parsebird/apple-podcasts-scraper").call(run_input={"searchTerms":["artificial intelligence"],"country":"us","maxPodcastsPerSearch":10,"maxEpisodesPerPodcast":20}). Inputs: searchTerms string[] discovers shows via iTunes Search; podcastIds string[] iTunes collection IDs for deterministic pulls; rssFeeds string[] direct RSS URLs bypassing Apple; country string default "us"; maxPodcastsPerSearch integer default 50; maxEpisodesPerPodcast integer default 100 (iTunes hard cap ~200); useRssForFullArchive boolean default false unlocks the full archive via RSS; minReleaseDate/maxReleaseDate string YYYY-MM-DD; explicit string enum all/clean/explicit default all; minDurationSeconds integer default 0; fetchShowMetadata boolean default true. Output fields: podcastId, podcastName, author, episodeId, episodeGuid, episodeTitle, episodeNumber, season, episodeType, description, showNotesHtml, releaseDate, durationMs, durationSec, audioUrl, audioExtension, audioFileSize, artworkUrl600, episodeAppleUrl, feedUrl, transcriptUrl, chapters, keywords, explicitness, genres, primaryGenre, country, trackCountTotal, source, scrapedAt. 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 Apple Podcasts Scraper?

**Apple Podcasts Scraper** is an Apple Podcasts scraper and Apple Podcasts API alternative for pulling structured episode data without manually browsing the app or website. Supply search terms, iTunes collection IDs, or RSS feed URLs, and the actor returns one row per episode, ready for analysis, monitoring, or downstream automation.

Use it for podcast data extraction workflows: content research, competitive monitoring, transcript pipelines, or building your own podcast search index through [Apify](https://apify.com/).

### What can Apple Podcasts Scraper do?

- 🔍 Discover podcasts by keyword using the iTunes Search API and expand every result into episodes.
- 🎯 Pull specific shows deterministically by iTunes collection ID.
- 📡 Fetch episodes directly from a podcast's RSS feed, bypassing Apple entirely.
- 📚 Unlock a show's full episode archive via RSS, beyond the iTunes Lookup API's ~200-episode cap.
- 🎙️ Extract Podcast 2.0 fields when available: transcript URLs, chapter markers, season and episode numbers.
- 🧹 Filter episodes by release date range, explicit rating, and minimum duration.
- ⏰ Run on demand or with [Apify schedules](https://docs.apify.com/platform/schedules) for recurring monitoring.
- 🔌 Access results through the [Apify API](https://docs.apify.com/api/v2), webhooks, and [integrations](https://apify.com/integrations).
- 💾 Download datasets as JSON, CSV, Excel, XML, RSS, or HTML from Apify storage.

### What data can you extract from Apple Podcasts?

| Field | Description |
|-------|-------------|
| `podcastName` | Podcast show title |
| `author` | Show author or network |
| `episodeTitle` | Episode title |
| `episodeNumber` / `season` | Episode and season numbers, when the RSS feed exposes them |
| `description` | Plain-text episode description |
| `showNotesHtml` | Full HTML show notes, when available via RSS `content:encoded` |
| `releaseDate` | Episode publish date and time |
| `durationSec` | Episode duration in seconds |
| `audioUrl` | Direct audio file URL |
| `episodeAppleUrl` | Link to the episode on Apple Podcasts |
| `transcriptUrl` | Transcript file URL, when the feed publishes a Podcast 2.0 `<podcast:transcript>` |
| `chapters` | Chapter markers, when the feed publishes a Podcast 2.0 chapters JSON file |
| `genres` / `primaryGenre` | Show category classification |
| `trackCountTotal` | Total episode count for the show |

### How to scrape Apple Podcasts episodes

1. Open [Apple Podcasts Scraper](https://apify.com/parsebird/apple-podcasts-scraper) on Apify.
2. Add one or more `searchTerms`, for example `artificial intelligence`, or add specific `podcastIds` or `rssFeeds` for deterministic pulls.
3. Set `country` to the iTunes storefront you want to search or look up shows in.
4. Set `maxPodcastsPerSearch` and `maxEpisodesPerPodcast` to control how much data each run pulls.
5. Enable `useRssForFullArchive` if you need a show's complete back catalog instead of just its most recent episodes.
6. Optionally add `minReleaseDate`, `maxReleaseDate`, `explicit`, or `minDurationSeconds` to narrow results.
7. Run the actor, open the dataset, and export results as JSON, CSV, Excel, or through the [Apify API](https://docs.apify.com/api/v2).

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchTerms` | array of strings | No\* | - | Keyword queries to discover podcasts via the iTunes Search API. |
| `podcastIds` | array of strings | No\* | - | iTunes collection IDs for direct, deterministic lookups. |
| `rssFeeds` | array of strings | No\* | - | Direct podcast RSS feed URLs. Bypasses Apple entirely. |
| `country` | string | No | `us` | iTunes storefront (30 supported). Affects ranking and country-restricted shows. |
| `maxPodcastsPerSearch` | integer | No | `50` | Max podcasts returned per search term. iTunes hard cap is 200. |
| `maxEpisodesPerPodcast` | integer | No | `100` | Max episodes pulled per iTunes lookup. iTunes returns roughly the 200 most recent. |
| `useRssForFullArchive` | boolean | No | `false` | After each iTunes lookup, also fetch the show's RSS feed to unlock the full archive and Podcast 2.0 fields. |
| `minReleaseDate` | string | No | - | Drop episodes released before this date (`YYYY-MM-DD`). |
| `maxReleaseDate` | string | No | - | Drop episodes released after this date (`YYYY-MM-DD`). |
| `explicit` | string | No | `all` | `all`, `clean`, or `explicit` content filter. |
| `minDurationSeconds` | integer | No | `0` | Drop episodes shorter than this duration. Useful for filtering trailers and ads. |
| `fetchShowMetadata` | boolean | No | `true` | Enrich each episode with show-level fields: genres, total episode count, explicitness. |

\* Supply at least one of `searchTerms`, `podcastIds`, or `rssFeeds`.

Example — discover and pull AI podcasts in the US:

```json
{
  "searchTerms": ["artificial intelligence", "machine learning", "LLM"],
  "country": "us",
  "maxPodcastsPerSearch": 50,
  "maxEpisodesPerPodcast": 100
}
```

Example — full archive of a single show beyond the iTunes 200-episode cap:

```json
{
  "podcastIds": ["1434243584"],
  "useRssForFullArchive": true,
  "fetchShowMetadata": true
}
```

Example — direct RSS feeds only, no iTunes lookup:

```json
{
  "rssFeeds": [
    "https://feeds.simplecast.com/54nAGcIl",
    "https://lexfridman.com/feed/podcast/"
  ]
}
```

### Output example

```json
{
  "podcastId": "1434243584",
  "podcastName": "Lex Fridman Podcast",
  "author": "Lex Fridman",
  "episodeId": "1000766518218",
  "episodeGuid": "https://lexfridman.com/?p=6494",
  "episodeTitle": "#500 – Khabib Nurmagomedov: Dagestan, MMA, UFC, Islam, Conor, Fedor & Football",
  "episodeNumber": null,
  "season": null,
  "episodeType": "full",
  "description": "Khabib Nurmagomedov is one of the greatest fighters of all time...",
  "showNotesHtml": null,
  "releaseDate": "2026-08-12T13:11:45Z",
  "durationMs": null,
  "durationSec": null,
  "audioUrl": "https://media.blubrry.com/takeituneasy/ins.blubrry.com/takeituneasy/lex_ai_khabib_nurmagomedov.mp3",
  "audioExtension": "mp3",
  "audioFileSize": 5242880,
  "artworkUrl600": "https://is1-ssl.mzstatic.com/image/thumb/Podcasts115/.../600x600bb.jpg",
  "episodeAppleUrl": "https://podcasts.apple.com/us/podcast/.../id1434243584?i=1000782963648",
  "feedUrl": "https://lexfridman.com/feed/podcast/",
  "transcriptUrl": null,
  "chapters": [],
  "keywords": null,
  "explicitness": "clean",
  "genres": ["Technology", "Podcasts", "Science"],
  "primaryGenre": "Technology",
  "country": "USA",
  "trackCountTotal": 501,
  "source": "itunes+rss",
  "scrapedAt": "2026-08-21T11:25:03Z"
}
```

Fields reflect what the source actually publishes — some feeds omit duration, show notes HTML, or Podcast 2.0 fields, and those fields come back `null` rather than a guessed value. Download results in JSON, CSV, Excel, XML, RSS, or HTML from the Apify dataset.

### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("parsebird/apple-podcasts-scraper").call(run_input={
    "searchTerms": ["artificial intelligence"],
    "country": "us",
    "maxPodcastsPerSearch": 10,
    "maxEpisodesPerPodcast": 20,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### JavaScript API example

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

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

const run = await client.actor('parsebird/apple-podcasts-scraper').call({
  searchTerms: ['artificial intelligence'],
  country: 'us',
  maxPodcastsPerSearch: 10,
  maxEpisodesPerPodcast: 20,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

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

### How much does it cost to scrape Apple Podcasts?

**What is the price per Apple Podcasts episode?**

| Plan | Price per event | Price per 1,000 |
|------|----------------|-----------------|
| Free | $0.0023 | **$2.30** |
| Bronze | $0.0021 | **$2.10** |
| Silver | $0.0019 | **$1.90** |
| Gold | $0.0016 | **$1.60** |

Each `episode-scraped` event means one podcast episode was extracted and pushed to the dataset. A run collecting 1,000 episodes costs $2.30 on the Free plan or $1.60 on Gold. Apify's free trial credits cover test runs.

### Use cases

- Build a podcast search index or discovery tool for a niche category.
- Monitor competitor or industry podcasts for new episodes and topics.
- Feed episode audio URLs and transcripts into a transcription or summarization pipeline.
- Track show metadata (genres, episode counts, explicitness) across a portfolio of podcasts.
- Archive a show's complete back catalog before a feed migration or hosting change.

### How it works

1. The actor validates `searchTerms`, `podcastIds`, `rssFeeds`, and the optional filters.
2. For each search term, it queries the iTunes Search API and deduplicates discovered shows against any directly supplied `podcastIds`.
3. For each unique podcast, it calls the iTunes Lookup API to pull up to `maxEpisodesPerPodcast` recent episodes and, optionally, show metadata.
4. If `useRssForFullArchive` is enabled, it also fetches the show's RSS feed, merges Podcast 2.0 fields into matching episodes, and adds any older episodes beyond the iTunes cap.
5. For direct `rssFeeds`, it fetches and parses the feed without any iTunes lookup.
6. It applies the `minReleaseDate`, `maxReleaseDate`, `explicit`, and `minDurationSeconds` filters, then pushes one row per episode to the default Apify dataset and charges one PPE event per pushed episode on the Apify platform.

### What are the limitations of Apple Podcasts scraping?

- The iTunes Lookup API returns roughly the 200 most recent episodes per show; use `useRssForFullArchive` for older episodes.
- Fields like `durationSec`, `showNotesHtml`, `transcriptUrl`, and `chapters` depend on what the show's RSS feed publishes — many feeds omit some of them.
- Podcast search ranking and country-restricted catalogs vary by the `country` storefront selected.
- RSS-only input (`rssFeeds`) has no Apple identifiers, so `podcastId`, `episodeId`, and `episodeAppleUrl` are not available for those rows.

### Is it legal to scrape Apple Podcasts?

**Is scraping Apple Podcasts legal?**

Apple Podcasts Scraper reads Apple's public iTunes Search and Lookup APIs and podcasters' own public RSS feeds — the same data a podcast app or Apple Podcasts itself uses. Scraping publicly available data is generally allowed in many jurisdictions, but you should review Apple's terms and each feed's usage terms and make sure your use case complies with applicable laws. For background, read Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

### Other Apple Podcasts scrapers / Related Actors

| Actor | Best for |
|-------|----------|
| [Apple Podcasts Scraper](https://apify.com/parsebird/apple-podcasts-scraper) | Podcast episode and show data by search, ID, or RSS |
| [RSS Feed Extractor](https://apify.com/parsebird/rss-feed-extractor) | Generic RSS/Atom feed parsing for any site |
| [YouTube Search Scraper](https://apify.com/parsebird/youtube-search-scraper) | Structured YouTube search results |

### FAQ

**Does Apple Podcasts Scraper require an Apple Podcasts login?**

No login or API key is required. The actor uses Apple's public iTunes Search and Lookup APIs and podcasters' public RSS feeds.

**How do I find a podcast's iTunes collection ID?**

It's the numeric segment in an Apple Podcasts URL. For `podcasts.apple.com/us/podcast/lex-fridman-podcast/id1434243584`, the ID is `1434243584`. Paste it into `podcastIds` for a fast, deterministic pull.

**Why do I only get ~200 episodes per show?**

That's the iTunes Lookup API's hard cap. Enable `useRssForFullArchive` to pull the show's complete archive directly from its RSS feed.

**Can I schedule recurring runs to catch new episodes?**

Yes. Use [Apify schedules](https://docs.apify.com/platform/schedules) to run the actor daily, weekly, or at any interval.

**Can I use it as an Apple Podcasts API?**

Yes. Start runs and fetch datasets through the Apify API, Python client, JavaScript client, webhooks, or integrations.

**Why are some fields null?**

Not every podcast RSS feed publishes every field. Duration, show notes HTML, transcripts, and chapters are only populated when the source feed includes them.

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

Open the Issues tab on the actor page and include your input example, run ID, and the fields you expected.

# Actor input Schema

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

Keyword queries to discover podcasts via the iTunes Search API. Each term returns up to Max Podcasts Per Search shows, and every show is expanded into episodes.

## `podcastIds` (type: `array`):

iTunes collection IDs for direct, deterministic lookups. Find the ID in an Apple Podcasts URL, e.g. podcasts.apple.com/us/podcast/.../id1434243584 has ID 1434243584.

## `rssFeeds` (type: `array`):

Direct podcast RSS feed URLs. Bypasses Apple entirely and is best for pulling a full episode archive beyond the iTunes ~200-episode lookup cap.

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

iTunes storefront to search and look up shows in. Affects ranking and which country-restricted shows are visible.

## `maxPodcastsPerSearch` (type: `integer`):

Maximum podcasts to return per search term. The iTunes Search API hard caps this at 200.

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

Maximum episodes to pull per iTunes lookup. The iTunes Lookup API returns roughly the 200 most recent episodes at most.

## `useRssForFullArchive` (type: `boolean`):

After each iTunes lookup, also fetch the show's RSS feed to unlock the full episode archive plus Podcast 2.0 fields (transcripts, chapters, season/episode numbers).

## `minReleaseDate` (type: `string`):

Drop episodes released before this date. Format: YYYY-MM-DD.

## `maxReleaseDate` (type: `string`):

Drop episodes released after this date. Format: YYYY-MM-DD.

## `explicit` (type: `string`):

Filter episodes by the show's explicit rating.

## `minDurationSeconds` (type: `integer`):

Drop episodes shorter than this duration. Useful for filtering out trailers and ads.

## `fetchShowMetadata` (type: `boolean`):

Enrich each episode with parent-show fields: genres, total episode count, and show description.

## Actor input object example

```json
{
  "searchTerms": [
    "artificial intelligence"
  ],
  "country": "us",
  "maxPodcastsPerSearch": 10,
  "maxEpisodesPerPodcast": 20,
  "useRssForFullArchive": false,
  "explicit": "all",
  "minDurationSeconds": 0,
  "fetchShowMetadata": true
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchTerms": [
        "artificial intelligence"
    ],
    "country": "us",
    "maxPodcastsPerSearch": 10,
    "maxEpisodesPerPodcast": 20,
    "explicit": "all"
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/apple-podcasts-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 = {
    "searchTerms": ["artificial intelligence"],
    "country": "us",
    "maxPodcastsPerSearch": 10,
    "maxEpisodesPerPodcast": 20,
    "explicit": "all",
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/apple-podcasts-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 '{
  "searchTerms": [
    "artificial intelligence"
  ],
  "country": "us",
  "maxPodcastsPerSearch": 10,
  "maxEpisodesPerPodcast": 20,
  "explicit": "all"
}' |
apify call parsebird/apple-podcasts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/apple-podcasts-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/ctwIfiB2FU0o4Yhzb/builds/mOXQ3OWjVwG4N8Y3P/openapi.json
