# Podcast Scraper – Apple Podcasts Search, Charts & RSS Episodes (`gazidev/podcast-scraper`) Actor

Find podcasts by keyword or Apple Podcasts top charts, then enrich each show from its public RSS feed: owner name & email, website, socials, language, categories, episode count, last episode date, activity, plus episodes with audio URLs and transcripts. $1 per 1,000 podcasts.

- **URL**: https://apify.com/gazidev/podcast-scraper.md
- **Developed by:** [Cemal Atakli](https://apify.com/gazidev) (community)
- **Categories:** For creators, News
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

## Podcast Scraper – Apple Podcasts Search, Top Charts, RSS Episodes & Contacts

Build podcast lists in minutes. **Search the Apple Podcasts directory by keyword**, pull the **top charts** of any category and country, or paste show URLs and RSS feeds. The Actor then reads each show's **public RSS feed** and returns one clean row per podcast:

- **Show data:** title, author, Apple ID and URL, RSS feed, artwork, genres, language, website, description and explicit flag.
- **Contact data the publisher put in the feed:** the owner name and **owner email** (the `itunes:owner` address that podcasters publish for directories), emails written in the description, social links (Instagram, X, YouTube, LinkedIn, TikTok…), funding links and hosts (Podcasting 2.0 `podcast:person`).
- **Activity metrics:** episode count, first and last episode date, **days since last episode**, episodes in the last 30 and 90 days, typical days between episodes, typical episode length and whether transcripts exist.
- **Episodes (optional):** title, date, duration, **audio URL**, episode and season numbers, transcript and chapter links, and plain-text show notes.

**$1 per 1,000 podcasts** and **$0.20 per 1,000 episodes**. Podcasts removed by your filters and unreachable feeds are free.

### What can I use it for?

- **Podcast guest booking and PR outreach:** find active shows in your niche (for example `activeWithinDays: 30`, `minEpisodes: 20`, `onlyWithEmail: true`) and export host names, emails and websites to your CRM.
- **Podcast sponsorship and advertising research:** list the top 200 shows per category and country, with how often they publish and how long their episodes are.
- **Market research and competitor tracking:** see who ranks for a topic, how fast shows publish, and which ones went inactive.
- **Episode monitoring and content pipelines:** get the newest episodes with audio URLs and transcript links for summarising or transcription (pair it with our [Media Transcriber](https://apify.com/gazidev/media-transcriber)).
- **Directories and datasets:** keep a podcast database fresh on a schedule.

### Input

| Field | Description |
|---|---|
| `searchTerms` | Keywords searched in Apple Podcasts (up to 200 shows each, `maxResultsPerSearch`) |
| `chartGenres`, `chartCountries`, `chartLimit` | Apple Podcasts top charts: `all`, `business`, `technology`, `true-crime`, `comedy`… × country codes, up to 200 per chart (`chartRank` is added) |
| `podcastUrls` | Apple Podcasts URLs or numeric IDs |
| `feedUrls` | Any public podcast RSS feed, including shows that are not on Apple |
| `country` | Apple storefront for search and lookups (`us`, `gb`, `de`, `br`, `tr`…) |
| `fetchFeeds` | Read each RSS feed for contacts, activity and metadata (default on, same price) |
| `includeEpisodes`, `maxEpisodesPerPodcast`, `episodeDescriptionChars` | Episode rows, newest first |
| `minEpisodes`, `activeWithinDays`, `languages`, `onlyWithEmail` | Filters. Filtered podcasts are not charged |
| `maxPodcasts`, `maxConcurrency`, `includeExplicit` | Limits and options |

```json
{
  "searchTerms": ["saas marketing", "b2b sales"],
  "maxResultsPerSearch": 100,
  "chartGenres": ["business"],
  "chartCountries": ["us", "gb"],
  "activeWithinDays": 60,
  "onlyWithEmail": true,
  "includeEpisodes": false
}
```

### Output

Rows have `type: "podcast"`, `"episode"` or `"error"` (free). The Output tab has three tables: **Podcasts**, **Contacts** and **Episodes**.

```json
{
  "type": "podcast",
  "appleId": 1532272557,
  "title": "B2B SaaS Marketing Snacks",
  "author": "Kalungi",
  "appleUrl": "https://podcasts.apple.com/us/podcast/b2b-saas-marketing-snacks/id1532272557",
  "feedUrl": "https://feeds.transistor.fm/b2b-saas-marketing-snacks",
  "primaryGenre": "Marketing",
  "genres": ["Marketing", "Business", "Entrepreneurship"],
  "searchTerm": "saas marketing",
  "searchRank": 1,
  "language": "en",
  "website": "https://www.kalungi.com/podcast",
  "categories": ["Business", "Business › Marketing", "Business › Entrepreneurship"],
  "ownerName": "Duff Ferguson",
  "ownerEmail": "duff.ferguson@kalungi.com",
  "emailsInDescription": [],
  "socialLinks": [],
  "people": [],
  "episodeCountInFeed": 99,
  "firstEpisodeAt": "2020-09-12T21:25:00+00:00",
  "lastEpisodeAt": "2026-07-10T19:35:45+00:00",
  "daysSinceLastEpisode": 86.7,
  "episodesLast30Days": 0,
  "episodesLast90Days": 1,
  "avgDaysBetweenEpisodes": 21.5,
  "avgDurationMins": 24.7,
  "hasTranscripts": true,
  "feedError": null
}
```

Episode row (shortened):

```json
{
  "type": "episode",
  "podcastTitle": "B2B SaaS Marketing Snacks",
  "podcastAppleId": 1532272557,
  "title": "99 - A Sneak Peek Inside T2D3 OS: How to Turn Your GTM Playbook Into a Repeatable Growth Engine",
  "publishedAt": "2026-07-10T19:35:45+00:00",
  "durationSecs": 1767,
  "audioUrl": "https://media.transistor.fm/d418b521/1d49ff81.mp3",
  "episodeNumber": 99,
  "episodeType": "full",
  "transcripts": [],
  "link": "https://share.transistor.fm/s/d418b521",
  "description": "In this episode, we explore the development of the T2D3 Operating System…"
}
```

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Podcast (directory data + RSS enrichment) | **$0.001** ($1 per 1,000) |
| Episode | **$0.0002** ($0.20 per 1,000) |
| Run start | $0.00005 |

Free: podcasts removed by filters, IDs not found on Apple, direct feeds that cannot be fetched, and the `SUMMARY` record.

| Actor | Monthly users | Price |
|---|---|---|
| **This Actor** | – | **$1 per 1,000 podcasts, $0.20 per 1,000 episodes**, RSS contacts and activity included |
| ryanclinton/podcast-directory-scraper | 25 | $50 per 1,000 podcasts |
| automation-lab/podcast-scraper | 18 | $1.15 per 1,000 podcasts + $0.57 per 1,000 episodes + $0.005 per run start |
| logiover/apple-podcasts-episode-scraper | 16 | $2.50 per 1,000 results |
| sourabhbgp/apple-podcast-scraper | 13 | $3 per 1,000 results |

Competitor figures are from the Apify Store on 2026-10-05. Example: 500 active marketing podcasts with contacts cost **$0.50**. The top 200 of 5 categories in 3 countries (about 2,500 shows after duplicates are removed) cost about $2.50.

Set *Maximum cost per run* and the Actor stops cleanly at that limit.

### FAQ

**Where does the data come from?** From Apple's public iTunes Search and Lookup APIs, the iTunes top-podcasts RSS, and each podcast's own public RSS feed, which the publisher distributes so that directories and apps can list the show. There is no login, no browser and no Apple Podcasts page scraping.

**Why is `ownerEmail` empty for some shows?** Some hosts (or the podcaster) hide the owner email in the feed. Big networks often use a generic address. `emailsInDescription` and `website` give you other routes.

**How fresh is it?** Feeds are read live on every run, so episode counts and dates are current. Apple's own fields (`episodeCountApple`, `latestReleaseApple`) can lag by a day.

**Spotify-only shows?** Spotify has no public directory API. Shows hosted on Spotify for Podcasters (Anchor) still have public RSS feeds, so you can pass the feed URL in `feedUrls`.

**Does it download audio?** No. It returns the audio URL. To get text, pass audio URLs to a transcriber.

**Is it legal?** It reads public directory APIs and feeds that are published for exactly this kind of listing. Contact data is limited to what podcasters publish for directories. If you contact people, follow the laws that apply to you (GDPR, CAN-SPAM…), for example by sending relevant, one-to-one pitches with an opt-out. Questions: iletisim.ortalamabiri@gmail.com.

### Use with AI agents / Apify MCP

Ask your agent *"find 50 active true-crime podcasts in the UK with a contact email"* or *"what did the top 10 tech podcasts publish this week?"*. Through the [Apify MCP server](https://mcp.apify.com) (`https://mcp.apify.com?actors=gazidev/podcast-scraper`), Claude, ChatGPT, Cursor and other MCP clients can call it directly. Over the API: `POST https://api.apify.com/v2/acts/gazidev~podcast-scraper/run-sync-get-dataset-items`.

### Related Actors

[Media Transcriber](https://apify.com/gazidev/media-transcriber) · [RSS Feed Reader](https://apify.com/gazidev/rss-feed-reader) · [Website Contact Finder](https://apify.com/gazidev/website-contact-finder) · [Email Syntax & MX Validator](https://apify.com/gazidev/email-syntax-mx-validator)

# Actor input Schema

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

Find podcasts in the Apple Podcasts directory by keyword (title, author, topic), e.g. `marketing`, `true crime`, `startup founders`. Up to 200 results per keyword.

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

1–200 (Apple's limit per search).

## `chartGenres` (type: `array`):

Also take the Apple Podcasts **top chart** of these categories (rank is added as `chartRank`). Use `all` for the overall chart.

## `chartCountries` (type: `array`):

Two-letter country codes for the charts (default: the country below), e.g. `us`, `gb`, `de`, `br`.

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

1–200.

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

Specific shows: `https://podcasts.apple.com/us/podcast/the-daily/id1200361736` or just `1200361736`.

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

Any public podcast RSS feed (Spotify-for-Podcasters/Anchor, Buzzsprout, Libsyn, Megaphone, Simplecast, Transistor, Podbean…). Works for shows that are not on Apple Podcasts.

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

Two-letter Apple storefront code for search and lookups (`us`, `gb`, `de`, `fr`, `br`, `in`, `tr`…).

## `fetchFeeds` (type: `boolean`):

Adds description, website, language, categories, **owner name & email** (as published in the feed for directories), social and funding links, hosts, episode count, first/last episode date, **days since last episode**, episodes in the last 30/90 days, publishing frequency, typical length and transcript availability. Same price.

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

Output the newest episodes of each podcast as extra rows (`type: episode`): title, date, duration, audio URL, episode/season number, transcript & chapter links, description. Charged per episode.

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

Newest first (feed order).

## `episodeDescriptionChars` (type: `integer`):

Characters of plain-text show notes per episode (0 = no description).

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

0 = no filter. Filtered podcasts are not charged.

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

Keep shows whose newest episode is at most N days old (e.g. 30). 0 = no filter.

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

Language codes from the feed, e.g. `en`, `de`, `es` (prefix match: `en` matches `en-us`).

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

Keep podcasts whose feed lists an owner email or an email in the description.

## `includeExplicit` (type: `boolean`):

Passed to Apple's search.

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

0 = no limit.

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

RSS feeds fetched at the same time.

## Actor input object example

```json
{
  "searchTerms": [
    "saas marketing"
  ],
  "maxResultsPerSearch": 10,
  "chartLimit": 100,
  "country": "us",
  "fetchFeeds": true,
  "includeEpisodes": false,
  "maxEpisodesPerPodcast": 10,
  "episodeDescriptionChars": 500,
  "minEpisodes": 0,
  "activeWithinDays": 0,
  "onlyWithEmail": false,
  "includeExplicit": true,
  "maxPodcasts": 0,
  "maxConcurrency": 8
}
```

# Actor output Schema

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

No description

## `contacts` (type: `string`):

No description

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

No description

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

No description

## `summary` (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 = {
    "searchTerms": [
        "saas marketing"
    ],
    "maxResultsPerSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("gazidev/podcast-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": ["saas marketing"],
    "maxResultsPerSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("gazidev/podcast-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": [
    "saas marketing"
  ],
  "maxResultsPerSearch": 10
}' |
apify call gazidev/podcast-scraper --silent --output-dataset

```

## MCP server setup

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