# Podchaser Podcast Scraper — Contacts, Ratings & Audience Data (`haketa/podchaser-scraper`) Actor

Podchaser scraper & API: search podcasts and episodes and export show title, description, category, rating, episode count, host, network, social links and RSS feed. Podcast discovery, media research and creator lead generation — fast, no login.

- **URL**: https://apify.com/haketa/podchaser-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Lead generation, Marketing
- **Features:** Limited permissions
- **Stats:** 28 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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

## Podchaser Scraper — Podcast Contacts, Verified Emails, Ratings & Audience Data

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-00B5AD?style=for-the-badge\&logo=apify\&logoColor=white)](https://apify.com/haketa/podchaser-scraper)
[![Target](https://img.shields.io/badge/Target-Podchaser.com-5C2D91?style=for-the-badge)](https://www.podchaser.com)
[![Lead Gen](https://img.shields.io/badge/Emails-~94%25%20Verified%20RSS%20Contacts-2E7D32?style=for-the-badge)]()
[![Proxy](https://img.shields.io/badge/Proxy-Not%20Required%20\(Free%20Direct\)-0288D1?style=for-the-badge)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel%20%7C%20API-4A148C?style=for-the-badge)]()

**Scrape [Podchaser.com](https://www.podchaser.com) at scale** and turn the world's largest podcast database into a clean, outreach-ready dataset: **show titles, descriptions, categories, weighted ratings, review counts, episode metrics, follower counts, hosting providers, Apple Podcasts & Spotify IDs, hosts & guests with roles, network affiliations, public RSS feeds — and a verified business contact email extracted directly from each show's RSS feed.** This **Podchaser scraper** requires **no login, no Podchaser Pro API key, no proxy, and no coding**.

Export your podcast database to **JSON, CSV, Excel, or via the Apify API** — or open the pre-built **Podcasts**, **Contacts (outreach)**, and **Creators (unwound)** dataset views in one click.

***

### ⚡ At a glance

| Feature | Details |
|---|---|
| **Target platform** | [Podchaser.com](https://www.podchaser.com) + public podcast RSS feeds |
| **Discovery modes** | 19 **Podcast Categories** (`news`, `business`, `technology`, `comedy`, `health-fitness`, etc.), **Podcast Name search**, **Podcast IDs/Slugs**, or **Start URLs** |
| **Lookalike expansion** | Optional BFS graph traversal via `crawlSimilar: true` (`similarDepth: 1–3`) |
| **Verified contact emails** | Extracts `contactEmail`, `contactEmailsAll`, and `ownerNameFromRss` from the show's public RSS feed (`~93.7%` email fill rate) |
| **Quality filters** | Filter by `minRating` (0–5), `minReviews`, `minEpisodes`, and `requireContactEmail: true` |
| **Pagination & scale** | Round-robin category pagination (~25 shows/page, `maxPagesPerCategory: 0` auto/unlimited) with 100% numeric ID de-duplication |
| **Proxy requirement** | **None (Direct HTTPS)** — runs fast and proxy-free by default |
| **Output views** | **Podcasts** (overview), **Contacts** (outreach-ready), and **Creators** (unwound host/guest rows) |

***

### 📋 Table of contents

- [Why scrape Podchaser?](#-why-scrape-podchaser)
- [What this Podchaser scraper does](#-what-this-podchaser-scraper-does)
- [Use cases](#-use-cases)
- [Input configuration](#-input-configuration)
- [Output & field reference](#-output--field-reference)
- [Pagination & 1,000+ scale](#-pagination--1000-scale)
- [How to use](#-how-to-use)
- [Pro tips for podcast outreach & PR](#-pro-tips-for-podcast-outreach--pr)
- [FAQ](#-faq)
- [Related scrapers](#-related-scrapers)
- [Changelog](#-changelog)

***

### 🔎 Why scrape Podchaser?

[Podchaser](https://www.podchaser.com) is the "IMDb of podcasts" — a cross-platform directory indexing millions of podcasts with weighted ratings, listener reviews, episode credits, creator profiles, hosting providers, and network affiliations. For PR agencies, podcast booking services, sponsorship buyers, and SaaS platforms, Podchaser is the ultimate discovery layer.

The challenge: Podchaser's web interface displays one show at a time with no bulk CSV/Excel export, while enterprise access to Podchaser Pro and the official API costs thousands of dollars per year. Manually opening category pages, clicking individual shows, locating RSS feeds, and hunting down producer email addresses takes hours for just a few dozen leads.

This **Podchaser data extractor** automates the entire workflow. Select your target categories or seed shows, and the actor discovers podcasts across pages, extracts structured audience and metadata fields, fetches the header of each show's public RSS feed to pull the verified producer/owner contact email (`itunes:owner`), and outputs a clean, de-duplicated dataset ready for HubSpot, Instantly, Smartlead, Apollo, or Clay.

#### Key business outcomes

- 📧 **Build verified podcast outreach lists** — extract real producer and host contact emails (`contactEmail`) with a **~94% fill rate** across active shows.
- 🎙️ **Automate podcast guest booking & PR pitching** — match executives, authors, and founders with active podcasts filtered by `categories`, `minRating`, `minReviews`, and `minEpisodes`.
- 💰 **Source podcast sponsorship & ad inventory** — identify established shows by `followerCount`, `ratingCount`, `daysBetweenEpisodes`, `hostingProvider`, and `networks`.
- 👥 **Map podcast hosts, producers & guests** — use the unwound `creators` view to discover hosts, co-hosts, producers, and frequent guests across any niche.
- 🔗 **Enrich existing media catalogs** — pass a list of `podcastIds` or `searchNames` to append Apple Podcasts IDs (`applePodcastsId`), Spotify IDs (`spotifyId`), RSS URLs, ratings, and emails to your internal database.

***

### ✨ What this Podchaser scraper does

- ✅ **19 built-in category dropdowns** — discover top and trending shows across `news`, `news-politics`, `government`, `business`, `technology`, `comedy`, `society-culture`, `education`, `health-fitness`, `sports`, `arts`, `science`, `history`, `music`, `religion`, `religion-spirituality`, `tv-film`, `fiction`, and `kids-family`.
- ✅ **Name search, direct IDs & Start URLs** — look up shows by title (`searchNames`), pass canonical Podchaser IDs or slugs (`podcastIds`), or paste any category/search/podcast URL (`startUrls`).
- ✅ **Lightweight RSS contact email enrichment** — downloads only the top byte range (`bytes=0-262144`) of each podcast's public RSS feed to extract the canonical `<itunes:owner><itunes:email>` address (`contactEmail`), all feed header emails (`contactEmailsAll`), and `<itunes:name>` (`ownerNameFromRss`) in milliseconds.
- ✅ **Lookalike graph expansion (`crawlSimilar`)** — every podcast record includes `similarPodcasts`; enable `crawlSimilar: true` to automatically follow 1 to 3 hops of related shows and build hyper-targeted niche lists from a few seed podcasts.
- ✅ **Pre-built outreach quality filters** — filter out dormant, trailer-only, or unrated shows using `minRating`, `minReviews`, `minEpisodes`, and `requireContactEmail`.
- ✅ **Unlocked 1,000+ round-robin pagination** — interleaves pages across your selected categories (`maxPagesPerCategory: 0` auto/unlimited) and de-duplicates every show by its numeric Podchaser `id`.
- ✅ **Three ready-made Console table views** — switch between **Podcasts** (full overview), **Contacts (outreach)** (clean pitch list), and **Creators (unwound)** (one row per host/guest credit).

***

### 🎯 Use cases

| Audience | How they use Podchaser data |
|---|---|
| **🎤 Podcast Guesting & PR Agencies** | Build targeted media lists of active podcasts with verified producer emails (`contactEmail`), episode counts, and latest air dates (`latestEpisodeDate`) ready for cold outreach. |
| **📢 Ad Networks & Sponsorship Sales** | Prospect high-cadence, high-follower podcasts (`followerCount`, `ratingCount`, `daysBetweenEpisodes`) and group them by `hostingProvider` (Megaphone, Simplecast, Acast, Libsyn) or `networks`. |
| **🚀 B2B SaaS & Creator Tools** | Generate B2B leads of active podcasters, editors, and media publishers who need recording, transcription, hosting, or monetization software. |
| **📊 Media Researchers & Analysts** | Analyze podcast industry trends: publishing cadence, active vs. idle status (`status`), category distribution, and network consolidation. |
| **🗂️ Directory & App Builders** | Cross-reference `applePodcastsId`, `spotifyId`, `rssFeedUrl`, and Podchaser `id` to unify podcast catalogs across platforms. |

***

### 📥 Input configuration

Configure your run in the Apify Console or via JSON. **Every field is optional** — running with empty inputs automatically discovers a balanced sample across 8 popular categories (`news`, `business`, `technology`, `comedy`, `society-culture`, `education`, `sports`, `science`).

| Field | Type | Default | Description |
|---|---|---|---|
| `categorySlugs` | `array` | `["news"]` (prefill) | Select one or more Podchaser categories to discover shows from (~25 podcasts per page). Leave empty for an 8-category mix. |
| `searchNames` | `array` | `[]` | Optional list of podcast titles to search for (e.g., `["The Daily", "Acquired", "Huberman Lab"]`). |
| `podcastIds` | `array` | `[]` | Optional list of numeric Podchaser IDs (`"90473"`) or slug-IDs (`"the-daily-90473"`). |
| `startUrls` | `array` | `[]` | Optional list of Podchaser URLs (category pages, search pages, or individual podcast URLs). |
| `scrapeFullProfile` | `boolean` | `true` | Attempt to fetch each podcast's detail page for extended fields, with automatic fallback to the rich listing state when detail pages are rate-gated. |
| `enrichContactFromRss` | `boolean` | `true` | Fetch the header of each podcast's public RSS feed to extract `contactEmail`, `contactEmailsAll`, and `ownerNameFromRss`. |
| `crawlSimilar` | `boolean` | `false` | Expand discovery by queuing the `similarPodcasts` of each scraped show. |
| `similarDepth` | `integer` | `1` | Number of lookalike hops (`1`–`3`) when `crawlSimilar` is enabled. |
| `minRating` | `number` | `0` | Minimum weighted average rating (`0`–`5`). `0` = no filter. |
| `minReviews` | `integer` | `0` | Minimum number of written reviews. `0` = no filter. |
| `minEpisodes` | `integer` | `0` | Minimum number of published episodes (great for skipping inactive shows). `0` = no filter. |
| `requireContactEmail` | `boolean` | `false` | Keep only podcasts where a valid `contactEmail` was extracted. |
| `maxRecords` | `integer` | `0` (prefill `50`) | Maximum number of podcasts to save (`0` = unlimited). |
| `maxPagesPerCategory` | `integer` | `0` | Maximum pages to paginate per category (~25 podcasts/page). Set `0` for automatic / unlimited pagination governed by `maxRecords`. |
| `requestDelay` | `integer` | `700` | Politeness delay between requests in milliseconds. |
| `maxConcurrency` | `integer` | `4` | Number of concurrent worker tasks (`1`–`15`). |
| `proxyConfiguration` | `object` | `{ useApifyProxy: false }` | Proxy settings. Direct connection (`useApifyProxy: false`) works out of the box; enable Apify Proxy only for very large runs. |

#### Example 1 — 1,000+ B2B & Tech podcast outreach list (verified emails only)

```json
{
  "categorySlugs": ["business", "technology", "news", "education", "science"],
  "enrichContactFromRss": true,
  "requireContactEmail": true,
  "minEpisodes": 20,
  "minReviews": 3,
  "maxRecords": 1000,
  "maxPagesPerCategory": 0,
  "maxConcurrency": 6,
  "requestDelay": 400,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

#### Example 2 — Lookalike expansion from seed podcasts (`crawlSimilar`)

```json
{
  "podcastIds": ["the-daily-90473", "planet-money-281", "how-i-built-this-196844"],
  "crawlSimilar": true,
  "similarDepth": 2,
  "enrichContactFromRss": true,
  "maxRecords": 300
}
```

#### Example 3 — Enrich a list of podcast names with cross-platform IDs & emails

```json
{
  "searchNames": ["Acquired", "All-In with Chamath", "Lex Fridman Podcast", "The Vergecast"],
  "enrichContactFromRss": true,
  "maxRecords": 50
}
```

***

### 📤 Output & field reference

Each item in the dataset represents one unique podcast. Below is a real record from a verification run:

```json
{
  "id": 90473,
  "slug": "the-daily",
  "title": "The Daily",
  "url": "https://www.podchaser.com/podcasts/the-daily-90473",
  "description": "This is what the news should sound like. The biggest stories of our time, told by the best journalists in the world.",
  "descriptionHtml": null,
  "imageUrl": "https://image.simplecastcdn.com/images/.../the-daily.jpg",
  "language": "English",
  "languageCode": "en",
  "explicit": false,
  "status": "active",
  "claimed": false,
  "website": null,
  "rssFeedUrl": "https://feeds.simplecast.com/54nAGcIl",
  "hostingProvider": "Simplecast",
  "applePodcastsId": "1200361736",
  "spotifyId": "3IM0lmZxpFAY7CwMuv9H4g",
  "externalIds": {
    "apple": "1200361736",
    "spotify": "3IM0lmZxpFAY7CwMuv9H4g"
  },
  "categories": ["news", "news-politics", "society", "culture"],
  "author": "The New York Times",
  "ownerName": "The New York Times",
  "ratingAverage": 4.35,
  "ratingCount": 1884,
  "reviewCount": 612,
  "followerCount": 45213,
  "listCount": 318,
  "numberOfEpisodes": 2680,
  "avgEpisodeMinutes": null,
  "daysBetweenEpisodes": 1,
  "startDate": null,
  "firstEpisodeDate": "2017-01-30 10:00:00",
  "latestEpisodeDate": "2026-11-01 11:00:00",
  "addedToPodchaser": "2017-02-01 08:14:00",
  "profileUpdatedAt": "2026-10-30 04:22:11",
  "reachVerified": null,
  "reachProvider": null,
  "socialLinks": null,
  "networks": [
    {
      "id": 197,
      "title": "The New York Times",
      "url": null,
      "verified": false
    }
  ],
  "creators": [
    {
      "id": 25791,
      "name": "Michael Barbaro",
      "role": "Host",
      "pcid": "042238",
      "socialAccounts": []
    }
  ],
  "creatorRoleCounts": [
    { "role": "host", "count": 2 }
  ],
  "sponsors": [],
  "latestEpisode": null,
  "similarPodcasts": [
    { "id": 14530, "slug": "up-first", "title": "Up First" },
    { "id": 2262, "slug": "ted-talks-daily", "title": "TED Talks Daily" }
  ],
  "contactEmail": "podcasts@nytimes.com",
  "contactEmailsAll": ["podcasts@nytimes.com"],
  "ownerNameFromRss": "The New York Times",
  "discoveredFrom": "category:news",
  "scrapedAt": "2026-11-02T00:15:00.000Z"
}
```

#### Field reference by category

##### 🏷️ Podcast identity & cross-platform IDs

| Field | Type | Coverage | Description |
|---|---|---|---|
| `id` | `integer` | 🟢 High (100%) | Canonical numeric Podchaser podcast ID (primary key used for de-duplication). |
| `slug` | `string` | 🟢 High (100%) | URL slug on Podchaser. |
| `title` | `string` | 🟢 High (100%) | Official podcast title. |
| `url` | `string` | 🟢 High (100%) | Canonical Podchaser podcast URL (`https://www.podchaser.com/podcasts/{slug}-{id}`). |
| `description` | `string \| null` | 🟢 High (100%) | Plain-text show summary. |
| `imageUrl` | `string \| null` | 🟢 High (100%) | High-resolution podcast cover art URL. |
| `categories` | `array` | 🟢 High (100%) | Array of Podchaser category slugs assigned to the show. |
| `status` | `string \| null` | 🟢 High (100%) | Activity status (`"active"`, `"idle"`, `"ended"`). |
| `claimed` | `boolean \| null` | 🟢 High (100%) | Whether the creator has claimed the profile on Podchaser. |
| `hostingProvider` | `string \| null` | 🟢 High (~86%) | Detected podcast hosting provider (e.g., `Simplecast`, `Megaphone`, `Acast`, `Libsyn`, `Anchor`). |
| `applePodcastsId` | `string \| null` | 🟢 High (~98%) | Apple Podcasts (iTunes) numeric ID. |
| `spotifyId` | `string \| null` | 🟢 High (~97%) | Spotify show ID. |
| `externalIds` | `object \| null` | 🟢 High (~99%) | Map of external directory IDs (`apple`, `spotify`, `playerfm`, etc.). |

##### 📧 Outreach contacts & RSS metadata

| Field | Type | Coverage | Description |
|---|---|---|---|
| `rssFeedUrl` | `string \| null` | 🟢 High (100%) | Public XML RSS feed URL of the podcast. |
| `contactEmail` | `string \| null` | 🟢 High (~93.7%) | Primary business/owner email extracted from the RSS `<itunes:owner><itunes:email>` tag or feed header. |
| `contactEmailsAll` | `array` | 🟢 High (~93.7%) | Up to 10 distinct email addresses discovered in the RSS feed header. |
| `ownerNameFromRss` | `string \| null` | 🟢 High (~90%) | Owner name extracted directly from the RSS `<itunes:owner><itunes:name>` tag. |
| `author` | `string \| null` | 🟢 High (~98%) | Published iTunes author name. |
| `ownerName` | `string \| null` | 🟢 High (~95%) | Published iTunes owner name on Podchaser. |

##### ⭐ Ratings, audience & episode cadence

| Field | Type | Coverage | Description |
|---|---|---|---|
| `ratingAverage` | `number \| null` | 🟢 High (~99%) | Weighted average rating on Podchaser (0.00–5.00 scale). |
| `ratingCount` | `integer \| null` | 🟢 High (100%) | Total number of user ratings. |
| `reviewCount` | `integer \| null` | 🟢 High (100%) | Total number of written reviews. |
| `followerCount` | `integer \| null` | 🟢 High (100%) | Number of followers on Podchaser. |
| `listCount` | `integer \| null` | 🟢 High (100%) | Number of curated Podchaser lists featuring this show. |
| `numberOfEpisodes` | `integer \| null` | 🟢 High (100%) | Total published episodes. |
| `daysBetweenEpisodes` | `number \| null` | 🟢 High (~97%) | Average publishing cadence in days (e.g., `1` = daily, `7` = weekly). |
| `firstEpisodeDate` | `string \| null` | 🟢 High (~99%) | Timestamp of the show's first episode. |
| `latestEpisodeDate` | `string \| null` | 🟢 High (100%) | Timestamp of the most recent episode (crucial for verifying active shows). |
| `addedToPodchaser` | `string \| null` | 🟢 High (100%) | Date the podcast was indexed on Podchaser. |
| `profileUpdatedAt` | `string \| null` | 🟢 High (100%) | Last profile refresh timestamp on Podchaser. |

##### 👥 Creators, networks, lookalikes & detail fields

| Field | Type | Coverage | Description |
|---|---|---|---|
| `creators` | `array` | 🟢 High (~80%) | Credited hosts, guests, and producers (`{ id, name, role, pcid, socialAccounts }`). |
| `creatorRoleCounts` | `array` | 🟢 High (~80%) | Summary counts of credits by role (`host`, `guest`, `producer`, etc.). |
| `networks` | `array` | 🟡 Conditional (~54%) | Podcast networks / publishers the show belongs to (`{ id, title, url, verified }`). |
| `similarPodcasts` | `array` | 🟢 High (100%) | Related podcasts (`{ id, slug, title }`) used for lookalike discovery. |
| `website`, `socialLinks`, `sponsors`, `latestEpisode`, `avgEpisodeMinutes`, `reachVerified` | `mixed` | 🟡 Conditional | Extended detail-page fields; populated whenever the individual show page is directly accessible. |
| `discoveredFrom` | `string` | 🟢 High (100%) | Provenance string showing which category page, search query, or seed surfaced the podcast. |
| `scrapedAt` | `string` | 🟢 High (100%) | ISO 8601 UTC timestamp of extraction. |

***

### 🔁 Pagination & 1,000+ scale

This **Podchaser scraper** is designed to build large, de-duplicated podcast outreach databases effortlessly:

1. **Unlocked `maxPagesPerCategory: 0` default:** When `maxPagesPerCategory` is `0` (the default), the actor automatically paginates through category pages (`?page=1`, `?page=2`, `?page=3`… at ~25 podcasts per page) until your `maxRecords` target is reached or all selected categories are exhausted.
2. **Round-robin category interleaving:** When you select multiple categories (e.g., `business`, `technology`, `news`, `education`), the scraper fetches page 1 of each category, then page 2 of each category, and so on. This guarantees a balanced, multi-category dataset even on smaller runs.
3. **Filter-aware over-fetching:** When post-filters (`minRating`, `minReviews`, `minEpisodes`, or `requireContactEmail`) are active, the discovery engine automatically gathers extra candidate seeds and continues scraping until `saved === maxRecords`.
4. **100% numeric ID de-duplication:** Podcasts that appear in multiple categories (e.g., both `news` and `news-politics`) or across `crawlSimilar` hops are de-duplicated by their canonical numeric `id` so you never pay for or export duplicate rows.

***

### ⚙️ How to use

1. **Open the actor** in the Apify Console.
2. **Choose your discovery source** — pick one or more categories in **Podcast Categories** (`categorySlugs`), or enter specific show names (`searchNames`), IDs (`podcastIds`), or URLs (`startUrls`).
3. **Keep RSS email enrichment on** — leave `enrichContactFromRss: true` to extract verified owner/producer emails from each show's RSS feed.
4. **Set quality filters & target size** — optionally enable `requireContactEmail: true`, set `minEpisodes: 10`, and set `maxRecords` (e.g., `50`, `500`, `2000`, or `0` for unlimited).
5. **Click Start** — no proxy is needed!
6. **Export your leads** — switch to the **Contacts (outreach)** tab in the Dataset viewer and download as **CSV, Excel, or JSON**, or pull directly into your CRM via the **Apify API**.

#### Calling via the Apify API (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("haketa/podchaser-scraper").call(run_input={
    "categorySlugs": ["business", "technology"],
    "enrichContactFromRss": true,
    "requireContactEmail": true,
    "minEpisodes": 15,
    "maxRecords": 500,
    "maxPagesPerCategory": 0,
})

for show in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(show["title"], "->", show["contactEmail"], f"({show['ratingAverage']}★)")
```

***

### 💡 Pro tips for podcast outreach & PR

- 🎯 **Filter out "podfaded" (inactive) shows:** Combine `minEpisodes: 15` with a quick filter on `latestEpisodeDate` in your exported sheet so your team only pitches podcasts that are actively releasing episodes.
- 🕸️ **Use `crawlSimilar` for niche micro-verticals:** Broad categories like `business` are great, but if you want a hyper-specific niche (e.g., *B2B SaaS growth*, *real estate syndication*, or *longevity medicine*), put 5–10 quintessential shows in `podcastIds`, enable `crawlSimilar: true` (`similarDepth: 2`), and let Podchaser's recommendation graph find 200+ lookalike shows.
- ⚡ **Tune concurrency for 1,000+ runs:** Set `maxConcurrency: 8` and `requestDelay: 350` to speed up RSS feed header checks while staying polite to podcast hosting CDNs.
- 📋 **Use the unwound Creators view:** In the Apify Console Dataset tab, select the **Creators (unwound)** view to get one flat row per `(podcast, host/guest)` — ideal for pitching individual hosts by name.

***

### ❓ FAQ

#### Where do the podcast contact emails come from?

Every podcast is powered by a public XML RSS feed distributed to Apple Podcasts and Spotify. Publishers include their official business/booking contact email inside the `<itunes:owner><itunes:email>` tag at the top of that RSS feed. Our scraper fetches just the first 256 KB of the RSS feed and extracts both the owner email (`contactEmail`) and any additional emails in the feed header (`contactEmailsAll`), achieving a **~93.7% fill rate**.

#### Do I need a Podchaser account, API key, or proxy?

No. The actor works out of the box with **no login, no Podchaser API key, and no proxy** (`useApifyProxy: false`).

#### How many podcasts can I scrape in a single run?

With `maxPagesPerCategory: 0` (the default) and `maxRecords: 1000` (or `0` for unlimited), the actor automatically paginates through your chosen categories and/or similar-podcast graph to return **hundreds to thousands of unique podcasts** per run.

#### Why are `website` or `socialLinks` sometimes `null`?

Podchaser places a subset of fields (`website`, `socialLinks`, `sponsors`) exclusively on individual show detail pages that are periodically gated by an anti-bot challenge over plain HTTP. When that happens, the scraper automatically serves the complete category/search entity plus the live RSS enrichment so you still receive 100% of titles, ratings, reviews, followers, episode counts, hosting providers, Apple/Spotify IDs, creators, networks, and verified RSS contact emails at high speed and zero proxy cost.

#### Can I export directly to CSV or Excel for cold email tools?

Yes. Export the dataset as **CSV** or **Excel (XLSX)** — or select the **Contacts (outreach)** view to export a clean 7-column table (`title`, `contactEmail`, `website`, `rssFeedUrl`, `categories`, `numberOfEpisodes`, `url`) ready for Instantly, Smartlead, Lemlist, or HubSpot.

***

### 🔗 Related scrapers

Building a creator-economy, media outreach, or B2B lead generation stack? Pair **Podchaser Scraper** with our other media extractors:

- 🎥 [YouTube Contact Scraper](https://apify.com/haketa/youtube-contact-scraper) — Extract verified creator emails, social links, and subscriber metrics from YouTube.
- 🎵 [SoundCloud Scraper](https://apify.com/haketa/soundcloud-scraper) — Scrape tracks, artists, play counts, and creator profiles from SoundCloud.
- 💿 [Discogs Scraper](https://apify.com/haketa/discogs-scraper) — Extract releases, artists, record labels, and marketplace pricing from Discogs.
- 🎶 [Genius Scraper](https://apify.com/haketa/genius-scraper) — Scrape songs, lyrics, artists, and producer credits from Genius.
- 🐘 [Mastodon Scraper](https://apify.com/haketa/mastodon-scraper) — Discover fediverse creator profiles and bio links.

***

### 📋 Changelog

#### v1.2 (2026-11)

- **Unlocked 1,000+ category pagination:** Changed `maxPagesPerCategory` default from `4` to `0` (automatic/unlimited, governed by `maxRecords`) and added filter-aware seed buffering so filtered runs (`requireContactEmail`, `minRating`, `minReviews`, `minEpisodes`) paginate deep enough to hit `maxRecords`.
- **Faster prefill & schema cleanup:** Tuned prefill `maxRecords` to `50` for sub-30s test runs and streamlined `dataset_schema.json` views.

#### v1.1 (2026-10)

- **Smart detail-page fallback:** Added automatic detection when individual detail pages are rate-challenged so runs immediately serve rich listing entities + RSS contact emails without wasted requests.
- **Round-robin category discovery:** Interleaved pagination across selected categories for balanced multi-niche datasets.

#### v1.0 (2026-05)

- Initial release with category discovery, name search, RSS `<itunes:owner>` contact email extraction, lookalike crawling (`crawlSimilar`), and 3 dataset views.

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/podchaser-scraper/changelog.md

# Actor input Schema

## `categorySlugs` (type: `array`):

Pick one or more categories to discover podcasts from. Each category returns a fresh page of ~25 top shows and paginates automatically. Leave empty to get a diverse, ready-to-use mix across popular categories.

## `searchNames` (type: `array`):

Optional. Type podcast names to look up specific shows (e.g. "The Daily", "Serial"). Leave empty to discover by category instead.

## `scrapeFullProfile` (type: `boolean`):

Visit each podcast page to extract the full record: social links with follower counts, sponsors, hosts & guests with roles, networks, audience-reach verification and similar podcasts. Turn OFF for ultra-fast listing-only discovery (title, ratings, episodes, RSS, categories from the category page alone).

## `enrichContactFromRss` (type: `boolean`):

Fetch each podcast's public RSS feed and extract the owner contact email (itunes:owner) plus any emails in the feed — the real address for outreach, guest pitching, PR and sponsorship. Adds one lightweight request per podcast (only the feed header is downloaded).

## `crawlSimilar` (type: `boolean`):

Expand discovery by following the 'similar podcasts' of every scraped show. Great for building a large, tightly-themed list from a few seeds. Respects Max Records.

## `similarDepth` (type: `integer`):

How many hops to follow when 'Crawl Similar Podcasts' is on. 1 = only the similar shows of your seeds.

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

Drop podcasts below this average rating (0–5). 0 = no filter.

## `minReviews` (type: `integer`):

Drop podcasts with fewer reviews than this. 0 = no filter.

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

Drop podcasts with fewer published episodes than this. Useful to skip inactive or trailer-only shows. 0 = no filter.

## `requireContactEmail` (type: `boolean`):

Keep only podcasts where a contact email was found (requires 'Enrich Contact Email From RSS'). Turns the output into a clean, ready-to-use outreach list.

## `maxRecords` (type: `integer`):

Total cap on podcasts to return. 0 = unlimited.

## `maxPagesPerCategory` (type: `integer`):

Maximum pagination depth per category (~25 podcasts per page). Set 0 for automatic / unlimited pagination (governed by Max Records).

## `startUrls` (type: `array`):

Advanced / optional. Paste any Podchaser URL — a podcast page, a category page, or an episodes page — to scrape it directly. Most users can ignore this and simply pick categories above.

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

Advanced / optional. Scrape specific podcasts directly by Podchaser ID (e.g. 90473) or slug-id (e.g. the-daily-90473). Most users can ignore this and pick categories above.

## `requestDelay` (type: `integer`):

Delay between requests. Higher = gentler on Podchaser.

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

Parallel request count. 3–5 is a good balance of speed and politeness.

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

Default: NO proxy — Podchaser serves data over plain HTTPS and does not require a proxy. Enable Apify Proxy (Datacenter is plenty, Residential for very large runs) only if you hit per-IP rate limits on big jobs.

## Actor input object example

```json
{
  "categorySlugs": [
    "news"
  ],
  "searchNames": [],
  "scrapeFullProfile": true,
  "enrichContactFromRss": true,
  "crawlSimilar": false,
  "similarDepth": 1,
  "minRating": 0,
  "minReviews": 0,
  "minEpisodes": 0,
  "requireContactEmail": false,
  "maxRecords": 50,
  "maxPagesPerCategory": 0,
  "startUrls": [],
  "podcastIds": [],
  "requestDelay": 700,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open to view, filter and export all scraped results from this run (JSON, CSV, Excel).

# 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 = {
    "categorySlugs": [
        "news"
    ],
    "searchNames": [],
    "scrapeFullProfile": true,
    "enrichContactFromRss": true,
    "maxRecords": 50,
    "startUrls": [],
    "podcastIds": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/podchaser-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 = {
    "categorySlugs": ["news"],
    "searchNames": [],
    "scrapeFullProfile": True,
    "enrichContactFromRss": True,
    "maxRecords": 50,
    "startUrls": [],
    "podcastIds": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/podchaser-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 '{
  "categorySlugs": [
    "news"
  ],
  "searchNames": [],
  "scrapeFullProfile": true,
  "enrichContactFromRss": true,
  "maxRecords": 50,
  "startUrls": [],
  "podcastIds": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call haketa/podchaser-scraper --silent --output-dataset

```

## MCP server setup

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