# Podcast Transcript Scraper (`masked_hacker/podcast-transcript-scraper`) Actor

Scrape podcast episodes and their full transcripts (segmented, with timestamps) from the show's RSS feed. Resolves a show name, Apple Podcasts URL, or RSS URL to the feed, then extracts each episode's metadata, audio URL and Podcasting 2.0 transcript.

- **URL**: https://apify.com/masked\_hacker/podcast-transcript-scraper.md
- **Developed by:** [Masked Hacker](https://apify.com/masked_hacker) (community)
- **Categories:** Videos
- **Stats:** 10 total users, 8 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 episodes

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Podcast Transcript Scraper: Episodes & Full Text Transcripts

Turn a list of podcast shows into a clean, structured dataset of episodes and their **full
transcripts:** segmented, with timestamps and speaker labels where the feed provides them.
Straight from the show's RSS feed, no login, no audio download, no ASR.

Perfect for **content research, competitive podcast monitoring, transcript search indexes, and
feeding LLM pipelines** without paying for a separate transcription step when the show already
ships one.

### What you get

- 🔎 **Search by show name, Apple Podcasts URL, or a direct RSS feed URL**.
- 📝 **Full transcript text** plus timed segments (`start`, `end`, `speaker`, `text`) wherever the
  publisher exposes a Podcasting 2.0 `<podcast:transcript>` tag.
- 🎙️ **Episode metadata:** title, publish date, duration, audio URL, description, episode URL.
- 🚦 **transcriptAvailable flag** so you always know which episodes came with a transcript.
- 📄 Clean JSON / CSV / Excel export, ready for a spreadsheet or a pipeline.

### Pricing

**Pay per event:** **$0.002 per episode** returned, plus a small per-run start fee. You only pay
for episodes you actually receive; no monthly subscription.

### How it works

1. Each input entry (a show name, an Apple Podcasts URL, or a direct RSS URL) is resolved to the
   show's RSS feed via the free iTunes lookup API.
2. The feed is parsed for episodes: title, publish date, duration, audio URL, description,
   episode URL.
3. Where an episode exposes a Podcasting 2.0 `<podcast:transcript>` tag, the transcript file
   (SRT / WebVTT / JSON) is fetched and parsed into full text plus timed segments.

### Input

| Field | Type | Description |
|---|---|---|
| `queries` | string\[] | Show names, Apple Podcasts URLs, or RSS feed URLs, one per show. |
| `maxEpisodesPerShow` | int | Most recent N episodes per show (default 10). |
| `onlyWithTranscript` | boolean | Skip episodes with no transcript (default false). |
| `includeTranscriptText` | boolean | Download + parse transcript text, else return only its URL (default true). |

#### Example input

```json
{
  "queries": ["Stuff You Should Know", "Darknet Diaries"],
  "maxEpisodesPerShow": 10
}
```

### Output

One record per episode.

| Field | Description |
|---|---|
| `showName`, `episodeTitle` | Show and episode titles. |
| `publishDate`, `durationSeconds` | Publish date and duration. |
| `audioUrl` | Direct audio file URL. |
| `transcriptAvailable`, `transcriptFormat`, `transcriptUrl` | Whether a transcript exists, its format and file URL. |
| `transcript`, `transcriptSegments` | Full transcript text and timed `{start, end, speaker, text}` lines. |
| `description`, `episodeUrl`, `guid` | Show notes, episode page URL and feed GUID. |
| `feedUrl`, `scrapedAt` | Source RSS feed and scrape time. |

#### Example output

```json
{
  "showName": "Stuff You Should Know",
  "episodeTitle": "How Ransomware Works",
  "publishDate": "2026-06-30T09:00:00.000Z",
  "durationSeconds": 3120,
  "audioUrl": "https://chtbl.com/track/12345/media.example.com/episode.mp3",
  "transcriptAvailable": true,
  "transcriptFormat": "srt",
  "transcriptUrl": "https://example.com/transcripts/episode-123.srt",
  "transcript": "Josh: Welcome to Stuff You Should Know...",
  "feedUrl": "https://feeds.megaphone.fm/stuffyoushouldknow"
}
```

### Coverage / limitations

- Transcripts come **only** from what the publisher puts in the RSS feed. Roughly a quarter of
  top shows do so today (all iHeart-network shows, and a growing set of others); coverage is
  expanding as the Podcasting 2.0 transcript tag spreads.
- Episodes with no feed transcript are still returned with metadata and `audioUrl`, flagged
  `transcriptAvailable: false`. This actor does **not** transcribe audio (no Whisper/ASR). That
  is out of scope for v1. For full coverage, feed the returned `audioUrl` into a dedicated
  speech-to-text actor.
- **Spotify URLs are not supported**: Spotify serves transcripts only to logged-in users. Pass
  the show name instead. It resolves to the same underlying RSS feed.

### FAQ

**Do I need an API key or podcast platform account?** No. Just provide a show name or URL.

**Which shows have transcripts?** Any show that publishes a Podcasting 2.0
`<podcast:transcript>` tag in its RSS feed, currently around a quarter of top shows, growing.

**Is this legal?** The actor collects only publicly available RSS feed data. You are responsible
for complying with each show's terms and applicable law in your use of the data.

# Actor input Schema

## `queries` (type: `array`):

One entry per show. Each may be a show name (e.g. "Stuff You Should Know"), an Apple Podcasts URL (podcasts.apple.com/...), or a direct RSS feed URL. Show names are resolved to the RSS feed via the free iTunes lookup API. Spotify URLs are not supported — Spotify serves transcripts only to logged-in users; pass the show name instead.

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

Take at most this many of the most recent episodes per show.

## `onlyWithTranscript` (type: `boolean`):

If on, skip episodes whose feed exposes no transcript. If off, those episodes are still returned with metadata and audioUrl, flagged transcriptAvailable=false (no transcription is performed).

## `includeTranscriptText` (type: `boolean`):

If on, download and parse each transcript file into full text and timed segments. If off, only the transcript file URL and format are returned (much faster).

## Actor input object example

```json
{
  "queries": [
    "My Favorite Murder",
    "https://podcasts.apple.com/us/podcast/behind-the-bastards/id1373812661"
  ],
  "maxEpisodesPerShow": 10,
  "onlyWithTranscript": false,
  "includeTranscriptText": true
}
```

# Actor output Schema

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

All scraped episodes in the default dataset.

# 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 = {
    "queries": [
        "Stuff You Should Know",
        "Darknet Diaries"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("masked_hacker/podcast-transcript-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 = { "queries": [
        "Stuff You Should Know",
        "Darknet Diaries",
    ] }

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

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "Stuff You Should Know",
    "Darknet Diaries"
  ]
}' |
apify call masked_hacker/podcast-transcript-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=masked_hacker/podcast-transcript-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/2i90wBuMDzmpXtdvC/builds/eeiSu43KEishwHUax/openapi.json
