# YouTube Transcript Extractor – Text, SRT, VTT & Timestamps (`siftwright/youtube-transcript-extractor`) Actor

Get YouTube transcripts & subtitles from videos, Shorts, playlists and channels. Plain text, timestamped JSON, SRT or VTT, any language + auto-translate. Only $3 per 1,000 transcripts; failed videos are free.

- **URL**: https://apify.com/siftwright/youtube-transcript-extractor.md
- **Developed by:** [Siftwright](https://apify.com/siftwright) (community)
- **Categories:** Videos, AI, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 transcript extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## YouTube Transcript Extractor

Get the **transcript (captions / subtitles) of any YouTube video** in seconds — as plain text, timestamped JSON segments, **SRT** or **WebVTT**. Paste video links, Shorts, whole **playlists** or entire **channels**, pick a language (or auto-translate), and download the results as JSON, CSV, Excel or via API.

**Price: $3 per 1,000 transcripts ($0.003 each).** You only pay for transcripts that are actually extracted — videos without captions, private videos and errors are **free**. Video metadata is included at no extra charge.

![Real input example](https://api.apify.com/v2/key-value-stores/8A8T7PkCkjvOJ3HbG/records/yt-transcript-input.png)
![Real dataset output](https://api.apify.com/v2/key-value-stores/8A8T7PkCkjvOJ3HbG/records/yt-transcript-output.png)
![Real SRT subtitle output](https://api.apify.com/v2/key-value-stores/8A8T7PkCkjvOJ3HbG/records/yt-transcript-srt.png)

### Why teams choose this extractor

| | This Actor |
|---|---|
| 💵 **Price** | **$3 per 1,000 transcripts**, no monthly rental |
| 🛡️ **Pay only for success** | Caption-less, private and failed videos cost **$0** (some tools bill every result row, even failures) |
| 🎁 **Free extras** | Title, channel, views, duration, publish date and available languages at no extra charge |
| 📦 **Every format in one run** | Plain text, timestamped JSON, **SRT** and **VTT** |
| 🌍 **Any language** | Pick a language or auto-translate into 100+ languages |
| ⚡ **Bulk-ready** | Whole playlists and channels, processed in parallel |
| 🤖 **AI-agent ready** | Callable from Claude, ChatGPT & Cursor through Apify's MCP server |

### What you can use it for

- 🤖 **AI & RAG pipelines** – feed clean transcript text into ChatGPT, Claude, LangChain, LlamaIndex or a vector database.
- 📝 **Content repurposing** – turn videos into blog posts, newsletters, social posts and show notes.
- 🔍 **Research & SEO** – analyze what competitors and creators say, find keywords, quotes and topics at scale.
- 🎓 **Education & accessibility** – study notes, summaries and subtitle files (SRT/VTT) for editors.
- 📊 **Media monitoring** – track mentions of brands, products or people across channels.

### Features

- ✅ Videos, **Shorts**, live replays, **playlists** and **channels** (`/@handle`, `/channel/UC…`, bare video IDs)
- ✅ Human-made captions preferred, automatic fallback to **auto-generated** captions
- ✅ **Any language** + **auto-translate** into 100+ languages via YouTube's built-in translation
- ✅ Output as **plain text**, **timestamped segments**, **SRT** and **VTT**
- ✅ Free **metadata**: title, channel, duration, views, publish date, description, keywords, thumbnail
- ✅ Lists the languages available for every video
- ✅ Fast & lightweight (no browser), parallel processing, automatic rate-limit handling
- ✅ Failed / caption-less videos are never charged

### How to use

1. Click **Try for free**.
2. Paste one or more YouTube URLs into **YouTube URLs or IDs**.
3. (Optional) choose a language, translation and output formats.
4. Click **Start** and download your transcripts from the **Output** tab.

### Input example

```json
{
  "urls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "https://youtu.be/jNQXAC9IVRw",
    "https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI",
    "https://www.youtube.com/@mkbhd"
  ],
  "language": "en",
  "translateTo": "",
  "outputFormats": ["text", "segments", "srt"],
  "maxVideosPerSource": 20
}
```

| Field | Description |
|---|---|
| `urls` | Video / Shorts / playlist / channel URLs or bare video IDs |
| `language` | Preferred language codes in order, e.g. `en` or `es,en` |
| `translateTo` | Translate the transcript into this language code, e.g. `de` |
| `preferManual` | Prefer creator-uploaded captions over auto-generated (default `true`) |
| `outputFormats` | Any of `text`, `segments`, `srt`, `vtt` |
| `includeMetadata` | Include free video metadata (default `true`) |
| `maxVideosPerSource` | Max videos taken from each playlist or channel (newest first) |

### Output example

```json
{
  "videoId": "dQw4w9WgXcQ",
  "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "status": "ok",
  "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
  "channelName": "Rick Astley",
  "durationSeconds": 213,
  "viewCount": 1700000000,
  "publishDate": "2009-10-24",
  "language": "en",
  "isAutoGenerated": false,
  "isTranslated": false,
  "availableLanguages": [{ "code": "en", "name": "English", "autoGenerated": false }],
  "wordCount": 487,
  "text": "♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ …",
  "segments": [
    { "start": 18.64, "duration": 3.24, "text": "♪ We're no strangers to love ♪" }
  ],
  "srt": "1\n00:00:18,640 --> 00:00:21,880\n♪ We're no strangers to love ♪\n…"
}
```

Videos without a transcript are returned with `"status": "no_transcript"` and an `error` message (and are not charged), so you always know what happened to every input.

### Pricing

Pay-per-event: **$0.003 per extracted transcript** (= $3 per 1,000). No monthly rental, no charge for failed videos, playlists/channel listing or metadata. Apify's free plan gives you monthly credits so you can try it for free.

### Quick start in Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("siftwright/youtube-transcript-extractor").call(run_input={
    "urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    "outputFormats": ["text", "srt"],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["wordCount"], "words")
```

### Use it via API

```bash
curl -X POST "https://api.apify.com/v2/acts/siftwright~youtube-transcript-extractor/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls":["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"outputFormats":["text"]}'
```

Works with Python and JavaScript API clients, Make, Zapier, n8n, LangChain and LlamaIndex. **AI agents** (Claude, ChatGPT, Cursor) can call it directly through [Apify's MCP server](https://mcp.apify.com).

### FAQ

**Does it work for videos without captions?** It can only return transcripts that exist on YouTube (creator-made or auto-generated). Videos with captions disabled are reported as `no_transcript` and are free.

**Is it legal?** The Actor only reads publicly available caption data. Make sure your use respects YouTube's terms and applicable copyright law.

**Something broke or you need a feature?** Open an issue on the **Issues** tab — we respond fast.

# Actor input Schema

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

Videos, Shorts, playlists or channels. Accepts full URLs (youtube.com/watch?v=…, youtu.be/…, /shorts/…, playlist?list=…, /@handle, /channel/UC…) or bare video IDs.

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

Comma-separated language codes in order of preference, e.g. "en" or "es,en". If none match, the first available transcript is used (see Translate to).

## `translateTo` (type: `string`):

Language code to machine-translate the transcript into using YouTube's built-in translation, e.g. "en", "de", "ja". Leave empty to keep the original language.

## `preferManual` (type: `boolean`):

Use creator-uploaded captions when available, otherwise fall back to auto-generated ones.

## `outputFormats` (type: `array`):

Which transcript formats to include in each result.

## `includeMetadata` (type: `boolean`):

Add title, channel, duration, views, publish date, description, keywords and thumbnail to each result (free).

## `maxVideosPerSource` (type: `integer`):

Limit for playlists and channels (newest uploads first for channels).

## `maxConcurrency` (type: `integer`):

How many videos to process at once.

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

Optional. By default the Actor connects directly and automatically falls back to Apify Proxy (at no extra cost to you) when YouTube rate-limits. Set this only to force your own proxy.

## Actor input object example

```json
{
  "urls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "language": "en",
  "preferManual": true,
  "outputFormats": [
    "text",
    "segments"
  ],
  "includeMetadata": true,
  "maxVideosPerSource": 50,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per video with metadata, status and the transcript.

# 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://www.youtube.com/watch?v=dQw4w9WgXcQ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("siftwright/youtube-transcript-extractor").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://www.youtube.com/watch?v=dQw4w9WgXcQ"] }

# Run the Actor and wait for it to finish
run = client.actor("siftwright/youtube-transcript-extractor").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://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ]
}' |
apify call siftwright/youtube-transcript-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,siftwright/youtube-transcript-extractor"
        }
    }
}
```

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/aEoIXmxSBbTI4XTdq/builds/dWN80tzjVUYsfQiWu/openapi.json
