# Apple Podcasts Scraper – Search, Shows, Episodes & Reviews (`rowfeed/apple-podcasts-scraper`) Actor

Search Apple Podcasts and extract show metadata, episode lists (with RSS fallback) and ratings-only reviews. Filter by search term, podcast ID or feed URL. Clean JSON for podcast marketers, guest-booking agencies, researchers and AI agents.

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

## Pricing

from $2.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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Apple Podcasts Scraper – Search, Shows, Episodes & Reviews

Search Apple Podcasts and get clean JSON: show metadata, episode lists and star-rating reviews, with no login, no API key and no headless browser.
Built for podcast marketers, guest-booking agencies, researchers and AI agents that need Apple's podcast catalog without scraping HTML.
Reads Apple's own public search, lookup and RSS endpoints with retries and a silent-failure check, so a scheduled run keeps working when Apple hiccups.

### What you get

- **Every podcast as one row** – name, publisher, feed URL, artwork, genres, total episode count, latest release date and the public Apple Podcasts URL.
- **Episodes on request** – title, publish date, duration, direct audio URL and description for the most recent episodes of each show, pulled from Apple's own index and topped up from the show's RSS feed when Apple returns fewer than you asked for.
- **Reviews on request** – rating, title and text for recent customer reviews. Reviewer nicknames are dropped; only the rating and text are kept.
- **Three ways in** – search terms, explicit Apple podcast IDs, or raw RSS feed URLs for shows that never made it into Apple's catalog.

### Sample rows

A podcast row and an episode row from a default search for "artificial intelligence":

```json
{
  "type": "podcast",
  "podcast_id": "1533115958",
  "name": "Me, Myself, and AI",
  "publisher": "MIT Sloan Management Review",
  "feed_url": "https://feeds.megaphone.fm/mesmyselfai",
  "artwork_url": "https://is1-ssl.mzstatic.com/image/thumb/.../600x600bb.jpg",
  "genres": ["Technology", "Business", "Podcasts"],
  "episode_count": 142,
  "latest_release": "2026-09-03T09:00:00+00:00",
  "apple_url": "https://podcasts.apple.com/us/podcast/me-myself-and-ai/id1533115958",
  "country": "USA",
  "scraped_at": "2026-09-09T18:00:00+00:00"
}
```

```json
{
  "type": "episode",
  "podcast_id": "1533115958",
  "podcast_name": "Me, Myself, and AI",
  "episode_id": "1000123456789",
  "title": "How one bank rebuilt fraud detection around AI agents",
  "published_at": "2026-09-03T09:00:00+00:00",
  "duration_seconds": 1854,
  "audio_url": "https://traffic.megaphone.fm/....mp3",
  "description": "Two guests explain what changed when their fraud team...",
  "apple_url": "https://podcasts.apple.com/us/podcast/.../id1533115958?i=1000123456789"
}
```

### Input

| Input | Default | What it does |
|---|---|---|
| `searchTerms` | `["artificial intelligence"]` | Podcast search terms, e.g. `["true crime", "startup"]`. |
| `podcastIds` | `[]` | Apple Podcasts numeric IDs to scrape directly, combined with search results. |
| `feedUrls` | `[]` | RSS feed URLs for shows without an Apple catalog entry. Always processed, even past `maxPodcasts`. |
| `country` | `us` | Apple storefront country code. |
| `maxPodcasts` | `50` | Cap on podcasts from search terms and podcast IDs combined. |
| `maxEpisodesPerPodcast` | `20` | Episodes kept per podcast, most recent first. |
| `includeEpisodes` | `true` | Fetch episode lists. |
| `includeReviews` | `false` | Fetch reviews (needs an Apple ID; has no effect on feed-only podcasts). |
| `maxReviewsPerPodcast` | `50` | Reviews kept per podcast when reviews are on. |

### Pricing

Pay per event, no subscription: **$2 per 1,000 podcasts**, **$0.50 per 1,000 episodes**, **$0.50 per 1,000 reviews**. A default run (up to 50 podcasts, 20 episodes each, no reviews) costs at most $0.10 for podcasts plus $0.50 for episodes. Set a maximum charge on the run and the Actor stops cleanly when it is reached, charging only for rows actually saved.

### Use it from your tools

- **API and SDKs** – call it via the Apify API or the official Python/JavaScript clients: one call to start the run, one to fetch the dataset as JSON or CSV.
- **Schedules** – run it daily inside Apify and push new episodes or reviews to Google Sheets, a webhook or your own storage automatically.
- **n8n, Make and Zapier** – trigger runs and pipe podcast data into a workflow through Apify's integration for each.
- **AI agents and MCP** – this Actor is eligible for agentic use via Apify's MCP server and supports pay-per-event pricing, so an agent can call it mid-task and pay only per podcast, episode or review it actually reads.
- **Webhooks** – fire on run finished to kick off the next step in a pipeline as soon as fresh episodes land.

### Details

- **Sources**: Apple's public `itunes.apple.com/search`, `/lookup` and customer-reviews endpoints, plus each show's own RSS feed. No authentication, no proxies, no browser, no personal data (reviewer nicknames are dropped).
- **Rate limits**: Apple limits search/lookup to roughly 20 requests/minute per IP; the Actor paces itself accordingly and retries 403/429 with backoff.
- **Reliability**: 429/403 (rate limit) and 5xx responses retry with exponential backoff (5 tries); a 200 without the expected data counts as a failure. One bad search term or ID never stops the run — it becomes an error row and the rest continues.
- **Run stats**: the `STATS` record in the run's key-value store holds request and error counts per category (`network`, `rate_limit`, `blocked`, `not_found`, `other`).
- **Output**: one dataset row per podcast, episode and review, distinguished by the `type` column. The Overview table shows type, podcast, title, publish date and Apple URL. Export as JSON, CSV or Excel, fetch through the Apify API, or schedule runs into Google Sheets, Make, Zapier or your own code.

# Actor input Schema

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

Podcast search terms, e.g. "artificial intelligence" or "true crime". Each term is looked up against Apple's podcast search. Leave empty and use Podcast IDs or Feed URLs instead if you already know what you want.

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

Apple Podcasts numeric collection IDs to scrape directly, e.g. 1200361736. Found in a show's apple.com URL after "id".

## `feedUrls` (type: `array`):

RSS feed URLs to scrape directly, for shows without an Apple Podcasts catalog entry. Always processed regardless of Max podcasts.

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

Apple Podcasts storefront country code (ISO 3166-1 alpha-2), e.g. us, gb, de.

## `maxPodcasts` (type: `integer`):

Keep at most this many podcasts from search terms and podcast IDs combined. Each podcast row is one `podcast` event.

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

Fetch at most this many episodes per podcast (most recent first). Each episode row is one `episode` event. 0 disables episode fetching even if Include episodes is on.

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

Fetch episode lists for each podcast. Falls back to the show's own RSS feed when Apple's lookup returns fewer episodes than requested.

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

Fetch customer reviews for each podcast (rating, title and text only, no reviewer names). Requires an Apple podcast ID, so it has no effect on feed-only podcasts.

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

Fetch at most this many reviews per podcast when Include reviews is on. Each review row is one `review` event.

## Actor input object example

```json
{
  "searchTerms": [
    "artificial intelligence",
    "true crime"
  ],
  "podcastIds": [
    "1200361736"
  ],
  "feedUrls": [],
  "country": "us",
  "maxPodcasts": 50,
  "maxEpisodesPerPodcast": 20,
  "includeEpisodes": true,
  "includeReviews": false,
  "maxReviewsPerPodcast": 50
}
```

# 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 = {};

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

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

```

## MCP server setup

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