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

Find podcasts on Apple Podcasts by keyword, ID or top chart in any country and export show details, RSS feed URLs, genres, episode counts and the latest episodes with audio links. Uses Apple's official iTunes Search API, no login, no proxy.

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

## Pricing

from $0.50 / 1,000 items

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

Find podcasts on **Apple Podcasts** by keyword, by ID or from the top chart of any country, and export show details, RSS feed URLs, genres, episode counts and the latest episodes with audio links.

The Actor uses Apple's official iTunes Search API and the public podcast charts. No API key, no login and no proxy are needed. A search returning 25 shows takes about a second.

### What you can do with it

- Build a list of podcasts in a niche with their RSS feeds, for outreach, sponsorship research or a podcast directory.
- Track the top podcasts chart in several countries over time.
- Get the latest episodes of a set of shows with audio URLs, for transcription or monitoring.
- Resolve Apple Podcasts links to feed URLs and metadata for an app or an AI agent.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | Keywords to search podcasts by, each returning shows in Apple's ranking order. |
| `podcastIds` | Apple Podcasts URLs or numeric IDs. |
| `chart` | `none` or `top` to also get the top shows chart for each country. |
| `chartLimit` | How many shows from the top of the chart (1-100). |
| `countries` | Store country codes, for example `us`, `gb`, `de`, `jp`. Every search, lookup and chart is repeated for each country. |
| `maxResultsPerSearch` | Up to 200 shows per term and country. |
| `includeEpisodes` | Also save the latest episodes of every show as separate items (`type: episode`). One extra request per show. |
| `maxEpisodesPerPodcast` | Newest first, up to 200 per show. |
| `maxItems` | Stop after this many shows and episodes. `0` means no limit. |

Top 10 shows in the US and Japan with their latest 3 episodes:

```json
{
  "searchTerms": [],
  "chart": "top",
  "chartLimit": 10,
  "countries": ["us", "jp"],
  "includeEpisodes": true,
  "maxEpisodesPerPodcast": 3
}
```

### Output

One item per show (`type: podcast`):

```json
{
  "type": "podcast",
  "podcastId": 1236907421,
  "name": "Y Combinator Startup Podcast",
  "artist": "Y Combinator",
  "artistId": null,
  "url": "https://podcasts.apple.com/us/podcast/y-combinator-startup-podcast/id1236907421",
  "feedUrl": "https://anchor.fm/s/8c1524bc/podcast/rss",
  "genre": "Technology",
  "genres": ["Technology"],
  "genreIds": ["1318", "26"],
  "episodeCount": 342,
  "latestReleaseDate": "2026-09-26T15:10:00Z",
  "explicit": false,
  "contentAdvisoryRating": "Clean",
  "rank": null,
  "source": "search",
  "query": "startup",
  "country": "us",
  "scrapedAt": "2026-10-16T08:29:17.315Z"
}
```

And, when `includeEpisodes` is on, one item per episode (`type: episode`):

```json
{
  "type": "episode",
  "podcastId": 1236907421,
  "podcastName": "Y Combinator Startup Podcast",
  "episodeId": 1000791775129,
  "name": "Robot-Use Agents: Why General-Purpose Models May Win in Robotics",
  "artist": "Y Combinator",
  "description": "One of the biggest surprises in AI over the last few years...",
  "descriptionText": "One of the biggest surprises in AI over the last few years...",
  "releaseDate": "2026-09-26T15:10:19Z",
  "durationMs": 1789000,
  "audioUrl": "https://anchor.fm/s/8c1524bc/podcast/play/126339684/....mp3",
  "url": "https://podcasts.apple.com/us/podcast/robot-use-agents/id1236907421?i=1000791775129",
  "guid": "7973c2f5-3986-449b-8aea-5d1290abddc0",
  "explicit": false,
  "genre": "Technology",
  "episodeNumber": null,
  "seasonNumber": null,
  "country": "us",
  "scrapedAt": "2026-10-16T08:29:17.315Z"
}
```

`rank` is the chart position for shows that came from the chart and `null` otherwise. `source` is `search`, `lookup` or `chart`.

### Limits and notes

- Apple's Search API allows roughly 20 requests per minute per IP. The Actor spaces requests out on larger runs and waits 30 seconds when it is throttled, so runs with many countries, terms or episodes take longer rather than failing.
- Ratings and review counts are not available through the Search API. Artwork URLs are not included because Apple restricts their use to promoting the store.
- The chart feed is read from Apple's public RSS charts (top shows, all genres). It occasionally fails to respond; the Actor retries, and reports the chart as failed if it keeps failing.
- Episode lookups return the newest episodes first, up to 200 per show. For a show's full archive use its `feedUrl`.

### Pricing

You pay per show or episode saved to the dataset, plus a tiny fee per run start.

# Actor input Schema

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

Keywords to search podcasts by. Each term returns shows in Apple's ranking order.

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

Apple Podcasts URLs (https://podcasts.apple.com/us/podcast/.../id1236907421) or numeric IDs (1236907421).

## `chart` (type: `string`):

Also get the top podcasts chart for each country.

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

How many shows to take from the top of the chart (1-100).

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

Two-letter store country codes, for example `us`, `gb`, `de`, `jp`. Every search, lookup and chart is repeated for each country.

## `maxResultsPerSearch` (type: `integer`):

Up to 200 shows per term and country.

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

Also save the latest episodes of every show as separate items (type `episode`). One extra request per show.

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

Newest episodes first, up to 200 per show.

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

The run stops after saving this many shows and episodes. 0 means no limit.

## Actor input object example

```json
{
  "searchTerms": [
    "startup"
  ],
  "podcastIds": [],
  "chart": "none",
  "chartLimit": 50,
  "countries": [
    "us"
  ],
  "maxResultsPerSearch": 25,
  "includeEpisodes": false,
  "maxEpisodesPerPodcast": 20,
  "maxItems": 50
}
```

# Actor output Schema

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

All podcasts and episodes saved by this run, as JSON. Add ?format=csv or ?format=xlsx for other formats.

# 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 = {
    "searchTerms": [
        "startup"
    ],
    "countries": [
        "us"
    ],
    "maxResultsPerSearch": 25,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("kasumilab/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 = {
    "searchTerms": ["startup"],
    "countries": ["us"],
    "maxResultsPerSearch": 25,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("kasumilab/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 '{
  "searchTerms": [
    "startup"
  ],
  "countries": [
    "us"
  ],
  "maxResultsPerSearch": 25,
  "maxItems": 50
}' |
apify call kasumilab/apple-podcasts-scraper --silent --output-dataset

```

## MCP server setup

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