# Audio & Video Transcriber: Any URL & Podcast RSS to Text (`scrapewise/media-transcriber`) Actor

Get a text transcript of any audio or video link: YouTube, TikTok, Instagram, Facebook, X, Reddit, Vimeo, Loom, MP3 and MP4 files, podcast RSS, Apple Podcasts and Spotify podcasts. Speech to text with Whisper inside the Actor, 99 languages, timestamps and SRT. No API key. Errors are free.

- **URL**: https://apify.com/scrapewise/media-transcriber.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** AI, Videos
- **Stats:** 10 total users, 6 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $17.00 / 1,000 media transcribed (up to 2 min)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 & Video Transcriber (Whisper)

Audio & Video Transcriber turns **audio and video from any public link into text**: direct files (**MP3, M4A, MP4, WAV, WebM, OGG**...), **YouTube, TikTok, Instagram, Facebook, X (Twitter), Reddit, Vimeo, Dailymotion, SoundCloud, Loom, Twitch clips** and 1,000+ other sites, and podcasts from **RSS feeds, Apple Podcasts or Spotify links** (the newest episodes, or the exact episode you link). You get the full transcript with **timestamps**, optional **SRT subtitles**, the **detected language** (99 languages), title, uploader and duration.

Transcription runs inside the Actor with OpenAI's open Whisper model (faster-whisper), so there is **no API key to bring and no third-party bill**. No login, no cookies.

**US$ 0.02 per file up to 2 minutes, then US$ 0.01 per extra minute. A 1-hour podcast costs about US$ 0.60. YouTube adds US$ 0.005 per minute. Files without speech and error rows are free.**

### Transcription pricing at a glance

- **Price per file:** US$ 0.02 (covers up to 2 minutes of audio), no run start fee, no monthly fee
- **Longer files:** US$ 0.01 per extra minute (about US$ 0.60 per hour of audio)
- **YouTube links:** + US$ 0.005 per minute of video (YouTube refuses cloud servers; part of the audio needs a residential proxy)
- **What we charge for:** Only files with a transcript delivered. No speech, errors, too-long files and duplicates are free

### Example transcript output

Vimeo video transcribed on Apify on 2026-09-30 (segments cut to 3):

```json
{
  "type": "transcript",
  "url": "https://vimeo.com/86877247",
  "platform": "Vimeo",
  "title": "What Moves You? A film for runners by runners",
  "uploader": "What Moves You?",
  "durationSeconds": 127.1,
  "billedMinutes": 2.12,
  "extraMinutes": 1,
  "language": "en",
  "languageProbability": 0.996,
  "transcript": "We're different. We see things differently. We see the world in a different way. We ignore the pain and we brave the cold. We've learned that running in circles doesn't always mean finishing where you've started. And that isolated paths aren't lonely. We are the elites and the not-so-elites. We are runners. born to it. I guess you could say we're oddballs, but we share a bond that is forged on the road from failure to triumph, and back again. And that makes us the same. These are our excuses. But what are the reasons? What really moves us? What if there is something deeper? Stronger moving us forward. What if we just think we know the reasons? And what if the real reasons are not entirely our own? The human race starts with a story. This is yours.",
  "wordCount": 139,
  "segments": [
    { "start": 6.86, "end": 12.29, "text": "We're different. We see things differently." },
    { "start": 12.29, "end": 16.61, "text": "We see the world in a different way." },
    { "start": 16.61, "end": 23.96, "text": "We ignore the pain and we brave the cold." }
  ],
  "model": "whisper-base"
}
```

### Supported transcription sources

Tested on Apify on 2026-09-30 with real public links. "Handled" means a transcript, or a correct free row such as `NO_SPEECH` for music-only clips.

| Source | Links that work | Tested | How |
|---|---|---|---|
| **YouTube** | `youtube.com/watch?v=`, `youtu.be/`, `/shorts/`, `m.youtube.com` | 48 of 48 public videos handled | No login, no cookies. Public videos only; age-restricted and members-only videos are free `LOGIN_REQUIRED` rows |
| **Instagram** | `instagram.com/reel/CODE/`, `/p/CODE/`, `/tv/CODE/` | 16 of 16 handled | The public post page and its audio-only track. For whole profiles use [Instagram Reels Transcript](https://apify.com/scrapewise/instagram-reels-transcript) |
| **Facebook** | `facebook.com/reel/ID`, `/watch/?v=ID`, `/PAGE/videos/ID` | 36 of 36 handled | Public videos and reels of pages. Videos shared only with friends or groups are free `LOGIN_REQUIRED` rows |
| **Reddit** | `reddit.com/r/.../comments/ID/...`, `redd.it/ID`, `v.redd.it/ID`, share links | 12 of 12 live videos handled | Reddit-hosted video from its public video server. Posts that link to YouTube or other sites are followed. Removed videos are free `NOT_FOUND` rows |
| **Spotify** | `open.spotify.com/episode/ID`, `/show/ID` | 7 of 7 episodes found | Spotify audio is DRM, so it is **never** downloaded from Spotify. The Actor finds the same show's public RSS feed (most shows have one) and transcribes that episode file. Spotify-only shows are a free `SPOTIFY_EXCLUSIVE` row |
| **Apple Podcasts, RSS** | show or episode links, any podcast feed | yes | The episode file from the public feed |
| **TikTok, X (Twitter), Vimeo, Dailymotion, SoundCloud, Loom, Twitch clips** | video or track page | yes | Page reader of the open-source yt-dlp |
| **Direct files** | `.mp3`, `.m4a`, `.mp4`, `.wav`, `.webm`, `.ogg`, `.opus`, `.flac`... | yes | Downloaded as is, up to 1.5 GB |

### Transcribe video to text: YouTube, TikTok, Instagram, Facebook, X (Twitter)

Paste the post or video link. The Actor downloads only the smallest audio track (never the full video when an audio-only track exists) and transcribes it. On YouTube it reads the audio itself, so it works on videos without captions; if you only need existing captions, [YouTube Transcript](https://apify.com/scrapewise/youtube-transcript) is cheaper.

### Transcribe audio to text: MP3, WAV, M4A files

Any public file link works, including signed or tracking links (podtrac, simplecast, S3, Google Cloud Storage, Dropbox direct links). Files up to 1.5 GB.

### Podcast transcription from an RSS feed, Apple Podcasts or Spotify

Paste the podcast RSS feed, an Apple Podcasts show or episode link, or a Spotify show or episode link, and set `maxEpisodesPerFeed`. The Actor transcribes the newest episodes and adds the episode title, podcast name and publish date to each row. Schedule it daily and you get new episodes as text.

Video guides from Apify: [how to schedule an Actor](https://www.youtube.com/watch?v=1jI7WcVQmwM) and [how to connect it to other apps](https://www.youtube.com/watch?v=bNACk1_S_6w).

### Loom transcript: screen recordings and video messages to text

Paste `loom.com/share/...` or `loom.com/embed/...` links of public Loom videos, one per line. The Actor reads the audio of the recording and returns the full transcript with timestamps, the video title and duration, without a Loom account. Useful for turning walkthroughs, bug reports, sales demos and async updates into searchable text or feeding them to an AI agent. Private or password-protected videos and videos with no speech come back as free rows with an error code.

### What you can do with the transcripts

- **Content repurposing:** turn videos and podcasts into blog posts, newsletters, show notes and subtitles.
- **Research and monitoring:** search what was said in podcasts, news clips and social videos.
- **AI pipelines:** clean text with timestamps for RAG, summarisation, translation or training data.
- **Accessibility:** SRT subtitles for your own videos.

### Transcriber input

| Field | What it does |
|---|---|
| `urls` | Links: audio or video files, video and post pages (YouTube, Instagram, Facebook, Reddit...), podcast RSS feeds, Apple Podcasts and Spotify links |
| `maxEpisodesPerFeed` | Default 3. Newest episodes per feed, Apple Podcasts show or playlist |
| `language` | `auto` (default) detects per file. Or force a 2-letter code (`en`, `pt`, `es`, `de`, `ja`...) |
| `model` | `tiny` (fastest), `base` (default), `small` (most accurate, best for non-English and noisy audio; each minute counts twice) |
| `includeSegments` | Default true: phrase-level `start` and `end` in seconds |
| `includeSrt` | Default false: adds a ready `.srt` subtitle text |
| `maxDurationMinutes` | Default 120. Longer files get a free `MEDIA_TOO_LONG` row. Caps your cost |

```json
{
  "urls": [
    "https://www.tiktok.com/@bbcnews/video/7652791912868482326",
    "https://feeds.npr.org/500005/podcast.xml",
    "https://example.com/interview.mp3"
  ],
  "maxEpisodesPerFeed": 2,
  "model": "base",
  "includeSrt": true
}
```

### Transcript output fields

`url`, `mediaUrl` (the audio file, for direct files and podcast episodes), `platform`, `title`, `uploader`, `podcast`, `publishedAt`, `durationSeconds`, `billedMinutes`, `extraMinutes`, `youtubeMinutes`, `language`, `languageProbability`, `transcript`, `wordCount`, `segments` (`start`, `end`, `text`), `srt`, `model`, `source` (the link you gave, for example the feed), `scrapedAt`.

#### Error codes (never charged)

| errorCode | Meaning |
|---|---|
| `NO_SPEECH` | Music, sound effects or silence only |
| `NO_AUDIO` | The video has no audio track |
| `MEDIA_TOO_LONG`, `MEDIA_TOO_LARGE` | Above `maxDurationMinutes`, or a file above 1.5 GB |
| `YOUTUBE_BLOCKED` | YouTube refused every server we tried for this video (rare). Run again later, or use [YouTube Transcript](https://apify.com/scrapewise/youtube-transcript) for captions |
| `USE_INSTAGRAM_ACTOR` | An Instagram profile link: use [Instagram Reels Transcript](https://apify.com/scrapewise/instagram-reels-transcript) for profiles |
| `NOT_A_VIDEO` | An Instagram photo or carousel, or a Reddit text or image post |
| `BLOCKED` | Instagram did not answer after retries; run again later |
| `LOGIN_REQUIRED` | The site only shows this media to logged-in users (private posts, friends-only Facebook videos, age-restricted YouTube) |
| `SPOTIFY_EXCLUSIVE` | The show (or that episode) exists only on Spotify, with no public RSS feed. Spotify audio is DRM-protected and never downloaded |
| `DRM_PROTECTED` | DRM-protected media on other sites |
| `NOT_FOUND`, `NO_EPISODES`, `NOT_A_FEED` | Deleted, private, wrong link, or a feed without audio |
| `UNSUPPORTED_URL`, `INVALID_URL`, `INVALID_INPUT` | A link or value the Actor does not understand |
| `DOWNLOAD_FAILED`, `TRANSCRIPTION_FAILED` | The site or the file did not cooperate after retries; run again |
| `NOT_REACHED`, `UNEXPECTED` | The run timeout or spending limit arrived, or something unforeseen broke; only that file is lost |

### Audio and video transcription pricing

| Event | Price |
|---|---|
| Media transcribed (up to 2 minutes of audio) | US$ 0.02 |
| Extra minute, per started minute after the first 2 | US$ 0.01 |
| YouTube minute, per started minute of a YouTube video (YouTube links only) | US$ 0.005 |

- 1,000 short clips (under 2 minutes) cost US$ 20.
- A 5-minute file costs US$ 0.02 + 3 x US$ 0.01 = US$ 0.05.
- A 60-minute podcast costs US$ 0.02 + 58 x US$ 0.01 = US$ 0.60.
- With `model: small`, minutes count twice (it uses about 3 times the compute): a 5-minute file costs US$ 0.02 + 8 x US$ 0.01 = US$ 0.10.
- A 10-minute YouTube video costs US$ 0.02 + 8 x US$ 0.01 + 10 x US$ 0.005 = US$ 0.15. YouTube refuses cloud servers, so part of its audio comes through a paid residential proxy; that is the only reason for the extra fee.

No speech, errors and duplicates are free, and there is no Apify compute bill on top. `billedMinutes`, `extraMinutes` and `youtubeMinutes` on each row show the minutes used for the price.

### Audio and video transcriber FAQ

**Does it work with YouTube?** Yes, for public videos (48 of 48 in our 2026-09-30 tests), with no login or cookies. It adds US$ 0.005 per minute for the residential proxy YouTube requires. If the video already has captions and you only need them, [YouTube Transcript](https://apify.com/scrapewise/youtube-transcript) is cheaper.

**Why not OpenAI's Whisper API or the official YouTube API?**
OpenAI's hosted Whisper API needs your own API key, bills you separately and accepts files up to 25 MB, so you still have to download and split the media yourself. The official YouTube Data API only downloads caption tracks with the video owner's permission. This Actor takes the link, fetches the audio and transcribes it in one run, with no key and no second bill.

**Does it download from Spotify?** No. Spotify audio is DRM-protected. For a Spotify episode link, the Actor finds the same episode in the show's public RSS feed (Apple Podcasts directory) and transcribes that file. Shows that exist only on Spotify come back as a free `SPOTIFY_EXCLUSIVE` row.

**Which languages?** The 99 languages Whisper knows, detected automatically. Forcing `language` helps on short clips.

**Speaker names?** No. The transcript is one text with timestamps; it does not tell who is speaking.

**How fast?** About 6 to 10 seconds of processing per minute of audio with `base`, plus the download. A 30-minute episode takes around 4 minutes.

### Transcriber limitations

- **Public media only.** Private posts, paid content, DRM streams and pages that need login are out of reach. The Actor reads public pages and files only.
- **Machine transcription.** Whisper is strong on clear speech; music, crowds and heavy slang lower accuracy. Use `small` for non-English speech.
- **Some sites refuse cloud servers.** YouTube and Instagram are handled with retries through other IPs; a link that still fails comes back as a free row.
- Runs with 4 GB of memory by default (one CPU core for the model). Less memory makes runs slower, not cheaper.

### Related scrapers

- [YouTube Transcript Scraper](https://apify.com/scrapewise/youtube-transcript): YouTube captions, SRT and AI transcription per video.
- [YouTube Channel Transcripts Scraper](https://apify.com/scrapewise/youtube-channel-transcripts): bulk transcripts of whole channels, SRT and VTT.
- [TikTok Transcript Scraper](https://apify.com/scrapewise/tiktok-transcript): TikTok captions with views and likes.
- [Instagram Reels Transcript Scraper](https://apify.com/scrapewise/instagram-reels-transcript): reel and video to text, whole profiles included.
- [Social Video Downloader](https://apify.com/scrapewise/social-video-downloader): download TikTok, Instagram, Facebook and X videos as files.

### Changelog

- **2026-09-30, 0.2:** YouTube audio (public videos, no login), Instagram reels and video posts, Reddit videos (including posts that link elsewhere), Spotify episode and show links (transcribed from the show's public RSS feed, never from Spotify), long episodes transcribed in 10-minute blocks (1-hour podcasts no longer run out of memory). New `youtubeMinutes` field and YouTube minute event.
- **2026-09-30, 0.1:** first release. Files, 1,000+ video sites, podcast RSS and Apple Podcasts, Whisper tiny, base or small, auto language, timestamps, SRT, free rows for no speech and errors.

# Actor input Schema

## `urls` (type: `array`):

Links to transcribe, one per line. Accepts direct audio or video files (mp3, m4a, mp4, wav, webm, ogg...), YouTube, TikTok, Instagram reels and posts, Facebook, X (Twitter), Reddit, Vimeo, Dailymotion, SoundCloud, Loom, Twitch clips and 1,000+ other video sites, podcast RSS feeds, Apple Podcasts shows or episodes, and Spotify podcast links (transcribed from the show's public RSS feed). For example https://www.youtube.com/watch?v=... or https://feeds.example.com/podcast.xml. Each file becomes one row with the full text. Leave empty to run a 24-second example clip. Also accepts 'mediaUrls', 'startUrls' or 'links' from other transcription Actors.

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

How many of the newest episodes to transcribe from each podcast RSS feed, Apple Podcasts show or playlist link (1 to 500, default 3). Single video or audio links ignore this. Each episode is billed as its own file, so a feed with 50 at 30 minutes each costs about 50 x 30 minutes: start low and raise it after checking the first rows.

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

Spoken language. Default 'auto' detects it for each file and reports it in the 'language' column. If you know it, type a 2-letter code (en, es, pt, fr, de, it, ja, hi, ar...): detection is skipped, the run is a little faster and short clips are not misread as another language. The transcript stays in the spoken language; nothing is translated.

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

Speech recognition model. 'base' (default) is right for most clear speech. 'small' is more accurate for non-English speech, accents and noisy audio, but uses about 3 times more compute, so each extra minute counts twice (see Pricing). 'tiny' is the fastest and least accurate, for quick drafts. The model used is saved in the 'model' column.

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

On by default: adds 'segments', a list with the start and end second and the text of each phrase, for quotes, chapters or jumping to a moment in the video. Turn off to get only the full text and smaller rows. No effect on price.

## `includeSrt` (type: `boolean`):

Adds an 'srt' column with the transcript as ready-to-use SRT subtitles (numbered cues with 00:00:01,000 --> 00:00:04,000 timestamps) that you can save as a .srt file and upload to YouTube or a video editor. Off by default. No effect on price.

## `maxDurationMinutes` (type: `integer`):

Files longer than this many minutes (1 to 600, default 120) are not transcribed: they come back as a free row with errorCode MEDIA_TOO_LONG and their duration. Use it to cap the cost of a run with long podcasts or livestreams. Raise it to 600 to transcribe anything up to 10 hours.

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

Apify Proxy, on by default. It is used only when a site refuses the first request. YouTube and Instagram may also go through Apify residential proxy when the datacenter IP is refused; on YouTube that carries a small per-minute fee (see Pricing). Keep the default unless you have your own proxy.

## Actor input object example

```json
{
  "urls": [
    "https://upload.wikimedia.org/wikipedia/commons/d/dd/Armstrong_Small_Step.ogg"
  ],
  "maxEpisodesPerFeed": 3,
  "language": "auto",
  "model": "base",
  "includeSegments": true,
  "includeSrt": false,
  "maxDurationMinutes": 120,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsCsv` (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 = {
    "urls": [
        "https://upload.wikimedia.org/wikipedia/commons/d/dd/Armstrong_Small_Step.ogg"
    ],
    "maxEpisodesPerFeed": 3,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/media-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 = {
    "urls": ["https://upload.wikimedia.org/wikipedia/commons/d/dd/Armstrong_Small_Step.ogg"],
    "maxEpisodesPerFeed": 3,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/media-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 '{
  "urls": [
    "https://upload.wikimedia.org/wikipedia/commons/d/dd/Armstrong_Small_Step.ogg"
  ],
  "maxEpisodesPerFeed": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/media-transcriber --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/media-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/3eqd6x7lVbkCrPc9w/builds/qYgwetXdMmsWeBc4q/openapi.json
