# YouTube Transcript Scraper: Captions, Subtitles & API (`veenkes/veenkes-youtube-transcripts`) Actor

Get YouTube transcripts (captions and subtitles) for videos, channels and playlists: full text plus timestamped segments in any language, auto-translation, and video metadata (title, channel, views, duration). No official API key.

- **URL**: https://apify.com/veenkes/veenkes-youtube-transcripts.md
- **Developed by:** [veenkes](https://apify.com/veenkes) (community)
- **Categories:** Videos, AI, Developer tools
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 transcript scrapeds

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 Scraper: Captions, Subtitles & API

A **YouTube transcript API** and scraper for **captions and subtitles**. Give it video URLs, channel handles or playlists and get the full transcript text, timestamped segments, the caption language (human-made or auto-generated), optional auto-translation, and video metadata: title, channel, views, duration, description, keywords and thumbnail.

No official YouTube API key, no login, no browser. Built for **AI / LLM pipelines**, content repurposing, SEO and research.

### Why use this YouTube transcript scraper?

- 📝 **Full text + timestamps:** a clean `transcript` string for LLMs, and `segments` (start, duration, text) for subtitles, chapters and quotes.
- 🌍 **Any language and translation:** choose preferred languages (e.g. `en`, `es`), fall back to the original language, or **translate** with YouTube's built-in translation (`translateTo: "en"`).
- 🎯 **Human captions first:** creator-uploaded captions are preferred over auto-generated ones, and the `isAutoGenerated` flag tells you which you got.
- 📺 **Channels and playlists:** paste a channel `@handle` or a playlist URL to process its latest videos.
- 📊 **Video metadata included:** title, channel, views, duration, description, keywords, thumbnail.
- 🛡️ **Reliable:** if YouTube refuses a request, the Actor automatically retries through a residential connection at no extra cost to you.
- 💸 **Fair pricing:** from $1.10 per 1,000 transcripts, and **videos without a transcript are free**.

### Who is it for?

- **AI builders:** RAG over YouTube content, summarization, Q\&A bots, fine-tuning datasets.
- **Content marketers:** turn videos into blog posts, newsletters, social threads and show notes.
- **SEO teams and researchers:** analyze what competitors and creators say, at scale.
- **Educators and students:** searchable lecture notes.
- **Media monitoring:** track mentions of brands and topics inside videos.

### What data does it extract?

| Field | Example |
|---|---|
| `videoId`, `url`, `title` | `dQw4w9WgXcQ`, `Rick Astley - Never Gonna Give You Up…` |
| `channelName`, `channelId` | `Rick Astley`, `UCuAXFkgsw1L7xaCfnd5JJOw` |
| `transcript` | full text |
| `segments` | `[{ "start": 1.36, "duration": 1.68, "text": "♪ We're no strangers to love ♪" }]` |
| `transcriptLanguage`, `transcriptLanguageName`, `isAutoGenerated`, `translated` | `en`, `English`, `false`, `false` |
| `availableLanguages` | every caption track: code, name, auto-generated flag |
| `wordCount`, `segmentCount` | `487`, `61` |
| `durationSeconds`, `viewCount`, `description`, `keywords`, `thumbnail` | metadata |
| `source` | `video`, a channel or a playlist |

### How to use it

1. Click **Try for free**.
2. Paste **video URLs or IDs** and/or **channels / playlists**.
3. Set **preferred languages** (and optionally **Translate to**).
4. Click **Start**, then export to JSON, CSV, Excel or Google Sheets, or call the Actor through the API from your AI app (works with the Apify MCP server, LangChain, n8n, Make and Zapier).

### Run it from the API

You can start this Actor from any language with the official [Apify API client](https://docs.apify.com/api/client/python). Replace `YOUR_APIFY_TOKEN` with a token from [Apify Console > Integrations](https://console.apify.com/account/integrations). Never put the token in a public repo.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("veenkes/veenkes-youtube-transcripts").call(run_input={
    "videos": [
        "https://www.youtube.com/watch?v=jNQXAC9IVRw"
    ],
    "languages": [
        "en"
    ],
    "includeSegments": True,
    "includeMetadata": True
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('veenkes/veenkes-youtube-transcripts').call({
    "videos": [
        "https://www.youtube.com/watch?v=jNQXAC9IVRw"
    ],
    "languages": [
        "en"
    ],
    "includeSegments": true,
    "includeMetadata": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Schedule the Actor, send results to a webhook, or connect it in Zapier, Make or n8n. Store page: <https://apify.com/veenkes/veenkes-youtube-transcripts>.

### Use from AI agents (Apify MCP)

AI agents can run this Actor through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). Connect Claude, Cursor or any MCP-compatible client to Apify, then ask the agent to call `veenkes/veenkes-youtube-transcripts` with an input like the example above. The agent discovers the tool from the Actor title and description.

### How much does it cost?

Pay per transcript. Videos without captions, private or deleted videos are not charged.

| Apify plan tier | Price per 1,000 transcripts |
|---|---|
| FREE | $2.00 |
| BRONZE | $1.50 |
| SILVER | $1.30 |
| GOLD and above | $1.10 |

There is also a $0.00005 start fee per run. Metadata, segments and translation are included at no extra cost.

### Input example

```json
{
    "videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ", "https://youtu.be/jNQXAC9IVRw"],
    "channels": ["@mkbhd"],
    "maxVideosPerChannel": 10,
    "languages": ["en", "es"],
    "fallbackToAnyLanguage": true,
    "preferManual": true,
    "translateTo": "",
    "includeSegments": true,
    "includeMetadata": true
}
```

### Output example

```json
{
    "videoId": "dQw4w9WgXcQ",
    "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
    "channelName": "Rick Astley",
    "channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
    "transcriptLanguage": "en",
    "transcriptLanguageName": "English",
    "isAutoGenerated": false,
    "translated": false,
    "transcript": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ …",
    "wordCount": 487,
    "segmentCount": 61,
    "durationSeconds": 213,
    "viewCount": 1836532905,
    "thumbnail": "https://i.ytimg.com/vi/dQw4w9WgXcQ/sddefault.jpg",
    "segments": [{ "start": 1.36, "duration": 1.68, "text": "[♪♪♪]" }],
    "scrapedAt": "2026-11-12T22:06:14.903Z"
}
```

The key-value store record `SUMMARY` lists videos that had no transcript or couldn't be processed, and why.

### Tips

- **Transcripts for LLMs:** turn off *Include timestamped segments* to keep only the text.
- **Non-English videos:** add your languages in order, or set *Translate to* = `en`.
- **Channels:** YouTube's public channel feed lists the latest 15 videos. For older videos, paste their URLs.

### Why this one?

You are charged per video that actually returns a transcript — videos with no captions are free. Preferred languages, fallback, and YouTube's own translation are built in, and you can turn off timestamped segments when you only need a clean text block for an LLM.

### FAQ

**Is this legal?**
The Actor reads captions that YouTube shows publicly in its player. It collects no personal data. Transcripts may be copyrighted by their creators, so use them in line with copyright law (for example research, analysis or summarization) and YouTube's terms.

**Why did a video fail?**
The video has no captions (neither creator-made nor auto-generated), is private or age-restricted, or was removed. Failed videos are listed in `SUMMARY` and are not charged.

***

### Integrations

- **Apify API** — Python and JavaScript clients (examples above), plus a REST API.
- **AI agents** — run it via the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).
- **Automation tools** — Zapier, Make, n8n, or an Apify webhook when a run finishes.
- **Export** — download the dataset as JSON, CSV, Excel or XML, or load it from a scheduled run.

[Open the Actor in Apify Store](https://apify.com/veenkes/veenkes-youtube-transcripts).

*Not affiliated with or endorsed by YouTube or Google. YouTube is a trademark of Google LLC.*

# Actor input Schema

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

YouTube video URLs (watch, youtu.be, Shorts, live or embed) or 11-character video IDs. Videos with no captions are skipped and not charged.

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

Channel URLs / @handles or playlist URLs. The latest videos are processed (YouTube's public feed lists up to 15 per channel or playlist).

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

How many of the latest videos to take from each channel or playlist. YouTube's public feed lists up to 15 items; paste older video URLs directly if you need them.

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

Transcript languages in order of preference (ISO codes like en, es, de, ru). The first available one is used.

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

If none of the preferred languages exists, use the video's original-language transcript.

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

Use creator-uploaded captions over auto-generated ones when both exist.

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

Optional: language code to auto-translate the transcript into (YouTube's built-in translation), e.g. en, es, fr.

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

Add the transcript as segments with start time and duration (seconds).

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

Add duration, views, publish date, category, description, keywords and thumbnail.

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

Optional. Not needed normally; use a proxy only if YouTube rate-limits your runs.

## Actor input object example

```json
{
  "videos": [
    "https://www.youtube.com/watch?v=jNQXAC9IVRw"
  ],
  "maxVideosPerChannel": 15,
  "languages": [
    "en"
  ],
  "fallbackToAnyLanguage": true,
  "preferManual": true,
  "includeSegments": true,
  "includeMetadata": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

# 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=jNQXAC9IVRw"
    ],
    "languages": [
        "en"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("veenkes/veenkes-youtube-transcripts").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=jNQXAC9IVRw"],
    "languages": ["en"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("veenkes/veenkes-youtube-transcripts").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=jNQXAC9IVRw"
  ],
  "languages": [
    "en"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call veenkes/veenkes-youtube-transcripts --silent --output-dataset

```

## MCP server setup

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

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/J0bcOsaror2nccYJL/builds/4fvAETNAiiReJ46GS/openapi.json
