# YouTube Transcript Scraper - Channels, Playlists & AI Chunks (`skydata/youtube-transcript-scraper`) Actor

YouTube transcripts from videos, whole channels, playlists and search results. Clean text with timestamps, SRT/VTT, AI-ready chunks with deep links, chapters, phrase search across videos, new-video monitoring. Pay only for videos with a transcript.

- **URL**: https://apify.com/skydata/youtube-transcript-scraper.md
- **Developed by:** [SkyData Tools](https://apify.com/skydata) (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 transcripts

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

### 🎬 What does YouTube Transcript Scraper do?

**YouTube Transcript Scraper** gets clean transcripts from **single videos, whole channels, playlists and YouTube search results** in one run, and makes them ready to use:

- 📝 **Clean text** plus **timestamped segments** (start and duration of every line)
- 🎞️ **SRT and VTT** subtitle files
- 🤖 **AI-ready chunks**: transcripts split into pieces of ~N words, each with start/end time, chapter and a **link that opens the video at that moment**. Perfect for RAG, embeddings, ChatGPT/Claude and AI agents
- 🔎 **Find phrases across videos**: every mention of a brand, topic or name, with the sentence around it and a clickable timestamp
- 📚 **Chapters** from the video description
- 🌍 **Any language**: pick your preferred languages in order; human-made captions are preferred over auto-generated ones; every video lists all caption languages it has
- 🔔 **Only new videos**: follow channels and get transcripts of new uploads only (schedule it daily or weekly)
- 📄 **All transcripts in one Markdown file**, ready to paste into an AI tool or a knowledge base
- 🏷️ Video details: title, channel, views, length, keywords, description

**💸 You only pay for videos that have a transcript.** Videos without captions, private or deleted videos, and failed lookups are always free.

No YouTube account, no API key, no browser.

### 👥 Who is it for?

- **AI builders**: feed YouTube knowledge into RAG pipelines, chatbots and agents
- **Researchers and students**: search what was said across hundreds of videos
- **Marketers and brands**: find every mention of your brand or competitors in YouTube videos, with links to the exact moment
- **Content creators**: subtitles (SRT/VTT), blog posts and show notes from videos
- **Course and podcast teams**: whole playlists and channels as text

### 🚀 How to use it

1. Add **videos**, **channels** (`@handle`), **playlists** or **search queries**. Mix them freely.
2. Choose languages and outputs (text, segments, SRT, VTT, AI chunks).
3. Optional: add **phrases to find**.
4. Click **Start** and download the results as JSON, CSV or Excel, or open **All transcripts in one file** in the Output tab.

💡 Want a head start? Open the **Example tasks** tab for ready-made setups (one click to run), e.g. common research jobs with the inputs already filled in.

### 📥 Input example

```json
{
  "channels": ["@3blue1brown"],
  "maxVideosPerSource": 10,
  "videos": ["https://www.youtube.com/watch?v=aircAruvnKk"],
  "languages": ["en"],
  "chunkWords": 300,
  "findPhrases": ["neural network", "gradient descent"],
  "onlyNewVideos": false
}
```

### 📤 Output (one row per video)

```json
{
  "videoId": "aircAruvnKk",
  "title": "But what is a neural network? | Deep learning chapter 1",
  "channel": "3Blue1Brown",
  "status": "ok",
  "language": "en",
  "isAutoGenerated": false,
  "wordCount": 3410,
  "durationSeconds": 1131,
  "text": "This is a 3. It's sloppily written ...",
  "segments": [{ "start": 4.22, "duration": 2.1, "text": "This is a 3." }],
  "chapters": [{ "start": 0, "startClock": "0:00", "title": "Introduction" }],
  "chunks": [{ "index": 0, "start": 4.22, "end": 98.5, "chapter": "Introduction", "text": "...", "url": "https://www.youtube.com/watch?v=aircAruvnKk&t=4s" }],
  "mentions": [{ "phrase": "neural network", "timeClock": "1:12", "context": "… what a neural network actually is …", "url": "https://www.youtube.com/watch?v=aircAruvnKk&t=72s" }],
  "availableLanguages": [{ "code": "en", "name": "English", "auto": false }]
}
```

Videos without a transcript come back with `status` `no_captions`, `unavailable` or `failed` and a short explanation. They are not charged.

### 💰 Pricing

Pay per **video with a transcript**. Everything else (no captions, unavailable, failed, listing channels and playlists, phrase search, chunks, Markdown file) is included. Platform usage is included. See the **Pricing** tab for the current price. You can set a maximum cost per run and the Actor stops there.

### 🤖 Use it with AI agents

Works as a tool for AI agents (Claude, ChatGPT, Cursor and others) through the [Apify MCP server](https://mcp.apify.com), and with Zapier, Make, n8n and the Apify API.

### 🧰 More from SkyData Tools

- 📈 **[Google Trends Scraper](https://apify.com/skydata/google-trends-scraper)**: many keywords × many countries, insights, ONE scale for 50+ keywords, what's-new monitoring
- 🔍 **[Google Ads Transparency Scraper](https://apify.com/skydata/google-ads-transparency-scraper)**: competitor ad reports, likely winning ads, countries, alerts
- ⭐ **[App Reviews Scraper](https://apify.com/skydata/app-reviews-scraper)**: App Store + Google Play reviews with complaint reports and alerts
- 📇 **[Website Contact & Company Info Scraper](https://apify.com/skydata/website-contact-company-scraper)**: emails, phones, social profiles and tech stack from any list of websites

### ❓ FAQ

**Which videos work?** Any public video, Short or finished live stream that has captions (human-made or auto-generated). Most videos with speech have auto-generated captions.

**Why is a video "no_captions"?** The uploader turned captions off, the video has no speech, or it is too new for YouTube's auto-captions. Not charged.

**Can it translate?** It returns every language the video really has (many videos have several). YouTube's automatic translation is currently not available to tools, so we don't offer a half-working version of it.

**Is this allowed?** The Actor reads public captions that YouTube shows to every visitor, without logging in. Use transcripts in line with copyright and YouTube's terms.

**Something missing or broken?** Open an issue. We answer within 12 hours.

# Changelog

This Actor's version history is a separate document: https://apify.com/skydata/youtube-transcript-scraper/changelog.md

# Actor input Schema

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

YouTube video links or IDs (normal videos, Shorts, youtu.be links). One per line.

## `channels` (type: `array`):

@handles, channel links or channel IDs (UC...). Gets the newest videos of each channel.

## `playlists` (type: `array`):

Playlist links or IDs (PL...).

## `searchQueries` (type: `array`):

Search YouTube and get transcripts of the top videos for each query.

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

How many videos to take from each channel (newest first), playlist or search.

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

Language codes in order of preference (en, es, ar, de, hi ...). Human-made captions are preferred over auto-generated ones in the same language.

## `fallbackToAnyLanguage` (type: `boolean`):

If none of your languages exists, return the transcript in the video's own language instead of skipping it.

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

What to include for each video.

## `chunkWords` (type: `integer`):

Split each transcript into pieces of about this many words (for example 300) with start/end time, chapter and a link to that moment. 0 = off. Ideal for RAG, embeddings and AI agents.

## `findPhrases` (type: `array`):

Words or phrases to find in every transcript (brand names, topics, people). Each mention comes with the time, the sentence around it and a link that opens the video at that moment.

## `includeDescription` (type: `boolean`):

Add the video description (chapters are always added when the video has them).

## `onlyNewVideos` (type: `boolean`):

Remember which videos were already done for each channel, playlist and search, and only process new ones next time. Schedule the Actor to follow channels.

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

Keeps separate memories for different lists.

## `maxVideosTotal` (type: `integer`):

Safety limit for the whole run.

## `concurrency` (type: `integer`):

How many videos to process at the same time.

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

Apify datacenter proxy by default (included in the price). If YouTube starts asking for bot checks, the Actor switches to residential proxy automatically.

## `fallbackToResidential` (type: `boolean`):

Included in the price.

## `pacingMs` (type: `integer`):

Average pause per worker between requests.

## `maxAttempts` (type: `integer`):

Retries with a new IP when YouTube refuses a request.

## Actor input object example

```json
{
  "videos": [
    "https://www.youtube.com/watch?v=aircAruvnKk",
    "https://youtu.be/jNQXAC9IVRw"
  ],
  "maxVideosPerSource": 20,
  "languages": [
    "en"
  ],
  "fallbackToAnyLanguage": true,
  "outputFormats": [
    "text",
    "segments"
  ],
  "chunkWords": 0,
  "includeDescription": true,
  "onlyNewVideos": false,
  "monitorName": "default",
  "maxVideosTotal": 1000,
  "concurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "fallbackToResidential": true,
  "pacingMs": 300,
  "maxAttempts": 6
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per video: status, language, words.

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

Everything per video: text, segments, chunks, mentions, metadata.

## `markdown` (type: `string`):

Ready for AI tools.

## `mentions` (type: `string`):

Only with 'Find phrases'.

## `runSummary` (type: `string`):

What was charged, inputs not found.

# 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=aircAruvnKk",
        "https://youtu.be/jNQXAC9IVRw"
    ],
    "languages": [
        "en"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("skydata/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=aircAruvnKk",
        "https://youtu.be/jNQXAC9IVRw",
    ],
    "languages": ["en"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("skydata/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=aircAruvnKk",
    "https://youtu.be/jNQXAC9IVRw"
  ],
  "languages": [
    "en"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call skydata/youtube-transcript-scraper --silent --output-dataset

```

## MCP server setup

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