# Apple Podcasts Scraper - Shows, Episodes, Charts, Reviews (`randy-tools/apple-podcasts-scraper`) Actor

Scrape Apple Podcasts: search shows in any country, top charts by country and genre, show details, episodes from the RSS feed (title, date, duration, audio URL, season/episode) and listener reviews. HTTP-only, pay per result.

- **URL**: https://apify.com/randy-tools/apple-podcasts-scraper.md
- **Developed by:** [AICORP Tools](https://apify.com/randy-tools) (community)
- **Categories:** Videos, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 — Shows, Episodes, Charts & Reviews

Extract **podcast data from Apple Podcasts**, in any country: search shows by keyword, read the **top charts by country and genre**, look up shows by id or URL, list **episodes** straight from each show's RSS feed, and collect **listener reviews**. Plain HTTP requests, no browser, no login.

### What you can do with it

- **Market research:** map every show in a niche, in any of 170+ storefronts
- **Chart tracking:** run daily on the top charts of a country and genre, and keep the rank history
- **Lead lists for podcast advertising and PR:** shows with artist, genre, episode count, latest release and website
- **Episode feeds:** new episodes with title, description, date, duration, audio URL, season and episode number
- **Review monitoring:** the newest listener reviews of your show or a competitor's

### Features

- 🔎 **Search:** top shows for any keyword (up to 200), in several countries at once
- 🏆 **Top charts:** overall or by genre (19 genres), up to 200 shows per chart, with the chart rank on every show
- 📇 **Show details:** id, name, artist, RSS feed URL, genres, artwork, episode count, latest release date, explicit flag, content advisory rating, Apple link; with episodes on, also description, language and website
- 🎧 **Episodes:** read from the show's own RSS feed, newest first: title, description, published date, duration, audio URL and type, size, season, episode, episode type, explicit, GUID, link, image, chapters URL. Falls back to Apple's episode list if a feed is down
- 📅 **Date filter:** `episodesSince` and `maxEpisodesPerShow` keep daily monitoring cheap
- ⭐ **Reviews:** stars, title, text, date, helpful votes and reviewer nickname, most recent or most helpful, filtered by stars and date
- 🌍 **Any storefront:** us, gb, de, jp, br, au and more

### Input example

```json
{
  "searchTerms": ["true crime"],
  "maxShowsPerSearch": 20,
  "searchCountries": ["us", "gb"],
  "chartCountries": ["us"],
  "chartGenres": ["1487"],
  "maxShowsPerChart": 50,
  "maxEpisodesPerShow": 10,
  "episodesSince": "2026-09-01",
  "maxReviewsPerShow": 100
}
```

### Output

The dataset holds three record types: `show`, `episode` and `review`. The Console shows each in its own view.

```json
{
  "type": "show",
  "collectionId": "1200361736",
  "name": "The Daily",
  "artist": "The New York Times",
  "feedUrl": "https://feeds.simplecast.com/Sl5CSM3S",
  "primaryGenre": "Daily News",
  "genres": ["Daily News", "Podcasts", "News"],
  "country": "us",
  "episodeCount": 2733,
  "releaseDate": "2026-09-28T09:46:00+00:00",
  "latestEpisodeDate": "2026-09-28T09:46:25+00:00",
  "explicit": false,
  "contentAdvisoryRating": "Clean",
  "chartCountry": "us",
  "chartGenre": "all",
  "chartRank": 1,
  "url": "https://podcasts.apple.com/us/podcast/the-daily/id1200361736"
}
```

```json
{
  "type": "episode",
  "showId": "1200361736",
  "showName": "The Daily",
  "title": "He Was Deported to a Country He’d Never Heard Of",
  "published": "2026-09-28T09:46:25+00:00",
  "durationSeconds": 1636,
  "enclosureUrl": "https://dts.podtrac.com/redirect.mp3/...",
  "enclosureType": "audio/mpeg",
  "episodeType": "full",
  "explicit": false,
  "guid": "bf6646a8-cdd6-4d87-92bd-6d088fe36dc3",
  "source": "rss"
}
```

```json
{
  "type": "review",
  "reviewId": "14551680625",
  "showId": "1200361736",
  "score": 2,
  "title": "Overproduced and a bit patronising",
  "text": "I like the level of expertise but ...",
  "date": "2026-09-15T06:59:25+00:00",
  "voteCount": 0,
  "country": "gb"
}
```

Export results as JSON, CSV, Excel or HTML, or pull them via the Apify API, webhooks, Make, Zapier, n8n or MCP.

### Pricing

Pay only for what you get: a small fee per run start, a fee **per show**, a small fee **per episode** and a small fee **per review**. Proxy costs are included.

### FAQ

**How many reviews can I get?** Apple serves the latest 500 reviews per show, country and sort order. Run several countries for more; reviews are per storefront.

**Does it download audio or transcripts?** No. You get the audio URL from the feed, and nothing is downloaded.

**Why is the episode list shorter than the episode count?** Some hosts only publish recent episodes in the RSS feed.

**Which genres can I chart?** The 19 top-level Apple Podcasts genres are in the input list.

**Is this legal?** The Actor collects only publicly visible directory data, feeds and reviews, without logins. Reviews include the reviewer's public nickname unless you enable `anonymizeReviewers`. You are responsible for handling the data in line with applicable laws (such as GDPR) and Apple's terms.

**Something broke?** Open an issue on the Issues tab. We monitor the Actor daily and usually respond within 24 hours.

# Actor input Schema

## `showIds` (type: `array`):

Numeric Apple Podcasts ids such as "1200361736", or podcasts.apple.com show URLs (the storefront in the URL is used).

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

Find shows by keyword, e.g. "true crime", "personal finance". Top results are scraped.

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

Up to 200, per search term and country.

## `searchCountries` (type: `array`):

Two-letter storefronts to search, e.g. us, gb, de, jp. Empty = the Country field below. Each country returns its own ranking.

## `chartCountries` (type: `array`):

Scrape the Apple Podcasts top charts of these storefronts, e.g. us, gb, au. Chart rank is added to every show.

## `chartGenres` (type: `array`):

Genres to chart. Leave empty for the overall top chart.

## `maxShowsPerChart` (type: `integer`):

Up to 200 (overall chart: 100).

## `includeShowDetails` (type: `boolean`):

Output one record per show: name, artist, feed URL, genres, artwork, episode count, latest release, explicit flag and more.

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

0 = no episodes. Read from the show's RSS feed, newest first; falls back to the iTunes episode list when the feed is unreachable.

## `episodesSince` (type: `string`):

YYYY-MM-DD. Skips older episodes, which keeps daily monitoring cheap.

## `maxReviewsPerShow` (type: `integer`):

0 = no reviews. Apple exposes at most 500 reviews per show, country and sort order.

## `reviewSort` (type: `string`):

Order in which Apple returns reviews.

## `reviewStars` (type: `array`):

Leave empty for all. Apple has no star filter, so reviews are filtered after download.

## `reviewsSince` (type: `string`):

YYYY-MM-DD. With 'Most recent' the run stops as soon as it reaches older reviews.

## `anonymizeReviewers` (type: `boolean`):

Leave out reviewer nicknames.

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

Default storefront for show ids and reviews, e.g. us, gb, de, jp. Reviews are per country.

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

Used only if Apple rate-limits or blocks the direct connection. Datacenter proxy (the default) is included in the price.

## Actor input object example

```json
{
  "showIds": [
    "1200361736"
  ],
  "maxShowsPerSearch": 10,
  "maxShowsPerChart": 25,
  "includeShowDetails": true,
  "maxEpisodesPerShow": 0,
  "maxReviewsPerShow": 0,
  "reviewSort": "recent",
  "anonymizeReviewers": false,
  "country": "us",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "showIds": [
        "1200361736"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("randy-tools/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 = {
    "showIds": ["1200361736"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("randy-tools/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 '{
  "showIds": [
    "1200361736"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call randy-tools/apple-podcasts-scraper --silent --output-dataset

```

## MCP server setup

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