# Apple Podcasts Scraper – Search, Top Charts & Episodes (`pinkish_armada/apple-podcasts-scraper`) Actor

Apple Podcasts data from Apple's official public API and each show's RSS feed: podcast details by URL or ID, keyword search with ranks, top charts by country and genre, episodes with new-episode alerts, plus active status, publishing frequency and website. $1 per 1k shows.

- **URL**: https://apify.com/pinkish_armada/apple-podcasts-scraper.md
- **Developed by:** [Phuc Tiet](https://apify.com/pinkish_armada) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 podcast with details

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 – Search, Top Charts, Episodes & Active Shows

Get **Apple Podcasts data** as clean JSON, CSV or Excel: **podcast details** by URL or ID, **keyword search** with Apple's ranking, **top podcast charts** for any country and genre, and **episodes** (title, date, duration, audio URL, season/episode, description) with a **monitor mode** that returns only new episodes.

Every show also gets **feed stats** at no extra cost: website, language, categories, episode count, latest and first episode date, days since the last episode, **publishing frequency** (daily / weekly / monthly...), average episode length, and an **isActive** flag. That makes it easy to build a list of *active* shows in a niche for guest booking, sponsorship or market research, without checking each show by hand.

Data comes only from **Apple's official public endpoints** (iTunes Search/Lookup API, Apple's top-podcasts RSS) and each show's **public RSS feed**, the same feed podcast apps read. No login, no proxies, no browser. You **only pay for rows you get**: errors and shows that don't exist are free.

### What can I use it for?

- **Podcast guest booking and PR:** find active shows about "SaaS marketing" or "true crime" that publish weekly, with their website.
- **Sponsorship and ad sales research:** top shows per country and genre, how often they publish, how long episodes are.
- **Market research and competitor tracking:** who ranks for your keywords in Apple Podcasts in the US, UK and Australia.
- **New-episode alerts:** schedule a daily run that returns only episodes published since the last run (Slack, email, webhook, Sheets).
- **Transcription and AI pipelines:** get the audio URLs, then transcribe them with our Audio & Video Transcriber.
- **Podcast SEO:** track your show's search rank for target keywords over time.

### How much does it cost?

Pay per result, no monthly fee:

| Row | Price | Per 1,000 |
|---|---|---|
| Podcast (details + feed stats, from a URL/ID, a search or a chart) | $0.001 | $1.00 |
| Episode | $0.0002 | $0.20 |

Plus a tiny run-start fee ($0.00005). Examples: the top 100 podcasts in 5 countries with active status is $0.50; 50 shows found for 10 keywords is $0.50; the last 20 episodes of 100 shows is $0.40; a daily new-episode monitor for 20 shows costs cents per month. Errors are free.

### Input

| Field | What it does |
|---|---|
| `podcasts` | Apple Podcasts links (`https://podcasts.apple.com/us/podcast/the-daily/id1200361736`) or IDs (`1200361736`) |
| `searchTerms` | Keywords; each result has its `rank` |
| `topCharts` | `true` to download Apple's Top Podcasts chart per country |
| `chartGenreId` | Optional genre, e.g. `1488` True Crime, `1318` Technology, `1321` Business, `1303` Comedy, `1489` News |
| `chartLimit` | Top 1–200 |
| `countries` | Two-letter storefront codes, default `["us"]` |
| `maxSearchResults` | Up to 200 per keyword and country |
| `includeFeedStats` | Website, cadence, active flag (default on, free) |
| `activeWithinDays` | Days since the last episode that still count as active (default 60) |
| `includeEpisodes` | Return episodes for the shows in `podcasts` |
| `maxEpisodesPerPodcast` | Newest first, up to 10,000 |
| `episodesSince` | `2026-09-01` or `7 days` |
| `onlyNewEpisodes` | Monitor mode: only episodes not returned before |
| `episodesForSearchAndCharts` | Also return episodes for search/chart results |

Example: active business podcasts in the US and UK, plus the last 10 episodes of two shows:

```json
{
  "searchTerms": ["b2b saas marketing", "startup founders"],
  "countries": ["us", "gb"],
  "maxSearchResults": 50,
  "podcasts": ["https://podcasts.apple.com/us/podcast/acquired/id1050462261", "1200361736"],
  "includeEpisodes": true,
  "maxEpisodesPerPodcast": 10
}
```

Then filter the dataset on `isActive = true`.

### Output

Every row has a `type`: `podcast`, `episode` or `error`. Dataset views: **Podcasts**, **Episodes**, **Errors**. A run summary is saved as `OUTPUT`.

Podcast:

```json
{
  "type": "podcast", "source": "lookup", "podcastId": "1322200189", "name": "Crime Junkie",
  "publisher": "Audiochuck", "country": "us", "url": "https://podcasts.apple.com/us/podcast/crime-junkie/id1322200189",
  "feedUrl": "https://feeds.simplecast.com/qm_9xx0g", "primaryGenre": "True Crime", "genres": ["True Crime"],
  "explicit": false, "episodeCountApple": 533, "latestReleaseDate": "2026-10-12T07:00:00Z",
  "website": "https://audiochuck.com", "language": "en", "feedType": "episodic", "feedCategories": ["True Crime"],
  "feedEpisodeCount": 533, "latestEpisodeAt": "2026-10-12T07:00:00.000Z", "firstEpisodeAt": "2017-12-18T00:01:00.000Z",
  "daysSinceLastEpisode": 3, "avgDaysBetweenEpisodes": 6.3, "publishingFrequency": "weekly", "avgEpisodeMinutes": 50.8,
  "episodesLast30Days": 4, "episodesLast90Days": 15, "isActive": true, "feedStatus": "ok"
}
```

Episode:

```json
{
  "type": "episode", "podcastId": "1200361736", "podcastName": "The Daily", "publisher": "The New York Times",
  "title": "The Republican Strategy to Salvage the Midterms", "publishedAt": "2026-10-15T09:52:16.000Z",
  "durationSecs": 2030, "audioUrl": "https://dts.podtrac.com/redirect.mp3/...", "audioType": "audio/mpeg",
  "audioBytes": 32490640, "season": null, "episodeNumber": null, "episodeType": "full",
  "guid": "db93ab61-641a-4cb8-9067-6b5498c8b8d5", "link": "https://www.nytimes.com/the-daily", "description": "..."
}
```

### Monitoring new episodes on a schedule

1. Add shows to `podcasts`, set `includeEpisodes: true` and `onlyNewEpisodes: true`.
2. Create a **Schedule** in Apify Console (e.g. every morning).
3. Add an **integration** (Slack, email, webhook, Google Sheets, Make, Zapier, n8n) on "Run succeeded".

The first monitor run returns the newest episodes (up to `maxEpisodesPerPodcast`) and remembers the whole feed, so later runs return only new ones. Use a different `stateStoreName` per monitor.

### Use it from code or AI agents

```bash
curl -X POST "https://api.apify.com/v2/acts/pinkish_armada~apple-podcasts-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["true crime"],"countries":["us"],"maxSearchResults":10}'
```

Works with the Apify JavaScript/Python clients, Make, Zapier, n8n, and as a tool in the **Apify MCP server** (`https://mcp.apify.com?tools=pinkish_armada/apple-podcasts-scraper`) for Claude, Cursor, ChatGPT and other MCP clients.

### FAQ

**How much does it cost to scrape Apple Podcasts?** $1 per 1,000 podcasts (feed stats included) and $0.20 per 1,000 episodes. Failed lookups are free.

**Where does the data come from?** Apple's official public iTunes Search/Lookup API and top-podcasts RSS, plus each show's own public RSS feed. No login, no private data, no anti-bot workarounds.

**Does it return host or owner email addresses?** No. Feed owner e-mails are personal data, so the Actor deliberately doesn't extract them. You get the show's public website instead.

**Does it include ratings and reviews?** Apple doesn't expose podcast ratings or reviews through its public APIs, so no.

**Why are some shows missing episodes?** Apple-exclusive or subscription-only shows have no public RSS feed (`NO_PUBLIC_FEED`, free). Some publishers keep only recent episodes in their feed.

**Why is the feed episode count lower than Apple's?** Publishers often trim old episodes from the RSS feed; `episodeCountApple` is Apple's own count.

**Does it work for Spotify?** No, Apple Podcasts only (most shows are on both, and the RSS feed is the same).

**Is it legal?** The data is public and published by Apple and the shows for discovery by apps. Respect Apple's and publishers' terms; don't republish full episode descriptions or audio as your own content.

### Related Actors

- **Audio & Video Transcriber**: turn the `audioUrl`s into text, SRT or VTT
- **Apple App Store Scraper**: app details, reviews, keyword ranks and charts
- **RSS Feed Reader & Monitor**: monitor any blog or news feed

### Support

Something missing or wrong? Open an issue on the **Issues** tab with your input. Fixes usually ship within a day.

# Actor input Schema

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

Apple Podcasts show links (https://podcasts.apple.com/us/podcast/the-daily/id1200361736) or numeric IDs (1200361736). Returns one podcast row per show and country.

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

Find podcasts by keyword (topic, niche, name). Each result has its Apple search rank, so you can also track podcast SEO over time.

## `topCharts` (type: `boolean`):

Download Apple's Top Podcasts chart for every country (optionally one genre below).

## `countries` (type: `array`):

Two-letter Apple storefront codes (us, gb, au, ca, de...). Lookups, searches and charts run per country. Default: us.

## `maxSearchResults` (type: `integer`):

Up to 200 podcasts per keyword and country.

## `includeFeedStats` (type: `boolean`):

Read each show's public RSS feed to add website, language, categories, episode count, latest/first episode date, days since last episode, publishing frequency, average episode length and an isActive flag. No extra charge.

## `activeWithinDays` (type: `integer`):

A show is isActive if its latest episode is newer than this.

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

Return episode rows (title, date, duration, audio URL, season/episode, description) from the show's public RSS feed for the podcasts you listed above.

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

Newest first. Up to 10,000 (whole back catalogue if the feed has it).

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

Only episodes on/after this date: 2026-09-01 or a relative value like 7 days, 2 weeks, 3 months.

## `onlyNewEpisodes` (type: `boolean`):

Return only episodes not seen in earlier runs (state kept in a named key-value store in your account). Schedule it daily for new-episode alerts.

## `stateStoreName` (type: `string`):

Use a different name per monitor. Default: apple-podcasts-scraper-state.

## `episodesForSearchAndCharts` (type: `boolean`):

Off by default to keep runs small; when on, every search/chart show also returns its episodes.

## `chartLimit` (type: `integer`):

Top 1–200 shows per country.

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

Optional Apple Podcasts genre ID, e.g. 1488 True Crime, 1318 Technology, 1321 Business, 1303 Comedy, 1489 News, 1545 Sports, 1512 Health & Fitness, 1304 Education. Empty = all podcasts.

## `descriptionMaxChars` (type: `integer`):

Episode and show descriptions are cut to this many characters (0 = no limit).

## `maxFeedSizeMb` (type: `integer`):

Very large feeds above this are skipped with a free error row.

## Actor input object example

```json
{
  "podcasts": [
    "https://podcasts.apple.com/us/podcast/crime-junkie/id1322200189"
  ],
  "searchTerms": [
    "true crime"
  ],
  "topCharts": false,
  "countries": [
    "us"
  ],
  "maxSearchResults": 10,
  "includeFeedStats": true,
  "activeWithinDays": 60,
  "includeEpisodes": false,
  "maxEpisodesPerPodcast": 5,
  "onlyNewEpisodes": false,
  "episodesForSearchAndCharts": false,
  "chartLimit": 100,
  "descriptionMaxChars": 1500,
  "maxFeedSizeMb": 25
}
```

# Actor output Schema

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

Podcast details with feed stats.

## `episodes` (type: `string`):

Episode rows.

## `allFields` (type: `string`):

Every row with every field.

## `summary` (type: `string`):

Counts, searches, charts and errors.

# 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/crime-junkie/id1322200189"
    ],
    "searchTerms": [
        "true crime"
    ],
    "countries": [
        "us"
    ],
    "maxSearchResults": 10,
    "maxEpisodesPerPodcast": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("pinkish_armada/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 = {
    "podcasts": ["https://podcasts.apple.com/us/podcast/crime-junkie/id1322200189"],
    "searchTerms": ["true crime"],
    "countries": ["us"],
    "maxSearchResults": 10,
    "maxEpisodesPerPodcast": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("pinkish_armada/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 '{
  "podcasts": [
    "https://podcasts.apple.com/us/podcast/crime-junkie/id1322200189"
  ],
  "searchTerms": [
    "true crime"
  ],
  "countries": [
    "us"
  ],
  "maxSearchResults": 10,
  "maxEpisodesPerPodcast": 5
}' |
apify call pinkish_armada/apple-podcasts-scraper --silent --output-dataset

```

## MCP server setup

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