# Audio Transcription and Speech to Text for Podcasts (`cleanscrape/podcast-transcription`) Actor

Turn podcast RSS feeds, Apple Podcasts links and audio or video files into text with timestamps. Whisper speech to text in about 100 languages, with SRT and VTT subtitles. Get only new episodes on a schedule. No login. $6 per 1,000 audio minutes. Maintained by CleanScrape.

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

## Pricing

from $4.80 / 1,000 audio minute (standard)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

## Audio Transcription and Speech to Text for Podcasts

Turn podcasts and audio files into text. Paste a podcast RSS feed, an Apple Podcasts link or a link to an audio or video file, and get the full transcript with timestamps, plus TXT, SRT and VTT files. It uses Whisper speech to text, works in about 100 languages and needs no login or API key of your own.

- **Podcast transcription:** the newest episodes of any public feed, with show, episode title, date and episode number.
- **Audio to text:** MP3, M4A, WAV, FLAC, OGG, MP4, MOV, WebM and other files, from any link that opens without logging in.
- **Only new episodes:** give a scheduled check a watch name and each run transcribes only what has appeared since the last one.
- **Timestamps and subtitles:** every spoken segment with its start and end, as a table and as SRT and VTT files.

**Price:** $6 per 1,000 audio minutes on Standard, $15 per 1,000 on Accurate. A one-hour episode is $0.36 or $0.90. Files that fail are not charged.

### Watch the walkthrough

A NASA podcast goes in and timestamped text comes out. In this 75-second demo, a 52-minute episode becomes 8,022 words, with subtitles, on a real run.

https://youtu.be/XYkpm8EJe4s

### Quick start

1. Paste a feed or file link under **Podcasts and audio links**.
2. Choose **Standard** or **Accurate**.
3. For feeds, set **Episodes per feed**. It starts at 1, the newest episode.
4. Click **Start**. An hour of speech takes about 10 minutes on Standard and 30 on Accurate.

### Choose a ready-to-run example

| Example | What you get |
| --- | --- |
| [Transcribe the latest episode of a podcast](https://apify.com/cleanscrape/podcast-transcription/examples/transcribe-latest-podcast-episode) | The newest episode of a show as text with timestamps, from its Apple Podcasts link |
| [Turn an audio file into text with timestamps](https://apify.com/cleanscrape/podcast-transcription/examples/audio-file-to-text-with-timestamps) | One MP3 link to a transcript with TXT, SRT and VTT files |
| [Weekly check: transcribe only new podcast episodes](https://apify.com/cleanscrape/podcast-transcription/examples/weekly-check-new-podcast-episodes) | Schedule it, and each run transcribes only what has appeared since the last one |
| [Transcribe a Japanese news podcast](https://apify.com/cleanscrape/podcast-transcription/examples/transcribe-japanese-news-podcast) | Accurate quality with the language found automatically |

### What you can paste

| You have | Example |
| --- | --- |
| A podcast RSS feed | `https://feeds.megaphone.fm/abc123` |
| An Apple Podcasts show | `https://podcasts.apple.com/us/podcast/name/id1078765985` |
| An Apple Podcasts episode | the same link with `?i=1000…` at the end |
| A podcast's website | most sites name their feed, and the Actor finds it |
| A file link | `https://example.com/interview.mp3`, a signed S3 or Google Cloud link |
| A Dropbox or Google Drive share link | set to "anyone with the link". This is the way to use a file from your computer |

You can also paste several links at once, or a share message with a link in it.

**Not supported:** YouTube, TikTok, Instagram, Spotify and similar sites. They play media on their own pages and their terms don't allow downloading it. If a show is on Spotify, paste its Apple Podcasts link or RSS feed instead.

### Output

One row per episode or file. The Output tab shows a table, and every format can be exported from Storage > Dataset.

| Field | What it is |
| --- | --- |
| `podcastTitle`, `podcastAuthor` | The show, from its feed |
| `title` | Episode title, or the file name |
| `episodeNumber`, `seasonNumber` | When the feed numbers them |
| `publishedAt`, `episodeUrl` | From the feed |
| `duration`, `durationSeconds` | Length of the audio |
| `language`, `languageConfidence` | Language code, and how sure the detection was |
| `text` | The full transcript |
| `segments` | Each spoken segment: `start`, `end`, `text` |
| `wordCount` | Empty for languages written without spaces, such as Chinese |
| `txtUrl`, `srtUrl`, `vttUrl`, `jsonUrl` | The transcript as files |
| `quality`, `model`, `minutesCharged` | What was used and charged |

Example segment:

```json
{ "start": 12.4, "end": 16.1, "text": "Welcome back to the show." }
```

### Use it from the API

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cleanscrape/podcast-transcription").call(run_input={
    "sources": ["https://podcasts.apple.com/us/podcast/mindshift-podcast/id1078765985"],
    "maxEpisodesPerFeed": 2,
    "quality": "standard",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["duration"], item["text"][:200])
```

### Monitor a podcast

1. Set **Only new episodes: watch name**, for example `weekly-podcasts`.
2. Save it as a task and add a schedule under **Schedules**.

The first run transcribes the newest episodes, up to **Episodes per feed**. Each later run transcribes only episodes that have appeared since. A check with nothing new costs $0.003 per feed, so a daily check of one feed is about $0.09 a month before any episodes. An episode that fails is tried again on the next runs, up to three times.

### Pricing

| | Standard | Accurate |
| --- | ---: | ---: |
| Whisper model | base | small |
| Per audio minute | $0.006 | $0.015 |
| 30-minute episode | $0.18 | $0.45 |
| 1-hour episode | $0.36 | $0.90 |
| 10 hours | $3.60 | $9.00 |
| Time for 1 hour of speech | about 10 minutes | about 30 minutes |

Apify's Bronze, Silver and Gold plans get 10%, 15% and 20% off. Each file is charged by its started minutes, so 61 seconds counts as 2 minutes. Silence and music count too, because the file is charged by its length.

Reading a podcast feed costs $0.003 per feed, each run, whether or not it has new episodes. Direct file links have no such charge.

Nothing is charged for a file that fails, has no speech or would go over your limits. Set **Maximum cost per run** under Run options to cap a run: the Actor checks each file's price first and stops before going over.

### What to expect

- **Accuracy depends on the audio.** Clear speech comes out well on Standard. Choose Accurate for names, accents, crowded rooms and languages other than English, and add names under **Names and terms to listen for**.
- **Some podcast hosts refuse automated downloads.** In a test of 134 shows, the newest episode of 127 could be reached. The rest, mostly on Buzzsprout and Captivate, refused or answered "not found". Those episodes are listed in the run report and their audio is not charged. The Actor doesn't pretend to be a podcast app to get around this.
- **Speakers are not labelled.** The transcript doesn't say who is speaking.
- **One language per file.** It is detected from samples across the whole file, so an ad in another language at the start doesn't decide it. Parts in a second language come out poorly. Set **Language** if you know it.
- **Music and singing** are mostly skipped. Sung words may come out wrong or not at all.
- **Long files need time.** The run stops before its timeout, and a file that would not finish is left out and not charged. The default timeout is 4 hours. For several long files on Accurate, raise it under Run options.
- **Memory:** 4 GB is the default. Each 4 GB adds a CPU core, so 8 GB works about twice as fast at about the same cost.

### Run report

Each run saves `REPORT`, a readable page listing every source and episode with what happened to it, and `SUMMARY`, the same as JSON. Both are in the run's Storage > Key-value store.

### Common questions

#### Does this use an official API?

It reads public podcast RSS feeds, which exist so that apps can download episodes, and Apple's public podcast lookup. Transcripts are made by Whisper on Apify's servers. Your audio isn't sent to any other service.

#### Do I need an OpenAI key or a login?

No. The Whisper models run inside the Actor.

#### Can I export to Excel or CSV?

Yes. Use Export on the Output tab, or the Storage > Dataset tab for all formats. Long transcripts can pass Excel's limit of 32,767 characters per cell: use `txtUrl` or the JSON export for those.

#### How much will a run cost?

Add up the audio minutes and multiply: see Pricing. **Maximum cost per run** under Run options caps it.

#### Can I transcribe a private feed?

Yes, if the feed link works without logging in, as many supporter feeds do. The part of a link after `?` is hidden in rows and reports.

#### Is this legal?

Podcasts and audio belong to their creators. Transcribing for your own research, notes or accessibility is common, but publishing a transcript may need the owner's permission. You are responsible for how you use the audio and the transcripts.

### Support

Questions or a problem? Open an issue on the Issues tab or write to contact.cleanscrape@gmail.com.

If the Actor was useful, an honest review on its Store page helps other people find it.

CleanScrape is independent and not affiliated with Apple, OpenAI or any podcast host.

### More tools from CleanScrape

- [ATP and WTA Tennis Rankings Scraper](https://apify.com/cleanscrape/tennis-rankings-scraper): current ATP and WTA singles, doubles and race rankings with points and movement
- [Flashscore Tennis Scraper](https://apify.com/cleanscrape/tennis-match-data): tennis results, statistics, point-by-point and head-to-head
- [Kick Sponsor Tracker](https://apify.com/cleanscrape/kick-sponsor-tracker): which Kick streamers promote which brands, with codes and broadcast hours
- [Whatnot Scraper](https://apify.com/cleanscrape/whatnot-scraper): Whatnot listings with prices and seller stats, and live shows
- [Whatnot Seller Tracker](https://apify.com/cleanscrape/whatnot-seller-tracker): top sellers per category, items sold, sales per day and followers over time
- [TikTok Shop Product Scraper](https://apify.com/cleanscrape/tiktok-shop-product-scraper): US TikTok Shop prices, sellers and ratings
- [Bilibili Scraper](https://apify.com/cleanscrape/bilibili-scraper): Bilibili videos, danmaku, comments and creators
- [App Store Reviews & Google Play Reviews Scraper (Play Store)](https://apify.com/cleanscrape/app-store-reviews-scraper): reviews from both app stores in one table
- [Google Trends Scraper API for Interest Over Time](https://apify.com/cleanscrape/google-trends-scraper): search interest over time, by region, related queries and trending searches
- [Map Your Show Exhibitor List Scraper for Trade Shows](https://apify.com/cleanscrape/event-exhibitor-monitor): trade show exhibitor lists and booth changes
- [Shopify Product Reviews Scraper for Judge.me and Okendo](https://apify.com/cleanscrape/shopify-reviews-scraper): Judge.me and Okendo reviews from Shopify product links
- [Google News Scraper and RSS Feed Reader](https://apify.com/cleanscrape/google-news-scraper): headlines from Google News and publisher feeds
- [Google Jobs Scraper](https://apify.com/cleanscrape/google-jobs-scraper): job listings with salaries and apply links
- [Pinterest Scraper API](https://apify.com/cleanscrape/pinterest-scraper): keyword search, public pin links and board previews; search results may lack a pin link
- [Google Hotels Scraper](https://apify.com/cleanscrape/google-hotels-scraper): hotel prices and booking offers for your dates
- [Meta Threads Scraper](https://apify.com/cleanscrape/threads-scraper): public Threads posts from accounts or post links
- [Likee Scraper API](https://apify.com/cleanscrape/likee-scraper): Likee videos and comments
- [Casino Bonus Checker](https://apify.com/cleanscrape/casino-bonus-checker): the casino bonus each affiliate and review site shows, with promo codes, 18+ notices and affiliate IDs
- [Video Frame Extractor for Scene Changes and Thumbnails](https://apify.com/cleanscrape/video-frame-extractor): still images from video files at scene changes, intervals or timestamps, with contact sheets
- [Career Site Job Listings from Workday, Greenhouse and Lever](https://apify.com/cleanscrape/career-site-jobs-scraper): open jobs from company career pages, with salaries and new or closed jobs per company
- [Economic Calendar Scraper for Official Release Dates](https://apify.com/cleanscrape/economic-calendar-api): central bank decisions and economic releases with dates and times

# Actor input Schema

## `sources` (type: `array`):

One per line: a podcast RSS feed, an Apple Podcasts show or episode link, or a direct link to an audio or video file (MP3, M4A, WAV, MP4 and others). For a file on your computer, share it from Dropbox or Google Drive with anyone who has the link, and paste that link. YouTube, TikTok, Instagram and Spotify links are not supported.

## `quality` (type: `string`):

Standard uses the Whisper base model and Accurate the Whisper small model. Accurate costs more per minute.

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

The spoken language, as a name or code such as English, fi or Japanese. Leave empty to detect it from samples across each file. One language is used for a whole file.

## `vocabulary` (type: `string`):

Names, brands or technical words that often come up, separated by commas. This helps Whisper spell them correctly.

## `maxEpisodesPerFeed` (type: `integer`):

The newest episodes to transcribe from each feed. Each audio minute is charged, so start small: a one-hour episode is 60 minutes.

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

Only episodes from this day onward, such as 2026-09-01, or from a period back from the start of the run, such as 7 days or 2 weeks.

## `watchName` (type: `string`):

Give a scheduled check a name, for example weekly-podcasts. The first run starts from the newest episodes. Each later run with the same name transcribes only episodes that have appeared since. A check with nothing new costs only the feed check.

## `maxMinutesPerFile` (type: `integer`):

Files longer than this are left out and not charged.

## `maxFileMb` (type: `integer`):

Files bigger than this are not downloaded and not charged.

## Actor input object example

```json
{
  "sources": [
    "https://api.apify.com/v2/key-value-stores/YIp5ecZuBa0h3BGde/records/poem.mp3"
  ],
  "quality": "standard",
  "maxEpisodesPerFeed": 1,
  "maxMinutesPerFile": 240,
  "maxFileMb": 1024
}
```

# Actor output Schema

## `transcripts` (type: `string`):

One row per episode or file: title, date, length, language, the full text, timestamped segments and links to the transcript files.

## `files` (type: `string`):

TXT, SRT, VTT and JSON files for each transcript.

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

What each source gave, and why anything was left out.

## `summary` (type: `string`):

The run as JSON, for code and AI agents.

# 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 = {
    "sources": [
        "https://api.apify.com/v2/key-value-stores/YIp5ecZuBa0h3BGde/records/poem.mp3"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleanscrape/podcast-transcription").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 = { "sources": ["https://api.apify.com/v2/key-value-stores/YIp5ecZuBa0h3BGde/records/poem.mp3"] }

# Run the Actor and wait for it to finish
run = client.actor("cleanscrape/podcast-transcription").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 '{
  "sources": [
    "https://api.apify.com/v2/key-value-stores/YIp5ecZuBa0h3BGde/records/poem.mp3"
  ]
}' |
apify call cleanscrape/podcast-transcription --silent --output-dataset

```

## MCP server setup

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

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/G4EaZc8BlsFaCFyyE/builds/IABWtSb6sdEiwRf5d/openapi.json
