# Apple Podcasts Scraper – Episodes, Charts & Podcast RSS Feeds (`openharvest/podcast-scraper`) Actor

Apple Podcasts scraper without login: search podcasts and episodes, top podcast and episode charts per country and genre, podcast details (feed URL, genres, episode count, ratings) and podcast episodes from RSS feeds with audio URL, duration, season, explicit flag and transcript links.

- **URL**: https://apify.com/openharvest/podcast-scraper.md
- **Developed by:** [Enes Bulanık](https://apify.com/openharvest) (community)
- **Categories:** Social media, News, AI
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 podcast scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Apple Podcasts Scraper – Episodes, Charts & Podcast RSS Feeds

Apple Podcasts scraper without login: search podcasts and episodes, top podcast and episode charts per country and genre, podcast details (feed URL, genres, episode count, ratings) and podcast episodes from RSS feeds with audio URL, duration, season, explicit flag and transcript links.

**Price: $1.00 per 1,000 podcasts, $0.30 per 1,000 episodes.** No login, no API key, no browser. Failed inputs are never charged.

### What data do you get?

- 🎙 **Podcasts:** Apple ID (`collectionId`), name, artist, RSS `feedUrl`, Apple Podcasts URL, genres, primary genre, episode count, store country, 600×600 artwork, latest release date, explicit flag. When the feed is read you also get the description, language, website, show type and first episode date. With `includeRatings` you get the **star rating and number of ratings**.
- 🎧 **Episodes (from the RSS feed):** GUID, title, publish date, duration in seconds, audio URL, MIME type and file size, show notes as plain text, episode link, season, episode number, episode type (full / trailer / bonus), explicit flag, image, **transcript URL(s)** (`podcast:transcript`) and chapters URL.
- 📈 **Charts:** Apple Podcasts **Top Shows** (up to 200, with optional genre filter) and **Top Episodes** (up to 100) for any country, with rank.
- 🔎 **Search:** up to 200 podcasts or episodes per query from the iTunes Search API, for any store country.

### Use cases

- **Podcast discovery and guest booking research:** find shows on a topic and compare episode counts, ratings and how recently they published.
- **Chart tracking:** record daily top-podcast rankings per country and genre.
- **Monitoring:** get every new episode of a list of shows, for example daily with `newEpisodes` and `onlyNewerThan: "1 day"`.
- **Transcription and AI pipelines:** collect audio URLs and existing transcript links for speech-to-text, summarization or RAG.
- **Ad sales and market research:** build lists of shows by genre with publisher, rating count and release cadence.

### How to use it

1. Click **Try for free** or **Start**.
2. Choose a **Mode**: `search` (default), `charts`, `podcastDetails` or `newEpisodes`.
3. Enter a **Search query**, pick a **Country** and **Genre**, or add **Podcasts** (Apple Podcasts URLs, Apple IDs or RSS feed URLs).
4. Set **Max items** and click **Start**. Export as JSON, CSV or Excel, or connect via API, Make, Zapier, n8n or Google Sheets.

### Input

| Field | Mode | Description |
|---|---|---|
| `mode` | all | `search` (default), `charts`, `podcastDetails`, `newEpisodes` |
| `searchQuery` | search | Keywords, show or host name. Default `technology` |
| `searchType` | search | `podcast` (shows) or `episode` |
| `country` | search, charts | 2-letter store code: `us`, `gb`, `de`, `tr` … Default `us` |
| `chartType` | charts | `podcasts` (Top Shows) or `episodes` (Top Episodes) |
| `genre` | charts | Apple genre ID, e.g. `1318` Technology, `1488` True Crime, `1489` News. Empty = all |
| `podcasts` | podcastDetails, newEpisodes | Apple Podcasts URLs, Apple IDs or RSS feed URLs |
| `includeEpisodes` | search, charts | Also read each show's RSS feed and return episodes. Default `false` |
| `maxEpisodesPerPodcast` | all | Newest N episodes per show. Default `20`, `0` = all |
| `onlyNewerThan` | all | `2026-01-01` or `7 days`. `newEpisodes` defaults to `7 days` |
| `includeRatings` | all | Add `ratingAverage`, `ratingCount` and description from the Apple Podcasts page |
| `maxItems` | all | Total item limit (= cost cap). Default `100` |

Example inputs:

```json
{ "mode": "search", "searchQuery": "artificial intelligence", "country": "us", "includeRatings": true, "maxItems": 50 }
```

```json
{ "mode": "charts", "country": "gb", "genre": "1318", "maxItems": 100 }
```

```json
{ "mode": "podcastDetails", "podcasts": ["https://podcasts.apple.com/us/podcast/huberman-lab/id1545953110", "https://podnews.net/rss"], "maxEpisodesPerPodcast": 0, "maxItems": 2000 }
```

```json
{ "mode": "newEpisodes", "podcasts": ["1200361736", "https://feeds.megaphone.fm/hubermanlab"], "onlyNewerThan": "1 day" }
```

### Output

Every item has a `type`: `podcast`, `episode` or `error` (free). This is real output (shortened):

**Podcast** (mode `podcastDetails`, `includeRatings: true`)

```json
{
    "type": "podcast",
    "chartRank": null,
    "collectionId": 1545953110,
    "name": "Huberman Lab",
    "artist": "Scicomm Media",
    "feedUrl": "https://feeds.megaphone.fm/hubermanlab",
    "appleUrl": "https://podcasts.apple.com/us/podcast/huberman-lab/id1545953110",
    "genres": ["Health & Fitness", "Science", "Life Sciences"],
    "primaryGenre": "Health & Fitness",
    "episodeCount": 447,
    "country": "USA",
    "artwork": "https://is1-ssl.mzstatic.com/image/thumb/Podcasts221/v4/9a/d3/19/…/600x600bb.jpg",
    "latestReleaseDate": "2026-10-05T08:00:00.000Z",
    "explicit": false,
    "description": "The Huberman Lab podcast is hosted by Andrew Huberman, Ph.D., a neuroscientist and tenured professor …",
    "language": "en",
    "website": "https://www.hubermanlab.com",
    "showType": "episodic",
    "firstEpisodeDate": "2020-12-21T05:22:00.000Z",
    "ratingAverage": 4.8,
    "ratingCount": 27992
}
```

**Episode** (from the RSS feed, with transcript)

```json
{
    "type": "episode",
    "podcastId": null,
    "podcastName": "Podnews Daily - podcast industry and podcasting news",
    "guid": "https://podnews.net/update/apple-podcasts-creators-aus-26",
    "title": "Apple Podcasts highlights “Creators We Love” for Australia",
    "publishedAt": "2026-10-07T10:40:00.000Z",
    "durationSec": 245,
    "audioUrl": "https://op3.dev/e,pg=9b024349-ccf0-5f69-a609-6b82873eab3c/podnews.net/audio/podnews261007.mp3",
    "audioType": "audio/mpeg",
    "audioSizeBytes": 3933888,
    "description": "Sponsored by SoundStack. Your new revenue opportunity lives in existing podcast content. …",
    "link": "https://podnews.net/update/apple-podcasts-creators-aus-26",
    "season": null,
    "episode": 2443,
    "episodeType": "full",
    "explicit": false,
    "image": "https://podnews.net/audio/podnews261007.jpeg",
    "transcriptUrl": "https://podnews.net/audio/podnews261007.mp3.vtt",
    "transcripts": [{ "url": "https://podnews.net/audio/podnews261007.mp3.vtt", "type": "text/vtt", "language": null, "rel": "captions" }],
    "chaptersUrl": null,
    "feedUrl": "https://podnews.net/rss",
    "source": "rss"
}
```

`podcastId` is the Apple ID when the show was given as an Apple URL or ID (it is `null` for feed-only input, as above).

**Top chart row** (mode `charts`, `country: "gb"`)

```json
{
    "type": "podcast",
    "chartRank": 1,
    "chartCountry": "gb",
    "collectionId": 1611374685,
    "name": "The Rest Is Politics",
    "artist": "Goalhanger",
    "feedUrl": "https://feeds.megaphone.fm/GLT9190936013",
    "appleUrl": "https://podcasts.apple.com/gb/podcast/the-rest-is-politics/id1611374685",
    "genres": ["Politics", "News", "Government"],
    "episodeCount": 675,
    "latestReleaseDate": "2026-10-07T23:00:00Z"
}
```

**Top episodes chart row** (`chartType: "episodes"`): `chartRank`, `podcastId`, `podcastName`, `publisher`, `appleEpisodeId`, `title`, `appleUrl`, `explicit`, `image`, `genres`, `feedUrl`. Apple's episode chart has no audio URL or date. Run `podcastDetails` on the `podcastId` to get them.

**Episode from search** (`searchType: "episode"`) also has `appleEpisodeId`, `appleUrl` and `genres`, with `source: "itunes"`.

**Error (free)**

```json
{ "type": "error", "input": "999999999", "errorCode": "NOT_FOUND", "error": "No podcast with Apple ID 999999999 found in the Apple Podcasts directory." }
```

Possible `errorCode` values: `INVALID_INPUT`, `NOT_FOUND`, `FEED_FAILED`, `CHART_UNAVAILABLE`, `NO_RESULTS`.

Dataset views in Apify Console: **Overview**, **Episodes**, **Errors**.

### Pricing

Pay per event, with platform usage included.

| Event | Price | When it is charged |
|---|---|---|
| `podcast` | **$0.001** per podcast ($1.00 / 1,000) | Each podcast (show) saved, including chart rows |
| `episode` | **$0.0003** per episode ($0.30 / 1,000) | Each episode saved |
| Errors / no results | **Free** | Invalid inputs, unknown IDs, broken feeds |

| Job | Cost |
|---|---|
| Search: 100 podcasts | **$0.10** |
| Top 200 shows in one genre | **$0.20** |
| 1 podcast + all 450 episodes | **$0.136** |
| Daily new episodes of 50 shows (~60 episodes) | **~$0.02** per day |

Set **Max items** and Apify's **Max cost per run**. The Actor stops cleanly at the limit.

### Use with AI agents (MCP)

Add the Actor as a tool in the [Apify MCP server](https://mcp.apify.com) (`https://mcp.apify.com?tools=openharvest/podcast-scraper`), or let agents find it with `search-actors` ("podcast").

Example `call-actor` input for "Find the best-rated podcasts about AI and give me their latest episodes":

```json
{ "mode": "search", "searchQuery": "artificial intelligence", "includeRatings": true, "includeEpisodes": true, "maxEpisodesPerPodcast": 3, "maxItems": 40 }
```

Example input for "What are the top 10 podcasts in Germany right now?":

```json
{ "mode": "charts", "country": "de", "maxItems": 10 }
```

### FAQ

**Where does the data come from?**
Apple's public iTunes Search/Lookup API, Apple's public top-chart feeds (rss.applemarketingtools.com and the iTunes RSS feeds) and each show's own public RSS feed. With `includeRatings` the Actor also reads the public Apple Podcasts show page.

**How many episodes can I get?**
All of them. RSS feeds usually contain the complete back catalogue. Set `maxEpisodesPerPodcast` to `0`. If a show has no working RSS feed, the Actor falls back to Apple's list of the latest ~200 episodes.

**Does it download audio or create transcripts?**
No. It returns the audio URL and any transcript files the publisher provides (`transcriptUrl`). Transcripts exist only if the feed includes the `podcast:transcript` tag.

**Why is the description empty for search or chart results?**
Apple's search API has no show descriptions. Turn on `includeEpisodes` (the description comes from the RSS feed) or `includeRatings` (it comes from the Apple page).

**Is there a rate limit?**
Apple allows about 20 search/lookup calls per minute. The Actor paces its requests and retries automatically. Most runs need only 1–3 such calls.

**Can it scrape Spotify?**
No, only Apple Podcasts and RSS feeds. Most shows on Spotify publish the same RSS feed, so you can use their feed URL.

### Is it legal to scrape podcasts?

The Actor reads only **public data**: Apple's public directory APIs and chart feeds, and the RSS feeds publishers make public so that podcast apps can read them. It does not log in and does not download or redistribute audio. Owner e-mail addresses in RSS feeds are intentionally **not** collected. Show notes, artwork and audio are copyrighted by their publishers, so respect their rights, [Apple's terms](https://www.apple.com/legal/internet-services/itunes/), and laws such as GDPR when you store or republish data. **Do not use the data for spam or unsolicited outreach.**

### Related actors

- Substack Scraper – Newsletter Posts, Full Text, Comments & Publication Info *(coming soon)*
- App Store Scraper *(coming soon)*
- RSS Feed Reader *(coming soon)*
- YouTube Transcript Scraper *(coming soon)*

### Support & feedback

Found a bug or a missing field? Open an issue in the **Issues** tab and we usually reply within a day.

# Actor input Schema

## `mode` (type: `string`):

<b>search</b> = search Apple Podcasts for shows or episodes. <b>charts</b> = Apple Podcasts top shows / top episodes per country (and genre). <b>podcastDetails</b> = specific podcasts with their episode list from the RSS feed. <b>newEpisodes</b> = only episodes published since a date (for monitoring).

## `searchQuery` (type: `string`):

Mode <b>search</b>: keywords, e.g. <code>artificial intelligence</code>, <code>true crime</code>, a show name or a host name.

## `searchType` (type: `string`):

Mode <b>search</b>: return podcasts (shows) or individual episodes.

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

Two-letter Apple Podcasts store country code: <code>us</code>, <code>gb</code>, <code>de</code>, <code>fr</code>, <code>tr</code>, <code>br</code>, <code>jp</code>, <code>in</code> … Used for search and charts.

## `chartType` (type: `string`):

Mode <b>charts</b>: top shows or top (trending) episodes.

## `genre` (type: `string`):

Mode <b>charts</b>, top shows only: limit the chart to one Apple Podcasts genre. Empty = all genres.

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

Modes <b>podcastDetails</b> and <b>newEpisodes</b>: Apple Podcasts URLs (<code>https://podcasts.apple.com/us/podcast/huberman-lab/id1545953110</code>), Apple IDs (<code>1545953110</code>) or RSS feed URLs (<code>https://feeds.megaphone.fm/hubermanlab</code>).

## `includeEpisodes` (type: `boolean`):

Modes <b>search</b> (podcasts) and <b>charts</b> (top shows): also read each podcast's RSS feed and return its episodes (each episode is charged as an 'episode' event). Always on in podcastDetails and newEpisodes.

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

Newest N episodes per podcast. 0 = all episodes in the feed.

## `onlyNewerThan` (type: `string`):

Skip episodes published before this date. Absolute date (YYYY-MM-DD) or relative period such as <code>7 days</code>, <code>1 month</code>. Mode <b>newEpisodes</b> uses <code>7 days</code> when empty.

## `includeRatings` (type: `boolean`):

Add the Apple Podcasts star rating (<code>ratingAverage</code>), number of ratings (<code>ratingCount</code>) and show description to each podcast. Needs one extra page load per podcast.

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

Maximum number of items in total (podcasts + episodes). You pay per item, so this also caps your cost. Search returns at most 200 results; charts at most 200 shows / 100 episodes.

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

Usually not needed. Apple limits the search API to about 20 requests per minute per IP; the Actor paces itself. Use Apify Proxy only for very large jobs.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "artificial intelligence",
  "searchType": "podcast",
  "country": "gb",
  "chartType": "podcasts",
  "genre": "1318",
  "podcasts": [
    "https://podcasts.apple.com/us/podcast/huberman-lab/id1545953110",
    "https://feeds.megaphone.fm/hubermanlab"
  ],
  "includeEpisodes": true,
  "maxEpisodesPerPodcast": 50,
  "onlyNewerThan": "7 days",
  "includeRatings": true,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped items in the default dataset (JSON, CSV, Excel and more via the dataset export).

## `files` (type: `string`):

Records saved in the default key-value store, e.g. the run summary.

# 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 = {
    "mode": "search",
    "searchQuery": "artificial intelligence",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("openharvest/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 = {
    "mode": "search",
    "searchQuery": "artificial intelligence",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("openharvest/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 '{
  "mode": "search",
  "searchQuery": "artificial intelligence",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call openharvest/podcast-scraper --silent --output-dataset

```

## MCP server setup

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