# Podcast Email Finder: Host Emails & Podcast Leads (`digital_influx/podcast-leads`) Actor

Search Apple Podcasts by keyword (or paste shows or RSS feeds) and get one lead per podcast: the owner's email from the RSS feed, checked in DNS, plus website, social profiles, episode count, last episode date, publishing rhythm, categories and language.

- **URL**: https://apify.com/digital\_influx/podcast-leads.md
- **Developed by:** [Bruno Petrelli](https://apify.com/digital_influx) (community)
- **Categories:** Lead generation, Marketing, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 podcast saveds

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 Email Finder: Host Emails & Podcast Leads

Type a topic, get a list of podcasts you can actually contact. For every show the Actor searches Apple Podcasts, reads the show's own RSS feed and returns one row with:

- **Contact email** the podcaster published in the feed (the `itunes:owner` address that directories use to reach the owner), plus any other address in the show notes.
- **Website and social profiles** (LinkedIn, X, Instagram, YouTube...) linked from the show.
- **Hosts** (`podcast:person`), author and owner name.
- **Activity:** episode count, first and last episode date, days since the last episode, publishing rhythm (weekly, every two weeks...), average episode length, and an `active` flag.
- **Profile:** categories, language, explicit flag, keywords, hosting platform (Buzzsprout, Libsyn, Spotify for Creators...), artwork, Apple Podcasts link and feed URL.

**No proxies, no login, no browser.** Apple's public Search API and the RSS feed every podcast publishes for podcast apps. In our test, 15 podcasts took 24 seconds and 10 of them had a contact email.

### Use it for

- **Guest booking and PR:** find active shows in your niche with an email, then pitch yourself or your client as a guest.
- **Podcast advertising and sponsorships:** shortlist shows by topic, rhythm and size (episode count), with the owner's contact.
- **Agencies and podcast services** (editing, hosting, growth): prospect shows that publish weekly, or that went quiet.
- **Market research:** how many shows cover a topic, in which language, on which hosting platform.
- **AI agents:** one plain JSON object per podcast, callable through the Apify MCP server.

### Input

```json
{
  "searchTerms": ["b2b marketing", "saas growth"],
  "onlyWithEmail": true,
  "activeWithinDays": 60,
  "languages": ["en"],
  "maxPodcasts": 200
}
```

You can also paste specific shows in `podcasts`: an Apple Podcasts URL, an Apple id or an RSS feed URL. They are read first, in your order, and a show found twice is saved once.

### Output

One item per podcast (real result on 2026-09-25, description shortened):

```json
{
  "title": "Full-Funnel B2B Marketing Show",
  "author": "Andrei Zinkevich",
  "ownerName": "Andrei Zinkevich",
  "email": "hello@fullfunnel.io",
  "emailSource": "itunes:owner",
  "emailMailServer": true,
  "otherEmails": [],
  "website": "https://getleado.com/",
  "socials": {},
  "people": [],
  "episodeCount": 187,
  "appleEpisodeCount": 187,
  "lastEpisodeDate": "2026-09-22T06:51:42.000Z",
  "firstEpisodeDate": "2018-07-19T07:07:50.000Z",
  "daysSinceLastEpisode": 3,
  "active": true,
  "publishingFrequency": "every two weeks",
  "medianDaysBetweenEpisodes": 11,
  "avgEpisodeMinutes": 62,
  "categories": ["Business", "Marketing"],
  "language": "en",
  "explicit": true,
  "hostingPlatform": "Spreaker",
  "description": "Welcome to the Full-Funnel B2B marketing podcast hosted by Andrei Zinkevich and Vladimir Blagojevic from FullFunnel.io...",
  "appleId": "1414178538",
  "appleUrl": "https://podcasts.apple.com/us/podcast/full-funnel-b2b-marketing-show/id1414178538",
  "feedUrl": "https://www.spreaker.com/show/3073695/episodes/feed",
  "status": "ok",
  "searchTerm": null,
  "input": "1414178538",
  "checkedAt": "2026-09-25T13:19:06.349Z"
}
```

Field notes:

- `email` is the best address found, in this order: `itunes:owner`, `podcast:locked` owner, `managingEditor` / `webMaster`, then the show notes. `emailSource` says which. Addresses of hosting platforms (for example `feeds@soundcloud.com`) and no-reply boxes are dropped: they do not reach the show.
- Every address is also looked up in DNS (MX records). One on a domain that does not exist or takes no mail goes to `emailsWithoutMailServer`, and the next address takes its place. `emailMailServer` is `true` when the chosen address's domain can receive mail and `null` when DNS did not answer. No email is sent.
- Some platforms hide the owner email from the public feed (in our sample, the shows on Buzzsprout and Captivate did not publish it). Those shows come with `email: null`, and usually with a `website` and `socials` to reach them.
- `active` means an episode in the last 90 days. `publishingFrequency` is the median gap between the 11 newest episodes: daily, several per week, weekly, every two weeks, monthly, less than monthly.
- `episodeCount` counts the episodes in the feed; `appleEpisodeCount` is Apple's number. Some hosts only keep the latest episodes in the feed.
- `latestEpisodes` (optional, up to 50 per show) adds title, date, duration, audio URL and show notes.
- A show whose feed cannot be read is saved with `status: "feed_error"` and the reason, free of charge (left out when "Only podcasts with a contact email" is on).

### Pricing

Pay per event: **one event per podcast saved**. Shows left out by your filters, unreadable feeds, invalid inputs and duplicates are free. Set a maximum cost for the run and the Actor stops cleanly when it is reached.

### Good to know

- Apple's Search API allows about 20 requests per minute, so search terms are sent 3 seconds apart; the feeds are then read in parallel. Apple returns at most 200 shows per search term: add more specific terms to go deeper.
- The feed is the source of truth for activity. Apple's own "last episode" date can lag behind it, so it is only used to skip shows that stopped long ago.
- Feeds larger than 12 MB are cut: the newest episodes are kept and `feedTruncated` is true.

### Personal data

Podcast owners publish their contact email in the feed so that directories and listeners can reach them, but an email that names a person is still personal data. Use it only with a legal basis (for example legitimate interest under the GDPR for a relevant, one-to-one pitch), honor opt-outs, and follow the anti-spam rules of the countries you send to.

### Support

A platform email that should be dropped, or a field you need? Open an issue on the Actor's Issues tab with the podcast link. Issues get an answer within a few days.

# Actor input Schema

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

Topics or show names, one per line, searched on Apple Podcasts (for example: b2b marketing, true crime, real estate investing). Each term returns up to "Max results per search term" shows, most relevant first.

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

Specific shows, one per line: an Apple Podcasts URL (https://podcasts.apple.com/us/podcast/.../id1496516404), an Apple id, or the show's RSS feed URL. They are read first, in this order.

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

Two-letter store country used for search (us, gb, de, es, br...). It changes which shows Apple ranks first.

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

Apple returns at most 200 shows per search.

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

The run stops once this many podcasts (after filters) are saved. Only these are charged.

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

Skip shows whose feed publishes no usable email. Skipped shows are not charged.

## `checkEmailDomains` (type: `boolean`):

Looks up the DNS mail records (MX) of every email found. An address on a domain that does not exist or takes no mail is dropped and the next address takes its place. No email is sent and no mail server is contacted.

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

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

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

Keep only shows with at least this many episodes. 0 = no filter.

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

Keep only shows whose feed declares one of these languages (two-letter codes: en, es, de...). en also matches en-us and en-gb. Empty = any language.

## `latestEpisodes` (type: `integer`):

Add the N newest episodes (title, date, duration, audio URL, show notes) to each podcast. 0 = none. Included in the podcast price.

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

How many RSS feeds are read at the same time (1 to 20).

## Actor input object example

```json
{
  "searchTerms": [
    "b2b marketing"
  ],
  "country": "us",
  "maxResultsPerTerm": 50,
  "maxPodcasts": 50,
  "onlyWithEmail": true,
  "checkEmailDomains": true,
  "activeWithinDays": 60,
  "minEpisodes": 0,
  "latestEpisodes": 0,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `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": [
        "b2b marketing"
    ],
    "maxPodcasts": 50,
    "onlyWithEmail": true,
    "activeWithinDays": 60
};

// Run the Actor and wait for it to finish
const run = await client.actor("digital_influx/podcast-leads").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"],
    "maxPodcasts": 50,
    "onlyWithEmail": True,
    "activeWithinDays": 60,
}

# Run the Actor and wait for it to finish
run = client.actor("digital_influx/podcast-leads").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"
  ],
  "maxPodcasts": 50,
  "onlyWithEmail": true,
  "activeWithinDays": 60
}' |
apify call digital_influx/podcast-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,digital_influx/podcast-leads"
        }
    }
}
```

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/vJIHXDFW99hSuGjJh/builds/3a2QifcjLZcJyiuMk/openapi.json
