# Podcast Transcriber - Episode Transcripts by Podcast Name (`appdata-labs/podcast-transcriber`) Actor

Type a podcast's name, or paste its Apple Podcasts link or RSS feed, and get its latest episodes as timestamped transcripts. Episodes found through Apple's podcast directory API and the podcast's own feed; Whisper transcribes inside the Actor. No API key. Pay per minute transcribed.

- **URL**: https://apify.com/appdata-labs/podcast-transcriber.md
- **Developed by:** [Kobkoon Janngam](https://apify.com/appdata-labs) (community)
- **Categories:** Agents, MCP servers, AI
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $17.50 / 1,000 audio minute transcribeds

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 Transcriber — episode transcripts by podcast name

**Type a podcast's name and get its latest episodes as text.** You can also paste an Apple Podcasts link or an RSS feed. Each episode comes back as timestamped passages of about 30 seconds, with the podcast name, the episode title and the publish date on every row. Whisper transcribes inside the Actor, so there's no API key and no speech service.

**Quick start:** press **Start** with no configuration. It finds *NASA Daily* by name and transcribes the first 3 minutes of its two newest episodes. Then type the podcasts you follow.

### Sample output

| podcast | episodeTitle | startTime | text |
|---|---|---|---|
| NASA Daily | 360. NASA News October 30, 2026 | 0:00 | Welcome to NASA Daily, where we bring you all of NASA's previous days' proceedings… |
| NASA Daily | 360. NASA News October 30, 2026 | 0:26 | Both carry golden records, containing music, images, sounds, and greetings in 55 languages… |
| NASA Daily | 360. NASA News October 30, 2026 | 0:52 | …an approximately 800 gram Martian meteorite that formed more than 4.1 billion years ago… |
| NASA Daily | 360. NASA News October 30, 2026 | 1:20 | Together, the arrays will increase the station's power capacity by approximately 30%… |

These rows come from a run on 31 October 2026.

Every row also carries `publishedAt`, `durationSeconds`, `episodeUrl`, `feedUrl`, `mediaUrl`, `passage`/`passageCount`, `startSeconds`/`endSeconds`, `language` and `status`.

### What you can do with it

- **Follow podcasts without listening.** Search, skim or summarise this week's episodes.
- **Monitor what is said about your company or market.** Run it on a schedule with *Only episodes since*.
- **Pull quotes with timestamps** for articles, newsletters and social posts.
- **Give an AI agent a podcast.** Each passage fits its context and carries the episode and the moment it came from.

### Input

| Field | Default | Notes |
|---|---|---|
| `podcasts` | `NASA Daily` | Names ("The Daily"), Apple Podcasts links, or RSS feed URLs. |
| `episodesPerPodcast` | `1` | How many of the newest episodes to transcribe, up to 50. |
| `publishedAfter` | — | Only episodes published since this date (YYYY-MM-DD). |
| `language` | `en` | The spoken language, one of 20. |
| `maxMinutesPerEpisode` | `60` | Transcribe at most this many minutes from the start of each episode. |
| `passageSeconds` | `30` | The length of each passage. |
| `country` | `us` | The Apple Podcasts country used for name search. |

### It never guesses the podcast

A name search runs on Apple's podcast directory, which is fuzzy. A nonsense name still returns *something*. This Actor accepts a result only when **every word you typed is in the podcast's title**. Otherwise it skips the entry and names the closest matches, so you're never charged for transcribing the wrong show.

### Every episode gets an answer

| status | Meaning | Charged |
|---|---|---|
| `ok` | Transcribed, one row per passage | Yes, per started minute |
| `no-speech` | The audio has no recognisable speech | Yes, per started minute |
| `not-media` / `download-failed` | The episode file could not be read | No |

Only the minutes you ask for are streamed. Long episodes are not downloaded in full. The run respects your spending limit.

### How it works

1. **Name or Apple link to feed.** Apple's iTunes Search and Lookup APIs are documented, keyless, and built for exactly this.
2. **Feed to episodes.** The RSS feed is what a podcast publishes so that apps can list its episodes.
3. **Episode to text.** Whisper (base, 8-bit) runs on the Actor's own CPU, and ffmpeg decodes the audio.

### Pricing

You pay per started minute of audio transcribed. Podcasts that can't be found and episodes that fail cost nothing.

### Works well with

Same publisher, same output conventions, same honest-failure rules:

- [**audio-video-transcriber**](https://apify.com/appdata-labs/audio-video-transcriber) — Any audio or video file URL to timestamped text, with Whisper.

### Disclaimer

This is an unofficial tool, not affiliated with Apple or any podcast publisher. It reads only public podcast feeds and the episode files they list, through the interfaces published for apps. Make sure your use of the transcripts respects each podcast's rights.

# Actor input Schema

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

Podcast names as you would search them ("The Daily"), Apple Podcasts links (https://podcasts.apple.com/us/podcast/the-daily/id1200361736) or RSS feed URLs. An entry that cannot be found is skipped with a reason; the rest still run.

## `episodesPerPodcast` (type: `integer`):

How many of the newest episodes to transcribe from each podcast. Up to 50. The sample run uses 2.

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

Only transcribe episodes published on or after this date, YYYY-MM-DD. Leave empty for the newest episodes whatever their date.

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

The language spoken in the audio. Whisper transcribes in this language; it does not detect it, so set it for non-English audio.

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

Transcribe at most this many minutes from the start of each episode. You pay only for minutes transcribed. Up to 240. The sample run uses 3.

## `passageSeconds` (type: `integer`):

The transcript is split into passages of about this many seconds, each with its start and end time — easy to cite, and each row fits an AI agent's context. 10 to 300.

## `country` (type: `string`):

Two-letter country code for the podcast name search (us, gb, de, jp…). Only matters when you type a name.

## Actor input object example

```json
{
  "podcasts": [
    "The Daily",
    "https://podcasts.apple.com/us/podcast/the-daily/id1200361736",
    "https://feeds.simplecast.com/Sl5CSM3S"
  ],
  "episodesPerPodcast": 5,
  "publishedAfter": "2026-10-01",
  "language": "es",
  "maxMinutesPerEpisode": 120,
  "passageSeconds": 60,
  "country": "gb"
}
```

# Actor output Schema

## `rows` (type: `string`):

Type a podcast's name, or paste its Apple Podcasts link or RSS feed, and get its latest episodes as timestamped transcripts

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

What was requested, what was transcribed, minutes charged and anything skipped.

# 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": [
        "NASA Daily"
    ],
    "episodesPerPodcast": 2,
    "publishedAfter": "",
    "language": "en",
    "maxMinutesPerEpisode": 3,
    "passageSeconds": 30,
    "country": "us"
};

// Run the Actor and wait for it to finish
const run = await client.actor("appdata-labs/podcast-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 = {
    "podcasts": ["NASA Daily"],
    "episodesPerPodcast": 2,
    "publishedAfter": "",
    "language": "en",
    "maxMinutesPerEpisode": 3,
    "passageSeconds": 30,
    "country": "us",
}

# Run the Actor and wait for it to finish
run = client.actor("appdata-labs/podcast-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 '{
  "podcasts": [
    "NASA Daily"
  ],
  "episodesPerPodcast": 2,
  "publishedAfter": "",
  "language": "en",
  "maxMinutesPerEpisode": 3,
  "passageSeconds": 30,
  "country": "us"
}' |
apify call appdata-labs/podcast-transcriber --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,appdata-labs/podcast-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/y4WD2fuPi7uJXZ414/builds/uCZc0asgDgVp6mbXl/openapi.json
