# Podcast Transcripts: speech-to-text, Apple Podcasts & RSS (`pikoulas/podcast-transcripts`) Actor

Transcribe podcast episodes to text or timestamped segments, by Apple Podcasts URL, RSS feed, podcast name or episode search, with each episode's title, date, duration and show notes. Speech-to-text by Whisper inside the run, in about 100 languages; long episodes in full.

- **URL**: https://apify.com/pikoulas/podcast-transcripts.md
- **Developed by:** [Spyridon Pikoulas](https://apify.com/pikoulas) (community)
- **Categories:** AI, Videos, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 audio minute transcribed (whisper base)s

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 Transcripts

Get the transcript of podcast episodes as clean text, or as timestamped segments, from any of:

- **Apple Podcasts URLs:** a show (podcasts.apple.com/.../id1200361736) for its latest episodes,
  or an episode (with `?i=...`).
- **Podcast names:** found on Apple Podcasts, as its search finds them.
- **RSS feeds:** any podcast's feed, Apple-listed or not, which covers Spotify's too when the show
  has a public feed.
- **Audio files:** a direct .mp3 or .m4a URL.
- **Episode search:** words searched across Apple Podcasts' episodes.

The speech-to-text runs inside the actor: OpenAI's Whisper model, open source, on Apify's
servers. Nothing is sent to an outside AI service. It detects the language spoken in each
episode, among about 100. Long episodes are transcribed in full, ten minutes at a time.

Every result also carries the episode's title, date, duration, show notes, season and number,
image and audio link, and the podcast's title, author, categories, website, feed and Apple IDs.

It costs **$0.003 per minute of audio** on Apify's paid plans ($0.006 on the free plan) with
Whisper base, and $0.008 ($0.016) with Whisper small, counted in started minutes: a 40-minute
episode is $0.12. Episodes without speech are free.

### What people use it for

- **AI and LLM pipelines:** summaries, RAG over a show's back catalogue, training data.
- **Research and monitoring:** what's said about a company, product or topic across podcasts.
- **Repurposing:** show notes, blog posts, newsletters, quotes and subtitles from episodes.
- **Accessibility and search:** a searchable text archive of a show.

### How to transcribe podcasts

1. Click **Try for free**; Apify's free plan covers a first run.
2. Fill in **Podcasts and episodes**, **Search episodes** or both, and how many episodes you want
   from each.
3. Click **Start**, then download the results as JSON, CSV, Excel or HTML, or read them through
   the API.

**Published after** keeps only newer episodes. **Max minutes per episode** transcribes and
charges only each episode's first minutes. **Speech-to-text model** picks between Whisper base,
fast and good on clear speech, and Whisper small, more accurate on accents, crosstalk, names and
languages other than English, and about three times slower. **Language** fixes the language
spoken when you know it; otherwise each episode's is detected. Turn on **Include timestamps** for
`segments`, each line with its start and end.

```json
{
  "podcasts": [
    "https://podcasts.apple.com/us/podcast/the-daily/id1200361736",
    "Huberman Lab",
    "https://feeds.npr.org/500005/podcast.xml"
  ],
  "searchTerms": ["interest rates"],
  "maxEpisodes": 5,
  "publishedAfter": "2026-10-01",
  "model": "base",
  "includeTimestamps": true
}
```

### Output

```json
{
  "podcastTitle": "The Daily",
  "podcastAuthor": "The New York Times",
  "podcastAppleId": "1200361736",
  "podcastAppleUrl": "https://podcasts.apple.com/us/podcast/the-daily/id1200361736",
  "feedUrl": "https://feeds.simplecast.com/Sl5CSM3S",
  "categories": ["Daily News", "News"],
  "podcastWebsite": "https://www.nytimes.com/the-daily",
  "podcastLanguage": "en",
  "episodeTitle": "Want to Enjoy Music More? Go For a Run.",
  "publishedAt": "2026-11-01T11:00:00Z",
  "durationSeconds": 2384,
  "episodeType": "full",
  "explicit": false,
  "description": "Ben Ratliff, a music critic and avid runner, always ran in silence. …",
  "guid": "92c4c6cb-4077-4a0e-bf32-12a44d1dd1f2",
  "audioUrl": "https://dts.podtrac.com/redirect.mp3/…/default.mp3",
  "imageUrl": "https://image.simplecastcdn.com/images/…/3000x3000/….jpg",
  "episodeAppleId": "1000799212333",
  "episodeAppleUrl": "https://podcasts.apple.com/us/podcast/want-to-enjoy-music-more-go-for-a-run/id1200361736?i=1000799212333",
  "input": "https://podcasts.apple.com/us/podcast/the-daily/id1200361736",
  "language": "en",
  "languageProbability": 0.99,
  "text": "There's rewarding, and then there's remarkably rewarding with Chase Sapphire Reserve. …",
  "transcribedSeconds": 2384,
  "isComplete": true,
  "billedMinutes": 40,
  "segments": [{"start": 0.82, "end": 6.44, "text": "There's rewarding, and then there's remarkably rewarding with Chase Sapphire Reserve."}]
}
```

An episode stopped short by **Max minutes per episode**, the run's spending limit or its timeout
comes with what was transcribed, `isComplete: false`, its `transcribedSeconds` and a
`stoppedBecause`, and is charged only for those minutes. An episode without speech, or whose
audio can't be fetched, comes with its details and a `noTranscriptReason`, and costs nothing.

### Use it as an API

Apify's API starts a run and returns its dataset as JSON; its Python and JavaScript clients, and
its Make, Zapier and n8n integrations, work the same way. Long episodes take minutes, so start a
run and read its dataset when it ends.

```bash
curl -X POST "https://api.apify.com/v2/acts/pikoulas~podcast-transcripts/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"podcasts": ["https://podcasts.apple.com/us/podcast/the-daily/id1200361736"], "maxEpisodes": 1}'
```

AI agents can call it as a tool through Apify's MCP server: `https://mcp.apify.com?tools=pikoulas/podcast-transcripts`.

### How much does it cost to transcribe a podcast?

With Whisper base you pay **$0.003 per started minute of audio** on Apify's paid plans, and
$0.006 on the free plan: an hour-long episode is $0.18 ($0.36 on the free plan). Whisper small,
which takes about three times the computing, is $0.008 per started minute ($0.016 on the free
plan). `billedMinutes` shows each episode's. Episodes without speech are free, and so is
everything else the run fetches. The only other charge is traffic through Apify's residential
proxy, at $0.0012 per 100 KB, only when you set it yourself; audio files never go through it.
There are no monthly fees.

The run stops at the spending limit you set, mid-episode if need be, and charges only what it
transcribed.

### Good to know

- Whisper writes what it hears: names, jargon and crosstalk can come out wrong, and Whisper small
  gets more of them right. Speakers aren't told apart.
- A run transcribes about 20 minutes of audio a minute with Whisper base at the default 8 GB of
  memory, and about 7 with Whisper small. More memory is faster, at the same price per minute.
  The default timeout of an hour covers about 20 hours of audio with base; raise it for more.
- Ads in the episode are transcribed with the rest, as they're part of the audio.
- A podcast's episodes come from its feed, newest first, as far back as the feed goes; Apple's
  latest 200 when the feed fails.
- An episode found twice in one run, by URL and in its show say, is given once.
- Paid, subscriber-only episodes can't be read.

### FAQ

#### Is it legal to transcribe podcasts?

It reads only what podcasts publish openly in their feeds, without logging in. Episodes are
their creators' copyrighted work: a transcript for your own research, analysis or accessibility
is often allowed, depending on your country's copyright law, but republishing it may need the
rights holder's permission, and personal data in it is protected by laws such as the GDPR and
the CCPA. If you're unsure, ask a lawyer;
Apify's [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/) is a good start.

#### Something missing or not working?

Open an issue on the **Issues** tab with the input you used, or ask there for a field you need.

# Actor input Schema

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

Apple Podcasts show or episode URLs (podcasts.apple.com/.../id1545953110, with ?i=... for an episode), RSS feed URLs, direct audio file URLs (.mp3, .m4a...), or a podcast's name to find on Apple Podcasts.

## `searchTerms` (type: `array`):

Words to search Apple Podcasts' episodes for, as its search does (titles and descriptions).

## `maxEpisodes` (type: `integer`):

Episodes from each podcast or search term, newest first for a podcast. An episode URL is always one.

## `publishedAfter` (type: `string`):

Only episodes released on or after this date (YYYY-MM-DD).

## `maxMinutesPerEpisode` (type: `integer`):

Transcribes only each episode's first minutes, and charges only those. Empty: whole episodes.

## `model` (type: `string`):

Whisper base is fast and good on clear speech. Whisper small is more accurate on accents, crosstalk, names and languages other than English, takes about three times as long and costs $0.008 per started minute against base's $0.003 ($0.016 and $0.006 on Apify's free plan).

## `language` (type: `string`):

The language spoken, as a code (en, es, pt, de, hi...), when all the episodes share one. Empty: detected for each episode.

## `includeTimestamps` (type: `boolean`):

Adds the transcript as segments with their start and end in seconds, next to the plain text.

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

Not needed for most runs. Used for Apple and the feeds, never for the audio files.

## Actor input object example

```json
{
  "podcasts": [
    "https://podcasts.apple.com/us/podcast/npr-news-now/id121493675"
  ],
  "maxEpisodes": 3,
  "model": "base",
  "language": "",
  "includeTimestamps": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "podcasts": [
        "https://podcasts.apple.com/us/podcast/npr-news-now/id121493675"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pikoulas/podcast-transcripts").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 = { "podcasts": ["https://podcasts.apple.com/us/podcast/npr-news-now/id121493675"] }

# Run the Actor and wait for it to finish
run = client.actor("pikoulas/podcast-transcripts").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 '{
  "podcasts": [
    "https://podcasts.apple.com/us/podcast/npr-news-now/id121493675"
  ]
}' |
apify call pikoulas/podcast-transcripts --silent --output-dataset

```

## MCP server setup

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

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/vqdATxjD6snoOtBNm/builds/NinSayjoHfSaJRLb0/openapi.json
