# YouTube Podcast Scraper — Top Charts, Popular Shows & Episodes (`yugenox/youtube-podcast-scraper`) Actor

Scrape YouTube podcasts without an account: the weekly top podcast chart (US, Canada, Mexico), the most popular shows and episodes in any country, shows by category, podcast search and every episode of a show, with views, publish date, length and description.

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

## Pricing

from $1.10 / 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

## YouTube Podcast Scraper — Top Charts, Popular Shows & Episodes

Scrape **YouTube podcasts** without an account, straight from YouTube Music's podcast pages:

- 🏆 **Weekly top podcast chart** — the 50 top shows this week in the **United States, Canada and Mexico**, ranked.
- 🔥 **Popular shows and episodes in any country** — the ~180-200 most popular shows and the 200 most popular episodes, ranked, for India, the UK, Brazil, Germany, Japan and 60+ more countries.
- 🗂️ **Shows by category** — Comedy, Sports, True crime, Business, Society & culture, Political commentary, Music, Gaming, Religion & spirituality, Science & technology, TV & film, Health & wellness, History, Arts & fiction.
- 🔍 **Search** podcasts or episodes by keyword.
- 🎧 **Every episode of a show** — paste a show link and get its episodes newest first, as many as the show has, with an optional "newer than" date.

Every episode comes with its **publish date**, plus **views, length and the full description** (episodes found by search get these with Show details); every show with its **author and channel**, links to YouTube Music and YouTube, and (optionally) its description. No login, no cookies, no API key, no browser — results arrive in seconds.

### 📦 What you get

| Mode | Rows |
|---|---|
| **Weekly top podcast chart** (US, CA, MX) | 50 shows: rank, title, author, channel, links, chart name. |
| **Popular** (any country) | Shows (~180-200, ranked) or episodes (200, ranked), or both. |
| **Shows by category** | 24 shows per category (14 categories), with their position in the category. |
| **Search** | Shows or episodes (or both) for each search term (50 of each per term by default). |
| **Show and episode links** | The show (with description) and its newest episodes (20 by default, any number), or single episodes. |

Add **Episodes per show** to any list to also get the newest episodes of every show found, and **Show details** to add each show's description.

### ⚙️ Input examples

This week's top podcasts in the US (the default):

```json
{ "mode": "charts", "country": "US" }
```

The 200 most popular podcast episodes in India, published in the last 7 days:

```json
{ "mode": "popular", "country": "IN", "resultType": "episodes", "newerThan": "7 days" }
```

All True crime and Business shows, each with its description and 5 newest episodes:

```json
{ "mode": "category", "categories": ["True crime", "Business"], "includeShowDetails": true, "maxEpisodesPerShow": 5 }
```

Search podcasts about investing:

```json
{ "mode": "search", "searchQueries": ["investing", "personal finance"], "maxResults": 20 }
```

Every episode of two shows from this year:

```json
{
  "mode": "shows",
  "showUrls": [
    "https://music.youtube.com/browse/MPSPPLzJVLNWKVr6ksDjycE7NpSptOlcaEP-jQ",
    "https://www.youtube.com/playlist?list=PLk1Sqn_f33KuWf3tW9BBe_4TP7x8l0m3T"
  ],
  "maxEpisodesPerShow": 1000,
  "newerThan": "2026-01-01"
}
```

| Field | What it does |
|---|---|
| `mode` | `charts`, `popular`, `category`, `search` or `shows`. Empty = the weekly chart (or Popular for a country without one). |
| `country` | Two-letter code. The chart and the popular lists differ by country; categories are the same everywhere. |
| `resultType` | `shows`, `episodes` or `both` (Popular and Search). |
| `categories` | Category names for `category` (empty = all 14). |
| `searchQueries` | Search terms for `search`. |
| `showUrls` | Show links (`music.youtube.com/browse/MPSP…`, YouTube or YouTube Music `playlist?list=PL…`) and episode links (`/browse/MPED…`, watch links) for `shows`. |
| `maxEpisodesPerShow` | Newest episodes per show: 20 for show links when empty; set it to add episodes to any list. |
| `includeShowDetails` | Add every show's description (and views, length and description for episodes found by search). |
| `newerThan` | Only episodes published on or after this day (`2026-09-01`, `7 days`). |
| `maxResults` | The most shows / episodes per list, category and search term per result type — `both` saves up to this many shows and this many episodes per term (for show links: per run). |

### 📤 Output

A show:

```json
{
  "type": "show",
  "title": "Financial Audit",
  "showId": "MPSPPLzJVLNWKVr6ksDjycE7NpSptOlcaEP-jQ",
  "playlistId": "PLzJVLNWKVr6ksDjycE7NpSptOlcaEP-jQ",
  "url": "https://music.youtube.com/browse/MPSPPLzJVLNWKVr6ksDjycE7NpSptOlcaEP-jQ",
  "youtubeUrl": "https://www.youtube.com/playlist?list=PLzJVLNWKVr6ksDjycE7NpSptOlcaEP-jQ",
  "author": "Caleb Hammer",
  "channelId": "UCLe_q9axMaeTbjN0hy1Z9xA",
  "channelUrl": "https://www.youtube.com/channel/UCLe_q9axMaeTbjN0hy1Z9xA",
  "description": "…",
  "rank": 1,
  "position": null,
  "category": null,
  "country": "US",
  "chart": "Weekly top podcast shows",
  "source": { "mode": "charts", "input": "US" },
  "scrapedAt": "2026-10-10T02:10:00.000Z"
}
```

An episode:

```json
{
  "type": "episode",
  "title": "The Most UNHINGED Woman In Financial Audit History",
  "videoId": "QhrjI7-Y788",
  "episodeId": "MPEDQhrjI7-Y788",
  "url": "https://music.youtube.com/watch?v=QhrjI7-Y788",
  "youtubeUrl": "https://www.youtube.com/watch?v=QhrjI7-Y788",
  "showTitle": "Financial Audit",
  "showId": "MPSPPLzJVLNWKVr6ksDjycE7NpSptOlcaEP-jQ",
  "views": 716000,
  "viewsText": "716K views",
  "publishedText": "11h ago",
  "publishedDate": "2026-10-09",
  "duration": "1 hr 33 min",
  "durationSeconds": 5580,
  "description": "…",
  "position": 1
}
```

Every row has the same keys (empty values are `null`), so CSV and Excel columns always line up. The dataset has three table views: **Shows & episodes**, **Shows** and **Episodes**. The run's key-value store holds `RUN_REPORT` (how the run ended, rows per type, skipped links).

### 💵 Pricing

Pay per event:

| Event | When | Price |
|---|---|---|
| Actor start | once per run (per GB of memory; the default 256 MB = 1) | $0.001 |
| Result | one show or episode saved to your dataset | $0.0019 ($1.90 per 1,000) on the Free and Bronze plans, $0.0015 on Silver, $0.0011 on Gold, $0.0008 on Platinum, $0.0006 ($0.60 per 1,000) on Diamond |

Examples on the Free plan: this week's top 50 US podcasts = $0.001 + 50 × $0.0019 = **$0.096**; one show with 200 episodes = $0.001 + 201 × $0.0019 = **$0.383**. Show details and the episodes your date filter skips add nothing; a show link that doesn't exist, a link that isn't a podcast and a run YouTube Music blocks cost nothing beyond the start. Set a maximum cost per run and the actor stops before going over it.

### ❓ FAQ

**Do I need a YouTube account, cookies or an API key?** No. Everything comes from the podcast pages YouTube Music shows any visitor who is not logged in.

**Which countries are covered?** The weekly top podcast chart exists for the United States, Canada and Mexico. The popular shows and episodes lists exist for every country in YouTube Music's country menu (60+), and they differ by country. The category lists are the same in every country today.

**How far back do a show's episodes go?** As far as the show goes: 20 episodes come with the show page, then 100 per page. Set **Episodes per show** to the number you want, and **Episodes newer than** to stop at a date.

**How exact are publish dates?** YouTube Music shows recent episodes as "11h ago" or "3d ago" and older ones as "Sep 14" or "Dec 1, 2025". `publishedText` is that text; `publishedDate` is the day it stands for (YYYY-MM-DD), accurate to about a day for recent episodes.

**Can I monitor new episodes?** Yes — schedule the actor with **Show and episode links** (or a popular list) and **Episodes newer than** = `1 day`; use `videoId` to keep only the episodes you haven't seen.

**Does it collect podcasters' emails or contact details?** No. Descriptions are returned as YouTube Music shows them; the actor does not extract emails, phone numbers or other contact details.

**Is it legal to scrape YouTube podcasts?** The actor reads only publicly available information that anyone can see on YouTube Music without signing in: show and episode titles, view counts, dates, descriptions and the public names of podcast channels. Rows can contain people's names (hosts and channel names), which laws such as GDPR (EU), PIPEDA (Canada) and CCPA (California) protect, so use the data for a legitimate purpose and follow YouTube's terms. Descriptions are copyrighted by their authors. If you're unsure whether your use case is legitimate, check with a lawyer. Background reading: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**What if YouTube Music blocks a request?** Each request is retried on fresh IPs. If YouTube Music refuses the whole run, it stops early and says so instead of spending your money — you pay nothing beyond the start, and the status message tells you to try again later. Runs always finish with the rows collected so far and a plain status message.

**Something missing or wrong?** Open an issue on the actor page and include your input.

# Actor input Schema

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

Weekly top podcast chart: YouTube Music's 50 top shows this week (US, Canada and Mexico). Popular: the most popular shows (~180-200) or episodes (200) in a country, ranked. Shows by category: Comedy, Sports, True crime and 11 more (24 shows each). Search: podcasts or episodes for your search terms. Show links: podcast shows (with their newest episodes) and episodes you paste. Empty = the chart (or Popular for a country without the chart).

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

The chart and the popular lists differ by country. Categories are the same everywhere today.

## `resultType` (type: `string`):

For Popular and Search: save shows, episodes, or both.

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

For Shows by category: which categories to save. Leave empty for all of them.

## `searchQueries` (type: `array`):

For Search: one term per line, e.g. a topic, a host or a show name.

## `showUrls` (type: `array`):

For Show links: podcast show links (music.youtube.com/browse/MPSP…, music.youtube.com or youtube.com playlist?list=PL… links) and episode links (music.youtube.com/browse/MPED… or a watch link). Each show comes with its newest episodes.

## `maxEpisodesPerShow` (type: `integer`):

How many of each show's newest episodes to save. Show links: 20 when empty (0 = the show row only). Chart, Popular, Category and Search: set it to also save the newest episodes of every show found (empty = shows only).

## `includeShowDetails` (type: `boolean`):

Open every show found and add its description (one extra request per show). Episodes found by search also get views, length and description. Show links always include them.

## `newerThan` (type: `string`):

Only save episodes published on or after this day: a date (2026-09-01) or an age (7 days, 2 weeks). Older episodes are skipped and never charged; a show's episodes stop at the date. YouTube Music shows recent dates as "3d ago", so dates are accurate to about a day.

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

The most shows or episodes to save from the chart, each popular list, each category, and each search term per result type ("Shows and episodes" saves up to this many shows and this many episodes per term; search: 50 when empty). Episodes of the shows found are counted by "Episodes per show". For show links: the most rows in the whole run. Leave empty for everything.

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

Apify datacenter proxies work well for YouTube Music (and are the cheapest). Requests YouTube Music blocks are retried on fresh IPs.

## Actor input object example

```json
{
  "mode": "charts",
  "country": "US",
  "resultType": "shows",
  "includeShowDetails": false,
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All podcast shows and episodes saved in this run.

## `run` (type: `string`):

Status and statistics for this run.

## `report` (type: `string`):

RUN_REPORT: how the run ended, rows per type, skipped links, requests and proxy use.

# 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": "charts",
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/youtube-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 = {
    "mode": "charts",
    "maxResults": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/youtube-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 '{
  "mode": "charts",
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/youtube-podcast-scraper --silent --output-dataset

```

## MCP server setup

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