# Apple Podcasts Scraper - Top Charts, Search & Owner Emails (`martin10291/apple-podcasts-scraper`) Actor

Top podcasts from the Apple Podcast charts (any country, 25 categories) or a podcast search by keyword: podcast details, owner name and email from the public RSS feed, website, episode count, last episode date and latest episodes with audio URLs. Only-new mode.

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

## Pricing

from $0.70 / 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.
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 - Top Charts, Search & Owner Emails

Get **top podcasts from the Apple Podcast charts** for any country and category, run a **podcast search** by keyword, or look up **specific podcasts**, all in one clean table. Every podcast comes with its **owner name and email** and **website** from the public RSS feed, the number of episodes and the **date of the last episode**, and optionally its latest **episodes** with audio URLs.

The actor uses Apple's **official public iTunes Search API**, the public Apple Podcasts charts and the podcasts' own **public RSS feeds**: no login, no API key, no browser, fast and stable.

### What you get

- **Podcast details**: title, host/artist, Apple ID and URL, primary category and all categories, episode count, explicit flag, artwork, RSS feed URL.
- **Top charts rank** for any of 25 categories (Business, Technology, Comedy, True Crime, Entrepreneurship, Investing...) in any Apple store country.
- **RSS details**: owner name and **owner email published by the creator**, website, language, description, number of episodes in the feed and **last episode date**.
- **Activity filters**: only shows with at least N episodes, or with a new episode in the last N days.
- **Episodes**: title, release date, duration, **audio URL**, Apple URL, description, GUID.
- **Only-new mode** for new-episode alerts: you get, and pay for, each episode once.

### Use cases

- **Podcast guest booking and PR**: build lists of active shows in your niche with the contact the host published.
- **Sponsorships and advertising**: find podcasts by category and country, check how active they are.
- **Podcast agencies and clippers**: track new episodes of the shows you edit or clip.
- **Market research**: top charts by country and category over time.
- **AI and data projects**: episode metadata and audio URLs for transcription pipelines.

### How to use it (step by step)

1. Click **Try for free** (or **Start**).
2. Choose **What to scrape**: search, top charts or specific podcasts.
3. Type **Search terms** (e.g. `startup`, `real estate investing`) or pick a **Category** for charts, and a **Country** (`us`, `gb`, `de`...).
4. Optional: set **Episodes per podcast**, **Minimum episodes** or **Active within (days)**.
5. Click **Start** and download the results as **Excel, CSV, JSON or HTML**, or send them to Google Sheets.

### New-episode alerts

1. Choose **Specific podcasts** and paste the shows you follow.
2. Set **Episodes per podcast** to 5, turn on **Only new episodes since last run** and set a **Monitor ID**.
3. Create a **Schedule** in Apify Console (e.g. every 6 hours) and add a **Slack, email, Zapier, Make or webhook** integration.

### Input

| Field | Type | Description |
|---|---|---|
| `mode` | string | `search`, `charts` or `podcastUrls`. |
| `searchTerms` | array | Keywords (up to 200 podcasts per term). |
| `podcastUrls` | array | Apple Podcasts URLs or numeric IDs. |
| `country` | string | Apple store country, e.g. `us`, `gb`, `de`. |
| `genre` | string | Category for charts (and search filter). |
| `includeRssDetails` | boolean | Owner, email, website, last episode from the RSS feed. Default `true`. |
| `episodesPerPodcast` | integer | Latest N episodes per podcast (0 = none). |
| `onlyNewEpisodes` | boolean | Only episodes not seen in earlier runs. |
| `monitorId` | string | Separate memory for different watch lists. |
| `minEpisodes` | integer | Skip podcasts with fewer episodes. |
| `activeWithinDays` | integer | Skip podcasts without an episode in the last N days. |
| `maxItems` | integer | Hard limit on items saved (and paid for). |

#### Example input

```json
{
  "mode": "charts",
  "genre": "business",
  "country": "us",
  "includeRssDetails": true,
  "activeWithinDays": 30,
  "maxItems": 100
}
```

### Output

```json
{
  "type": "podcast",
  "podcastId": "1469759170",
  "title": "My First Million",
  "artist": "Hubspot Podcast Network",
  "chartRank": 12,
  "primaryGenre": "Entrepreneurship",
  "genres": ["Entrepreneurship", "Business"],
  "episodeCount": 877,
  "latestReleaseAt": "2026-10-28T11:01:00Z",
  "explicit": true,
  "feedUrl": "https://feeds.megaphone.fm/HS2300184645",
  "appleUrl": "https://podcasts.apple.com/us/podcast/my-first-million/id1469759170",
  "ownerName": "Example Owner",
  "ownerEmail": "owner@example.com",
  "website": "https://www.example.com",
  "language": "en",
  "rssEpisodeCount": 877,
  "lastEpisodeAt": "2026-10-28T11:01:00Z",
  "scrapedAt": "2026-10-31T10:00:00Z"
}
```

Episodes are saved as separate rows with `"type": "episode"`: `title`, `releasedAt`, `durationMinutes`, `audioUrl`, `appleUrl`, `description`. *Values above are illustrative.*

### Use it from your code (API)

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("martin10291/apple-podcasts-scraper").call(run_input={
    "mode": "search",
    "searchTerms": ["real estate investing"],
    "country": "us",
    "activeWithinDays": 30,
    "maxItems": 200,
})
for p in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(p["title"], p.get("ownerEmail"), p.get("lastEpisodeAt"))
```

### Pricing

**$1.00 per 1,000 results** (podcasts or episodes), no start fee: cheaper than other Apple Podcasts scrapers. Podcasts removed by your filters are free and **Max results** caps the cost of every run.

### FAQ

**Is this allowed?**
The actor reads Apple's public iTunes Search API and public RSS feeds that podcasters publish so apps can list their shows. It does not log in or bypass anything.

**Where does the email come from?**
From the `itunes:owner` field that podcast creators publish in their own RSS feed. Some feeds don't include it. Use it respectfully (personalised outreach, no spam) and follow GDPR and CAN-SPAM.

**How many podcasts can I get?**
Up to 200 per search term and up to 200 per chart. Use more terms, categories or countries for more.

**Something is missing?**
Open an issue on the **Issues** tab with an example input.

### More Actors by Martin Petrov

- **[YouTube Transcript Bulk Extractor](https://apify.com/martin10291/youtube-transcript-bulk-extractor)**: Transcripts of many YouTube videos at once.
- **[YouTube Shorts Clip Finder](https://apify.com/martin10291/youtube-shorts-clip-finder)**: The best moments of long videos for Shorts and Reels.
- **[YouTube Channel Monitor](https://apify.com/martin10291/youtube-channel-monitor)**: New videos from any channel, with alerts.
- **[EU Tenders Scraper (TED)](https://apify.com/martin10291/eu-tenders-ted-monitor)**: EU public tenders with daily alerts.

### Legal

Podcast titles, artwork and feeds belong to their creators. Contact details are published by the creators themselves: use them for relevant, personal outreach only and follow GDPR.

*Last updated: October 31, 2026.*

# Actor input Schema

## `mode` (type: `string`):

Search by keyword, take the Apple top charts, or look up specific podcasts.

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

Keywords for 'Search' mode, e.g. 'startup', 'real estate investing', 'true crime'. Up to 200 podcasts per term.

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

For 'Specific podcasts' mode: Apple Podcasts URLs (https://podcasts.apple.com/us/podcast/.../id1469759170) or numeric IDs.

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

Two-letter Apple store country, e.g. us, gb, de, ca, au.

## `genre` (type: `string`):

Category for top charts (and optional filter for search).

## `includeRssDetails` (type: `boolean`):

Read each podcast's public RSS feed: owner name and email published by the creator, website, language, description, number of episodes and date of the last episode.

## `episodesPerPodcast` (type: `integer`):

Also save the latest N episodes of every podcast (title, date, duration, audio URL, description). 0 = podcasts only.

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

With 'Episodes per podcast' > 0: save only episodes not seen in earlier runs with the same Monitor ID (great for new-episode alerts).

## `monitorId` (type: `string`):

Name of the monitor for 'only new episodes'.

## `minEpisodes` (type: `integer`):

Skip podcasts with fewer episodes. 0 = no limit.

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

Skip podcasts whose last episode is older than N days (find active shows only). 0 = any.

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

Hard limit on items saved (podcasts + episodes) and paid for.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "startup"
  ],
  "podcastUrls": [],
  "country": "us",
  "genre": "all",
  "includeRssDetails": true,
  "episodesPerPodcast": 0,
  "onlyNewEpisodes": false,
  "monitorId": "default",
  "minEpisodes": 0,
  "activeWithinDays": 0,
  "maxItems": 30
}
```

# Actor output Schema

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

Podcasts (and episodes) from Apple Podcasts.

# 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"
    ],
    "podcastUrls": [],
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("martin10291/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"],
    "podcastUrls": [],
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("martin10291/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"
  ],
  "podcastUrls": [],
  "maxItems": 30
}' |
apify call martin10291/apple-podcasts-scraper --silent --output-dataset

```

## MCP server setup

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