# Apple Podcast Reviews Scraper (`kibaale/apple-podcast-reviews-scraper`) Actor

Written reviews and ratings for Apple Podcasts shows, as clean structured records — one podcast URL in, the show's metadata plus every written review out. No login, no Apple ID, no API key.

- **URL**: https://apify.com/kibaale/apple-podcast-reviews-scraper.md
- **Developed by:** [kibalee](https://apify.com/kibaale) (community)
- **Categories:**
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

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 Podcast Reviews Scraper

Written reviews and ratings for Apple Podcasts shows, as clean structured
records — one podcast URL in, the show's metadata plus every written review
out. No login, no Apple ID, no API key, nothing to install.

### What you get

- **Every written review** — full text, author, star rating (1–5), title and
  exact date, across all pages of reviews Apple makes available
- **Show ratings** — average star rating and total rating count, straight
  from the show page
- **Show metadata** — title, description, genre categories and cover-art URL
- **Any country's storefront** — paste URLs from `/us/`, `/gb/`, `/de/`,
  `/id/` … each storefront's own reviews are returned
- **Batch friendly** — paste dozens of shows in one run; they are scraped in
  parallel and land together in a single dataset
- **No browser, no login** — lightweight requests, so runs are fast and
  cheap
- **Always fresh** — every run fetches the live show page at that moment

### Quick start

Input — one or more Apple Podcasts show URLs:

```json
{
  "podcastUrls": [
    "https://podcasts.apple.com/us/podcast/the-vic-mensa-show/id6800160324",
    "https://podcasts.apple.com/us/podcast/coerced-the-devotion-death-of-mica-francis-miller/id6806122527"
  ]
}
```

### Example result

Real output from a run of The Vic Mensa Show URL above (description and
review text trimmed):

```json
{
  "type": "podcast",
  "podcastId": "6800160324",
  "podcastName": "The Vic Mensa Show",
  "podcastUrl": "https://podcasts.apple.com/us/podcast/the-vic-mensa-show/id6800160324",
  "description": "Vic Mensa has done it all. Music with Justin Bieber, Pharrell and Jay-Z. Roles on Showtime's The Chi and Peacock's Bel-Air...",
  "genre": ["Music", "Podcasts", "Society & Culture"],
  "image": "https://is1-ssl.mzstatic.com/image/thumb/Podcasts211/v4/4c/20/b0/.../mza_3587765940574900504.jpg/1200x1200bf.webp",
  "rating": 4.8,
  "ratingCount": 109,
  "cc": "us",
  "reviewsScraped": 6
}
```

…followed by one record per written review:

```json
{
  "type": "review",
  "podcastId": "6800160324",
  "podcastName": "The Vic Mensa Show",
  "podcastUrl": "https://podcasts.apple.com/us/podcast/the-vic-mensa-show/id6800160324",
  "reviewId": "14499880301",
  "userName": "Jaiden C.",
  "rating": 5,
  "title": "Created to be one of the most important shows of our era",
  "review": "Vic Mensa's fall off and climb back to the top will be studied, mark my words. An incredibly real and deep and funny and healing c...",
  "date": "2026-09-02T00:48:12Z"
}
```

Each run produces one record of type `"podcast"` per show, then one record
of type `"review"` per written review. Every review record carries the
show's id, name and URL, so records are easy to join back to their show.

### Input

| Field | What it does |
|---|---|
| **Podcast URLs** (required) | One Apple Podcasts show URL per row, e.g. `https://podcasts.apple.com/us/podcast/the-daily/id1200361736`. Any country's storefront works (`us`, `gb`, `de`, `id`, …). Paste several to scrape multiple shows in one run. |
| Max reviews per podcast | Stop after this many written reviews per show. Default `0` = scrape all written reviews Apple makes available. |
| Max concurrency | How many podcasts to scrape at the same time (1–20, default 5). Higher values finish faster; reviews of a single show are always fetched in order. |

### Record fields

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

| Field | Description |
|---|---|
| `podcastId` | Apple podcast identifier (numeric) |
| `podcastName` | Show title |
| `podcastUrl` | The URL you provided |
| `cc` | Storefront country code the reviews come from |
| `rating` | Average star rating (1–5) |
| `ratingCount` | Total number of ratings on the show — stars and written reviews combined |
| `reviewsScraped` | How many written reviews this run collected for the show |
| `description` | Show description |
| `genre` | Genre categories, as listed by Apple |
| `image` | Cover-art URL |

**Review record** (`"type": "review"`)

| Field | Description |
|---|---|
| `reviewId` | Apple review identifier |
| `userName` | Reviewer's display name (may be empty) |
| `rating` | Reviewer's star rating (1–5) |
| `title` | Review headline |
| `review` | Full review text |
| `date` | ISO-8601 timestamp of the review |

### How much does it cost you?

Roughly one request per show page plus one request per 10 written reviews:

| Action | Requests |
|---|---|
| Show metadata + ratings (1 show) | 1 request |
| Written reviews | 1 request per 10 reviews |

No browser to spin up, no API-key fees — only lightweight requests, priced
per dataset record: see the **Pricing** tab on the Store page.

### Ideas

- Podcast marketing and audience-sentiment research
- Benchmarking a show against competitors in the same genre
- Curating listener quotes for social proof and promotion
- UGC datasets for analysis and AI pipelines

### FAQ

**Do I need an Apple ID or login?** No. Paste the public podcast URL and run.

**Why does a show with thousands of ratings return only a few reviews?**
Apple only exposes written reviews that reviewers chose to publish — and
only on the storefront the URL points to. Star-only ratings without text
are never exposed, by Apple's design. The show's total rating count
(`ratingCount`) still reflects every rating.

**Does the storefront matter?** Yes, the same way it does on the Apple
Podcasts site: reviews differ per country storefront. Change the country in
the URL (`/us/`, `/gb/`, `/id/`, …) to scrape that storefront's reviews.

**How do I get every review of a big show?** Leave "Max reviews per
podcast" at `0` — the actor follows every page of reviews until the end. A
very popular show can mean hundreds of review records, which is why the
field exists.

**Can a run scrape many shows at once?** Yes — paste up to any number of
URLs; they run in parallel (default 5 at a time) and all results land in
one dataset.

**What happens if a URL is wrong or a show is unavailable?** That URL is
skipped with a clear error message in the run log; the rest of the list
still completes.

**Is the data fresh?** Yes — every run fetches the show page and its
reviews live, at the moment you run it.

# Actor input Schema

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

One Apple Podcasts show URL per row — e.g. https://podcasts.apple.com/us/podcast/the-daily/id1200361736. Works for any country storefront (us, gb, id, de, ...). Paste several to scrape multiple shows in one run.

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

Stop after this many written reviews per show (0 = scrape all of them). Star-only ratings without text are never returned by Apple, so this only counts reviews with text.

## `maxConcurrency` (type: `integer`):

How many podcasts to scrape at the same time. Higher values finish faster but send more parallel requests. Reviews of a single show are always fetched in order.

## Actor input object example

```json
{
  "maxReviewsPerPodcast": 0,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

Podcast and review records stored in the run's default dataset

# 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("kibaale/apple-podcast-reviews-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("kibaale/apple-podcast-reviews-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 kibaale/apple-podcast-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kibaale/apple-podcast-reviews-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/tM8dv38pf4uRuQNSJ/builds/Nl0dZ9snWWqZeguYC/openapi.json
