# Apple Podcasts Scraper: Shows, Episodes, Ratings & Top Charts (`uber_byte/apple-podcasts-scraper`) Actor

Scrape Apple Podcasts: search shows, top charts by country, ratings, genres, RSS feed URLs and full episode lists with dates, durations, descriptions and audio URLs.

- **URL**: https://apify.com/uber\_byte/apple-podcasts-scraper.md
- **Developed by:** [Marlon Lee](https://apify.com/uber_byte) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 podcasts

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

Apple Podcasts Scraper collects podcast shows and episodes from Apple Podcasts: search by keyword, pull the Apple Podcasts top charts for any country or category, or look up shows by URL or ID. You get each show's star rating and 1 to 5 star breakdown, genres, RSS feed URL and artwork, plus its newest episodes with dates, durations, descriptions and audio URLs. Built for chart tracking, podcast advertising research and transcription pipelines. No login, no API key.

### What you get

**Podcast rows** (`type: "podcast"`):

- Apple podcast ID, title, artist and artist ID, Apple Podcasts URL, RSS feed URL, artwork
- Primary genre, genres and genre IDs, Apple's episode count, latest release date, explicit flag, content advisory rating, store country
- **Ratings:** average stars, number of ratings and the 5/4/3/2/1 star breakdown from the show's Apple Podcasts page
- **From the RSS feed:** description, language, website, copyright, feed author, feed type (episodic or serial), categories and the number of episodes the feed lists
- **Source:** chart country, chart genre and chart position, or the search term and position that found the show, so you can track rankings over time

**Episode rows** (`type: "episode"`), newest first:

- Podcast ID, podcast title and artist, episode GUID, title, publish date, duration in seconds
- Description (HTML cleaned to plain text), audio URL, file type and size
- Season and episode number, episode type, explicit flag, episode link and image

### Use cases

- **Podcast chart tracking:** snapshot the top charts per country or category every day.
- **Advertisers and agencies:** find shows by topic and compare ratings and publishing cadence.
- **Podcast directories and analytics:** build a database of shows with feeds and episode metadata.
- **Transcription and AI pipelines:** get direct audio URLs to transcribe or summarize episodes.
- **Competitor research for podcasters:** see how often similar shows publish and how long their episodes run.

### How to use

1. Open the Actor in Apify Console.
2. Add **Search terms**, Apple Podcasts **show URLs or IDs**, and/or **Top chart countries** such as `us` or `gb`. For a category chart, add a **Chart genre ID**.
3. Set the store country for search and lookups, the max podcasts per search or chart, and whether to include episodes and ratings.
4. Set **Max results** to cap the total number of podcasts plus episodes.
5. Click **Start**. Download the results as JSON, CSV or Excel, or read them through the Apify API.

### Input example

```json
{
  "searchTerms": ["true crime", "history"],
  "podcastUrls": ["https://podcasts.apple.com/us/podcast/dan-carlins-hardcore-history/id173001861"],
  "chartCountries": ["us", "gb"],
  "chartGenreId": "",
  "country": "us",
  "maxResultsPerSource": 20,
  "includeEpisodes": true,
  "maxEpisodesPerPodcast": 20,
  "includeRatings": true,
  "maxItems": 500
}
```

Chart genre IDs include 1301 Arts, 1303 Comedy, 1304 Education, 1321 Business, 1487 History, 1488 True Crime, 1489 News and 1545 Sports. Any Apple Podcasts genre ID works.

### Output example

```json
{
  "type": "podcast",
  "podcastId": 1322200189,
  "title": "Crime Junkie",
  "artist": "Audiochuck",
  "artistId": 1485045052,
  "url": "https://podcasts.apple.com/us/podcast/crime-junkie/id1322200189",
  "feedUrl": "https://feeds.simplecast.com/qm_9xx0g",
  "primaryGenre": "True Crime",
  "genres": ["True Crime"],
  "genreIds": ["1488"],
  "episodeCount": 531,
  "latestReleaseDate": "2026-09-28T07:00:00Z",
  "explicit": false,
  "contentAdvisoryRating": "Clean",
  "country": "USA",
  "artworkUrl": "https://is1-ssl.mzstatic.com/image/thumb/Podcasts126/v4/8c/35/04/8c350430-2fbf-98d0-0a25-00b76550ffeb/mza_13445204151221888086.jpg/600x600bb.jpg",
  "chartCountry": "us",
  "chartGenreId": null,
  "chartPosition": 2,
  "rating": { "average": 4.7, "count": 365253, "histogram": { "1": 14712, "2": 5104, "3": 7355, "4": 11851, "5": 326231 } },
  "description": "Does hearing about a true crime case always leave you scouring the internet for the truth behind the story? …",
  "language": "en",
  "website": "https://audiochuck.com",
  "copyright": "Audio Chuck LLC",
  "feedAuthor": "Audiochuck",
  "feedType": "episodic",
  "categories": ["True Crime"],
  "feedEpisodeCount": 531
}
```

```json
{
  "type": "episode",
  "podcastId": 173001861,
  "podcastTitle": "Dan Carlin's Hardcore History",
  "artist": "Dan Carlin",
  "guid": "http://traffic.libsyn.com/dancarlinhh/dchha74_Mania_for_Subjugation_IV.mp3",
  "title": "Show 74 - Mania for Subjugation IV",
  "publishedAt": "2026-07-31T18:02:23.000Z",
  "durationSeconds": 14480,
  "description": "The stage is set for an in-person showdown between Alexander and Persia's Great King. …",
  "audioUrl": "https://dts.podtrac.com/redirect.mp3/traffic.libsyn.com/dancarlinhh/dchha74_Mania_for_Subjugation_IV.mp3",
  "audioType": "audio/mpeg",
  "audioBytes": 179177054,
  "episodeNumber": 74,
  "season": null,
  "episodeType": null,
  "explicit": false,
  "link": "http://www.dancarlin.com/product/hardcore-history-74-mania-for-subjugation-iv",
  "imageUrl": "https://static.libsyn.com/p/assets/8/2/6/b/826bd177b9d9350516c3140a3186d450/dchha74-Mania-for-Subjugation-square-3000x3000.jpg"
}
```

### Pricing

You pay per result saved: each `podcast` row and each `episode` row. Error rows cost nothing. To pay for shows only, set `includeEpisodes` to `false`. Cap results with **Max results**, or set a maximum cost per run in Apify Console and the Actor stops cleanly when it reaches that limit.

### FAQ

**Is it legal to scrape Apple Podcasts?** The Actor uses Apple's public iTunes Search and Lookup APIs, Apple's public top-chart feeds, each show's public Apple Podcasts page (for ratings) and the show's own public RSS feed (for episodes). It skips the owner and editor email fields in RSS feeds. You are responsible for using the data in line with Apple's terms, publishers' rights and the laws that apply to you.

**Do I need a proxy?** A datacenter proxy is enough. The default Apify Proxy spreads iTunes API rate limits across IPs, and the Actor keeps its request rate under Apple's throttling.

**How many shows can I get?** The overall top chart returns at most 100 shows per country, and category charts up to 200. iTunes search returns at most 200 shows per term.

**How many episodes per show?** Up to **Max episodes per podcast**, newest first, from the publisher's RSS feed. If the feed is unreachable or empty, the Actor falls back to Apple's episode lookup, which returns at most the latest 200 episodes and fewer fields.

**Why does `episodeCount` differ from `feedEpisodeCount`?** `episodeCount` is Apple's count. `feedEpisodeCount` is how many episodes the RSS feed lists right now. Some publishers keep only recent episodes in the feed, and some hide older ones from Apple.

**Does it collect written reviews?** No. You get the star rating, rating count and star breakdown only.

**Why is `rating` missing for some shows?** Ratings come from Apple's web page, and Apple doesn't show them for some new shows or in some stores.

# Actor input Schema

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

Keywords to search Apple Podcasts for, e.g. "true crime" or a show name.

## `podcastUrls` (type: `array`):

Apple Podcasts show links (https://podcasts.apple.com/us/podcast/.../id173001861) or numeric IDs.

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

Two-letter country codes whose Top Podcasts chart to scrape, e.g. us, gb, de.

## `chartGenreId` (type: `string`):

Optional Apple genre ID to get a category chart instead of the overall chart, e.g. 1487 History, 1489 News, 1488 True Crime, 1303 Comedy, 1304 Education, 1321 Business.

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

Two-letter store country for search and lookups.

## `maxResultsPerSource` (type: `integer`):

Max podcasts per search term / chart.

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

Read each show's RSS feed and save its episodes.

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

Newest episodes first, as listed in the RSS feed.

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

Read the average rating, rating count and star breakdown from the show's Apple Podcasts page (one extra request per show).

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

Total podcasts + episodes to save. Each one is a billable result.

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

Datacenter proxy is enough; it spreads iTunes API rate limits across IPs.

## Actor input object example

```json
{
  "searchTerms": [
    "history"
  ],
  "country": "us",
  "maxResultsPerSource": 20,
  "includeEpisodes": true,
  "maxEpisodesPerPodcast": 20,
  "includeRatings": true,
  "maxItems": 200,
  "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 = {
    "searchTerms": [
        "history"
    ]
};

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

# Run the Actor and wait for it to finish
run = client.actor("uber_byte/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": [
    "history"
  ]
}' |
apify call uber_byte/apple-podcasts-scraper --silent --output-dataset

```

## MCP server setup

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