# Podcast Scraper — Podcaster Emails, Ratings & Leads (`cleandata/podcast-scraper`) Actor

Find podcasts by keyword or Apple Podcasts category (top charts) in any country, or look up any show: owner emails, ratings, episodes per month, last episode, website and Instagram, X, YouTube and LinkedIn links. Filter before you pay. Podcast guest and sponsor leads.

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

## Pricing

from $4.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.
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 Scraper — Podcaster Emails, Ratings & Leads

Find **podcasts** for guest booking, sponsorships, PR and influencer marketing. Search Apple Podcasts by keyword, pull the **top 200 charts** of any category in any country, or look up specific shows, and get one complete row per podcast: the **owner's contact email** from the show's RSS feed, **Apple rating and number of ratings**, **episodes per month**, **last episode date**, average episode length, website, and **Instagram / X / YouTube / LinkedIn links** when the show publishes them.

**Fast and cheap:** no browser, no login. All filters run *before* billing, so you only pay for podcasts that match.

### What can you use it for?

- **Podcast guest booking:** find active shows in your niche and the email to pitch them.
- **Podcast sponsorships and ads:** build a list of shows with a real audience (*Min Apple ratings*) that publish regularly (*Active within*), with company emails for the ad team.
- **PR and outreach:** keep only shows with a company-domain address (`ads@show.com`) using *Email types*.
- **Market research:** the top 200 shows of a category in each country, with their chart position, ratings and publishing pace.
- **Creator lists across platforms:** many podcasters also stream or post video; combine with our Twitch, YouTube and Kick scrapers.

### Sample results

A real run looking up five well-known shows:

| Podcast | Email | Apple ratings | Stars | Episodes / month | Avg minutes |
|---|---|---|---|---|---|
| The Daily | thedaily@nytimes.com | 106,135 | 4.3 | 6.0 | 42 |
| Social Media Marketing Podcast | mike@socialmediaexaminer.com | 1,443 | 4.7 | 4.3 | 45 |
| Marketing School | maya.harper@singlegrain.com | 1,254 | 4.6 | 17.3 | 27 |
| Marketing Against The Grain | podcasts@hubspot.com | 361 | 4.8 | 8.3 | 28 |
| Marketing Made Simple | hello@storybrand.com | 290 | 4.6 | 0 | 34 |

In our tests about **2 in 3 podcasts publish a real contact email** in their feed, most of them on a company domain. Shows on Acast or Spotify for Creators often show only a forwarding address instead: it goes in `relayEmail` and doesn't count as an email.

### How much does it cost?

You pay per result, with no monthly rental: **$5 per 1,000 podcasts** ($0.005 each), less on higher Apify plans. **Emails, ratings and social links are included at no extra cost**, and podcasts removed by your filters are never charged, so with *Only podcasts with an email* you only pay for contactable shows. Apify's free plan includes $5 of monthly credit, which covers about 1,000 podcasts a month. You can also set a maximum cost per run in the run options.

### How to use it

1. Click **Try for free** and sign in to Apify (no credit card needed).
2. Add search keywords, categories (top charts) or specific shows, and the countries to search.
3. Optionally filter by language, episodes, recent activity, Apple ratings, email or email type.
4. Click **Start**. When the run finishes, download the results as JSON, CSV or Excel, or send them to Google Sheets, your CRM or your own system.

### Input

| Field | Description |
|---|---|
| **Search keywords** | Apple Podcasts search: `marketing`, `true crime`, `startup founders`… Up to 200 shows per keyword and country. |
| **Categories (top charts)** | Apple's top 200 in a category: `Business`, `Marketing`, `Entrepreneurship`, `True Crime`, `Health & Fitness`, `Technology`… Subcategories work too. |
| **Countries** | Apple Podcasts stores, as 2-letter codes: `US`, `GB`, `CA`, `AU`, `DE`, `FR`, `ES`, `BR`… Each one is searched separately. Default: `US`. |
| **Podcasts to look up** | Apple Podcasts links or ids, or RSS feed URLs. |
| **Languages** | Only shows in these languages (from the feed), as 2-letter codes. |
| **Min episodes** | Skip shows with fewer episodes. |
| **Active within (days)** | Only shows that published an episode in the last N days. Use 30 to skip abandoned podcasts. |
| **Min Apple ratings** | Skip shows with fewer ratings on Apple Podcasts: the best public sign of audience size (ratings, not listeners: see Output). |
| **Only podcasts with an email** | Skip shows without a contact email (forwarding addresses don't count). |
| **Email types** | Keep only shows whose emails are `company` (own or network domain), `free provider` (Gmail, Outlook…) and/or `both`. Empty = any. |
| **Include Apple ratings** | On by default. Turn off for a faster run. |
| **Max podcasts** | Limit for the whole run (0 = no limit). |
| **Proxy** | Used for Apple Podcasts; the default works well. Feeds are read directly from each podcast host. |

Example: active English business and marketing shows in the US and UK with at least 50 ratings and a company email:

```json
{
    "searchKeywords": ["b2b marketing", "saas founders"],
    "categories": ["Marketing", "Entrepreneurship"],
    "countries": ["US", "GB"],
    "languages": ["EN"],
    "activeWithinDays": 30,
    "minRatings": 50,
    "emailTypes": ["company", "both"],
    "maxResults": 300
}
```

### Output

```json
{
    "podcastName": "Marketing Against The Grain",
    "author": "Hubspot Media",
    "ownerName": "Hubspot",
    "emails": ["podcasts@hubspot.com"],
    "companyEmails": ["podcasts@hubspot.com"],
    "emailType": "company",
    "relayEmail": null,
    "checkedAt": "2026-11-05T11:35:12.000Z",
    "website": "https://www.hubspot.com/podcastnetwork",
    "socials": {},
    "ratingAverage": 4.8,
    "ratingCount": 361,
    "episodeCount": 473,
    "lastEpisodeAt": "2026-11-03T06:00:00.000Z",
    "episodesPerMonth": 8.3,
    "avgEpisodeMinutes": 28,
    "language": "en",
    "categories": ["Marketing", "Business", "Entrepreneurship"],
    "explicit": false,
    "description": "Kipp Bodnar (HubSpot’s CMO) and Kieran Flanagan (Hubspot's SVP of Marketing), lead you down the rabbit hole of marketing trends...",
    "appleUrl": "https://podcasts.apple.com/us/podcast/marketing-against-the-grain/id1616700934",
    "feedUrl": "https://feeds.megaphone.fm/marketingagainstthegrain",
    "hostedOn": "megaphone.fm",
    "fundingUrl": null,
    "artworkUrl": "https://is1-ssl.mzstatic.com/image/thumb/.../600x600bb.jpg",
    "appleId": "1616700934",
    "country": "us",
    "foundVia": "search",
    "searchKeyword": "marketing against the grain",
    "searchCategory": null,
    "chartRank": null
}
```

- `emails` are the addresses the show publishes in its RSS feed: the owner's contact email first (the one Apple and Spotify use to verify the show), then any other in the feed or show description.
- `emailType` says whether the emails are on a `company` domain, a `free provider` (Gmail, Outlook, Yahoo…) or `both`; `companyEmails` lists only the company ones.
- `relayEmail` is a forwarding address some hosts publish instead of the owner's (Acast, Spotify for Creators). It may reach the owner, but it's kept apart and doesn't count as an email for the filters, so *Only podcasts with an email* and *Email types* remove these shows and they are never charged. A real example:

```json
{
    "podcastName": "High Performance Business",
    "emails": [],
    "emailType": null,
    "relayEmail": "info+67b8a49ac0f169362a5f3f65@mg-eu.acast.com",
    "website": "https://shows.acast.com/highperformancebusiness",
    "ratingCount": 37,
    "hostedOn": "acast.com"
}
```

- `checkedAt` is when the show's feed (and so its email) was read. Every run reads the feeds live, so it's the time of your run.
- `episodesPerMonth` is the publishing pace over the last 90 days (0 = no episode in 90 days). `avgEpisodeMinutes` is from the latest episodes.
- `ratingAverage` and `ratingCount` are from the Apple Podcasts store of `country`. They are **ratings, not listener or download numbers**: Apple and Spotify don't publish those. Use `ratingCount` to compare shows with each other (1,000 ratings is a much bigger show than 20), not as an audience size for a sponsorship quote. `ratingCount` is `0` when a show has no ratings yet and `null` when ratings were turned off or the show was given by feed URL only.
- `hostedOn` is the podcast host (Megaphone, Libsyn, Buzzsprout…), handy to tell independent shows from network ones.
- `foundVia` is `search` (see `searchKeyword`), `chart` (see `searchCategory` and `chartRank`) or `input`.

### Privacy

The Actor only collects public information: the show's Apple Podcasts listing and its public RSS feed, the same data every podcast app reads. Emails are only the contact addresses the show itself publishes in its feed.

### Limits

- Apple returns up to 200 shows per keyword and up to 200 per category chart, in each country. For bigger lists, add keywords, categories or countries.
- Some feeds are very long: the Actor reads the channel information and the latest episodes, which is all the stats need. `episodeCount` comes from Apple.
- A few publishers only keep their latest episodes in the public feed, which can make `episodesPerMonth` lower than the real pace.

### Use it in your app

Every run is one API call away, so the podcast list can go straight into your CRM, database or spreadsheet.

**One HTTP request** starts a run and returns the results when it finishes. Your token is in Apify Console → Settings → API & Integrations.

```bash
curl -X POST "https://api.apify.com/v2/acts/cleandata~podcast-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN"   -H "Content-Type: application/json"   -d '{"searchKeywords": ["marketing"], "countries": ["US"], "onlyWithEmail": true, "maxResults": 50}'
```

This waits for the run for up to 5 minutes. For bigger runs, start it with `/runs` instead and get a webhook call when it finishes.

**No code:** connect it to Zapier, Make, n8n, Google Sheets, Slack or Airtable from the *Integrations* tab, and schedule it to run daily or weekly.

### Use it from AI agents

This Actor works with AI agents and LLM apps:

- **MCP:** add it to Claude, Cursor, VS Code or any other MCP client through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).
- **Agentic payments:** agents can run it and pay per result with [x402](https://docs.apify.com/platform/integrations/x402) (USDC), without an Apify account.

### FAQ

**Is it legal to scrape podcasts?** The Actor only reads public directory listings and public RSS feeds, which are published so that apps can read them. Use the data responsibly: respect privacy laws such as GDPR and CAN-SPAM when you contact podcasters.

**Why don't all podcasts have an email?** Some hosts hide the owner's email or replace it with a forwarding address (in `relayEmail`). The website and social links are often the next best way to reach them.

**Why did I get fewer podcasts than expected?** Apple returns at most 200 shows per keyword or category and country, and strict filters (for example *Min Apple ratings* plus *Email types*) keep only a share of them. The run log says how many were checked. Add keywords, categories or countries, or widen the filters.

**Does it include Spotify?** Most podcasts publish the same feed to Apple and Spotify, so the shows and emails are the same. Ratings are Apple's.

**Do you also have Twitch, YouTube and Kick?** Yes: [Twitch Streamers Scraper](https://apify.com/cleandata/twitch-streamers-scraper), [YouTube Channel Scraper](https://apify.com/cleandata/youtube-creator-leads) and [Kick Streamers Scraper](https://apify.com/cleandata/kick-streamers-scraper) return creator leads with emails and social links too.

**Can I call it from code?** Yes: see *Use it in your app* above for a single HTTP request. In Python (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("cleandata/podcast-scraper").call(
    run_input={"categories": ["Marketing"], "countries": ["US"], "activeWithinDays": 30, "maxResults": 100}
)
for podcast in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(podcast["podcastName"], podcast["ratingCount"], podcast["emails"])
```

The same works in JavaScript (`apify-client`) or with plain HTTP. See the *API* tab on this page.

**Something broke or you need a field?** Open an issue on the Actor's Issues tab. Feature requests are welcome.

**Found it useful?** A short review on the Reviews tab helps other people find this Actor and tells me what to improve next.

# Actor input Schema

## `searchKeywords` (type: `array`):

Find podcasts matching these words with Apple Podcasts search, e.g. <code>marketing</code>, <code>true crime</code>, <code>startup founders</code>. Up to 200 shows per keyword and country.

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

Get Apple's top 200 podcasts in these categories, e.g. <code>Business</code>, <code>Marketing</code>, <code>Entrepreneurship</code>, <code>True Crime</code>, <code>Health & Fitness</code>, <code>Technology</code>. Subcategories work too. The chart position is in <code>chartRank</code>.

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

Apple Podcasts stores to search, as 2-letter codes: <code>US</code>, <code>GB</code>, <code>CA</code>, <code>AU</code>, <code>DE</code>, <code>FR</code>, <code>ES</code>, <code>BR</code>… Each country is searched separately, which also finds more shows. Ratings come from the store the show was found in.

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

Apple Podcasts links or ids (e.g. <code>https://podcasts.apple.com/us/podcast/the-daily/id1200361736</code>) or RSS feed URLs.

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

Only shows in these languages (from the show's feed), as 2-letter codes: <code>EN</code>, <code>ES</code>, <code>PT</code>, <code>DE</code>, <code>FR</code>…

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

Skip shows with fewer episodes (0 = no minimum).

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

Only shows that published an episode in the last N days (0 = any). Use 30 to skip abandoned podcasts.

## `minRatings` (type: `integer`):

Skip shows with fewer ratings on Apple Podcasts (0 = no minimum). The number of ratings is the best public sign of a show's audience size (they are ratings, not listener numbers).

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

Skip shows that don't publish a contact email (forwarding addresses from Acast or Spotify don't count).

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

Keep only shows whose emails are of these types (leave empty for any): <b>company</b> = on their own or their network's domain, like ads@show.com; <b>free provider</b> = Gmail, Outlook, Yahoo or similar; <b>both</b> = one of each. Shows without an email are skipped when this is set.

## `includeRatings` (type: `boolean`):

Add the star rating and number of ratings from each show's Apple Podcasts page. Turn off for a faster run.

## `maxResults` (type: `integer`):

Stop after this many podcasts (0 = no limit). You only pay for podcasts you get.

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

Used for Apple Podcasts. The default (Apify datacenter proxy) works well; feeds are read directly from each podcast host.

## Actor input object example

```json
{
  "searchKeywords": [
    "marketing"
  ],
  "countries": [
    "US"
  ],
  "minEpisodes": 0,
  "activeWithinDays": 0,
  "minRatings": 0,
  "onlyWithEmail": false,
  "includeRatings": true,
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `podcasts` (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 = {
    "searchKeywords": [
        "marketing"
    ],
    "countries": [
        "US"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleandata/podcast-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchKeywords": ["marketing"],
    "countries": ["US"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cleandata/podcast-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchKeywords": [
    "marketing"
  ],
  "countries": [
    "US"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cleandata/podcast-scraper --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/x7SJBkSsyG4JKRUvq/builds/Kh8dTB4tiDySct3iC/openapi.json
