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

Scrape Apple Podcasts: Top Podcasts charts by country (up to 100 ranked shows), podcast search with RSS feed URLs, episode counts and genres, and episode lists with audio links and durations. Export CSV, Excel, JSON, XML. No login or API key. Up to 300 episodes per show.

- **URL**: https://apify.com/recordsdata/apple-podcasts-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** Videos, Lead generation
- **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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3" alt="RecordsData" width="100%" />
</p>

## 🎙️ Apple Podcasts Scraper: Top Charts, Shows & Episodes

> Apple Podcasts Scraper extracts the Top Podcasts chart of any country (up to 100 ranked shows, optional genre), podcast search results with RSS feed URLs and episode counts, and episode lists with release date, duration, audio link, GUID and explicit flag. Optional RSS feed reading adds language, website, episode and season numbers (when published) and show notes. Export CSV, Excel, JSON or XML. No login, no API key. Only-new mode returns just what is new. From $0.010 per row, failed or empty requests are never charged.

Apple Podcasts Scraper reads Apple's public chart, search and lookup services and, optionally, each show's RSS feed. Version 0.1.10 was verified in the cloud on 2026-10-09.

### 🎯 What does Apple Podcasts Scraper do?

- Get the **Apple Podcasts top charts** for one or many countries in a single run (any storefront code, such as us, gb or mx), optionally for one of 19 genres such as Technology or True Crime.
- **Search podcasts by keyword** (optionally within a genre): RSS feed URL, episode count, genre and content rating for up to 200 shows, or more with search expansion.
- **List podcast episodes** from a podcast ID or Apple URL: title, date, duration, description, audio URL, GUID and explicit flag, up to 300 per show.
- **Read the show's RSS feed** (`includeFeedDetails`, free): language, website, author, episode and season numbers, audio size, show notes.
- **Monitor mode** (`onlyNew`): scheduled runs return only rows not delivered before; skipped rows are free.
- **Export** as CSV, Excel, JSON or XML; one `maxItems` limit caps all modes.

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

The dataset has 42 columns across three row types; columns that do not apply are left out.

| Field | Chart row | Search row | Episode row |
|---|---|---|---|
| recordType, podcastId, url, scrapedAt | yes | yes | yes |
| country, rank | yes | country only | no |
| name / podcastName | yes | yes | yes |
| publisher | yes | yes | no |
| genres | yes | yes | yes |
| feedUrl (RSS), episodeCount, primaryGenre, contentRating, latestEpisodeDate | no | yes | no |
| explicit | no | yes | yes |
| episodeId, guid, title, releaseDate, durationMinutes | no | no | yes |
| description, audioUrl, contentType, fileExtension, closedCaptioning | no | no | yes |
| artworkUrl | yes | yes | no |

With `includeFeedDetails` or `episodeSource: rss`, these columns are added when the feed has them:

- Show rows: language, websiteUrl, author, ownerName, showType, feedCategories, copyright.
- Episode rows: episodeNumber, seasonNumber, episodeType, audioSizeBytes, showNotes (up to 4,000 characters).

Episode and season numbers exist only when the show's feed publishes them. Missing Apple values are marked `Not Disclosed`, `Not Available` or `Not Rated`; `genres` is left out when Apple lists none.

### 📊 Sample output of the Apple Podcasts chart export

Real rows from 2026-10-03. Chart type, US storefront:

```json
{
  "recordType": "chart",
  "country": "us",
  "rank": 1,
  "podcastId": "1200361736",
  "name": "The Daily",
  "publisher": "The New York Times",
  "genres": ["News"],
  "url": "https://podcasts.apple.com/us/podcast/the-daily/id1200361736",
  "scrapedAt": "2026-10-04T04:10:26.756Z"
}
```

Episode row (audio link shortened):

```json
{
  "recordType": "episode",
  "podcastId": "1322200189",
  "podcastName": "Crime Junkie",
  "episodeId": "1000791290981",
  "title": "MURDERED: Dorothy “Toby” Tate",
  "releaseDate": "2026-09-28T07:00:00Z",
  "durationMinutes": 38,
  "audioUrl": "https://tracking.swap.fm/track/.../audio/128/default.mp3?aid=rss_feed",
  "genres": ["True Crime"],
  "scrapedAt": "2026-10-04T04:24:31.709Z"
}
```

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

The actor uses pay-per-event pricing. You pay only for rows delivered to your dataset. Prices below are for the free Apify plan; chart rows drop to $0.012 on the highest paid tiers. Podcast and episode rows are $0.010 on every tier.

| Event | Price per row (free plan) | Per 1,000 rows |
|---|---|---|
| Chart row (ranked show from a country chart) | $0.015 | $15.00 |
| Podcast record (search result with feed URL) | $0.010 | $10.00 |
| Episode record (one episode with audio link) | $0.010 | $10.00 |

Worked example: 1,000 podcast or episode rows cost $10.00 on the free plan, 1,000 chart rows $15.00, and three country charts of 100 shows each (300 chart rows) $4.50. RSS feed reading, genre filters and search expansion add no billed event.

With `onlyNew` on, rows already delivered in an earlier run are skipped and not charged, so a repeat run with nothing new costs $0. Error rows, "podcast not found" rows and empty searches are never charged. The run respects your `maxTotalChargeUsd` and stops cleanly at that limit.

### 🚀 How to scrape Apple Podcasts (3 steps)

1. Open the actor and click **Try for free**.
2. Choose what you want: chart countries and size, a search keyword, and/or podcast IDs or Apple URLs for episodes.
3. Click **Start**, then download the dataset as CSV, Excel, JSON or XML.

### ⚙️ Input

| Field | Type | Default | What it does |
|---|---|---|---|
| includeTopCharts | boolean | true | Scrape the Top Podcasts chart per country |
| chartCountries | array | \["us"] | Two-letter storefront codes |
| chartSize | integer | 50 | Shows per chart, 1 to 100 |
| genre | string | empty (any) | One of 19 Apple genres, applied to charts and search |
| searchQuery | string | empty | Keyword search, up to 200 shows |
| searchCountry | string | US | Storefront used for search |
| expandSearch | boolean | false | Also search the query plus a to z, merged without duplicates |
| podcastIds | array | empty | IDs or Apple URLs for episode lists |
| maxEpisodesPerPodcast | integer | 100 | Episodes per show, 1 to 300 |
| includeFeedDetails | boolean | false | Read each show's RSS feed (first 30 shows for search) |
| episodeSource | string | apple | `apple` or `rss` (show's own feed; falls back to Apple data if unreadable) |
| maxItems | integer | 10 | Total row cap across all modes |
| onlyNew | boolean | false | Return only rows not delivered before |
| stateKey | string | empty | Monitor name for independent monitors |
| resetSeen | boolean | false | Clear seen rows before the run |

Example input:

```json
{
  "includeTopCharts": true,
  "chartCountries": ["us", "gb", "mx"],
  "chartSize": 100,
  "genre": "1488",
  "searchQuery": "true crime",
  "podcastIds": ["1200361736"],
  "maxItems": 500
}
```

### 📦 Output

Each row is tagged with `recordType` (`chart`, `podcast` or `episode`). A search with no matches finishes as SUCCEEDED and charges nothing. An invalid country code or unknown podcast ID produces an uncharged error row.

### ⚖️ Apple Podcasts scraper vs alternatives

Competitor features and prices read on 2026-10-09.

| Capability | This actor | sourabhbgp Apple Podcast Scraper | automation-lab podcast-scraper |
|---|---|---|---|
| Charts, countries | Several countries per run, 100 per chart | Several countries and genres, up to 200 | Not offered |
| Search and episodes | Both, in one dataset | Both, among ten modes | Both, plus show details |
| RSS episode depth | RSS mode, input cap 300 per show | From feed, no cap stated | Up to 5,000 per show |
| Episode fields | GUID, numbers, explicit, language (feed) | GUID, numbers, explicit, language | GUID, episode number, full notes |
| Genre filter | One of 19 genres | Genre lists | None |
| Only-new filter | Yes, skipped rows free | Rank-change labels only | No |
| Fields | 42 columns, three row types | Not stated | 18 episode, 15 show |
| Price per 1,000 | $10 shows and episodes, $15 charts | $3 | From $0.30 header; README $0.50 per episode |

On price and breadth we do not lead. sourabhbgp is cheaper and has more modes, including multi-genre charts up to 200 entries, and automation-lab reads RSS archives up to 5,000 episodes. Also read the same day: webdatatools/podcast-lookup ($0.001 per row, no charts) and logiover (from $1.75, no charts). What we offer is monitor mode that returns and bills only new rows, plus charts, search, episodes and feed details in one actor, with errors and empty runs free.

### 💡 Use cases

Chart monitoring, ad planning and PR shortlists, and seeding podcast apps with feeds and audio links.

### 🔌 Run Apple Podcasts Scraper via API, schedule and integrations

```bash
curl -X POST "https://api.apify.com/v2/acts/RecordsData~apple-podcasts-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"includeTopCharts": true, "chartCountries": ["us"], "chartSize": 10, "maxItems": 10}'
```

Schedule runs and connect the dataset to Zapier, Make, n8n or Google Sheets.

### 🤖 Apple Podcasts Scraper MCP server for AI agents

AI agents can call this Actor through the Apify MCP server at `https://mcp.apify.com?tools=RecordsData/apple-podcasts-scraper`.

Add this to your MCP client configuration (Claude Desktop, Cursor, VS Code):

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=RecordsData/apple-podcasts-scraper"
    }
  }
}
```

Example agent prompt:

> Use the Apple Podcasts Scraper to get the top 20 podcasts in the US and the UK, then search for "true crime" and list the RSS feed URL and latest episode date of the first 5 shows.

Choose this Actor for ranked charts, podcast RSS feed URLs or episode lists with audio links. It returns one dataset row per chart entry, show or episode. Tool description: scrape Apple Podcasts charts by country and genre, keyword search, and episode lists with audio links, GUID and explicit flag; optional RSS feed details add language, website and episode numbers.

### 🛡️ Is it legal to scrape Apple Podcasts?

The actor reads Apple's public chart, search and lookup services at about one request per second, with no login. Podcast content belongs to its publishers; respect their terms.

### ❓ Frequently asked questions

#### Which countries work for Apple Podcasts charts?

Apple Podcasts Scraper accepts any Apple Podcasts storefront code, such as us, gb, mx, es, br, de, fr or jp, in the chartCountries input. You can list several countries in one run, and each Top Podcasts chart returns up to 100 ranked shows. An invalid country code produces an uncharged error row instead of a failed run.

#### How do I find an Apple Podcasts ID?

The Apple Podcasts ID is the number after "id" in any Apple Podcasts URL, for example 1200361736 in the page for The Daily. You can also skip the manual step: Apple Podcasts Scraper chart and search rows already include a podcastId field, which you can paste into the podcastIds input.

#### How many episodes can I scrape per podcast?

Apple Podcasts Scraper returns up to 300 of the most recent episodes per show, set with the maxEpisodesPerPodcast input (1 to 300, default 100). The input accepts at most 300 in RSS mode as well. Each episode row has the title, release date, duration in minutes, description, GUID, explicit flag and a direct audio URL.

#### Do I need an Apple API key or login to scrape Apple Podcasts?

No. Apple Podcasts Scraper reads Apple's public chart feed and the public iTunes search and lookup services, so it needs no Apple API key, developer account or login. You only need an Apify account to run it, with no key to request and no sign-up with Apple.

#### How do I get the RSS feed URL of a podcast?

Use the search mode of Apple Podcasts Scraper by filling the searchQuery input with a keyword. Each search row (recordType podcast) includes the feedUrl field with the show's RSS feed, plus episodeCount, primaryGenre, contentRating and the latest episode date, for up to 200 shows per search.

#### Why did my Apple Podcasts Scraper run return 0 results?

Either the search keyword has no matches in that storefront, or every input was invalid. A genuinely empty search ends as SUCCEEDED with the status "Finished, but no items matched the input" and nothing is charged. If every request fails, the Apple Podcasts Scraper run ends as FAILED with a clear message and no charge.

#### Am I charged for errors or empty results in Apple Podcasts Scraper?

No. Apple Podcasts Scraper never charges for error rows, "podcast not found" rows or empty searches. You pay only for chart, podcast and episode rows actually delivered to your dataset: $0.015 per chart row and $0.010 per podcast or episode row on the free plan. Rows skipped by only-new mode are free. The run also respects your maxTotalChargeUsd limit.

#### Does Apple Podcasts Scraper return episode GUID, episode number and season number?

Yes. Every episode row has the guid (Apple's episodeGuid) and an explicit flag. Episode number, season number and episode type are not in Apple's data, so they come from the show's RSS feed: switch on includeFeedDetails or use episodeSource rss. They appear only when the publisher's feed lists them, and a row without them simply has no such column.

#### How do I get podcast language and website?

Set includeFeedDetails to true. Apple Podcasts Scraper then downloads each show's own RSS feed once and adds language, websiteUrl, author, ownerName and copyright to chart and search rows. For search results the first 30 shows of the run are read. Reading the feed is free and adds no billed event.

#### Can I filter Apple Podcasts charts and search by genre?

Yes. The genre input accepts 19 Apple genres, such as Technology, Comedy, True Crime, News or Business, and applies to both modes. Search uses Apple's genre parameter and charts use its genre chart feed. You pick one genre per run, and leaving it on Any genre returns every genre.

#### How do I get only new podcasts and episodes since my last run?

Turn on onlyNew. Apple Podcasts Scraper remembers every chart entry, show and episode it delivered for the same search in a key-value store named applepodcasts-seen in your account, and skips them next time. Skipped rows are not charged. Use stateKey for separate monitors and resetSeen to start over.

#### Can I get more than 200 search results?

Yes, partly. Apple returns at most 200 shows per query. With expandSearch on, the actor also searches your keyword followed by a to z, one request every 2 seconds, and merges the results without duplicates by podcast id. That adds 26 requests per run. This mode was not run to completion in our tests.

#### Can I try Apple Podcasts Scraper for free?

Yes. Free Apify users get a 10-row preview per Apple Podcasts Scraper run, which is enough to check the chart, search and episode fields before buying anything. Paid Apify plans unlock full runs, limited only by your maxItems and charge limit.

### 🎧 Want more data? Other RecordsData scrapers

- [Hacker News Search Scraper](https://apify.com/RecordsData/hackernews-search-scraper)
- [SEC EDGAR Filings Scraper](https://apify.com/RecordsData/sec-edgar-filings-scraper)
- [Steam Charts Scraper](https://apify.com/RecordsData/steam-charts-scraper)

### 🛟 Support

Open the **Issues** tab on this actor's page or write to contact.punkrecordsdata@gmail.com. Custom solutions available on request.

Last updated: 2026-10-11

# Actor input Schema

## `includeTopCharts` (type: `boolean`):

Set to true to scrape the Apple Podcasts Top Podcasts chart (ranked shows with publisher, genres and Apple URL) for each country in Chart countries.

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

Two-letter Apple storefront country codes for the Top Podcasts charts, for example us, gb, mx, es, br, de, fr, jp. An invalid code returns an error row that is not charged.

## `chartSize` (type: `integer`):

How many ranked shows to return per country chart, from 1 to 100 (Apple's chart limit).

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

Only podcasts of this Apple Podcasts genre, for charts (top podcasts of the genre) and for search results. Leave on Any genre for all.

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

Keyword to search Apple Podcasts shows, for example 'true crime' or 'marketing'. Returns up to 200 shows with RSS feed URLs and episode counts. Leave empty to skip search.

## `searchCountry` (type: `string`):

Two-letter storefront country code used for the podcast search, for example US, GB, MX.

## `expandSearch` (type: `boolean`):

Apple search returns at most 200 podcasts per query. Switch on to also search "<query> a" to "<query> z" (26 more requests, one every 2 seconds) and merge the results without duplicates.

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

Apple podcast IDs or podcast page URLs to list episodes for, for example 1200361736 or https://podcasts.apple.com/us/podcast/the-daily/id1200361736. Leave empty to skip episodes.

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

Maximum number of recent episodes per podcast, from 1 to 5,000. Episode source 'Apple' returns at most 200 per show (Apple's lookup limit); choose episode source 'RSS feed' to go above 300 on long shows. Each episode row is billed, so set Max Items and your max charge to match.

## `includeFeedDetails` (type: `boolean`):

Fetch each show's own RSS feed and add language, website, author, owner, show type, explicit flag, categories, copyright, and per episode the episode number, season number, episode type, audio size and full show notes. One feed download per show (for search results, the first 30 shows of the run).

## `episodeSource` (type: `string`):

Apple returns at most 200 episodes per show. RSS feed reads the show's own feed instead, which has the full archive (up to 5,000 episodes) with show notes and audio size; shows whose feed cannot be read fall back to Apple data.

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

Maximum total rows to return across charts, search and episodes. Free users are limited to 10 rows (preview). Paid users can set up to 1,000,000.

## `onlyNew` (type: `boolean`):

Only new results: skip every chart entry, podcast and episode this same search already returned in an earlier run, so scheduled runs return just what is new and you are not charged for skipped rows. Max Items then means N new rows. Off by default.

## `stateKey` (type: `string`):

Optional label for the monitor state. Use a different label to run several independent monitors with identical filters. Leave empty to share state between runs of the same search.

## `resetSeen` (type: `boolean`):

Clear the stored list of already-seen rows for this search (and Monitor name) before the run starts, so everything counts as new again.

## Actor input object example

```json
{
  "includeTopCharts": true,
  "chartCountries": [
    "us",
    "gb"
  ],
  "chartSize": 50,
  "genre": "",
  "searchQuery": "",
  "searchCountry": "US",
  "expandSearch": false,
  "podcastIds": [],
  "maxEpisodesPerPodcast": 100,
  "includeFeedDetails": false,
  "episodeSource": "apple",
  "maxItems": 10,
  "onlyNew": false,
  "stateKey": "",
  "resetSeen": false
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields per row

## `fullData` (type: `string`):

Complete dataset with all fields

# 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 = {
    "chartCountries": [
        "us",
        "gb"
    ],
    "searchQuery": "",
    "podcastIds": [],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/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 = {
    "chartCountries": [
        "us",
        "gb",
    ],
    "searchQuery": "",
    "podcastIds": [],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/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 '{
  "chartCountries": [
    "us",
    "gb"
  ],
  "searchQuery": "",
  "podcastIds": [],
  "maxItems": 10
}' |
apify call recordsdata/apple-podcasts-scraper --silent --output-dataset

```

## MCP server setup

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