# YouTube Transcript, Subtitles & Metadata Scraper (AI Ready) (`ramgoxxx/youtube-transcript-chapters-scraper`) Actor

Fast bulk YouTube transcript, timestamped subtitles, description chapters & video metadata extractor. Outputs clean plain text, LLM Markdown & timestamped segments.

- **URL**: https://apify.com/ramgoxxx/youtube-transcript-chapters-scraper.md
- **Developed by:** [Antonio Ramos Gómez](https://apify.com/ramgoxxx) (community)
- **Categories:** Agents, Developer tools, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 video 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, Subtitles & Metadata Scraper API do?

**YouTube Transcript, Subtitles & Metadata Scraper** extracts clean **full-text transcripts**, **millisecond-accurate subtitle segments**, **description chapters**, and **video metadata** (*title, channel, views, duration, language*) from standard YouTube videos, `youtu.be` links, and **YouTube Shorts** in bulk — engineered specifically for **AI agents, RAG pipelines, LLM summarization, n8n, Make, and MCP workflows**.

Unlike brittle web-page caption scrapers that return `0 bytes` due to YouTube web PoToken checks, this **YouTube Transcript API** uses native Innertube mobile player negotiation + automatic cloud proxy fallback for fast, reliable extraction.

- **Ultra-low Pay-Per-Event pricing:** `$0.50 per 1,000 videos` (`$0.0005` per video transcript). Zero platform compute charges.
- **10,000 Free Video Transcripts / Month:** Apify's `$5.00/month` free plan credit covers **10,000 full YouTube transcripts every month at `$0`**.
- **AI & RAG Ready Out of the Box:** Outputs both a clean paragraph-ready `fullTranscript` string (no XML/HTML entities, no duplicate rolling lines) AND optional timestamped `segments` + parsed `chapters`.

***

### Why use this YouTube Transcript & Subtitles API?

YouTube's official Data API v3 restricts `captions.download` via OAuth ownership, meaning you cannot download transcripts for public third-party videos through Google's API. Meanwhile, standard Python `youtube-transcript-api` deployments on AWS, GCP, Vercel, or Railway get blocked with `429` or empty `timedtext` bodies.

#### Built for AI, Content & Research Teams

1. **RAG, Vector Databases & Knowledge Bases (Pinecone, Supabase, Qdrant, LangChain):** Ingest entire YouTube channels, podcasts, or university lectures with clean text + exact timestamps for clickable video citations.
2. **AI Assistants via MCP (Claude, Cursor, VS Code, ChatGPT):** Paste any YouTube URL into Claude or Cursor and get an instant deep summary, code walkthrough, or action-item checklist without watching a 90-minute video.
3. **Content Repurposing Automation (n8n, Make, Zapier):** Automatically convert new YouTube uploads or Shorts into SEO blog posts, LinkedIn carousels, X/Twitter threads, and Substack newsletters.
4. **Competitor & Creator Trend Intelligence:** Analyze hooks, sponsor reads, chapter pacing, and keyword density across top-performing videos in your niche.

***

### What data can YouTube Transcript Scraper extract?

Each output item contains complete video metadata plus clean full-text and timestamped captions:

| Field Name | Type | Description |
| :--- | :--- | :--- |
| `videoId` | `string` | 11-character YouTube Video ID (supports `watch?v=`, `youtu.be/`, and `/shorts/`). |
| `url` | `string` | Canonical YouTube watch URL (`https://www.youtube.com/watch?v=...`). |
| `title` | `string \| null` | Full video title. |
| `channelName` | `string \| null` | Creator / channel display name. |
| `durationSeconds` | `integer \| null` | Exact video length in seconds. |
| `viewCount` | `integer \| null` | Total public view count at extraction time. |
| `languageCode` | `string \| null` | Selected subtitle track ISO code (`en`, `es`, `de`, `fr`, `pt`, etc.). |
| `availableLanguages` | `array<string>` | All caption language codes available on the video. |
| `isAutoGenerated` | `boolean` | `true` for YouTube ASR auto-captions, `false` for creator-uploaded subtitles. |
| `wordCount` | `integer` | Total words in `fullTranscript` — useful for token estimation before LLM calls. |
| `fullTranscript` | `string` | Clean, deduplicated plain-text transcript ready for LLMs, RAG, and search indexing. |
| `chapters` | `array<object>` | Timestamped chapters parsed from description (`timestamp`, `startSeconds`, `title`). |
| `segments` | `array<object>` | Optional array of `{ "startMs", "durationMs", "text" }` subtitle cues (`includeSegments: true`). |

***

### How to extract YouTube transcripts in bulk (Step-by-Step)

1. Click **Try for free** to open **YouTube Transcript, Subtitles & Metadata Scraper**.
2. Paste one or hundreds of YouTube URLs, Shorts links, or 11-char IDs into **YouTube Video URLs or IDs** (`videoUrls`).
3. Set **Preferred Subtitle Language** (`preferredLanguage`, default `en` — automatically falls back to the primary available language if your preferred language isn't present).
4. Toggle **Include Timestamped Segments Array** (`includeSegments`) on for RAG timestamp citations, or off for compact LLM payloads.
5. Click **Start** and download your transcripts in **JSON, CSV, Excel, or Markdown-ready text**.

***

### How much does it cost to scrape YouTube transcripts?

Priced on **Pay-Per-Event (`$0.50 / 1,000` videos)** — among the lowest and most predictable rates on Apify Store, with **compute 100% included**:

| Videos Transcribed | Total Cost | Covered by Apify `$5/mo` Free Credit? |
| :--- | :--- | :---: |
| **100 videos** (full channel) | **`$0.05`** | Yes (`$0`) |
| **1,000 videos** (RAG corpus) | **`$0.50`** | Yes (`$0`) |
| **10,000 videos / month** | **`$5.00`** | **100% Free every month** |
| **100,000 videos** | **`$50.00`** | `$0.0005` per video — 100x cheaper than Whisper ASR |

***

### Use with AI Assistants & MCP (Claude, Cursor, VS Code, ChatGPT)

Turn Claude Desktop, Cursor, Windsurf, or ChatGPT into an instant YouTube research assistant via Apify's remote MCP server:

```json
{
  "mcpServers": {
    "youtube-transcripts": {
      "url": "https://mcp.apify.com/?actors=ramgoxxx/youtube-transcript-chapters-scraper",
      "headers": {
        "Authorization": "Bearer YOUR_APIFY_API_TOKEN"
      }
    }
  }
}
```

Ask your AI agent directly:

- *"Extract the transcript of `https://www.youtube.com/watch?v=jNQXAC9IVRw` and summarize key takeaways with timestamps."*
- *"Pull transcripts for these 5 competitor tutorials and extract every tool they mention."*

***

### Input examples

#### Example 1: Clean LLM-Ready Transcripts (Compact Mode)

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "https://youtu.be/dQw4w9WgXcQ"
  ],
  "preferredLanguage": "en",
  "includeSegments": false
}
```

#### Example 2: Spanish Transcripts + Millisecond Segments for RAG Citations

```json
{
  "videoUrls": ["jNQXAC9IVRw"],
  "preferredLanguage": "es",
  "includeSegments": true
}
```

***

### Output example

```json
[
  {
    "videoId": "jNQXAC9IVRw",
    "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "title": "Me at the zoo",
    "channelName": "jawed",
    "durationSeconds": 19,
    "viewCount": 348912045,
    "languageCode": "en",
    "availableLanguages": ["en", "es", "de", "fr"],
    "isAutoGenerated": false,
    "wordCount": 37,
    "fullTranscript": "All right, so here we are in front of the elephants, the cool thing about these guys is that they have really, really, really long trunks...",
    "chapters": [],
    "segments": [
      { "startMs": 1200, "durationMs": 3100, "text": "All right, so here we are in front of the elephants" }
    ]
  }
]
```

***

### Use in n8n, Make, LangChain & Python

#### Python (`apify-client`)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_API_TOKEN")
run = client.actor("ramgoxxx/youtube-transcript-chapters-scraper").call(
    run_input={
        "videoUrls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"],
        "preferredLanguage": "en",
        "includeSegments": True,
    }
)

for video in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(video["title"], f"({video['wordCount']} words)")
    print(video["fullTranscript"][:500])
```

#### n8n / Make HTTP Request (`run-sync-get-dataset-items`)

```bash
curl -X POST "https://api.apify.com/v2/acts/ramgoxxx~youtube-transcript-chapters-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"videoUrls":["https://www.youtube.com/watch?v=jNQXAC9IVRw"],"preferredLanguage":"en","includeSegments":false}'
```

***

### Frequently Asked Questions & Disclaimer

#### Does this work on YouTube Shorts and auto-generated captions?

Yes. Standard videos (`youtube.com/watch?v=...`), shortened URLs (`youtu.be/...`), YouTube Shorts (`youtube.com/shorts/...`), manual creator subtitles, and automatic ASR captions are all supported.

#### What if a video has captions completely disabled by the uploader?

If a video has zero subtitle or auto-caption tracks enabled on YouTube, no empty garbage item is billed.

#### Legal, GDPR & Ethical Notice

> Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or private location. They only extract publicly accessible captions and metadata published on public YouTube videos. Personal data is protected by the GDPR in the European Union and by other regulations worldwide. Always respect creator copyrights and YouTube's Terms of Service when republishing content. Open an issue in the **Issues** tab if you need support.

# Actor input Schema

## `videoUrls` (type: `array`):

List of YouTube URLs (watch, youtu.be, shorts) or 11-char video IDs.

## `preferredLanguage` (type: `string`):

Preferred language code (e.g. 'en', 'es', 'de', 'fr'). Automatically falls back to first available track if not found.

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

Include exact start/duration millisecond segments alongside full clean text.

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

Automatic Apify Proxy fallback to prevent cloud IP rate limits.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=jNQXAC9IVRw"
  ],
  "preferredLanguage": "en",
  "includeSegments": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `transcripts` (type: `string`):

Every extracted video transcript and metadata row.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("ramgoxxx/youtube-transcript-chapters-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("ramgoxxx/youtube-transcript-chapters-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 '{}' |
apify call ramgoxxx/youtube-transcript-chapters-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ramgoxxx/youtube-transcript-chapters-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/ixylw3PL0xdEI6Qex/builds/MCnL84Kz4aWHicMNe/openapi.json
