# YouTube Transcript Downloader & Scraper: Videos, Channels (`data-done-right/youtube-transcript-scraper`) Actor

Get clean YouTube transcripts (captions and subtitles) for videos, whole channels or playlists: full text, timestamped segments and SRT, with language preference and translation. You only pay for transcripts delivered. A YouTube transcript API and downloader for AI/RAG.

- **URL**: https://apify.com/data-done-right/youtube-transcript-scraper.md
- **Developed by:** [Data Done Right](https://apify.com/data-done-right) (community)
- **Categories:** Videos, AI, For creators
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 transcripts

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

## YouTube Transcript Downloader & Scraper: Videos, Channels

This YouTube transcript scraper turns videos into clean text, in bulk, without the API. Paste video links, **whole channels** (`youtube.com/@handle`) or **playlists**, and get each transcript as full text, timestamped segments and an optional **SRT** subtitle file. **You only pay for transcripts delivered.** Videos without captions are listed for free.

### Why this YouTube transcript downloader

- **Channels and playlists in one go.** No need to collect video URLs first.
- **Language control.** Give your preferred languages; human-made captions are used before auto-generated ones. If none match, you get the video's own language, or YouTube's translation into the language you choose.
- **Keeps going when YouTube pushes back.** Blocked requests switch to a fresh IP and retry, so big batches finish.
- **AI-ready output.** One clean `text` field per video for LLMs and RAG, plus `segments` with start times for citations and clips.

### How to download YouTube transcripts in bulk

Paste video, channel or playlist links, set the languages you prefer and run. Example input:

```json
{
  "videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ", "https://www.youtube.com/@mkbhd"],
  "maxVideosPerChannel": 20,
  "languages": ["en"],
  "includeSrt": true
}
```

### Output (one item per video)

```json
{
  "videoId": "dQw4w9WgXcQ",
  "title": "Rick Astley - Never Gonna Give You Up (Official Video)",
  "channel": "Rick Astley",
  "languageCode": "en",
  "isGenerated": false,
  "isTranslated": false,
  "text": "We're no strangers to love ...",
  "wordCount": 487,
  "transcriptSeconds": 211.3,
  "segments": [{"start": 18.6, "duration": 3.2, "text": "We're no strangers to love"}],
  "srt": "1\n00:00:18,600 --> 00:00:21,800\nWe're no strangers to love\n"
}
```

Videos without captions (or private, removed, age-restricted) appear with the reason in the `FAILED` record of the key-value store. **They are not charged.**

### Ideas

- Feed a channel's transcripts into an LLM to make summaries, show notes, blog posts or a searchable knowledge base.
- Do competitor and creator research at scale.
- Find the exact moment a topic is mentioned using segment timestamps.
- Send the results to Google Sheets with our *Google Sheets Import & Export* Actor.

### YouTube transcript API

Call this Actor from the Apify API, Python, JavaScript, Make, Zapier or n8n and get transcripts back as JSON. There's no YouTube API key, no OAuth and no quota. YouTube's official Data API only lets a channel's owner download its captions.

### Use it in Claude, ChatGPT and Cursor

Connect Apify's MCP server (mcp.apify.com) and your AI assistant can fetch transcripts itself. For example: "get the transcripts of the last 10 videos on @mkbhd and summarize them." The only required input is `videos`.

### How much does it cost

Pay per event: **$0.002 per transcript** delivered (100 transcripts ≈ $0.20), plus the standard start fee. Apify Silver plans get 10% off, Gold and higher 20%.

### FAQ

#### Is there a YouTube transcript API?

YouTube's official Data API only lets a channel's owner download its captions. This Actor works as a YouTube transcript API for any public video, channel or playlist, with no API key.

#### How do I download YouTube subtitles as an SRT file?

Turn on `includeSrt`. Each video then comes with an `srt` field you can save as a `.srt` subtitle file.

#### How do I get the transcript of a YouTube video?

Paste the video link. You get the full `text`, timestamped `segments` and, if you turn on `includeSrt`, an SRT subtitle file.

#### Can I download transcripts for a whole channel or playlist?

Yes. Paste a channel (`youtube.com/@handle`) or playlist link and set `maxVideosPerChannel`. No need to collect the video URLs first.

#### What if a video has no captions?

It is listed with the reason (no captions, private, removed or age-restricted) in the `FAILED` record, and it is not charged.

#### Can I choose the language, or get a translation?

Yes. Give your preferred languages. Human-made captions are used before auto-generated ones. If none match, you get the video's own language, or YouTube's translation into the language you choose.

#### Is it free to get YouTube transcripts?

Opening a transcript in YouTube is free for one video. This Actor is for bulk work and is pay per event: $0.002 per transcript delivered (100 transcripts ≈ $0.20). You pay nothing for videos without captions.

#### Is it legal to scrape YouTube transcripts?

The captions are public and no login is used. Follow YouTube's terms and respect the creators' copyright when you reuse the text.

### Related tools

- **YouTube Channel Scraper** lists a channel's videos with views, likes and comments.
- **Transcribe Audio to Text** transcribes videos that have no captions, with your own API key.

# Actor input Schema

## `videos` (type: `array`):

Any mix of video URLs (watch, youtu.be, shorts, live), video IDs, playlist URLs, and channel URLs (youtube.com/@handle).

## `maxVideosPerChannel` (type: `integer`):

Newest first for channels.

## `maxVideos` (type: `integer`):

Stop after this many videos in total (also caps cost).

## `languages` (type: `array`):

Language codes in order of preference, e.g. \["en", "en-US", "es"]. Human-made captions are used before auto-generated ones. If none match, the video's own language is used.

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

Language code to translate into using YouTube's own translation, e.g. en, es, de.

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

Timestamped lines (start, duration, text) for citations and clips.

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

A ready-to-use .srt subtitle text for each video.

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

Add the video title and channel name.

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

How many videos to process at the same time.

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

YouTube blocks most datacenter IPs. Residential proxies give the best success rate.

## Actor input object example

```json
{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "maxVideosPerChannel": 20,
  "languages": [
    "en"
  ],
  "includeSegments": true,
  "includeSrt": false,
  "includeMetadata": true,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All result items of this run (the default dataset), as JSON, CSV, Excel and more.

## `records` (type: `string`):

Key-value store records: the run summary, notes on any problems, and any files.

# 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 = {
    "videos": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data-done-right/youtube-transcript-scraper").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 = {
    "videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("data-done-right/youtube-transcript-scraper").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 '{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call data-done-right/youtube-transcript-scraper --silent --output-dataset

```

## MCP server setup

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

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/PlV1jXeeWVhG8EMTL/builds/Dmbf975edW0I74tie/openapi.json
