# Apple Podcasts Scraper — Shows, Episodes, Charts & Ratings (`highbrow_fame/apple-podcasts-shows-episodes`) Actor

Apple Podcasts shows by link, search or top chart (any country and genre) with rating, publisher, genres and feed, plus their episodes with audio links. No login.

- **URL**: https://apify.com/highbrow_fame/apple-podcasts-shows-episodes.md
- **Developed by:** [yestrue](https://apify.com/highbrow_fame) (community)
- **Categories:** Other, 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 & Ratings

Get Apple Podcasts shows — by link, id, search word or top chart of any country and genre — with their star rating, number of ratings, publisher, genres, episode count, RSS feed and description. Switch on episodes and get every show's newest episodes with title, date, duration, description and the audio file link — or its whole back catalogue. Or search single episodes by topic, guest or brand. No login, no browser, no API key.

**Why this one**

- 🏆 **Top charts of every country and genre.** Pick `us`, `gb`, `de`… and any of Apple's 110 genres and sub-genres (History, True Crime, Sports › Soccer…): each chart delivers its top 200 shows with their rank. A live run read the GB News and GB True Crime charts, a search and a show — 501 shows with ratings and 4,338 episodes in 106 seconds.
- ⭐ **Ratings included.** Every show comes with its star rating and number of ratings in the store you choose (The Daily: 4.3 from 105,750 ratings in the US store) — Apple's search API does not give them.
- 📚 **The whole back catalogue.** Apple lists at most 200 episodes of a show; this Actor reads the rest from the show's own RSS feed. A live run delivered all 2,756 Joe Rogan Experience episodes, back to December 2009, in 79 seconds.
- 🆕 **Really the newest episodes.** Apple lists serial shows oldest first, so its 200 can be the oldest 200: for the American Revolution Podcast, Apple's list ends in May 2025. This Actor sorts by date and takes the newest from the feed — in a live run, its six episodes of the last two weeks.
- 🔒 **No personal data.** Phone numbers, e-mail addresses, contact persons' names and fan-mail boxes are taken out of every description: 1,074 e-mail addresses and 534 phone numbers in a 4,849-record run. Listener reviews and their names are not collected.
- 💸 **You pay only for what is delivered.** An unknown show, a search with no results or a show without episodes comes back as a free record with the reason.

### What you get

Every row has a `recordType`: `podcast` or `episode`.

**Podcasts**

| Field | What it is |
|---|---|
| `podcastId`, `name`, `url` | the show on Apple Podcasts |
| `publisher` | who publishes it, as Apple shows it |
| `rating`, `ratingCount`, `description` | star rating, number of ratings and the show description in the chosen store (with **Add rating and description**) |
| `primaryGenre`, `genres`, `genreIds` | Apple's genres |
| `episodeCount`, `latestReleaseDate` | episodes on Apple, and Apple's latest release date (can be a scheduled episode a few weeks ahead) |
| `explicit`, `contentRating` | explicit or clean |
| `feedUrl`, `artwork` | the public RSS feed and the 600×600 cover |
| `input`, `inputType`, `chart`, `position`, `storeCountry` | where it came from; for charts and searches, its rank |

**Episodes**

| Field | What it is |
|---|---|
| `episodeId`, `title`, `url` | the episode on Apple Podcasts (`episodeId` and `url` are empty for older episodes read from the feed) |
| `podcastId`, `podcastName` | its show |
| `releaseDate`, `durationSec` | when it came out and how long it is |
| `description` | the show notes as plain text |
| `audioUrl`, `mediaType`, `fileExtension` | the audio (or video) file |
| `episodeNumber`, `season`, `episodeType` | from the feed, when the show gives them |
| `contentRating`, `guid`, `artwork`, `source` | `source` is `apple` or `feed` |
| `input`, `inputType`, `position` | where it came from; `position` 1 = newest |

#### Example

Real records from a live run of the prefill input — the US History chart — 25 September 2026 (descriptions shortened, some fields left out):

```json
{
  "recordType": "podcast",
  "input": "us / History",
  "inputType": "chart",
  "chart": "History",
  "position": 2,
  "storeCountry": "us",
  "podcastId": 1537788786,
  "name": "The Rest Is History",
  "publisher": "Goalhanger",
  "primaryGenre": "History",
  "genres": ["History"],
  "episodeCount": 993,
  "explicit": false,
  "feedUrl": "https://feeds.megaphone.fm/GLT4787413333",
  "url": "https://podcasts.apple.com/us/podcast/the-rest-is-history/id1537788786",
  "rating": 4.7,
  "ratingCount": 14090,
  "description": "Take a deep dive into History’s biggest moments with Tom Holland & Dominic Sandbrook.…",
  "status": "OK"
}
```

```json
{
  "recordType": "episode",
  "input": "us / History",
  "position": 1,
  "episodeId": 1000789799724,
  "title": "The Terror: The Reign of Robespierre (Part 2)",
  "podcastId": 1537788786,
  "podcastName": "The Rest Is History",
  "releaseDate": "2026-09-23T23:05:00Z",
  "durationSec": 5410,
  "description": "Where did Maximilien Robespierre come from and what led him to rise from provincial obscurity…",
  "audioUrl": "https://pdst.fm/e/traffic.megaphone.fm/GLT2099451333.mp3",
  "mediaType": "audio",
  "fileExtension": "mp3",
  "url": "https://podcasts.apple.com/us/podcast/the-terror-the-reign-of-robespierre-part-2/id1537788786?i=1000789799724",
  "source": "apple",
  "status": "OK"
}
```

### How to use it

1. Add **Podcasts** (Apple Podcasts links or ids), **Search words**, **Top charts** (countries, and genres if you like) and/or **Episode search words**.
2. Set the **Store country** for the searches and ratings (`us`, `gb`, `de`, `jp`…) and **Max results per search or chart**.
3. For episodes, set **Episodes per podcast** (0 = shows only) and, if you only want recent ones, **Only episodes from the last … days**.
4. Press **Start**, and download the results from the **Output** tab as JSON, CSV or Excel. Filter on `recordType` to separate shows from episodes.

To follow a chart or your favourite shows, save your input as a task and schedule it daily or weekly — with **Only episodes from the last … days** set to 1 or 7 you get just the new episodes.

You can also call it from the Apify API, from Make, Zapier or n8n, or from an AI agent through the Apify MCP server.

### Pricing

You are charged **per podcast** and **per episode** delivered — see the prices on this page. Reading ratings costs nothing extra, only about a second per show. Unknown shows, empty searches and shows without episodes are free. If your run has a **Maximum charge**, the Actor stops cleanly when it is reached.

### FAQ

**Why about 100 shows per search word?** That is what Apple's search gives, whatever the limit. Charts go to 200. For more shows, add more search words, genres or countries.

**Why do some shows have no episodes?** A few shows — Apple Podcasts Subscriptions and Apple-hosted shows, some news shows — have no public feed and Apple lists no episodes for them: in a live run, 7 of 446 shows. They come back as a free `NO_RESULTS` record.

**Why is `episodeId` empty for some episodes?** Apple gives ids for the up to 200 episodes it lists; older ones come from the show's RSS feed, which has its own `guid` but no Apple id.

**Why is a rating missing?** A show with only a few ratings in a store shows no rating there (5 of 501 shows in a live run). Ratings are per store: pick the **Store country** you care about.

**Is this affiliated with Apple?** No. This is an independent tool that reads Apple's public podcast directory and the shows' public RSS feeds.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

# Actor input Schema

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

Apple Podcasts show links (https://podcasts.apple.com/us/podcast/…/id1200361736) or show ids (1200361736). The store in the link is kept.

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

What you would type into the Apple Podcasts search: every show found is delivered, in Apple's order (Apple gives up to about 100 shows per search word).

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

Two-letter store codes (us, gb, de, fr, jp…). Delivers each country's Top Shows chart — up to 200 shows, with their rank — for every genre chosen below.

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

Optional. One chart per country and genre. Leave empty for the all-podcasts chart.

## `episodeSearchTerms` (type: `array`):

Find single episodes about a topic, a guest or a brand across all shows (Apple gives up to about 100 episodes per word).

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

Two-letter code of the Apple Podcasts store for the searches, the ratings and the show links without a store: us, gb, de, jp, hu…

## `maxResultsPerSearch` (type: `integer`):

Stops each search word, chart or episode search after this many results. Charts hold up to 200 shows, searches about 100.

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

Reads the top of every show's page for its star rating, number of ratings and description in the chosen store. Adds about a second per show.

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

Also deliver the newest episodes of every show found (0 = shows only). Apple lists the newest 200; beyond that the episodes are read from the show's RSS feed.

## `episodesFromLastDays` (type: `integer`):

Optional: only episodes published in this many days (7 = last week). Also applies to the episode search. 0 = any date.

## `maxConcurrency` (type: `integer`):

How many searches, charts or shows to work on at the same time.

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

Used only to try again after a network error: the first try goes out directly.

## Actor input object example

```json
{
  "podcasts": [
    "https://podcasts.apple.com/us/podcast/the-daily/id1200361736"
  ],
  "chartCountries": [
    "us"
  ],
  "chartGenres": [
    "1487"
  ],
  "country": "us",
  "maxResultsPerSearch": 30,
  "includeRatings": true,
  "maxEpisodesPerPodcast": 5,
  "episodesFromLastDays": 0,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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"
    ],
    "chartCountries": [
        "us"
    ],
    "chartGenres": [
        "1487"
    ],
    "country": "us",
    "maxResultsPerSearch": 30,
    "maxEpisodesPerPodcast": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/apple-podcasts-shows-episodes").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"],
    "chartCountries": ["us"],
    "chartGenres": ["1487"],
    "country": "us",
    "maxResultsPerSearch": 30,
    "maxEpisodesPerPodcast": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/apple-podcasts-shows-episodes").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"
  ],
  "chartCountries": [
    "us"
  ],
  "chartGenres": [
    "1487"
  ],
  "country": "us",
  "maxResultsPerSearch": 30,
  "maxEpisodesPerPodcast": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/apple-podcasts-shows-episodes --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,highbrow_fame/apple-podcasts-shows-episodes"
        }
    }
}
```

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/Nkg4dECxfhU1wm3Ag/builds/XGUndodp7TsT5HJpq/openapi.json
