# Apple Podcasts Scraper · Search, Charts, Episodes, Reviews (`agentsgearbox/apple-podcasts-scraper`) Actor

Apple Podcasts for any country: search podcasts, daily top charts, full podcast details, episodes with audio links and durations (latest 200 from Apple or the whole archive from the feed), listener reviews with ratings, since-last-run checkpoint. $1.80 per 1,000 podcasts, $0.60 per 1,000 episodes.

- **URL**: https://apify.com/agentsgearbox/apple-podcasts-scraper.md
- **Developed by:** [AgentsGearbox](https://apify.com/agentsgearbox) (community)
- **Categories:** News, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.08 / 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.
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

## Apple Podcasts Scraper

Apple Podcasts as rows, for any country: **search** shows by keyword, read the **daily top charts**, get **full podcast details**
(publisher, genres, artwork, feed URL, episode count, latest release), the **episodes** with description, release date, duration and
**audio file URL** (the latest 200 from Apple in one request, or the whole archive from the show's own feed with season and episode
numbers), and the **listener reviews** with ratings from any storefront. A since-last-run checkpoint turns a daily schedule into a
feed of new episodes. **$1.80 per 1,000 podcasts, $0.60 per 1,000 episodes, $0.20 per 1,000 reviews.** Summaries and errors are free.
The first 25 results each month are free for every account.

### Why this one

| | This actor |
|---|---|
| Four sources, one run | Search, charts, details, episodes and reviews, through the feeds Apple publishes for them: the Search and Lookup API, the charts feed, each show's RSS feed and the reviews feed. No browser, no login, no key. |
| Episodes that pipelines can use | Every episode carries its audio URL, file type, duration in seconds, description, release date and Apple page. `episodeSource: "rss"` reads the show's own feed for the complete archive with season and episode numbers. |
| Any storefront | `countries` runs searches, charts and reviews once per storefront (`us`, `gb`, `de`, `it`, `br`…); reviews differ per country, which matters for international shows. |
| Monitoring | `onlyNewSinceLastRun` remembers the newest episode date per podcast and returns only newer episodes next time. |
| Honest numbers | Apple publishes no aggregate rating for podcasts, so the actor does not invent one; with reviews on, the free `summary` carries the average of the reviews it fetched, per podcast. |
| Price | $0.0018 per podcast, $0.0006 per episode, $0.0002 per review, Apify's default $0.00005 start fee. No platform usage charged on top. |

### What people use it for

- **Transcription and summarisation pipelines**: the audio URLs of this morning's new episodes, straight into Whisper or an LLM.
- **Podcast PR and guest booking**: shows by topic and country, with publisher, size, latest release and feed.
- **Chart tracking**: the top 200 in several countries every day, with positions, into a sheet.
- **Listener sentiment**: reviews and ratings of competing shows across storefronts.
- **AI agents**: "find podcasts about X and their latest episodes" as structured data through the Apify MCP server.

### Example tasks

Ready-made configurations you can open, copy and run as they are:

- [New episodes of the podcasts you follow, daily, with audio](https://apify.com/agentsgearbox/apple-podcasts-scraper/examples/new-episodes-of-podcasts-you-follow): two shows checked daily for new episodes with the checkpoint on.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | array | – | Podcast searches, one per line. |
| `podcasts` | array | `[]` | Apple IDs (`1434243584`) or Apple Podcasts URLs. |
| `charts` | array | `[]` | `top`, `top-subscriber`. |
| `chartSize` | integer | 50 | Entries per chart and country, up to 200. |
| `countries` | array | `["us"]` | Storefront codes. |
| `maxPodcastsPerQuery` | integer | 20 | Up to 200. |
| `includeEpisodes` | boolean | true | One `episode` row per episode. |
| `episodeSource` | string | `apple` | `apple` (latest 200, one request) or `rss` (whole archive, one request per show). |
| `maxEpisodesPerPodcast` | integer | 50 | Newest first. |
| `episodesAfter` | string | – | `2026-01-01`, `7d`, `30d`, `12w`. |
| `includeReviews` | boolean | false | One `review` row per review, newest first, per country. |
| `maxReviewsPerPodcast` | integer | 50 | Up to 500 per country. |
| `onlyNewSinceLastRun` | boolean | false | Monitoring mode for episodes. |
| `checkpointStoreName` | string | `apple-podcasts-state` | Key-value store for the checkpoints. |

At least one of `searchQueries`, `podcasts` or `charts` is required.

```json
{
    "searchQueries": ["artificial intelligence"],
    "podcasts": ["1434243584", "https://podcasts.apple.com/us/podcast/the-daily/id1200361736"],
    "charts": ["top"],
    "chartSize": 50,
    "countries": ["us", "gb"],
    "includeEpisodes": true,
    "maxEpisodesPerPodcast": 10,
    "includeReviews": true,
    "maxReviewsPerPodcast": 50
}
```

### Output

Five record types share one dataset, told apart by `type`: `podcast`, `episode`, `review` (charged), `summary` and `error` (free). Real rows, long fields shortened:

```json
{
  "type": "podcast",
  "id": "1406537385",
  "name": "Practical AI",
  "publisher": "Practical AI LLC",
  "url": "https://podcasts.apple.com/us/podcast/practical-ai/id1406537385?uo=4",
  "feedUrl": "https://changelog.com/practicalai/feed",
  "artwork": "https://is1-ssl.mzstatic.com/image/thumb/Podcasts211/v4/…/600x600bb.jpg",
  "genres": ["Technology", "Podcasts"],
  "primaryGenre": "Technology",
  "episodeCount": 337,
  "latestReleaseDate": "2026-10-29T09:00:00.000Z",
  "explicit": false,
  "contentRating": "Clean",
  "country": "us",
  "query": "artificial intelligence",
  "chart": null,
  "chartPosition": null,
  "scrapedAt": "2026-11-02T14:05:12.000Z"
}
```

```json
{
  "type": "episode",
  "podcastId": "1434243584",
  "podcastName": "Lex Fridman Podcast",
  "id": "1000798266396",
  "guid": "https://lexfridman.com/?p=7807",
  "title": "#503 – AI Crisis in Math: Navier-Stokes, Riemann Hypothesis & Complexity Theory",
  "description": "…",
  "releaseDate": "2026-10-26T22:52:28.000Z",
  "durationSeconds": 13360,
  "audioUrl": "https://media.blubrry.com/takeituneasy/ins.blubrry.com/takeituneasy/lex_ai_math_ai_crisis.mp3",
  "fileType": "mp3",
  "url": "https://podcasts.apple.com/us/podcast/…/id1434243584?i=1000798266396&uo=4",
  "seasonNumber": null,
  "episodeNumber": null,
  "episodeType": null,
  "explicit": false,
  "artwork": "https://is1-ssl.mzstatic.com/image/thumb/…/600x600bb.jpg",
  "source": "apple"
}
```

```json
{
  "type": "review",
  "podcastId": "1406537385",
  "country": "us",
  "id": "14674368862",
  "rating": 1,
  "title": "Drunk on the Kool-Aid",
  "text": "This podcast was decent for a while, but it's really tailed off recently…",
  "author": "PHISHSIHd",
  "date": "2026-10-16T17:57:18.000Z",
  "voteSum": 0,
  "voteCount": 0,
  "url": "https://itunes.apple.com/us/review?id=1406537385&type=Podcast"
}
```

| Field | Notes |
|---|---|
| `podcast.episodeCount`, `latestReleaseDate` | As Apple reports them for the show. |
| `podcast.chart`, `chartPosition` | Set when the podcast came from a chart. |
| `episode.durationSeconds`, `audioUrl`, `fileType` | From Apple or the feed's enclosure. |
| `episode.seasonNumber`, `episodeNumber`, `episodeType` | Only with `episodeSource: "rss"`, when the feed states them. |
| `episode.source` | `apple` or `rss`. |
| `review.rating` | 1 to 5. Reviews are per storefront; `voteSum` and `voteCount` are Apple's helpfulness votes. |

**`summary`** (free, one per search, chart or podcast input): `status` (`COMPLETE`, `PARTIAL`, `EMPTY`, `ERROR`), `podcastsFound`, and per podcast the episodes and reviews delivered, the newest episode date, the average rating of the reviews fetched and a note when the feed failed and Apple's episodes were used instead.

**`error`** (free): `{"type": "error", "target": "99999999999", "error": "Apple Podcasts has no podcast with ID 99999999999 in the us storefront."}`

### Pricing and cost examples

**Try it free.** The first 25 results each calendar month are free for every Apify account, with nothing to enter: the actor keeps count in a small key-value store in your account (`free-slice-apple-podcasts-scraper`) and charges only from the 26th on. The free results are real results you keep; the counter resets on the first of each month.

| Job | Rows | Cost |
|---|---|---|
| Daily new episodes of 50 shows, about 1 a day each (checkpoint on) | 50 podcasts + 50 episodes a day | $0.12 a day |
| Top 200 in 5 countries, podcasts only | 1,000 | $1.80 |
| 100 shows with their latest 100 episodes | 100 + 10,000 | $6.18 |
| Reviews of 20 shows, 200 each, 3 storefronts | 20 + 12,000 reviews | $2.44 |

Platform compute is included. A run that finds nothing new costs only Apify's $0.00005 start fee.

**Discounts for paid Apify plans**, applied automatically to the buyer's plan: Bronze 10% off, Silver 25% off, Gold and enterprise tiers 40% off the prices above. Free-plan users pay the listed price.

### Monitoring: new episodes every morning

1. Create a task from this actor with your shows in `podcasts`, `includeEpisodes: true`, `episodesAfter: "30d"` for the first run and `onlyNewSinceLastRun: true`.
2. Add an Apify schedule (daily is plenty).
3. Add an integration on the task: Slack, e-mail, Google Sheets, Make, Zapier, n8n or a webhook. Each run delivers only new episodes with their audio URLs; the `summary` tells you per show what was found.

The checkpoint is the newest episode date per podcast, kept in the key-value store named in `checkpointStoreName`. To start over, change the name or delete the store.

### Run it from your code

Node.js:

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('agentsgearbox/apple-podcasts-scraper').call({
    searchQueries: ['artificial intelligence'], countries: ['us'], maxPodcastsPerQuery: 10, includeEpisodes: true, maxEpisodesPerPodcast: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((i) => i.type === 'episode').map((i) => [i.podcastName, i.title, i.durationSeconds, i.audioUrl]));
```

Python:

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("agentsgearbox/apple-podcasts-scraper").call(run_input={
    "charts": ["top"], "chartSize": 100, "countries": ["us", "gb", "de"], "includeEpisodes": False})
podcasts = [i for i in client.dataset(run["defaultDatasetId"]).iterate_items() if i["type"] == "podcast"]
```

cURL (synchronous, returns the dataset):

```bash
curl -X POST "https://api.apify.com/v2/acts/agentsgearbox~apple-podcasts-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"podcasts": ["1434243584"], "includeEpisodes": true, "maxEpisodesPerPodcast": 10}'
```

### For AI agents

Give your agent hands. Apple Podcasts pages are rendered applications; this actor returns the same data as JSON, priced per row and known in advance. "Find podcasts about longevity and give me the audio of their latest episode" becomes one tool call.

- **MCP, this actor only:** add `https://mcp.apify.com?tools=agentsgearbox/apple-podcasts-scraper` to Claude Desktop, Claude Code, Cursor or any MCP client (with your Apify token), then ask for "the ten most popular podcasts about personal finance in the UK with their latest episode".

* **MCP, all agentsgearbox actors:** `https://mcp.apify.com?tools=agentsgearbox/telegram-channel-scraper,agentsgearbox/google-play-reviews-scraper,agentsgearbox/substack-scraper,agentsgearbox/google-news-scraper,agentsgearbox/brand-name-generator,agentsgearbox/ai-readiness-audit,agentsgearbox/company-lookup,agentsgearbox/app-intelligence,agentsgearbox/app-store-reviews-scraper,agentsgearbox/company-jobs-scraper,agentsgearbox/apple-podcasts-scraper,agentsgearbox/remote-jobs-scraper`

- **No Apify account?** This actor is eligible for Apify's agentic payments: an agent can buy a spend-capped token through [agi.apify.com](https://agi.apify.com) (x402, MPP or Skyfire) and call the API directly.
- Prices are per row and known in advance, so the agent can set a spending limit; an unknown ID comes back as a free `error` record, not as a failed run.

### Limitations, stated plainly

- Apple's lookup returns at most 200 episodes per show; for older episodes use `episodeSource: "rss"`, which reads the show's own feed (a few feeds are huge or protected, in which case the actor falls back to Apple's 200 and says so in the summary).
- Apple publishes no aggregate rating or review count for podcasts; the average in the summary is computed from the reviews fetched.
- Apple's reviews feed holds at most 500 reviews per show and storefront, newest first, and serves no reviews at all for some shows.
- Apple's Search API allows about 20 requests a minute per IP; the actor paces itself, so a run over hundreds of shows takes minutes rather than seconds.
- Transcripts are not published by Apple; the audio URL is what you feed to a transcription model.

### Troubleshooting

| Symptom | Cause and fix |
|---|---|
| `error`: no podcast with ID … | Wrong ID or URL. The ID is the number after `id` in the show's Apple Podcasts URL. |
| 0 episodes with the checkpoint on | Nothing new since the last run. |
| Episodes stop at 200 | Apple's limit; switch `episodeSource` to `rss`. |
| `summary.note` says the feed failed | The show's feed timed out or is not public; Apple's latest 200 were used. |
| `status: "PARTIAL"` | Your spending limit for the run was reached. Raise it or lower the limits. |

### Track record

- Published 2 November 2026 and tested every day since by an automated run on the Apify platform. The Store's run statistics on this page reflect those runs with a delay of up to a day.
- No browser, so a run cannot fail on Chrome crashes or memory limits.
- Every actor from this account is monitored daily, so a change on Apple's side is normally fixed the same day.

### More from agentsgearbox

- [Telegram Channel Scraper](https://apify.com/agentsgearbox/telegram-channel-scraper): public Telegram channels as JSON, no API key.
- [Google Play Reviews Scraper](https://apify.com/agentsgearbox/google-play-reviews-scraper): Google Play reviews with replies and versions, any market.
- [Substack Scraper](https://apify.com/agentsgearbox/substack-scraper): Substack posts with full text and comments, custom domains too.
- [Google News Scraper](https://apify.com/agentsgearbox/google-news-scraper): Google News with real publisher URLs and full text.
- [Brand & Business Name Generator](https://apify.com/agentsgearbox/brand-name-generator): brand names verified live on domains, handles and app stores.
- [AI Readiness Audit](https://apify.com/agentsgearbox/ai-readiness-audit): how well AI search engines and agents can read a site: crawler access, llms.txt, structured data, content without JavaScript, scored with fixes.
- [Company Lookup](https://apify.com/agentsgearbox/company-lookup): one row per domain with legal identity and VAT validation, contacts, socials, tech stack, open jobs, apps, news and Wikidata facts.
- [App Intelligence](https://apify.com/agentsgearbox/app-intelligence): App Store and Google Play in one run: search, top charts, full app details and each app's twin on the other store.
- [App Store Reviews Scraper · iOS + Google Play, Any Country](https://apify.com/agentsgearbox/app-store-reviews-scraper): Reviews of any iOS or Android app from both stores in one run: stars, text, version, votes, developer replies, since-last-run checkpoint, rating trend per app..
- [Company Jobs Scraper](https://apify.com/agentsgearbox/company-jobs-scraper): every open job on a company's careers page: nine applicant tracking systems, one schema, salaries where stated, hiring signals free.
- [Remote Jobs Scraper](https://apify.com/agentsgearbox/remote-jobs-scraper): remote jobs from six boards and the Hacker News hiring thread in one schema, deduplicated, only-new mode for alerts.

All of them are pay-per-event, run without a browser, and are compared with their alternatives on [agentsgearbox.com](https://agentsgearbox.com/actors/).

### Support

Open an issue on this actor's Issues tab, usually answered within a day, or email <support@agentsgearbox.com>. More actors and daily comparisons of scrapers for 200+ websites at [agentsgearbox.com](https://agentsgearbox.com).

### Legal and fair use

This actor is an independent tool, not affiliated with or endorsed by Apple; Apple Podcasts is a trademark of Apple Inc., used only to name the service the actor reads. It uses Apple's public Search and Lookup API and feeds, each show's own RSS feed, which exists to be read by any client, and Apple's public reviews feed, without keys or logins, and it stores nothing on your behalf beyond your own Apify datasets. Episode audio and artwork belong to their publishers: link to them, play them in your own tools, analyse them, but do not re-host them as your own. Reviews are written by listeners; quote them with attribution.

# Actor input Schema

## `searchQueries` (type: `array`):

Podcast searches on Apple Podcasts, one per line. Each returns up to `maxPodcastsPerQuery` podcasts in each country.

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

Specific podcasts: Apple IDs (`1434243584`) or Apple Podcasts URLs.

## `charts` (type: `array`):

Apple's daily podcast charts per country (`chartSize` entries each).

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

Entries per chart and country, up to 200.

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

Apple storefronts as two-letter codes (`us`, `gb`, `de`, `it`, `br`…). Searches, charts and reviews run once per country.

## `maxPodcastsPerQuery` (type: `integer`):

Podcasts per search and country, up to 200.

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

One `episode` row per episode with title, description, release date, duration, audio URL and Apple page.

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

Apple's lookup returns the latest 200 episodes in one request; the podcast's RSS feed holds the whole archive with season and episode numbers and takes one request per podcast.

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

Newest first. Apple serves at most 200; the RSS feed has no limit.

## `episodesAfter` (type: `string`):

ISO date (`2026-01-01`) or relative (`7d`, `30d`, `12w`). Episodes released before it are skipped.

## `includeReviews` (type: `boolean`):

One `review` row per review (rating, title, text, author, date) from each country's storefront, newest first.

## `maxReviewsPerPodcast` (type: `integer`):

Newest first, up to 500 per country (Apple serves 50 per page).

## `onlyNewSinceLastRun` (type: `boolean`):

Remembers the newest episode date per podcast in a named key-value store and returns only newer episodes next time.

## `checkpointStoreName` (type: `string`):

Key-value store for the checkpoints (created automatically in your account).

## Actor input object example

```json
{
  "searchQueries": [
    "artificial intelligence"
  ],
  "podcasts": [],
  "charts": [],
  "chartSize": 50,
  "countries": [
    "us"
  ],
  "maxPodcastsPerQuery": 20,
  "includeEpisodes": true,
  "episodeSource": "apple",
  "maxEpisodesPerPodcast": 50,
  "includeReviews": false,
  "maxReviewsPerPodcast": 50,
  "onlyNewSinceLastRun": false,
  "checkpointStoreName": "apple-podcasts-state"
}
```

# Actor output Schema

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

Podcasts, episodes and reviews as JSON (type field), plus free summary and error records.

# 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 = {
    "searchQueries": [
        "artificial intelligence"
    ]
};

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

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

```

## MCP server setup

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