# Apple Podcasts Scraper: Shows, Episodes & Host Emails (`sysco32/apple-podcasts-scraper`) Actor

Search Apple Podcasts (iTunes podcast search) by keyword or top charts by country and genre, then enrich every show from its RSS feed: host/owner email, website, socials, episode count and activity. Optional episodes to CSV/JSON. Official API, no login. $1 per 1,000 podcasts.

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

## Pricing

from $1.00 / 1,000 podcast 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?

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: Podcast Host Emails, Top Charts & Episodes

Find podcasts on **Apple Podcasts** by keyword or from the **top charts** of any country and genre, then enrich every show from its **RSS feed**: **owner email**, website, social links, episode count, first and latest episode, publishing frequency and whether the show is still active. Episodes are optional. It uses Apple's official iTunes Search API and public RSS feeds, with no login, no browser and no proxies.

- ✅ **Keyword search** across Apple Podcasts in any country store
- ✅ **Top 100 podcast chart** of any country, optionally narrowed to one genre such as Business, Technology or Comedy
- ✅ **Contact data from RSS**: `owner_email`, `owner_name`, `website`, emails and social links found in the show description
- ✅ **Activity signals**: `episode_count`, `latest_episode_date`, `avg_days_between_episodes`, `is_active`
- ✅ Filters: only shows with an email, active within N days, minimum episodes, language
- ✅ Optional **episodes** with audio URL, duration, season and episode numbers
- ✅ **Only new podcasts** monitoring mode, so you pay only for shows you haven't seen before

### Input examples

Podcasts about marketing (default):

```json
{
  "mode": "search",
  "searchTerms": [
    "marketing"
  ],
  "maxResults": 20,
  "country": "us"
}
```

Active shows from the UK top 100 that publish an email (guest outreach list):

```json
{
  "mode": "charts",
  "country": "gb",
  "maxResults": 100,
  "onlyWithEmail": true,
  "activeWithinDays": 30
}
```

Specific shows with their last 5 episodes (Apple URLs, IDs or RSS feed URLs):

```json
{
  "mode": "podcasts",
  "podcasts": [
    "https://podcasts.apple.com/us/podcast/the-daily/id1200361736",
    "https://feeds.npr.org/510289/podcast.xml"
  ],
  "includeEpisodes": true,
  "maxEpisodesPerPodcast": 5
}
```

Genre IDs for `chartGenreId` (keeps chart shows of that genre): 1321 Business, 1318 Technology, 1303 Comedy, 1489 News, 1488 True Crime, 1512 Health & Fitness, 1304 Education, 1545 Sports, 1301 Arts, 1324 Society & Culture.

### Output example (real run)

A podcast (description shortened):

```json
{
  "record_type": "podcast",
  "search_term": "marketing",
  "search_rank": 1,
  "podcast_id": "1588397602",
  "title": "Marketing Happy Hour",
  "author": "Marketing Happy Hour",
  "apple_url": "https://podcasts.apple.com/us/podcast/marketing-happy-hour/id1588397602",
  "feed_url": "https://anchor.fm/s/50d9d294/podcast/rss",
  "artwork_url": "https://is1-ssl.mzstatic.com/image/thumb/Podcasts211/v4/ea/a7/5c/eaa75c82-06cf-fe11-3161-68e39f7e487f/mza_7610324141478559814.jpg/600x600bb.jpg",
  "primary_genre": "Marketing",
  "genres": [
    "Marketing",
    "Business"
  ],
  "explicit": false,
  "country": "USA",
  "episode_count": 288,
  "latest_episode_date": "2026-10-22T12:21:24Z",
  "owner_name": "Marketing Happy Hour",
  "owner_email": "cassie@cammmedia.com",
  "website": "https://www.marketinghappyhr.com/",
  "language": "en",
  "description": "Keeping up with marketing trends and leveling up your career doesn’t have to be overwhelming. Don’t go at it alone. Marketing Happy Hour was created to help you navigate the corporate marketing world, launch your own bus…",
  "categories": [
    "Business",
    "Marketing"
  ],
  "copyright": "Marketing Happy Hour",
  "contact_emails": [
    "cassie@cammmedia.com"
  ],
  "social_links": [],
  "first_episode_date": "2021-07-14T01:32:15Z",
  "avg_days_between_episodes": 7.7,
  "is_active": true,
  "rss_ok": true,
  "rss_error": null,
  "scraped_at": "2026-10-25T19:25:38Z"
}
```

An episode (`record_type: episode`):

```json
{
  "record_type": "episode",
  "podcast_id": "1200361736",
  "podcast_title": "The Daily",
  "episode_title": "Tricks, Treats and Trends",
  "published_at": "2026-10-25T10:00:00Z",
  "duration_secs": 1781,
  "audio_url": "https://dts.podtrac.com/redirect.mp3/pdst.fm/e/pfx.vpixl.com/6qj4J/pscrb.fm/rss/p/tracking.swap.fm/track/4jdbJYYRKqK96EGqOzQb/nyt.simplecastaudio.com/03d8b493-87fc-4bd1-931f-8a8e9b945d8a/episodes/c139c515-24f7-449e-a672-…",
  "audio_type": "audio/mpeg",
  "episode_url": "https://www.nytimes.com/the-daily",
  "season": null,
  "episode": null,
  "episode_type": "full",
  "explicit": false,
  "guid": "e002eb18-11e7-4058-8ee9-68c6ed866929",
  "description": "Americans are expected to spend a record $13.5 billion on Halloween this year, according to the National Retail Federation. That includes costumes, decorations and lots of candy. In this episode of “The Sunday Daily,” ou…",
  "scraped_at": "2026-10-25T19:25:41Z"
}
```

Use the **Podcasts & contacts** or **Episodes** views, or export to JSON, CSV or Excel. The `OUTPUT` record has per-input counts and errors.

### Pricing

Pay per event, no subscription:

| Event | Price |
|---|---|
| Podcast with RSS contact data | **$0.001** ($1 per 1,000) |
| Episode (optional) | $0.0003 ($0.30 per 1,000) |
| Actor start (per run) | $0.002 |

The default run (20 podcasts) costs about $0.022. Shows removed by filters are never charged, and you can set a maximum cost per run.

### Use cases

- **Podcast guest booking and PR**: build lists of relevant, active shows with the host's email and website.
- **Sponsorship and ad sales**: find podcasts in a niche and check how often they publish.
- **Market research**: track the top charts by country over time.
- **Lead generation**: podcasters are business owners, creators and consultants with public contact details.
- **Content monitoring**: schedule a keyword with **Only new podcasts** to get newly launched shows.

### FAQ

**Where do the emails come from?** From the public RSS feed that each podcaster publishes for Apple Podcasts (`itunes:owner`) and from the show description. No emails are guessed. If a feed has no email, `owner_email` is `null`, and **Only podcasts with an email** removes those shows.

**Which countries are supported?** Any Apple Podcasts storefront. Use a two-letter country code such as `us`, `gb`, `de`, `ca`, `au` or `in`.

**How many results can I get?** Apple's search API returns up to 200 shows per keyword, so use several specific keywords for bigger lists. Charts cover the top 100 shows of a country. A genre filter keeps the shows of that genre within those 100, so use search for bigger niche lists.

**What if a feed is down?** The show is still returned with the Apple data and `rss_ok: false` plus `rss_error`, so you can see what happened.

**Is this legal?** The Actor reads public data: Apple's public iTunes Search API, public charts and the RSS feeds podcasters publish for directories. Use contact data in line with GDPR, CAN-SPAM and similar rules in your country.

### Related actors

More Actors by the same author:

- [Substack Scraper (sysco32/substack-newsletter-scraper)](https://apify.com/sysco32/substack-newsletter-scraper): posts, likes, comments and full text of free posts from any public Substack newsletter.
- [RSS Feed Reader & Monitor (sysco32/rss-feed-reader)](https://apify.com/sysco32/rss-feed-reader): RSS, Atom and JSON Feed items as clean JSON, with only-new-item monitoring.
- [Apple App Store Scraper (sysco32/apple-app-store-scraper)](https://apify.com/sysco32/apple-app-store-scraper): top charts, keyword ranks, app details, developer portfolios and reviews.
- [Hacker News Scraper & Who Is Hiring Jobs Parser (sysco32/hacker-news-scraper)](https://apify.com/sysco32/hacker-news-scraper): HN stories, search and comments, plus the monthly "Who is hiring?" thread parsed into structured jobs.

### Need a custom scraper or data pipeline?

If you need data from another podcast directory or website, extra fields, or the results delivered to Google Sheets, a database or an n8n workflow on a schedule, I take custom projects on Fiverr: [Python scraping scripts and n8n automation workflows](https://www.fiverr.com/sysco32/build-python-scraping-scripts-and-n8n-automation-workflows). Public data only; message me with the details first and I'll confirm whether it's doable.

# Actor input Schema

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

Choose one mode. Each mode uses the options in its section below.

## `maxResults` (type: `integer`):

Maximum podcasts per search term (search), for the chart (charts, up to 100) or in total (podcasts).

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

Two-letter Apple store front code, e.g. <code>us</code>, <code>gb</code>, <code>de</code>, <code>pl</code>, <code>au</code>.

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

Keywords to search in podcast titles, authors and descriptions, e.g. <code>marketing</code>, <code>true crime</code>, <code>saas founders</code>.

## `chartGenreId` (type: `string`):

Keep only chart entries in this Apple genre, e.g. <code>1321</code> Business, <code>1318</code> Technology, <code>1488</code> True Crime, <code>1303</code> Comedy, <code>1489</code> News, <code>1545</code> Sports, <code>1512</code> Health & Fitness.

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

Apple Podcasts URLs (<code>https://podcasts.apple.com/us/podcast/.../id1234567</code>), Apple IDs or direct RSS feed URLs.

## `fetchRssDetails` (type: `boolean`):

Adds owner name and email (itunes:owner), website, language, categories, contact emails and social links found in the description, first/latest episode dates, episode count, average days between episodes and an active flag.

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

Also output the latest episodes of each podcast (title, date, duration, audio URL, season/episode numbers). Needs RSS details.

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

Newest episodes first.

## `onlyWithEmail` (type: `boolean`):

Keep only shows where an owner or contact email was found (great for guest outreach and sponsorship lists).

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

Keep only shows that published an episode in the last N days. 0 = no filter.

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

Skip shows with fewer episodes.

## `languages` (type: `array`):

RSS language codes to keep, e.g. <code>en</code>, <code>de</code>, <code>pl</code>.

## `onlyNewPodcasts` (type: `boolean`):

Remember the podcasts already delivered and skip them in later runs: schedule a search or chart and get (and pay for) only shows you haven't seen.

## `stateStoreName` (type: `string`):

Named key-value store for seen podcasts. Use a different name for each independent monitor.

## Actor input object example

```json
{
  "mode": "search",
  "maxResults": 20,
  "country": "us",
  "searchTerms": [
    "marketing"
  ],
  "fetchRssDetails": true,
  "includeEpisodes": false,
  "maxEpisodesPerPodcast": 10,
  "onlyWithEmail": false,
  "activeWithinDays": 0,
  "minEpisodes": 0,
  "onlyNewPodcasts": false,
  "stateStoreName": "apple-podcasts-scraper-seen"
}
```

# Actor output Schema

## `podcasts` (type: `string`):

Podcasts with RSS contact data

## `episodes` (type: `string`):

Episodes (when Include episodes is on)

## `summary` (type: `string`):

Records per task, failed inputs with error messages.

# 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 = {
    "mode": "search",
    "maxResults": 20,
    "country": "us",
    "searchTerms": [
        "marketing"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sysco32/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 = {
    "mode": "search",
    "maxResults": 20,
    "country": "us",
    "searchTerms": ["marketing"],
}

# Run the Actor and wait for it to finish
run = client.actor("sysco32/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 '{
  "mode": "search",
  "maxResults": 20,
  "country": "us",
  "searchTerms": [
    "marketing"
  ]
}' |
apify call sysco32/apple-podcasts-scraper --silent --output-dataset

```

## MCP server setup

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