# 🎙️ Podcast Directory Scraper — Host Contacts & Emails (`data_minds/podcast-directory-scraper`) Actor

Turn Apple Podcasts searches, charts, or links into podcast host emails, websites, and social contacts. No API key needed. Get RSS-enriched leads with confidence-scored emails and an outreach lead score for podcast outreach and PR pitching.

- **URL**: https://apify.com/data_minds/podcast-directory-scraper.md
- **Developed by:** [Data Minds](https://apify.com/data_minds) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $17.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

### What is Podcast Directory Scraper?

**Podcast Directory Scraper** turns Apple Podcasts into a podcast host email list for podcast lead generation. Search by keyword, top chart or direct link, and get host emails, owner names, websites, social links, ratings, publishing frequency and a lead score for every show. Pay per podcast, from $0.0175 on the Gold plan.

Just enter a keyword and click Start. No coding needed, and the results stream into your dataset while the run is still going.

- **Podcast guest outreach:** find active shows in your niche, keep only the ones with a host email, and pitch the best-scored shows first.
- **Podcast lead generation:** build a podcast contact list for sales, PR or partnership teams and export it to your CRM.
- **Podcast sponsorship research:** filter by rating count, rating and publishing frequency to shortlist shows with a real audience.
- **Podcast PR outreach:** reach hosts and owners of shows that talked about your topic, even when the title never mentions it.
- **Podcast market research:** compare categories, languages, ratings and release cadence across thousands of shows.
- **Podcast chart monitoring:** pull the top shows per category for any of 175 country stores and track them over time.

Use it as a podcast email finder or podcast contact finder. Sales teams also use it as a podcast lead finder, and booking teams as a podcast guest finder.

Because it runs on Apify, you also get an API, scheduled runs, webhooks, integrations and exports in JSON, CSV, Excel, XML and HTML.

#### What can Podcast Directory Scraper do?

- 📧 **Find podcast host emails** with the best address per show, its type, a confidence score and up to three alternates
- 🔎 **Discover shows four ways:** keyword search, episode keyword search, top charts by category, or your own links and show IDs
- 🏆 **Score every lead** from 0 to 100 and label its reachability, so you can work the best prospects first
- 📅 **Measure real publishing frequency** from episode dates, then skip inactive or finished shows
- ⭐ **Add audience signals** such as podcast ratings and rating count data, plus an optional 1 to 5 star breakdown
- 🔗 **Collect podcast social media links** and websites for each show
- 🧹 **Filter before you pay:** shows removed by your filters are never saved and never charged
- 🔌 **Export and automate** with the Apify API, schedules and integrations

***

### What data can Podcast Directory Scraper extract?

Each podcast becomes one dataset row with these fields.

| Data | Fields | What you get |
|---|---|---|
| 🆔 Identity | `podcastId`, `title`, `author`, `description` | Apple Podcasts show ID, show name, host or author, description |
| 🗂 Category and language | `categories`, `language`, `storefront`, `countryOfOrigin` | Categories, language code, store country searched, country of origin |
| 🎧 Episodes | `episodeCount`, `seasonCount`, `episodes`, `matchedEpisodes` | Counts, recent episode list (when switched on), episodes that matched an episode keyword |
| 📅 Activity | `firstPublishedDate`, `lastEpisodeDate`, `daysSinceLastEpisode`, `episodeFrequency`, `medianGapDays`, `appleReleaseFrequency`, `isActive`, `isCompleted` | First and latest episode dates, measured cadence and gap, store-listed frequency, active and ended flags |
| 📺 Show type | `showType`, `mediaKinds`, `contentRating`, `accessType`, `hasPaidSubscription` | Show type, media kinds, explicit or clean rating, access type, paid option flag |
| ⭐ Audience | `ratingAverage`, `ratingCount`, `ratingHistogram`, `popularityTier` | Rating, number of ratings, optional star breakdown, popularity level |
| 🔗 Links | `applePodcastsUrl`, `websiteUrl`, `artworkUrl`, `feedUrl`, `feedGuid`, `feedError`, `isLockedFeed`, `fundingUrl` | Apple Podcasts page, website, artwork, RSS feed address and ID, feed note, locked flag, support link |
| 👤 People | `ownerName`, `people` | Owner name and credited hosts with roles |
| 📧 Contact | `ownerEmail`, `emailSource`, `emailType`, `emailScore`, `alternateEmails`, `contactability` | Best host email, where it was found, type, confidence 0 to 100, up to three alternates, reachability label |
| 🌐 Social | `socialLinks`, `hasSocial` | Show-level profile links by platform |
| 🏆 Lead quality | `leadScore`, `dataQuality`, `hasEmail`, `hasWebsite` | Outreach score, data quality grade, yes or no flags |
| 🧭 Discovery | `source`, `discoveryMode`, `searchTerm`, `chartRank`, `scrapedAt` | How the show was found, the matched keyword, chart position, collection time |

> **Note:** Host emails exist only for shows that publish one, so `ownerEmail` is empty for many rows. Fields a show does not publish come back empty. `episodes` stays empty unless episode listings are on, `socialLinks` is empty when social links are off, and `ratingHistogram` is empty unless the star breakdown is on.

#### What data can't Podcast Directory Scraper extract?

- Audio downloads or transcript text. Episode rows carry links only, and listener or download counts are not part of the output.
- Private contact details that a show does not publish.
- Phone numbers. For business phone numbers, try the Google Maps scraper in the table near the end of this page.

***

### How to scrape Apple Podcasts data

Podcast Directory Scraper is designed for an easy start, even if you have never extracted data from the web before.

1. [Create a free Apify account](https://console.apify.com/sign-up) with your email.
2. Open [Podcast Directory Scraper](https://apify.com/data_minds/podcast-directory-scraper).
3. Add your topics to `searchTerms`, or paste Apple Podcasts links, show IDs or feed addresses into `urls` and switch `mode` to match.
4. Set `maxResultsPerTerm` and the `country` store, then add filters such as `requireEmail` or `activeOnly`.
5. Click **Start** and wait for the run to finish. Rows appear in the dataset while it runs.
6. Open the Output tab, pick a view such as host contacts, and download your data in JSON, CSV, Excel, XML or HTML.

***

### How much does it cost to scrape Apple Podcasts?

Podcast Directory Scraper uses pay-per-event pricing: you pay for each podcast saved to your dataset, and Apify platform usage is billed in addition. The price per podcast depends on your Apify plan.

| Plan | Price per podcast | Price per 1,000 podcasts |
|---|---|---|
| 🆓 Free | $0.025 | $25.00 |
| 🥉 Bronze | $0.0225 | $22.50 |
| 🥈 Silver | $0.02 | $20.00 |
| 🥇 Gold | $0.0175 | $17.50 |

Each run also pays one start event of $0.00005 per GB of memory, with a minimum of one event. The default memory is 1 GB (1,024 MB), so the start event costs $0.00005 per run.

Example: 1,000 podcasts on the Gold plan cost 1,000 x $0.0175 = $17.50, plus the $0.00005 start event, with platform usage billed in addition.

Shows removed by your filters are not saved and not charged. You can also set a maximum spend per run on Apify, and the run stops cleanly when it is reached.

#### Is scraping Apple Podcasts free?

You can start without paying. The Apify Free plan includes a $5 monthly credit, which covers about 200 podcasts at the Free price of $0.025 ($5 / $0.025 = 200), before platform usage. For larger lists, a paid plan lowers the price per podcast. See the [pricing tab](https://apify.com/data_minds/podcast-directory-scraper/pricing) for all events.

***

### Input

All inputs are optional, but the chosen `mode` needs something to work on: keywords for search and episode modes, a chart for charts mode, or links and IDs for direct mode. Run settings such as `concurrency` and `maxRetries` have safe defaults. See the [input tab](https://apify.com/data_minds/podcast-directory-scraper/input-schema) for the full form.

This example finds up to 25 podcasts for one keyword in the US store:

```json
{
  "searchTerms": ["b2b saas marketing"],
  "maxResultsPerTerm": 25,
  "country": "us",
  "mode": "search"
}
```

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| 🔎 `searchTerms` | array | No | `[]` | Topics, niches or show names, one per line (up to 100) |
| 🔗 `urls` | array | No | `[]` | Apple Podcasts links, bare show IDs or feed addresses |
| 🆔 `podcastIds` | array | No | `[]` | Bare show IDs, processed together with `urls` |
| 📬 `maxResultsPerTerm` | integer | No | `50` | Podcasts per keyword, 1 to 1000 (prefill 25) |
| 🌍 `country` | string | No | `us` | Two-letter store country code |
| 🎛 `mode` | string | No | `search` | `search`, `episodes`, `charts` or `ids` |
| 🎧 `episodeSearchTerms` | array | No | `[]` | Phrases to find in episodes; empty reuses `searchTerms` |
| 🏆 `chart` | string | No | `top-series` | `top-series`, `top` or `top-subscriber` (charts mode) |
| 🗂 `chartGenres` | array | No | `[]` | Category names for charts mode; empty means every top-level category |
| 🧮 `maxPodcasts` | integer | No | `0` | Total cap on saved podcasts; `0` means no limit |
| 📡 `fetchRss` | boolean | No | `true` | Look up each show's feed details for host email, owner, cadence and episodes |
| 🌐 `scrapeWebsite` | boolean | No | `true` | Also look for a contact address on the show website |
| 📄 `websiteMaxPages` | integer | No | `2` | Extra contact or about pages to check, 0 to 10 |
| 🔗 `includeSocialLinks` | boolean | No | `true` | Collect show social profiles |
| 📻 `includeEpisodes` | boolean | No | `false` | Add recent episodes to each row |
| 🔢 `maxEpisodesPerShow` | integer | No | `10` | Episodes per show; `0` returns every episode |
| 📊 `includeRatingHistogram` | boolean | No | `false` | Add the 1 to 5 star vote counts |
| 🟢 `activeOnly` | boolean | No | `false` | Keep shows with an episode in the last 90 days |
| 🗓 `activeWithinDays` | integer | No | `0` | Own activity window in days; overrides `activeOnly`; `0` is off |
| 🚫 `excludeCompleted` | boolean | No | `false` | Skip shows flagged as ended |
| 📧 `requireEmail` | boolean | No | `false` | Keep only shows with a host email |
| 🌐 `requireWebsite` | boolean | No | `false` | Keep only shows with a website |
| 🔞 `excludeExplicit` | boolean | No | `false` | Skip explicit shows |
| 🏆 `minLeadScore` | integer | No | `0` | Minimum lead score, 0 to 100 |
| 🎧 `minEpisodes` | integer | No | `0` | Minimum number of episodes |
| 🗳 `minRatingCount` | integer | No | `0` | Minimum number of ratings |
| ⭐ `minRating` | number | No | `0` | Minimum star rating, 0 to 5 |
| 🏷 `emailTypes` | array | No | `[]` | Keep only `role`, `personal`, `generic` or `platform` emails |
| 📅 `frequencies` | array | No | `[]` | Keep only `daily`, `multiple-per-week`, `weekly`, `biweekly`, `monthly`, `irregular` or `infrequent` |
| 🗣 `languages` | array | No | `[]` | Two-letter language codes such as `en` |
| 🗂 `categoryFilter` | array | No | `[]` | Category names; partial matches count |
| 🚦 `proxyConfiguration` | object | No | `{"useApifyProxy": false}` | Proxy configuration; leave the default unless you need a specific setup |
| ⚡ `concurrency` | integer | No | `8` | Shows processed in parallel, 1 to 25 |
| ⏸ `requestDelaySeconds` | number | No | `0` | Seconds between requests, 0 to 10 |
| ♻ `maxRetries` | integer | No | `3` | Attempts per request, 1 to 10 |
| 🔬 `maxScanned` | integer | No | `20000` | Stop after examining this many shows; `0` means no limit |
| ⏱ `maxRunSeconds` | integer | No | `0` | Stop cleanly after this many seconds; `0` means no limit |

#### Discovery mode

`mode` decides how shows are found. Use `search` to match show titles and authors, `episodes` to find shows that talked about a topic, `charts` for the store's top charts, and `ids` to use only your own links and IDs.

- ✅ Good: `"mode": "episodes"` with `"episodeSearchTerms": ["cold outreach"]`
- ❌ Bad: `"mode": "episodes"` with no keywords at all

> **Warning:** If the selected mode has nothing to work on (for example, `ids` with empty `urls` and `podcastIds`), the run ends right away and saves nothing.

#### Filters that never charge you

Filters such as `requireEmail`, `minLeadScore`, `activeOnly` and `languages` are applied before a podcast is saved.

- ✅ Good: `"requireEmail": true` with `"minLeadScore": 60` for a short, contactable list
- ❌ Bad: stacking many strict filters on a tiny keyword list, which can leave zero rows

> **Warning:** If a strict filter combination rejects every show among the first 2,000 examined, the run stops early and names the filter that rejected the most.

***

### Output

Results appear in the Output or Storage tab as a dataset, with one row per podcast. View them as a table, pick the fields you need, and download in JSON, CSV, Excel, XML or HTML. Ready-made views cover overview, host contacts, social profiles, ratings and popularity, publishing and activity, feed and links, episodes and people, lead quality, and discovery.

#### JSON example

Results for the input example above:

```json
{
  "podcastId": "1000000001",
  "title": "Example SaaS Marketing Show",
  "author": "Example Host",
  "description": "Weekly conversations about B2B marketing.",
  "categories": ["Business", "Marketing"],
  "language": "en",
  "storefront": "us",
  "countryOfOrigin": "USA",
  "episodeCount": 120,
  "seasonCount": 3,
  "firstPublishedDate": "2021-03-01",
  "lastEpisodeDate": "2026-10-08",
  "daysSinceLastEpisode": 9,
  "episodeFrequency": "weekly",
  "medianGapDays": 7.0,
  "appleReleaseFrequency": "weekly",
  "isActive": true,
  "isCompleted": false,
  "showType": "episodic",
  "mediaKinds": ["audio"],
  "contentRating": "clean",
  "accessType": "free",
  "hasPaidSubscription": false,
  "ratingAverage": 4.8,
  "ratingCount": 350,
  "ratingHistogram": null,
  "popularityTier": "medium",
  "applePodcastsUrl": "https://podcasts.apple.com/us/podcast/example/id1000000001",
  "feedUrl": "https://feeds.example.com/saas-marketing",
  "feedGuid": "00000000-0000-0000-0000-000000000000",
  "feedError": null,
  "websiteUrl": "https://example.com",
  "artworkUrl": "https://example.com/artwork.jpg",
  "ownerName": "Example Owner",
  "ownerEmail": "booking@example.com",
  "emailSource": "rss_owner",
  "emailType": "role",
  "emailScore": 95,
  "alternateEmails": ["hello@example.com"],
  "people": [{"name": "Example Host", "role": "host", "url": null}],
  "socialLinks": {"linkedin": "https://linkedin.com/company/example"},
  "fundingUrl": null,
  "isLockedFeed": false,
  "leadScore": 88,
  "dataQuality": "high",
  "hasEmail": true,
  "hasWebsite": true,
  "hasSocial": true,
  "contactability": "direct",
  "source": "apple",
  "discoveryMode": "search",
  "searchTerm": "b2b saas marketing",
  "chartRank": null,
  "matchedEpisodes": null,
  "episodes": [],
  "scrapedAt": "2026-10-26T10:00:00+00:00"
}
```

Each run also saves a `run-summary` record in the key-value store with these keys: `source`, `scrapedAt`, `mode`, `country`, `podcastsSaved`, `showsDiscovered`, `showsExamined`, `showsSkippedByFilters`, `withEmail`, `withWebsite`, `withSocialProfile`, `withRating`, `withPublishingFrequency`, `withEpisodeList`, `activeShows`, `alternateEmailsCollected`, `emailSources`, `emailTypes`, `contactability`, `filterRejections`, `perTerm`, `requestsMade` and `durationSeconds`.

#### Notes and limitations

- Host emails appear only when a show publishes one, and `emailScore` and `leadScore` are estimates that help you prioritise, not a guarantee of delivery.
- Ratings, chart rank and episode keyword search can be limited in a run when extra show details are unavailable. The log tells you when that happens.
- If you set `minRating`, a minimum rating count of 1 is applied automatically.
- When `includeEpisodes` is on, each entry in `episodes` has `title`, `description`, `publishDate`, `duration`, `audioUrl`, `episodeNumber`, `seasonNumber`, `guid`, `transcriptUrl` and `guests`.
- Very large episode lists are shortened so each row stays within the platform size limit.
- Run time grows with the number of podcasts, and with feed, website and episode lookups switched on. Start with 10 to 25 podcasts to gauge the time for your settings.

***

### Tips and advanced usage

#### How many podcasts can you scrape with Podcast Directory Scraper?

You control the size. `maxResultsPerTerm` accepts 1 to 1,000 per keyword, you can add up to 100 keywords, and `maxPodcasts` sets a total cap up to 100,000. The final count depends on your keywords, the store `country` and your filters, because shows that fail a filter are skipped. A quick test run with 10 to 25 podcasts shows what to expect.

#### How to get faster or cheaper results

- Turn off `fetchRss` for a fast metadata-only run, but note that host emails then come only from the show website.
- Keep `includeEpisodes` off for smaller rows.
- Use `requireEmail`, `minLeadScore` and `activeOnly` so you only pay for contactable, active shows.
- Set `maxPodcasts` and `maxRunSeconds` as safety limits.

#### Outreach tips

Run podcast host email verification before outreach, and follow podcast email outreach compliance rules for your region. To build a podcast contact list from top charts, use `charts` mode with `chartGenres`. To find podcasts by niche for guest appearances, use `episodes` mode with your topic.

***

### Integrations and API

#### Can I use Podcast Directory Scraper as an API?

Yes. The [Apify API](https://docs.apify.com/api/v2) gives you programmatic access to Podcast Directory Scraper: start runs, schedule them and fetch results. Use the `apify-client` package for Node.js or Python. The [API tab](https://apify.com/data_minds/podcast-directory-scraper/api) has ready-to-use code.

#### How to scrape Apple Podcasts with Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("data_minds/podcast-directory-scraper").call(run_input={
    "searchTerms": ["b2b saas marketing"],
    "maxResultsPerTerm": 25,
    "country": "us",
    "mode": "search",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["ownerEmail"])
```

#### Can I integrate Podcast Directory Scraper with other apps?

Yes. Connect it through [Apify integrations](https://apify.com/integrations) to tools such as Make, Zapier, Google Sheets and Slack. Use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger an action when a run finishes, and schedules to refresh your podcast contact list weekly or monthly.

#### Can I use Podcast Directory Scraper with AI agents (MCP)?

Yes. Connect it to Claude and other MCP clients through the Apify MCP server. Open the [MCP tab](https://apify.com/data_minds/podcast-directory-scraper/api/mcp) for setup steps.

***

### Other Apple Podcasts and lead scrapers

| Actor | Use it to |
|---|---|
| 📧 [Google Maps Email And Phone Number Scraper](https://apify.com/data_minds/google-maps-email-and-phone-number-scraper) | Collect emails and phone numbers for businesses on Google Maps |
| 🔗 [Google Maps Leads Scraper](https://apify.com/data_minds/google-maps-leads-scraper) | Scrape Google Maps into ready-to-use business leads: name, address, phone, website, rating, hours, categories and socials. |
| 🔗 [Dubai Real Estate Scraper — Unit Number & DLD Permit Checker](https://apify.com/data_minds/uae-dubai-property-leads-scraper) | Scrape Dubai real estate listings and get the DLD-verified unit number, RERA permit status, price, size and agent contacts. |
| 🔎 [Website Lead Intelligence](https://apify.com/data_minds/website-lead-intelligence-find-the-right-person-verified) | Find the right person at a company website, verified |
| 🔗 [Netflix Search Scraper](https://apify.com/data_minds/netflix-search-scraper) | Search the Netflix catalogue and export movies & series with IMDb ratings, votes, awards and plot, genres, cast & crew, season/episode breakdowns... |

***

### FAQ

#### Is it legal to scrape Apple Podcasts?

Podcast Directory Scraper collects information that any visitor can see publicly. Legality still depends on your country, how you use personal data such as email addresses, and the platform terms. Read [Apify's guide to web scraping legality](https://blog.apify.com/is-web-scraping-legal/) and follow GDPR and CAN-SPAM rules before outreach. This is not legal advice.

#### How does Podcast Directory Scraper work?

You give it keywords, a chart or your own links, plus optional filters. The Actor builds a list of matching shows, adds ratings, activity and contact details where a show publishes them, scores each lead, and saves one row per podcast to your dataset while the run progresses. You can export the rows when it finishes.

#### How do I find a podcast host email?

Keep `fetchRss` and `scrapeWebsite` on, then add `requireEmail` to keep only shows with an address. Each row reports `ownerEmail`, its type, a confidence score and up to three alternates. Verify addresses before outreach, because shows publish contact details at their own discretion and many publish none.

#### Do podcasts have email addresses?

Many do, but not all. Hosts often publish a booking, press or hello address, and others publish only a website or social profiles. Podcast Directory Scraper saves the best address it finds, labels its type and confidence, and flags rows with no email so you can filter or follow up another way.

#### Why scrape podcast data?

Teams scrape podcast data for guest outreach, lead generation, sponsorship research, PR pitches, market research and chart monitoring. A structured dataset replaces hours of manual searching, lets you sort shows by lead score and activity, and makes it easy to refresh the same list on a schedule when new shows appear.

#### How do I get a podcast RSS feed?

Run a keyword search or add a show link, then read the `feedUrl` field in each row. It holds the show's RSS feed address when one is available. If a feed cannot be read, `feedError` explains why, and the show is still saved with the other details so you lose nothing.

#### Can I export podcast data to Excel or CSV?

Yes. Open the Output or Storage tab after the run and download JSON, CSV, Excel, XML or HTML. The host contacts and lead quality views give you contact-focused columns only. Rows are written as the run progresses, so you can also export partial results before it finishes.

#### Why am I getting fewer results than expected?

Filters such as `requireEmail`, `activeOnly` or `minLeadScore` remove shows, a keyword may have few matches in the chosen `country`, or `maxResultsPerTerm` and `maxPodcasts` may be low. Check the log for the progress line that counts shows skipped by your filters, then widen the keyword or relax a filter.

#### Is Podcast Directory Scraper not working?

Open the Issues tab on the Actor page and include your run link and input, without secrets. Before that, read the log. It names the likely cause, such as missing keywords for the selected mode, a filter that is too strict, or a country code that is not supported.

***

### Support and feedback

Found a bug or have a feature request? Please create an issue on the [Issues tab](https://apify.com/data_minds/podcast-directory-scraper/issues/open).

Need a custom solution or more data? Contact us at hello.dataminds@gmail.com.

Built and maintained by the [data_minds](https://apify.com/data_minds) team on Apify. Podcast Directory Scraper is independent and not affiliated with Apple. Apple Podcasts and other trademarks belong to their owners. It collects publicly available data from the public [Apple Podcasts](https://podcasts.apple.com) site, and you are responsible for complying with applicable laws and the site's terms.

# Actor input Schema

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

🎯 Topics, niches or show names — for example `b2b saas marketing`, `true crime`, `health and fitness`, `startup founders`. Each keyword is searched on its own. Bulk input supported — paste one per line.

## `urls` (type: `array`):

📎 Scrape exact shows instead of (or on top of) a keyword search. Accepts <b>Apple Podcasts links</b> (`https://podcasts.apple.com/us/podcast/.../id1322200189`), <b>bare show IDs</b> (`1322200189`) and <b>direct RSS feed URLs</b> (`https://feeds.simplecast.com/qm_9xx0g`). Bulk input supported — one per line, or upload a file.

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

🔢 Bare Apple Podcasts show IDs, one per line — for example `1322200189`. Use this when you have plain IDs rather than full links; the URL field above only accepts real URLs. Both fields are processed together.

## `maxResultsPerTerm` (type: `integer`):

🎁 How many shows to collect for each keyword. Start with 10–25 for a quick sample, raise it for a full harvest.

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

🗺️ Which country's Apple Podcasts store to search. Charts and rankings are country-specific, so this changes what you get. Pick one or type any two-letter code — 175 stores are supported.

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

🔀 <b>Keyword search</b> matches show titles and authors. <b>Episode keyword search</b> finds shows that actually <i>talked about</i> your topic, even when their title never mentions it. <b>Top charts</b> harvests the store's own rankings. <b>Direct links</b> uses only the URLs/IDs you pasted above.

## `episodeSearchTerms` (type: `array`):

🗣️ Used only by <b>Episode keyword search</b>. Phrases to look for inside episode titles and notes — `series B funding`, `cold outreach`, `menopause`. Leave empty to reuse your main search keywords.

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

📈 Used only by <b>Top charts</b> mode. `top-series` is the classic most-popular-shows chart.

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

🎨 Used only by <b>Top charts</b> mode. Category names such as `business`, `comedy`, `true crime`, `health & fitness`. Leave empty to sweep every top-level category.

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

🛑 Hard stop for the whole run, across every keyword and category. `0` means no limit. You are only charged for podcasts actually saved.

## `fetchRss` (type: `boolean`):

📬 Opens the show's own feed to pull the <b>host email</b>, owner name, real website, credited hosts, publishing cadence, funding link and episode list. Turn off for a fast metadata-only run.

## `scrapeWebsite` (type: `boolean`):

🔍 Also checks the podcast's own website — homepage plus contact/about pages — for an address.

## `websiteMaxPages` (type: `integer`):

🗂️ How many contact/about pages to open beyond the homepage. Higher finds more addresses but takes longer.

## `includeSocialLinks` (type: `boolean`):

📱 Twitter/X, LinkedIn, Instagram, YouTube, Facebook and TikTok profiles belonging to the show (guest and sponsor links are filtered out).

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

📻 Adds recent episodes per show — title, description, publish date, duration, audio URL, episode/season number, transcript link and credited guests. Turn off for smaller, faster rows.

## `maxEpisodesPerShow` (type: `integer`):

📦 How many recent episodes to include per show. `0` returns every episode in the feed (can be very large). Publishing cadence is always calculated from the full feed regardless of this cap.

## `includeRatingHistogram` (type: `boolean`):

⭐ Adds the 1★–5★ vote counts alongside the average rating.

## `activeOnly` (type: `boolean`):

📅 Keep only shows that published an episode in the last 90 days. Shows whose feed could not be read are dropped too, since activity cannot be confirmed.

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

⏳ Keep only shows with an episode in the last N days. Overrides the 90-day switch above. `0` disables it.

## `excludeCompleted` (type: `boolean`):

🎬 Drop shows the store flags as completed/ended — they will never book a guest.

## `requireEmail` (type: `boolean`):

💰 Skip any show with no usable contact address. Filtered shows are never saved and never charged, so you only pay for contactable leads.

## `requireWebsite` (type: `boolean`):

🔗 Skip shows that publish no website of their own.

## `excludeExplicit` (type: `boolean`):

🧹 Drop shows marked explicit — useful for brand-safe sponsorship lists.

## `minLeadScore` (type: `integer`):

🎯 Skip shows scoring below this (0–100). Roughly: <b>60</b> keeps shows with at least one direct contact channel, <b>80</b> keeps active, well-rated shows with a real inbox. `0` keeps everything.

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

📚 Drop shows with fewer episodes than this — a quick way to filter out abandoned pilots.

## `minRatingCount` (type: `integer`):

📈 Drop shows with fewer listener ratings than this — a sign of real audience size.

## `minRating` (type: `number`):

🌟 Drop shows rated below this on the 0–5 scale. A minimum rating count of 1 is applied automatically, because a 5.0 from zero raters is not a 5.0.

## `emailTypes` (type: `array`):

📮 <b>role</b> = booking@/press@/hello@ · <b>personal</b> = a named human · <b>generic</b> = support@/admin@ · <b>platform</b> = a podcast host's own inbox. Leave empty to keep every type.

## `frequencies` (type: `array`):

⏱️ Calculated from the real gaps between episodes, not from what the show claims. Leave empty to keep every cadence.

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

🌐 Two-letter codes such as `en`, `es`, `de`. `en` also matches `en-US` and `en-GB`. Leave empty for every language.

## `categoryFilter` (type: `array`):

🎨 Partial matches count — `business` keeps `Business` and `Business News`. Leave empty for every category.

## `proxyConfiguration` (type: `object`):

🚦 The run manages its own connection by default. Only change this if you need a specific connection setup for your run.

## `concurrency` (type: `integer`):

🏎️ How many show feeds and websites to open at the same time.

## `requestDelaySeconds` (type: `number`):

⏸️ Seconds to wait between requests. `0` is fine for normal runs; raise it if you are sweeping very large keyword sets.

## `maxRetries` (type: `integer`):

🔁 Attempts before a request gives up.

## `maxScanned` (type: `integer`):

🧭 Safety valve: stop after checking this many shows, even if your filters rejected all of them. `0` means no limit.

## `maxRunSeconds` (type: `integer`):

⌛ Stop cleanly after this many seconds, keeping everything already saved. `0` means no time limit.

## Actor input object example

```json
{
  "searchTerms": [
    "b2b saas marketing"
  ],
  "urls": [],
  "podcastIds": [],
  "maxResultsPerTerm": 25,
  "country": "us",
  "mode": "search",
  "episodeSearchTerms": [],
  "chart": "top-series",
  "chartGenres": [],
  "maxPodcasts": 0,
  "fetchRss": true,
  "scrapeWebsite": true,
  "websiteMaxPages": 2,
  "includeSocialLinks": true,
  "includeEpisodes": false,
  "maxEpisodesPerShow": 10,
  "includeRatingHistogram": false,
  "activeOnly": false,
  "activeWithinDays": 0,
  "excludeCompleted": false,
  "requireEmail": false,
  "requireWebsite": false,
  "excludeExplicit": false,
  "minLeadScore": 0,
  "minEpisodes": 0,
  "minRatingCount": 0,
  "minRating": 0,
  "emailTypes": [],
  "frequencies": [],
  "languages": [],
  "categoryFilter": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "concurrency": 8,
  "requestDelaySeconds": 0,
  "maxRetries": 3,
  "maxScanned": 20000,
  "maxRunSeconds": 0
}
```

# Actor output Schema

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

Every podcast collected in this run, with all fields.

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

Contact-focused columns only — best for feeding an outreach tool.

## `leads` (type: `string`):

Lead score, reachability and data-quality grade per show.

## `csv` (type: `string`):

The same rows as a spreadsheet-ready CSV download.

## `runSummary` (type: `string`):

Totals, coverage counts, email sources and filter rejections for this run.

# 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": [
        "b2b saas marketing"
    ],
    "maxResultsPerTerm": 25,
    "country": "us",
    "mode": "search",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_minds/podcast-directory-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": ["b2b saas marketing"],
    "maxResultsPerTerm": 25,
    "country": "us",
    "mode": "search",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("data_minds/podcast-directory-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": [
    "b2b saas marketing"
  ],
  "maxResultsPerTerm": 25,
  "country": "us",
  "mode": "search",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call data_minds/podcast-directory-scraper --silent --output-dataset

```

## MCP server setup

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