# Podcast Leads Scraper: Host Emails, Ratings & Activity (`varnmill/podcast-leads-scraper`) Actor

Find podcasts for guest pitching and sponsorship outreach. Search Apple Podcasts by keyword, genre chart or URL and get host emails from public RSS feeds and websites, socials, Apple rating, publishing activity and guest and sponsor signals. No login or API key.

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

## Pricing

from $1.75 / 1,000 podcast leads

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

## Podcast Leads Scraper: Host Emails, Ratings & Activity

Host emails, websites and social profiles, Apple ratings, publishing frequency, last-episode date and guest and sponsor signals for podcasts found by keyword, Apple top chart or URL, from Apple's public search API, each show's public RSS feed and its website, with no login or API key.

**Try it:** Click Start with the default input: 20 podcasts in 30 s for about $0.05 (run on October 21, 2026); 16 of the 20 came with a usable email, and the shows with no episode in the last 60 days were skipped for free.

Default input: search `b2b marketing`, US storefront, active within 60 days, 20 shows. Real rows from that run:

| Show | Email | Apple rating | Frequency | Episodes | Last episode | Guest share |
|---|---|---|---|---|---|---|
| Stacking Growth | The B2B Marketing Podcast | teamtools@refinelabs.com | 4.8 (29) | weekly | 277 | 2026-09-21 | 0.33 |
| Spotlight on B2B Marketing | hello@armstronglloyd.co.uk | 5 (1) | every two weeks | 46 | 2026-10-21 | 1 |
| Breaking B2B - SaaS Marketing and B2B Marketing Podcast | samuelmdunning@gmail.com | 4.8 (23) | weekly | 505 | 2026-10-12 | 0.13 |
| Social Media for B2B Growth: LinkedIn Strategy for B2B Marketing | support@b2bgrowthco.com | 4.9 (19) | weekly | 160 | 2026-10-15 | 0.17 |

Every row also carries the owner name, website and contact page, Instagram, X, Facebook, LinkedIn and YouTube links, the rating histogram, median days between episodes, average episode length, sponsor-mention share and the full list of emails with their source.

**Pricing:** $2.50 per 1,000 podcasts (primary event; $0.0025 per saved show). Shows removed by your filters, dead feeds and failed runs are not charged; platform usage is included.

### More real examples (runs of October 13, 2026)

Input: `{"searchTerms": ["b2b marketing"], "countries": ["us"], "activeWithinDays": 60, "maxPodcasts": 20}`

The run took 33 seconds. It saved 20 shows, 16 of them with a usable email, and skipped 71 shows with no episode in the last 60 days for free. A few rows:

| Show | Email | Apple rating | Frequency | Episodes | Last episode | Avg length | Guest share |
|---|---|---|---|---|---|---|---|
| Rattle & Pedal: B2B Marketing Podcast | jmlicki@rattleback.com | 4.8 (23) | every two weeks | 253 | 2026-09-25 | 36 min | 0.43 |
| Social Media for B2B Growth | support@b2bgrowthco.com | 4.9 (19) | weekly | 160 | 2026-10-05 | 25 min | 0.17 |
| Tiny Marketing: B2B Marketing for the Rule-Breakers | hello@sarahnoelblock.com | 5.0 (2) | weekly | 214 | 2026-10-11 | 27 min | 0.50 |
| B2B Marketing: Tomorrow's Best Practices... Today | hello@leadtail.com (from website) | 5.0 (1) | monthly | 64 | 2026-09-24 | 32 min | 0.63 |
| Stacking Growth, The B2B Marketing Podcast | teamtools@refinelabs.com | no ratings | weekly | 277 | 2026-09-21 | 37 min | 0.33 |

One full row as the actor returns it (description shortened):

```json
{
  "name": "Rattle & Pedal: B2B Marketing Podcast",
  "author": "Jason Mlicki & Jeff McKay",
  "ownerName": "Jason Mlicki & Jeff McKay",
  "email": "jmlicki@rattleback.com",
  "hasEmail": true,
  "emails": [{ "email": "jmlicki@rattleback.com", "source": "rss-owner", "isPlatformAddress": false }],
  "website": "https://rattleandpedal.com/",
  "contactPageUrl": "https://rattleandpedal.com/contact-us/",
  "xUrl": "https://x.com/jeffmckay",
  "facebookUrl": "https://www.facebook.com/rattleback.agency",
  "linkedinUrl": "https://www.linkedin.com/in/jasonmlicki",
  "primaryGenre": "Marketing",
  "genres": ["Marketing", "Business", "Management"],
  "episodeCount": 253,
  "lastEpisodeDate": "2026-09-25T16:16:25+00:00",
  "daysSinceLastEpisode": 17.4,
  "publishingFrequency": "every two weeks",
  "medianDaysBetweenEpisodes": 14,
  "episodesLast90Days": 6,
  "avgEpisodeMinutes": 36.2,
  "firstEpisodeDate": "2018-05-06T19:26:45+00:00",
  "lastEpisodeTitle": "The Future of the Marketing Organization is Fractional with Casey Stanton",
  "language": "en-us",
  "country": "US",
  "appleRating": 4.8,
  "appleRatingCount": 23,
  "appleRatingHistogram": { "5": 21, "4": 1, "3": 0, "2": 1, "1": 0 },
  "guestEpisodeShare": 0.43,
  "sponsorMentionShare": 0,
  "acceptsGuestPitches": false,
  "mentionsSponsorship": false,
  "showType": "episodic",
  "appleId": 1386915358,
  "appleUrl": "https://podcasts.apple.com/us/podcast/id1386915358",
  "feedUrl": "http://rattleandpedal.com/feed/podcast/",
  "source": "search:b2b marketing",
  "chartRank": null,
  "warnings": [],
  "scrapedAt": "2026-10-13T01:06:52+00:00"
}
```

Second example, from the same night. The US **Entrepreneurship** top chart (`chartGenres: ["Entrepreneurship", "Marketing"]`, `chartLimit: 15`) returned 30 shows in 11 seconds, 24 of them with an email:

| Rank | Show | Email | Rating | Frequency | Sponsor share |
|---|---|---|---|---|---|
| 1 | REAL AF with Andy Frisella | contact@andyfrisella.com | 4.9 (32,809) | several times a week | 0 |
| 3 | Young and Profiting (YAP) with Hala Taha | youngandprofiting@gmail.com | 4.7 (1,505) | several times a week | 1.0 |
| 4 | Proven Podcast | podcast@iamcharlesschwartz.com | 4.4 (395) | every two weeks | 0 |
| 9 | Founder's Story | hello@ibhmedia.co | 4.2 (235) | several times a week | 0.97 |
| 10 | the bossbabe podcast | operations@bossbabe.com | 4.9 (2,109) | weekly | 0.2 |

### Three ways to find shows (combine freely)

1. **Search terms** (`searchTerms`): keyword search on Apple Podcasts. Apple returns up to 100 shows per term per country. Turn on `expandSearch` and each term is also searched with 10 variations ("saas podcast", "saas interviews" and so on), which reaches several hundred shows per term.
2. **Top charts** (`chartGenres`): Apple's top 200 per genre and country, with `chartRank`. You can use any Apple genre or subgenre by name ("Business", "Marketing", "Entrepreneurship", "Health & Fitness", "True Crime", "Technology", ...) or by ID. Use "All" for the overall chart.
3. **Podcast URLs** (`podcastUrls`): Apple Podcasts links, bare Apple IDs, or RSS feed URLs. Use this to enrich a list you already have.

Shows are de-duplicated across all sources by Apple ID and feed URL.

### Filters (filtered shows are free)

| Input | What it does |
|---|---|
| `activeWithinDays` | Keep shows whose latest episode came out in the last N days (for example 30 or 60). Dead shows are the biggest waste in outreach lists. |
| `minEpisodes` | Skip brand-new or tiny shows. |
| `languages` | Match the RSS language: `en` matches en-us and en-gb; `pt-br`, `de`, `es` and so on also work. |
| `countries` | Apple storefronts for search, charts and ratings (`us`, `gb`, `ca`, `au`, `de`, ...). |
| `requireEmail` | Only shows with a usable email. Hosting relay addresses such as `podcasts60+…@anchor.fm` do not count. |
| `minAppleRatingCount` | A rough audience-size filter. |

### Output fields

- **Contact:** `email` (best address), `emails` (every address with its source: `rss-owner`, `website`, `rss-managingeditor`, `rss-description`, `episode-notes`), `ownerName`, `website`, `contactPageUrl`, `instagramUrl`, `xUrl`, `facebookUrl`, `linkedinUrl`, `youtubeUrl`, `tiktokUrl`, `socials` (also Patreon and Threads), `hosts` (from `podcast:person`)
- **Activity:** `episodeCount`, `lastEpisodeDate`, `daysSinceLastEpisode`, `publishingFrequency`, `medianDaysBetweenEpisodes`, `episodesLast90Days`, `avgEpisodeMinutes`, `firstEpisodeDate`, `lastEpisodeTitle`
- **Reach:** `appleRating`, `appleRatingCount`, `appleRatingHistogram`, `chartRank`
- **Outreach signals:**
  - `guestEpisodeShare`: share of the latest 30 episodes that look like guest interviews
  - `sponsorMentionShare`: share of those episodes whose notes mention a sponsor, promo code or ad read
  - `acceptsGuestPitches`: the feed or website invites guest pitches
  - `mentionsSponsorship`: the feed or website invites advertisers
- **Show:** `name`, `author`, `primaryGenre`, `genres`, `language`, `explicit`, `showType`, `description`, `hostingPlatform`, `appleId`, `appleUrl`, `feedUrl`, `artworkUrl`, `source`, `warnings`, `scrapedAt`

The dataset has a **Leads** view (contact columns) and an **Activity** view. The CSV link in the run's Output tab exports the Leads view.

### Pricing

| Event | Price |
|---|---|
| Podcast lead (one saved show with all fields) | $0.0025 ($2.50 per 1,000) |
| Actor start | $0.00005 |

Platform usage is included. Shows that fail a filter, have a dead feed or are not found are not charged. Set a maximum charge per run in the run options and the actor stops cleanly when it is reached.

### How the email is chosen

1. The `itunes:owner` email from the RSS feed. Podcasters publish it so Apple, Spotify and other directories can contact them.
2. Otherwise, an email found on the show's website, or on its contact page when the home page has none.
3. Otherwise, the feed's `managingEditor` or `webMaster` field, or an address in the show description.
4. Otherwise, an address that appears in at least two of the latest ten episodes' notes. Addresses mentioned only once are usually guests or sponsors and are left out.

Hosting-platform relay addresses (Spotify for Creators, Libsyn and so on) are listed in `emails` with `isPlatformAddress: true` but are never used as `email`. Social profiles follow the same rule: they come from the feed's channel fields, `podcast:person`, the website, or episode notes when the same profile appears in at least two episodes. Website-builder footers such as Squarespace's own Instagram are ignored.

### Accuracy and limits

- **Search depth:** Apple's search API returns at most 100 shows per term and country. Use more terms, `expandSearch`, more countries or genre charts for bigger lists.
- **Episode count:** for feeds larger than 2.5 MB (shows with roughly 1,000+ episodes) only the newest part is read. `feedTruncated` is then true, `episodeCount` comes from Apple, and Apple's count tops out at 2,000.
- **Apple ratings** are per storefront and are read from the public show page. From cloud servers, Apple now and then serves that page with the rating block zeroed. The actor re-checks every zero on a fresh connection. When the page still says 0 but shows written reviews, the rating is returned as `null` with a warning instead of a wrong 0. A show with ratings but no written reviews can still very rarely show 0. Shows given only as RSS feed URLs have no Apple ID, so their rating is `null`.
- **Guest and sponsor signals** are text heuristics on titles and show notes, so treat them as a ranking aid, not a fact. Interview shows whose titles are just the guest's name ("Jane Doe — Topic") score lower than they should.
- **Websites** that block bots (Cloudflare 403/429) are skipped with a warning; the feed data is still returned.
- **Speed:** about 1 to 3 shows per second with ratings and website scan on. Turn off `includeAppleRating` and `scanWebsite` for the fastest runs.
- Respect anti-spam law (CAN-SPAM, GDPR, CASL) when you email. Pitch shows you have actually listened to.

### FAQ

**Is this allowed?** The actor only uses Apple's public iTunes Search and chart endpoints, public RSS feeds and public web pages. It sends no logins and gets past no CAPTCHA or paywall. The owner email in a podcast feed is published by the podcaster for contact.

**Do I need a proxy?** No. Apple's endpoints work from Apify without one. There is an optional proxy setting for Apple requests in case Apple ever starts rate-limiting.

**Why did a show with no email still come back?** `requireEmail` is off by default because website, socials and Apple links are often enough to reach a host. Turn it on to pay only for shows with an email.

**Can I monitor new shows in a niche?** Yes. Schedule a run with `activeWithinDays` and `minEpisodes`, then dedupe on `appleId` in your CRM.

**Spotify-only shows?** Not covered. Nearly every show on Spotify is also listed on Apple Podcasts.

### Changelog

- **0.1 (October 13, 2026):** first release. Search, top charts by genre and URL modes; RSS owner email, website and contact-page emails, social profiles, Apple rating with histogram, activity stats, guest and sponsor signals, filters, and pay-per-event pricing.

# Actor input Schema

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

Keywords to search Apple Podcasts for, such as 'b2b marketing' or 'true crime'. Apple returns up to 100 shows per term and country; turn on 'Expand each search term' to reach several hundred.

## `expandSearch` (type: `boolean`):

Also search 10 variations of each term ('<term> podcast', '<term> interviews', '<term> show' and so on) to find up to about 600 extra shows per term. Each variation is one extra Apple request, about 3 seconds each.

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

Apple Podcasts top-chart genres to pull, by name or ID: 'All', 'Business', 'Marketing', 'Entrepreneurship', 'Technology', 'Health & Fitness', 'True Crime', 'Comedy' and every other Apple genre and subgenre. Shows keep their chart rank.

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

How many shows to take from each genre chart (Apple publishes the top 200).

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

Specific shows to enrich: Apple Podcasts links (https://podcasts.apple.com/us/podcast/.../id863897795), bare Apple IDs, or RSS feed URLs.

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

Two-letter Apple storefront codes for search, charts and ratings, e.g. us, gb, ca, au, de. Each country is searched separately. Default: us.

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

Stop after this many podcasts pass your filters and are saved. You are charged only for saved podcasts.

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

Keep only shows whose latest episode came out within this many days. 0 keeps everything, including shows that stopped publishing.

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

Skip shows with fewer episodes than this.

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

Keep only shows whose RSS language matches, e.g. en, es, de, pt-br. 'en' matches en-us and en-gb. Empty keeps every language.

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

Skip shows where no usable email was found. Hosting-platform relay addresses (for example ...@anchor.fm) do not count.

## `minAppleRatingCount` (type: `integer`):

Skip shows with fewer Apple ratings than this in the chosen storefront. A rough size filter. Needs 'Include Apple rating'.

## `includeAppleRating` (type: `boolean`):

Read the star rating, rating count and star histogram from each show's public Apple Podcasts page.

## `scanWebsite` (type: `boolean`):

Visit the show's website (and its contact page if the home page has no email) for extra emails, social profiles and 'be a guest' or 'sponsor us' pages. Hosting-platform pages are skipped.

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

How many shows to process at once.

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

Optional. Apple's public endpoints normally work without a proxy. Use one only if Apple starts rate-limiting your runs. Feeds and websites are always fetched directly.

## Actor input object example

```json
{
  "searchTerms": [
    "b2b marketing"
  ],
  "expandSearch": false,
  "chartGenres": [
    "Marketing",
    "Entrepreneurship"
  ],
  "chartLimit": 100,
  "countries": [
    "us"
  ],
  "maxPodcasts": 20,
  "activeWithinDays": 60,
  "minEpisodes": 0,
  "requireEmail": false,
  "minAppleRatingCount": 0,
  "includeAppleRating": true,
  "scanWebsite": true,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `leadsCsv` (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": [
        "b2b marketing"
    ],
    "countries": [
        "us"
    ],
    "maxPodcasts": 20,
    "activeWithinDays": 60
};

// Run the Actor and wait for it to finish
const run = await client.actor("varnmill/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 = {
    "searchTerms": ["b2b marketing"],
    "countries": ["us"],
    "maxPodcasts": 20,
    "activeWithinDays": 60,
}

# Run the Actor and wait for it to finish
run = client.actor("varnmill/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 '{
  "searchTerms": [
    "b2b marketing"
  ],
  "countries": [
    "us"
  ],
  "maxPodcasts": 20,
  "activeWithinDays": 60
}' |
apify call varnmill/podcast-leads-scraper --silent --output-dataset

```

## MCP server setup

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