# YouTube Transcript & Subtitles Scraper API (`george.the.developer/youtube-transcript-scraper`) Actor

Extract YouTube transcripts, subtitles, captions, timestamps & metadata in bulk from videos, Shorts, playlists & channels. Pay-per-video YouTube transcript API, no API key needed. Callable from any MCP client (Claude, Cursor, ChatGPT). Built for RAG, LLM datasets & content repurposing.

- **URL**: https://apify.com/george.the.developer/youtube-transcript-scraper.md
- **Developed by:** [George Kioko](https://apify.com/george.the.developer) (community)
- **Categories:** AI, Videos, Developer tools
- **Stats:** 410 total users, 16 monthly users, 99.8% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## YouTube Transcript & Subtitles Scraper API

> **No API key. No YouTube Data API quota. No monthly subscription.** Official-API tools burn quota and miss auto-generated captions; this scraper reads YouTube's caption tracks directly.
> You pay per extracted transcript. Videos with no captions at all never trigger a per-transcript charge.

**YouTube Transcript & Subtitles Scraper is an Apify Actor that extracts transcripts, subtitles, timed caption segments, and video metadata from YouTube videos, playlists, channels, and Shorts, and returns them as structured JSON — with no API key and no YouTube Data API quota.** It is a bulk **YouTube transcript API** and **YouTube subtitles scraper** built for RAG datasets, LLM training corpora, content repurposing, and video SEO analysis: paste URLs, get clean timestamped text.

✅ Auto-generated + manual captions · ✅ Playlists, channels, Shorts · ✅ Language fallback · ✅ Up to 5,000 videos per run · ✅ **$1 per 1,000 transcripts** · ✅ MCP ready for AI agents

### Pricing

| Event | Price | You pay when |
|---|---|---|
| Actor start | $0.0001 | Once per run |
| Transcript extracted | $0.001 | Per video transcript successfully extracted |

**$1 per 1,000 transcripts.** The start fee is a hundredth of a cent. A 500-video channel costs about $0.50. No API key, no quota, no subscription — pay only for transcripts you actually receive.

### Why this Actor?

- **Zero setup friction** — no Google Cloud project, no OAuth, no API quota limits.
- **Bulk by default** — up to 5,000 videos per run; mix video URLs, playlist URLs, channel URLs, Shorts, and raw IDs in one input.
- **Auto-generated caption support** — works even when the creator never uploaded manual subtitles.
- **Language fallback** — ask for `en`, and if it doesn't exist you still get the best available track instead of an empty row.
- **LLM-ready output** — full text, timestamped segments, or both, plus title/channel/views/duration metadata on every row.
- **Loss-leader pricing** — $1 per 1,000 transcripts.

### How it works

```mermaid
flowchart LR
    A[Video, playlist,<br/>channel, Shorts URL] --> B[Normalize URL<br/>and discover videos]
    B --> C[Fetch transcript tracks<br/>manual or auto captions]
    C --> D{Preferred language<br/>available?}
    D -- yes --> E[Extract selected<br/>language transcript]
    D -- no --> F[Fallback to best<br/>available captions]
    E --> G[Format output<br/>full text, segments, or both]
    F --> G
    G --> H[Attach metadata<br/>title, channel, views,<br/>duration, thumbnail]
    H --> I[Dataset export<br/>JSON, CSV, Excel, API]
```

### What data does it extract?

- **Full transcript text** — complete spoken content as plain text
- **Timed segments** — caption segments with start time, end time, and duration
- **Video metadata** — title, channel name, view count, upload date, duration, description, thumbnail URL
- **Language** — detected or selected transcript language
- **Video URL** — direct link to the source video

### What is NOT returned

- ❌ Video or audio files — this extracts text, not media
- ❌ Comments or community posts
- ❌ Machine translation — you get the caption tracks YouTube actually serves, in their original languages
- ❌ Burned-in (hardcoded) subtitles — text rendered into the video image has no caption track to read

### Quick start

1. Open the [YouTube Transcript Scraper](https://apify.com/george.the.developer/youtube-transcript-scraper) on Apify Store and click **Try for free**.
2. Paste video URLs, playlist URLs, channel URLs, or raw video IDs into **URLs** — formats can be mixed.
3. Pick a **Language** (default `en`; falls back automatically), an **Output Format** (`full-text`, `segments`, or `both`), and toggle timestamps/metadata.
4. Click **Start**, then export the dataset as JSON, CSV, or Excel — or pull it via API.

### Input parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `urls` | Array | Yes | YouTube video URLs, playlist URLs, channel URLs, or video IDs |
| `language` | String | No | Preferred transcript language code (default: `en`) |
| `outputFormat` | Enum | No | `full-text`, `segments`, or `both` (default: `both`) |
| `includeTimestamps` | Boolean | No | Include start/end times for each segment (default: `true`) |
| `maxVideos` | Integer | No | Maximum videos to process, up to 5,000 (default: 50) |
| `includeMetadata` | Boolean | No | Include video title, channel, views, etc. (default: `true`) |
| `maxConcurrency` | Integer | No | Concurrent requests, 1-20 (default: 5) |
| `proxyConfiguration` | Object | No | Apify Proxy country routing only. The actor always uses `BUYPROXIES94952`; custom proxy URLs and alternate groups are ignored |

### Output example

```json
{
  "videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "title": "How to Build a RAG Pipeline in 2026",
  "channel": "AI Engineering Academy",
  "viewCount": 245000,
  "uploadDate": "2026-02-15",
  "duration": "14:32",
  "language": "en",
  "fullText": "Welcome to this tutorial on building a retrieval-augmented generation pipeline. Today we'll cover vector databases, embedding models, and...",
  "segments": [
    {
      "text": "Welcome to this tutorial on building a retrieval-augmented generation pipeline.",
      "start": 0.0,
      "end": 4.2,
      "duration": 4.2
    },
    {
      "text": "Today we'll cover vector databases, embedding models, and chunking strategies.",
      "start": 4.2,
      "end": 8.8,
      "duration": 4.6
    }
  ],
  "thumbnailUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg"
}
```

### Use from Claude, ChatGPT and any MCP agent

Add this actor to any MCP client (Claude, Cursor, ChatGPT) through the Apify MCP server:

```
https://mcp.apify.com/?tools=george.the.developer/youtube-transcript-scraper
```

Or call it programmatically:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('george.the.developer/youtube-transcript-scraper').call({
    urls: ['https://www.youtube.com/watch?v=dQw4w9WgXcQ'],
    outputFormat: 'both',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
// items[0].fullText, items[0].segments
```

```bash
curl -X POST "https://api.apify.com/v2/acts/george.the.developer~youtube-transcript-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]}'
```

### Integrations

- **n8n** — add the **Apify** node → operation *Run Actor and Get Dataset Items* → actor `george.the.developer/youtube-transcript-scraper` → map `fullText` into your workflow.
- **Make / Zapier** — use the Apify app's *Run Actor* module, then *Get Dataset Items*.
- **Anything else** — every run's dataset has a stable URL: `https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&format=json&clean=1`.

### AI and content pipeline

```mermaid
flowchart TD
    YT[YouTube videos] --> TR[Transcript extraction]
    TR --> CLEAN[Clean text + timestamps]
    CLEAN --> RAG[RAG / vector database]
    CLEAN --> SEO[Video SEO analysis]
    CLEAN --> REP[Blog posts, newsletters,<br/>show notes, clips]
    RAG --> APP[Chatbot or research assistant]
    SEO --> PLAN[Keyword and topic gaps]
    REP --> CMS[CMS / social scheduler]
```

### Use cases

1. **RAG and LLM fine-tuning** — turn hundreds of domain videos into a knowledge base or training corpus.
2. **Content repurposing at scale** — one video becomes blog posts, threads, newsletters, show notes.
3. **Video SEO and competitor analysis** — mine top-ranking videos' spoken content for keyword and topic gaps.
4. **Podcast and webinar archives** — long-form recordings become timestamped searchable text.
5. **Creator research and clipping** — find recurring hooks and send timestamped sections to editors or AI agents.

### FAQ

#### Do I need a YouTube Data API key?

No. This scraper works without any API key or Google account. It reads caption tracks directly, so YouTube API quotas never apply.

#### How much does it cost to transcribe 1,000 videos?

$1. Pricing is $0.001 per extracted transcript plus a $0.0001 run-start fee. Videos without captions never trigger a per-transcript charge.

#### Does it work with auto-generated captions?

Yes. Both manually uploaded subtitles and YouTube's auto-generated captions are supported, in any language YouTube serves.

#### Can I scrape entire playlists or channels?

Yes. Pass a playlist or channel URL and the scraper discovers and processes every video, up to your `maxVideos` limit (max 5,000 per run).

#### What languages are supported?

Every language YouTube provides a caption track for. Set your preferred language code; if it isn't available the scraper falls back to the best available track instead of returning nothing.

#### How do I handle geo-restricted videos?

Set `proxyConfiguration.countryCode` to route through Apify Proxy in the right country. The actor always enforces the `BUYPROXIES94952` proxy group for reliability.

#### Can I use the output for LLM training data?

Yes. The `full-text` format is designed for direct ingestion into fine-tuning and RAG pipelines; process up to 5,000 videos per run to build large corpora.

# Actor input Schema

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

List of YouTube video URLs, playlist URLs, or channel URLs. Supports: youtube.com/watch?v=, youtu.be/, youtube.com/playlist?list=, youtube.com/@channel, youtube.com/shorts/

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

Preferred transcript language code (e.g., 'en', 'es', 'fr', 'de', 'ja'). Falls back to auto-generated captions if manual captions unavailable. Leave empty for default language.

## `includeTimestamps` (type: `boolean`):

Include start time and duration for each transcript segment. Useful for building video indexes or jumping to specific parts.

## `outputFormat` (type: `string`):

How to format the transcript text. 'full-text' = single concatenated string (best for AI/LLM input). 'segments' = array of timestamped segments. 'both' = includes both formats.

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

Maximum number of videos to process. Useful when scraping playlists or channels to limit costs.

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

Include video title, channel name, description, view count, publish date, duration, and tags alongside the transcript.

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

Maximum number of concurrent requests. Higher = faster but more likely to hit rate limits.

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

Apify Proxy country routing only. This actor always uses BUYPROXIES94952; custom proxy URLs and alternate groups are ignored.

## Actor input object example

```json
{
  "urls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "language": "en",
  "includeTimestamps": true,
  "outputFormat": "both",
  "maxVideos": 50,
  "includeMetadata": true,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "BUYPROXIES94952"
    ]
  }
}
```

# 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"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "BUYPROXIES94952"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("george.the.developer/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 = {
    "urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["BUYPROXIES94952"],
    },
}

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

```

## MCP server setup

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