# Podcast Leads Scraper - Host Emails, Websites & Guest Shows (`snappytools/podcast-leads-scraper`) Actor

Find podcasts on Apple Podcasts by keyword, top chart or your own list. One row per show with the host email (from the feed or the show's website), website, socials, how active it is and whether it takes guests.

- **URL**: https://apify.com/snappytools/podcast-leads-scraper.md
- **Developed by:** [Snappy](https://apify.com/snappytools) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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 Leads Scraper - Host Emails, Websites & Guest Shows

Find podcasts on Apple Podcasts by keyword, from the top charts for a category, or from a list you already have, and get one row per show with the host's email, the show's website and social links, how often it publishes, when the last episode came out, and whether it takes guests.

Emails come from two places. First the show's RSS feed (the owner email, plus a few other tags where hosts put one). If the feed has none, the tool finds the show's own website and checks its homepage and its contact, "be a guest" or about page. Every row says where its email came from.

Test runs on 17 October 2026:

| Run | Podcasts | With an email |
| --- | --- | --- |
| Search "marketing", US | 50 | 41 (39 from the feed, 2 from the website) |
| Top Business chart, Australia | 30 | 29 |
| Search "entrepreneur", US, only shows that take guests | 20 | 17 |

Bigger shows usually publish an email in the feed. Smaller shows are where the website check helps, because some hosts (Buzzsprout, Podbean, Captivate and RSS.com in my checks) leave it out of the feed.

### Why this one

- **Emails from the feed and from the show's website.** Not only the `itunes:email` tag. Emails on the podcast host's own pages (like a Buzzsprout support address) are left out, so you don't email the wrong people. You're only charged the email fee when an email is found.
- **Guest booking signals.** Each row has a guest score from the last 20 episodes (guest names in titles like "Jane Doe: building a brand" or "with Jane Doe", and guests tagged in the feed), the recent guests' names, and three sample episode titles. Turn on **Only shows that take guests** to keep just those.
- **Is the show still going?** Last episode date, episodes in the last 90 days, how often it publishes (daily, weekly, fortnightly, monthly) and the average episode length. Shows that have stopped are left out by default.
- **Three ways in.** Search by keyword in any of 22 Apple Podcasts countries, take the top 200 for a category (Business, Marketing, Health & Fitness, True Crime and 71 more), or paste your own Apple links and RSS feeds.
- **Pay once per lead.** **Only new podcasts since my last run** skips shows an earlier run already gave you.
- **$0.01 per podcast with an email, $0.003 without.** Shows left out by your filters, broken feeds and status rows are free.

### Quick start: a guest outreach list

Paste this into the Input tab (JSON view) and click Start.

```json
{
    "mode": "search",
    "searches": ["marketing", "small business"],
    "countries": ["us"],
    "onlyGuestFriendly": true,
    "onlyWithEmail": true,
    "activeWithinDays": "60",
    "maxPodcastsPerSearch": 100
}
```

You get US marketing and small-business podcasts that have published in the last 60 days, look like interview shows, and have an email you can pitch. Expect roughly 20 to 40 per search: in a test with "entrepreneur", 20 of 60 active shows looked like interview shows, and the other 40 were left out at no charge.

### What you can use it for

| Who | What for |
| --- | --- |
| Podcast guest booking agencies and PR firms | Active interview shows in your client's niche, with the host's email and recent guests to reference in the pitch |
| Authors, founders and experts | Find shows to pitch yourself as a guest |
| Brands and ad agencies | Shows in a category or country to approach about sponsorship, with how often they publish and their funding links (Patreon and similar) |
| Podcast tools and services (editing, hosting, transcription) | A list of active shows with contacts, filtered by the hosting platform they use |
| Market research | What's in the top charts for a category or country, and how active those shows are |

### How to use it

1. Click **Try for free**.
2. Pick **How to find podcasts**:
   - **Search by keyword**: add one search per line ("real estate investing", "parenting", "true crime").
   - **Top charts by category**: pick one or more categories. Leave it empty for the overall chart.
   - **My list**: paste Apple Podcasts links (`https://podcasts.apple.com/us/podcast/.../id1234567890`), Apple IDs or RSS feed addresses, one per line.
3. Pick one or more **Countries**. Each search and chart runs in every country you pick.
4. Set filters if you want them: active in the last N days (90 by default), minimum episodes, language, no explicit shows, only shows with an email, only shows that take guests.
5. Click **Start**.

For a weekly list of new shows, go to **Schedules**, use the same input, and tick **Only new podcasts since my last run**.

### Input example

```json
{
    "mode": "charts",
    "categories": ["1321", "1492", "1493"],
    "countries": ["au", "gb"],
    "maxPodcastsPerSearch": 200,
    "findContacts": true,
    "hideExplicit": true
}
```

This takes the top Business, Marketing and Entrepreneurship charts in Australia and the UK. A show that appears in more than one chart is delivered (and charged) once.

### What data you get

The Output has four tabs: **Podcasts**, **Contacts**, **Guest booking** and **Run status**.

| Field | What it is | Example |
| --- | --- | --- |
| `title`, `author`, `ownerName` | Show name, the author Apple shows, and the owner name in the feed | `Build Your SaaS` |
| `email`, `emailSource` | The best email for the show, and where it came from: `feed`, `website`, or `podcast host page` | `shows@example.com`, `feed` |
| `otherEmails` | Other emails from the feed and the website | `["sponsors@example.com"]` |
| `website`, `websiteSource` | The show's own website, and how it was found: `feed`, `feed email domain`, `show description`, `host's link in feed`, or `matched from show name` (only kept when that site's title names the show) | `https://example.com/` |
| `contactPageUrl`, `phones`, `socials` | From the website: the contact or guest page, phone numbers (only from phone links or written with a + country code), and social links (Instagram, X, LinkedIn, Facebook, YouTube, TikTok, Threads, Patreon) | |
| `contactStatus` | `email in feed`, `email on website`, `no email in feed or on website`, `no email in feed, no website found`, `no email in feed, website unreachable (...)`, or `no email in feed (website not checked)` | |
| `isActive`, `latestEpisodeDate`, `daysSinceLastEpisode`, `episodesLast90Days` | Is the show still publishing? `isActive` means an episode in the last 90 days | `true`, `2026-10-14T09:00:00.000Z`, `3`, `13` |
| `cadence`, `avgEpisodeMinutes` | How often it publishes (from the last 12 gaps between episodes) and the average length of the last 20 | `weekly`, `42` |
| `episodeCount`, `firstEpisodeDate` | Number of episodes, and the first one in the feed | `164` |
| `guestFriendly`, `guestScore`, `recentGuests`, `sampleGuestEpisodes` | Guest signals from the last 20 episodes. `guestScore` is the share with a guest (0 to 1) | `true`, `0.8`, `["Adam Wathan"]` |
| `hosts` | Hosts named in the feed (`podcast:person` tags) | `["Justin Jackson"]` |
| `categories`, `language`, `explicit` | From the feed, or from Apple when the feed has none | `["Business", "Marketing"]`, `en`, `false` |
| `hostingPlatform`, `hostPageUrl` | Where the show is hosted (Buzzsprout, Libsyn, Transistor, Spotify for Creators and 36 more), and its page there | `Buzzsprout` |
| `appleId`, `appleUrl`, `feedUrl`, `podcastGuid`, `storefront` | Links and IDs. `feedUrl` is the address after any redirects | |
| `chartRank`, `chartName` | With top charts: the position in Apple's chart | `3`, `Top Business podcasts` |
| `fundingLinks`, `artworkUrl`, `description`, `latestEpisodes` | Support links from the feed, cover art, the show description (first 600 characters), and the last 5 episodes with date and length | |
| `source` | Which search, chart or list line it came from | `marketing (US)` |
| `isNew` | Only with "Only new podcasts since my last run" | `true` |

Example from the test run (search `marketing`, US, 17 Oct 2026, trimmed):

```json
{
    "type": "podcast",
    "title": "The StoryBrand Podcast",
    "author": "StoryBrand.com",
    "email": "hello@storybrand.com",
    "emailSource": "feed",
    "website": "https://storybrand.com/",
    "socials": {
        "instagram": "https://instagram.com/storybrand",
        "linkedin": "https://linkedin.com/company/storybrand",
        "facebook": "https://facebook.com/storybrand",
        "x": "https://x.com/storybrand"
    },
    "contactStatus": "email in feed",
    "isActive": true,
    "latestEpisodeDate": "2026-10-16T09:00:00.000Z",
    "episodesLast90Days": 13,
    "cadence": "weekly",
    "avgEpisodeMinutes": 31,
    "episodeCount": 578,
    "hostingPlatform": "Libsyn",
    "categories": ["Business", "Marketing"],
    "appleUrl": "https://podcasts.apple.com/us/podcast/the-storybrand-podcast/id1092751338"
}
```

#### Run status

One free row per search, chart and country saying what happened. From the test above: "Delivered 50 podcasts, 41 with an email (39 from the feed, 2 from the show's website). Apple returned 100 podcasts for this search in United States. Left out, and not charged: 10 have no episode in the last 90 days. Stopped at your limit of 50." A run summary is saved as `OUTPUT` in the key-value store, including the feeds that couldn't be read and why.

### Pricing

You pay per podcast delivered, nothing for status rows, empty searches, broken feeds, or shows your filters leave out.

| Event | Price |
| --- | --- |
| Podcast row (all the data above) | $0.003 per podcast |
| Email found (in the feed or on the website) | $0.007 per podcast, only when there's an email |
| Run start | $0.00005 per run |

So a podcast with an email costs $0.01, and one without costs $0.003. For example:

| Run | Cost |
| --- | --- |
| Search "marketing", US: 50 podcasts, 41 with an email | $0.44 |
| Top Business chart, Australia: 30 podcasts, 29 with an email | $0.29 |
| 100 podcasts, "Only shows with an email" on | $1.00 |

If you set a maximum cost per run, the run stops cleanly at that limit and the status row says so.

### Good to know

- **Apple returns about 100 podcasts per search and up to 200 per chart.** For more, add more specific searches (one per line), more categories, or more countries. Shows that appear twice are only delivered once.
- **Not every show has an email.** Some hosts hide it from the feed, and some shows have no website, or one with only a contact form. Those rows say so in `contactStatus`, and you can leave them out (free) with **Only shows with an email**.
- **The guest score is a guess from episode titles** and from guests tagged in the feed. Shows that never name their guests in titles will score low. Check a few shows before a big outreach.
- **Website checks** look at up to 4 pages per show and don't run JavaScript, so emails that only appear after a page loads in a browser are missed.
- **Spotify-only shows can't be read**, because Spotify doesn't publish RSS feeds. Shows on YouTube only aren't covered either.
- **Feeds bigger than 6 MB** (shows with thousands of episodes) are read up to that point, and `firstEpisodeDate` is left empty for those. Most feeds list the newest episodes first, so activity and guest data are usually still complete.
- **Contact details** come only from public RSS feeds and public web pages. Nothing behind a login is accessed. Follow the anti-spam and privacy laws where you and the hosts are (for example CAN-SPAM in the US, GDPR and PECR in the UK and EU, the Spam Act in Australia): say who you are, keep pitches relevant, and honour opt-outs.
- This tool isn't affiliated with or endorsed by Apple or any podcast host.

### Getting the data out

Download results as Excel, CSV or JSON from the Output tab, or send them on automatically: Google Sheets, Slack, Zapier, Make and webhooks are all in the **Integrations** tab, and every run is available through the Apify API.

### Questions or problems

Open an issue on the **Issues** tab and include the run link. I reply within one business day.

# Actor input Schema

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

Search Apple Podcasts by keyword, take the top charts for a category, or check a list of podcasts you already have.

## `searches` (type: `array`):

One search per line, as you would type it in Apple Podcasts: "marketing", "real estate investing", "true crime", "parenting". Each line runs in every country you pick. Used with "Search by keyword".

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

Which Apple Podcasts store to search or take charts from. Each search line or chart runs in every country you pick. Shows from other countries still appear when they're listed in that store.

## `categories` (type: `array`):

With "Top charts by category": one chart per category you pick (leave empty for the overall top podcasts chart). With "Search by keyword": keep only podcasts in these categories.

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

With "My list": one podcast per line. Paste an Apple Podcasts link (https://podcasts.apple.com/us/podcast/.../id1234567890), an Apple ID (1234567890) or an RSS feed address. Spotify links can't be used because Spotify doesn't publish feeds.

## `maxPodcastsPerSearch` (type: `integer`):

Stop after this many podcasts for each search line, chart and country. Apple returns about 100 per search and up to 200 per chart. Podcasts left out by your filters don't count. Not used for "My list".

## `findContacts` (type: `boolean`):

When the feed has no email (common on Buzzsprout, Podbean, Captivate and RSS.com), find the show's website and check its homepage and contact or "be a guest" page for emails, social links and phone numbers. Turn off for a faster run with feed emails only.

## `activeWithinDays` (type: `string`):

Leave out shows that have gone quiet. Not used for "My list", where every show you list is returned and the isActive column tells you.

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

Leave out shows with fewer episodes than this (0 = no minimum).

## `language` (type: `string`):

Only shows whose feed is in this language. Use the two-letter code: en, es, de, fr, pt. Leave empty for any language.

## `hideExplicit` (type: `boolean`):

Skip shows marked explicit on Apple or in their feed.

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

Return only podcasts where an email was found (in the feed or on the website). Shows without one are left out and not charged.

## `onlyGuestFriendly` (type: `boolean`):

Keep only shows whose recent episodes look like interviews (guest names in titles, "with ...", "feat.", or guests tagged in the feed). Good for guest booking.

## `onlyNewSinceLastRun` (type: `boolean`):

Skip podcasts an earlier run with the same input already gave you, so you pay for each lead once. Use it on a schedule.

## `watchName` (type: `string`):

With "Only new podcasts": give a name to share one memory between runs with different inputs, for example "guest-outreach". Leave empty to keep a memory per input.

## Actor input object example

```json
{
  "mode": "search",
  "searches": [
    "marketing"
  ],
  "countries": [
    "us"
  ],
  "maxPodcastsPerSearch": 50,
  "findContacts": true,
  "activeWithinDays": "90",
  "minEpisodes": 0,
  "hideExplicit": false,
  "onlyWithEmail": false,
  "onlyGuestFriendly": false,
  "onlyNewSinceLastRun": false
}
```

# Actor output Schema

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

No description

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

No description

## `guests` (type: `string`):

No description

## `status` (type: `string`):

No description

## `allResults` (type: `string`):

No description

## `runSummary` (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 = {
    "mode": "search",
    "searches": [
        "marketing"
    ],
    "countries": [
        "us"
    ],
    "maxPodcastsPerSearch": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("snappytools/podcast-leads-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",
    "searches": ["marketing"],
    "countries": ["us"],
    "maxPodcastsPerSearch": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("snappytools/podcast-leads-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",
  "searches": [
    "marketing"
  ],
  "countries": [
    "us"
  ],
  "maxPodcastsPerSearch": 50
}' |
apify call snappytools/podcast-leads-scraper --silent --output-dataset

```

## MCP server setup

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