# Podcast Transcript Generator & API: Audio & Video to Text (`s_actors/audio-video-transcriber`) Actor

Transcribe podcasts and audio / video files to text: paste an Apple Podcasts, Spotify or RSS link, a podcast name, or any MP3 / MP4 URL. Uses the podcast's own transcript when published, Whisper AI in 99 languages when not. Timestamps, speakers, SRT and VTT.

- **URL**: https://apify.com/s_actors/audio-video-transcriber.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** AI, Videos, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.79 / 1,000 audio minute transcribed by ais

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 Transcript Generator & API: Audio & Video to Text

Turn **podcasts and audio / video files into text**: paste an **Apple Podcasts** or **Spotify** link, an **RSS feed**, a podcast's name, or any **MP3, M4A, WAV, MP4 or MOV** link. You get the **full transcript**, **speakers**, **timed segments** and ready **SRT and VTT subtitles**, with the episode's title, date and length.

Many podcasts publish their own transcript with each episode, often with speaker names. The Actor **uses that transcript whenever it exists** (instant, any length, $0.00199 an episode). Everything else is transcribed from the audio by **Whisper AI in 99 languages** at **$0.00599 per minute**. **Files without speech are free.**

```json
{ "sources": ["https://podcasts.apple.com/us/podcast/stuff-you-should-know/id278981407", "Darknet Diaries", "https://example.com/interview.mp3"], "maxEpisodes": 3 }
```

No sign-up on a transcription website, no API key, no upload limits: use it as a **transcription API** for a single file or for whole podcasts.

#### What you get

One row per file or episode. Real example, October 2026:

| podcastTitle | episodeTitle | transcriptSource | language | speakers | wordCount | durationSeconds | aiMinutes |
|---|---|---|---|---|---|---|---|
| Stuff You Should Know | The Twilight Zone Episode | podcast-feed | en | Speaker 1, Speaker 2 | 8,756 | 2,760 | 0 |
| Darknet Diaries | 181: Ricky | podcast-feed | en | JACK | 15,329 | 4,815 | 0 |
| NPR News Now | 7am ET, October 23 | ai | en | | 740 | 303 | 6 |

| Field | Description |
|---|---|
| `transcript` | The spoken words as one text; with speakers, a paragraph per speaker turn ("JACK: ...") |
| `segments` | `[{start, end, text, speaker}]` with seconds, for quotes, clips, chapters and search inside an episode |
| `subtitlesSrt`, `subtitlesVtt` | Ready subtitles for a video editor, YouTube or a player |
| `srtFileUrl`, `vttFileUrl`, `txtFileUrl` | Download links of the same as files (with **Save files**) |
| `speakers` | Speaker names when the podcast's transcript has them |
| `transcriptSource` | `podcast-feed` (the transcript the podcast publishes) or `ai` (Whisper speech recognition) |
| `transcriptionModel`, `aiMinutes` | Which transcript or model wrote the text, and the AI minutes charged |
| `language`, `languageName` | Spoken language: `en` / English |
| `wordCount`, `segmentCount`, `speechSeconds`, `hasTimestamps` | How much is said, and for how long |
| `podcastTitle`, `podcastAuthor`, `episodeTitle`, `season`, `episodeNumber`, `publishedAt`, `durationSeconds`, `imageUrl` | The podcast and the episode |
| `episodeUrl`, `audioUrl`, `feedUrl`, `publishedTranscriptTypes` | Links: the episode page, the audio file, the RSS feed, and the transcript formats the podcast publishes |
| `hasTranscript`, `noTranscriptReason` | `false` with the reason when a file has no speech or was skipped (free) |
| `input`, `inputType`, `position`, `scrapedAt`, `error` | Which input the row came from; why a file was not read |

#### What you can paste

| Input | What happens |
|---|---|
| **Audio / video file link** | `.mp3`, `.m4a`, `.wav`, `.ogg`, `.opus`, `.flac`, `.aac`, `.mp4`, `.mov`, `.webm`, `.mkv`... up to 1.5 GB and 10 hours |
| **Dropbox / Google Drive share link** | Turned into a direct download (the file must be shared with "anyone with the link") |
| **Web page with a player** | The page's audio or video file (`og:audio`, `<audio>`, `<video>`, a link to an `.mp3`); a podcast website's episode page is found in its feed |
| **Podcast RSS feed** | The latest episodes (**Episodes per podcast**) |
| **Apple Podcasts link** | A show (latest episodes) or one episode (`?i=...`) |
| **Spotify link** | A show or an episode, found in the podcast's public feed. Spotify-only shows have no public audio and cannot be transcribed |
| **Podcast name** | "Lex Fridman Podcast", "The Daily": found on Apple Podcasts |

YouTube, TikTok, Instagram and Facebook links are not files: use our [YouTube Transcript Scraper](https://apify.com/s_actors/youtube-transcript-scraper), [TikTok Transcript Scraper](https://apify.com/s_actors/tiktok-transcript-scraper), [Instagram Reel Transcript](https://apify.com/s_actors/instagram-reel-transcript) or [Facebook Video Transcript](https://apify.com/s_actors/facebook-video-transcript).

#### Settings

| Setting | What it does |
|---|---|
| **Episodes per podcast** | Latest N episodes of each podcast (default 1, `0` = all of them) |
| **Only episodes published after** | Only recent episodes: `2026-10-01` or `7 days`, `2 weeks`, `1 month` |
| **Only new episodes** | Skip what earlier runs already saw: schedule it to follow podcasts |
| **Use the podcast's own transcript** | On by default. Off = every file goes through AI |
| **Transcribe with AI** | On by default. Off = only published transcripts, the rest are free rows |
| **Spoken language** | Empty = detected from each file's first minutes. Set `en`, `es`, `de`... only if detection picks the wrong one |
| **Max file length** | Longer files are skipped for free (default 300 minutes) |
| **Timed segments / SRT and VTT / Save files** | What goes into each row, and `.srt` `.vtt` `.txt` files in your storage |

#### Why this Actor

| | |
|---|---|
| 📄 **Published transcripts first** | About 1 in 4 big podcasts publish a transcript in their feed (Stuff You Should Know, The Diary of a CEO, Darknet Diaries, Acquired, every Buzzsprout show with transcripts on): you get it with speaker names for a flat $0.00199, whatever the length |
| 🤖 **Whisper AI for everything else** | $0.00599 a minute, 99 languages, language detected automatically; a voice detector runs first, so music and silence are not transcribed and AI never invents words over a jingle |
| 🔗 **Any link** | Apple Podcasts, Spotify, RSS, podcast names, direct files, Dropbox, Google Drive, web pages with a player: no need to find the MP3 yourself |
| ⏱️ **Long files** | Episodes of 3-5 hours are cut into 10-minute pieces at pauses, so no word is split and memory stays low |
| 🔔 **Podcast monitoring** | Only the new episodes since the last run, on a schedule |

#### Follow podcasts automatically

1. Add the podcasts you follow (names, Apple or Spotify links, or RSS feeds)
2. Turn on **Only new episodes**
3. Save as a task with a daily schedule: each run transcribes only the new episodes, ready for a Google Sheet, Slack, a newsletter or an AI summary through an integration

The list of seen episodes is kept per podcast and monitor name in your account (key-value store `audio-transcriber-state`).

#### Pricing

Pay per AI minute, or a flat price for an episode whose podcast publishes its transcript. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Audio minute transcribed by AI (started minutes, rounded up per file) | $0.00599 | $0.00539 | $0.00479 |
| Published podcast transcript, per episode (any length) | $0.00199 | $0.00179 | $0.00159 |

| Task | Cost |
|---|---|
| A 5-minute voice memo or news bulletin | ~$0.03 |
| A 1-hour podcast episode without a published transcript | ~$0.36 |
| A 1-hour episode of a podcast that publishes transcripts | ~$0.002 |
| 100 hours of interviews | ~$36 |
| Following a weekly 1-hour podcast for a month | ~$1.45 per month |

Files without speech, files that are not found and files over the length limit are not charged.

#### Ready-made tasks

Open it, change the link, and run:

| Task | What you get |
|---|---|
| [Podcast Transcript Generator from Link: Spotify, Apple, RSS](https://apify.com/s_actors/audio-video-transcriber/examples/podcast-transcript-generator-from-link) | Transcripts of the podcast episodes you paste, with speakers and SRT |

#### FAQ

**How do I get the transcript of a podcast episode?** Paste the episode's Apple Podcasts or Spotify link (or the podcast's name for its latest episode) into **Audio / video links, podcasts** and run. The `transcript` column has the text; `subtitlesSrt` has it with timestamps.

**Where does the text come from?** From the transcript the podcast publishes in its RSS feed when there is one (`transcriptSource: podcast-feed`): made by the podcast or its hosting service, usually with speaker names. Otherwise from OpenAI's Whisper speech recognition (`transcriptSource: ai`): large-v3-turbo, or Whisper base when the hosted model is busy. Clear speech comes out nearly word for word; names, jargon and crosstalk can be misheard.

**Can I transcribe Spotify podcasts?** Yes, when the podcast is also published outside Spotify (nearly all are): the Actor finds the same episode in the podcast's public feed. Spotify-only shows and paid episodes have no public audio file.

**Which languages are supported?** The 99 languages of Whisper, detected for each file. Published transcripts come in the podcast's language.

**Does it identify speakers?** Published transcripts usually include speaker names (`speakers`, and `speaker` in each segment). AI transcripts do not separate speakers.

**How are AI minutes counted?** By the file's length, rounded up once per file: a 40-second clip is 1 minute, a 61-minute episode is 62. Published transcripts have no AI minutes.

**How long does a long episode take?** About 1-3 minutes per hour of audio while the hosted model is available, up to ~15 minutes per hour on the fallback model. Raise the run's memory to make the fallback faster.

**Can I upload a file from my computer?** Upload it anywhere that gives a public link (Dropbox, Google Drive, an Apify key-value store, your website) and paste that link.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Transcribe the last 3 episodes of Acquired and summarise what they say about Nvidia".

#### Other transcript tools

| Tool | What it does |
|---|---|
| [YouTube Transcript Scraper](https://apify.com/s_actors/youtube-transcript-scraper) | YouTube captions of videos, channels and playlists in any language |
| [TikTok Transcript Scraper](https://apify.com/s_actors/tiktok-transcript-scraper) | TikTok subtitles and AI transcripts from links or profiles, SRT and VTT |
| [Instagram Reel Transcript](https://apify.com/s_actors/instagram-reel-transcript) | Instagram Reels to text from links or profiles, SRT and VTT |
| [Facebook Video Transcript](https://apify.com/s_actors/facebook-video-transcript) | Facebook videos and Reels to text, Facebook captions or AI |

#### Is it legal?

The Actor reads only public files and feeds that anyone can open, without logging in. Transcripts are the speakers' words: use them for research, accessibility, notes or quotes in line with copyright law, and handle personal data such as names in line with GDPR and other privacy laws.

# Actor input Schema

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

One per line, any mix of: a direct file link (MP3, M4A, WAV, OGG, FLAC, MP4, MOV, WebM...), a Dropbox or Google Drive share link, a web page with an audio / video player, a podcast RSS feed, an Apple Podcasts or Spotify podcast link (show or episode), or simply a podcast's name ("Lex Fridman Podcast"). Public files only.

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

For a podcast (feed, show link or name): how many of its latest episodes to transcribe. 0 = all (up to 1,000). Episode links always give that one episode.

## `postedAfter` (type: `string`):

Podcasts only. A date (2026-10-01) or a period back from now ("7 days", "24 hours", "2 weeks", "3 months"). Empty = no date limit.

## `onlyNew` (type: `boolean`):

Podcasts only: skip episodes that an earlier run with the same monitor name already saw. The first run takes the latest episodes as usual.

## `monitorName` (type: `string`):

Keeps separate "already seen" lists for different schedules. Same name = same list.

## `usePublishedTranscripts` (type: `boolean`):

On: episodes with a transcript published in their podcast feed get it (one flat price per episode, speakers included). Off: every file goes through AI (per minute).

## `transcribeWithAI` (type: `boolean`):

On: files and episodes without a published transcript are transcribed by Whisper AI (charged per started minute). Off: only published transcripts; the rest come back free without text.

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

Two-letter code of the spoken language (en, es, de, fr, pt, hi, ar...). Empty = detected automatically from the first minutes of each file (recommended).

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

Longer files are skipped (free row) instead of transcribed by AI, so one 10-hour recording cannot eat your budget. Published transcripts are used at any length.

## `includeSegments` (type: `boolean`):

Add the transcript as segments with start and end seconds (and speaker, when known).

## `includeSubtitles` (type: `boolean`):

Add ready subtitles (SRT and WebVTT text) to every row.

## `saveFiles` (type: `boolean`):

Also save each transcript as downloadable files in the run's key-value store (links in the row).

## `debugLog` (type: `boolean`):

Log every request attempt (for support).

## Actor input object example

```json
{
  "sources": [
    "https://podcasts.apple.com/us/podcast/stuff-you-should-know/id278981407",
    "https://feeds.npr.org/500005/podcast.xml"
  ],
  "maxEpisodes": 1,
  "onlyNew": false,
  "monitorName": "default",
  "usePublishedTranscripts": true,
  "transcribeWithAI": true,
  "maxMinutesPerFile": 300,
  "includeSegments": true,
  "includeSubtitles": true,
  "saveFiles": false,
  "debugLog": false
}
```

# Actor output Schema

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

One row per file or episode: the transcript, language, speakers and source.

## `details` (type: `string`):

Podcast, episode, file and feed of each transcript, how it was made.

## `subtitles` (type: `string`):

SRT and VTT subtitles of every timed transcript, ready to paste or save.

## `all` (type: `string`):

Every field of every row.

# 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://podcasts.apple.com/us/podcast/stuff-you-should-know/id278981407",
        "https://feeds.npr.org/500005/podcast.xml"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/audio-video-transcriber").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://podcasts.apple.com/us/podcast/stuff-you-should-know/id278981407",
        "https://feeds.npr.org/500005/podcast.xml",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("s_actors/audio-video-transcriber").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://podcasts.apple.com/us/podcast/stuff-you-should-know/id278981407",
    "https://feeds.npr.org/500005/podcast.xml"
  ]
}' |
apify call s_actors/audio-video-transcriber --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/audio-video-transcriber"
        }
    }
}
```

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/A8lxAf9eckPF5HeSX/builds/Va0XP04FBm0ZJijHC/openapi.json
