Documents and media

Podcast RSS Feed Scraper: Episodes and Transcripts as JSON

Every podcast is published as an RSS feed, but feeds vary in namespaces, duration formats and show-note markup. This Actor parses them into clean show and episode records, finds the feed for an Apple Podcasts link or show name, and can download each episode's transcript as text.

Open the Actor on Apify Store

Podcast RSS Scraper — Episodes, Transcripts & Apple Podcasts. Pay per result; see the Store page for current pricing.

The source and its limits

The Actor parses the RSS 2.0, iTunes and Podcasting 2.0 namespaces with an XML parser; no browser and no proxies. It handles odd feeds: non-standard namespace prefixes, missing GUIDs, durations given as MM:SS, HH:MM:SS or seconds, and HTML show notes.

Apple Podcasts URLs, bare Apple IDs and search:<term> entries are resolved through Apple's public iTunes Lookup and Search API, which needs no key. A show web page with an RSS autodiscovery link also works.

With fetchTranscripts, each episode's <podcast:transcript> file is downloaded (plain text first, then WebVTT, SRT, JSON or HTML, up to 2 MB) and returned as transcriptText with timestamps and cue numbers removed and speaker names kept as labels.

Limits worth knowing

  • Feeds are fetched up to 30 MB each with a 20-second timeout, at about two requests per second per host.
  • Only transcripts published in the feed are downloaded; audio is never transcribed.
  • Apple lists some shows without a public feed (Apple-exclusive or subscription shows); those return an APPLE_NO_FEED_URL error item.
  • Apple lookups are limited to about 20 requests per minute, so many Apple inputs resolve more slowly than feed URLs.
  • ownerEmail is included only when the feed publishes it.

Fields you get

FieldWhat it holds
recordTypeshow or episode
title, description, author, language, categories, explicitShow metadata
episodeCount, lastBuildDate, latestEpisodeAt, podcastGuid, fundingShow-level Podcasting 2.0 and feed details
episodeGuid, title, pubDate, durationSeconds, season, episode, episodeTypeEpisode metadata
audioUrl, audioType, audioBytes, imageUrl, linkMedia and links
transcripts, transcriptUrl, transcriptFormatTranscript links in the feed
transcriptText, transcriptWordsWith fetchTranscripts
resolvedVia, searchAlternativesHow an Apple link or search term was resolved, and other matches

Example output

One Podnews Daily episode with its transcript fetched (from the Actor's README; shortened):

{
  "recordType": "episode",
  "feedUrl": "https://podnews.net/rss",
  "showTitle": "Podnews Daily - podcast industry and podcasting news",
  "episodeGuid": "https://podnews.net/update/pave-disney-hulu-clues",
  "title": "PAVE Studios shows head to Disney+ and Hulu",
  "pubDate": "2026-10-16T10:09:41.000Z",
  "durationSeconds": 291,
  "episode": 2450,
  "episodeType": "full",
  "explicit": false,
  "audioUrl": "https://op3.dev/e,pg=9b024349-ccf0-5f69-a609-6b82873eab3c/podnews.net/audio/podnews261016.mp3",
  "audioType": "audio/mpeg",
  "link": "https://podnews.net/update/pave-disney-hulu-clues",
  "transcriptUrl": "https://podnews.net/audio/podnews261016.mp3.vtt",
  "transcriptFormat": "vtt",
  "transcriptText": "James Cridland: From our free daily newsletter, the latest from podnews.net with Soundstack. …",
  "transcriptWords": 730,
  "fetchedAt": "2026-10-16T13:13:06.512Z"
}

Use cases

New-episode alerts

Turn on onlyNewSinceLastRun and schedule the Actor. The first run is a baseline; later runs return only episodes with GUIDs not seen before and POST them to your webhook.

Transcript text for search or LLM analysis

Turn on fetchTranscripts to get plain transcript text with speaker labels for shows that publish transcripts.

Find a feed from a show name

Pass search:Hard Fork or an Apple Podcasts link; the show record records how it was resolved and lists other matches.

How to run it

You need an Apify account and its API token (Console → Settings → API & Integrations). Each run is billed per result to your account; set a maximum total charge for the run to cap spend.

With curl

The sync endpoint starts a run, waits up to 300 seconds and returns the dataset items. The five newest episodes of one feed, with transcript text:

export APIFY_TOKEN=<your Apify API token>

curl -sS -X POST \
  "https://api.apify.com/v2/acts/owlabee~podcast-rss-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer ${APIFY_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
  "feeds": [
    "https://podnews.net/rss"
  ],
  "maxEpisodesPerFeed": 5,
  "includeShowRecord": true,
  "fetchTranscripts": true,
  "onlyNewSinceLastRun": false,
  "maxConcurrency": 5
}'

From an AI agent (MCP)

Apify hosts an MCP server. This config exposes only this Actor to the agent:

{
  "mcpServers": {
    "owlabee-podcast-rss-scraper": {
      "url": "https://mcp.apify.com/?tools=owlabee/podcast-rss-scraper",
      "headers": {
        "Authorization": "Bearer ${APIFY_TOKEN}"
      }
    }
  }
}

Then ask, for example: Get the last 20 episodes of Planet Money from Apple Podcasts with their publish dates, durations and audio URLs.

Python, Node.js and more examples

Runnable curl.sh, python.py, node.mjs and mcp.json files for this Actor are in examples/podcast-rss-scraper on GitHub.

FAQ

Does it need an API key?

No. Feeds, transcript files and the iTunes API are public endpoints.

Which transcript formats are supported?

Plain text, WebVTT, SRT, Podcasting 2.0 JSON and HTML. Timestamps, cue numbers and styling are removed; speaker names are kept.

How does monitoring work?

The Actor stores each feed's seen episode GUIDs (up to 5,000) in the key-value store named by stateStoreName and returns only unseen ones on later runs.

Can it resolve Podcast Index GUIDs?

No. That needs a Podcast Index API key, so those inputs return GUID_RESOLUTION_UNAVAILABLE.

I want summaries, not raw transcripts.

The podcast summarizer takes the same inputs and writes an abstract, chapters and quotes per episode.