# YouTube Transcript Scraper: Subtitles to Text, SRT & API (`s_actors/youtube-transcript-scraper`) Actor

Get YouTube transcripts and subtitles of videos, Shorts, whole channels and playlists: plain text, timestamped segments, SRT or VTT, any caption language, manual or auto-generated. Search words inside transcripts with links to the moment. Only-new mode for new uploads. No API key.

- **URL**: https://apify.com/s\_actors/youtube-transcript-scraper.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Videos, AI, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 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 Scraper: Subtitles to Text, SRT & API

Get the **transcript of any YouTube video**, Short, **whole channel** or **playlist**: plain text, **timestamped segments**, **SRT** or **VTT** subtitles, in any caption language the video has, manual or auto-generated. **Search words inside transcripts** and get a link to the exact second, or schedule **Only new videos** to get the transcripts of new uploads.

```json
{ "videos": ["https://www.youtube.com/watch?v=rfscVS0vtbw"], "languages": ["en"] }
```

No YouTube API key, no quota, no browser extension, no login. Use it as a **YouTube transcript API**: one call returns clean JSON.

#### What you get

One row per video. Real example, September 2026:

| title | channelName | language | wordCount | text |
|---|---|---|---|---|
| Learn Python - Full Course for Beginners | freeCodeCamp.org | English | 50,862 | In this course, I'm going to teach you everything you need to know to get started programming in Python... |
| iPhone 18 Pro Review: All About that Chip | Marques Brownlee | English (auto-generated) | 3,343 | ... |
| Never Gonna Give You Up (4K Remaster) | Rick Astley | English | 487 | \[♪♪♪] ♪ We're no strangers to love ♪ ... |

| Field | Description |
|---|---|
| `text` | The whole transcript as plain text |
| `segments` | `[{start, duration, text}]` in seconds, one per caption line |
| `timestampedText` | `[1:23] text` on every line (option) |
| `srt`, `vtt` | Subtitle files as text, with no overlapping lines (options) |
| `language`, `languageCode`, `isAutoGenerated` | The caption track used, e.g. `English (auto-generated)`, `en`, `true` |
| `availableLanguages` | Every caption track of the video: code, name, auto-generated or not |
| `wordCount`, `characterCount`, `segmentCount` | Size of the transcript |
| `matches`, `matchCount` | With **Search words**: `{word, timestamp, text, url}`, the url opens the video at that second |
| `title`, `channelName`, `channelId`, `durationSeconds`, `views`, `videoUrl` | The video |
| `description`, `keywords` | Description and tags (option) |
| `transcriptAvailable`, `error` | Why there is no transcript: no captions, not in your languages, video unavailable. These rows are free |

#### How it works

1. Add **videos, Shorts, channels or playlists**: `youtube.com/watch?v=...`, `youtu.be/...`, `/shorts/...`, video IDs, `youtube.com/@handle`, `/channel/UC...` or `?list=...`
2. Set **Transcript languages** in order of preference: `en`, `es`, `de`...
3. Pick the **output formats**: segments, text with timestamps, SRT, VTT
4. Run, then download as JSON, CSV or Excel, or call it as an API

| Input | What it does |
|---|---|
| **Videos per channel or playlist** | A channel gives its latest uploads, a playlist its videos (default 10) |
| **Transcript languages** | First language the video has; `en` also matches `en-GB` |
| **Otherwise use the original language** | No preferred language: the transcript in the spoken language instead of nothing |
| **Auto-generated captions** | Use when there are no manual captions (default), prefer them, or never |
| **Search words in transcripts** | Timestamped links to every mention; **Only videos that mention the words** skips the rest for free |
| **Only new videos** | Monitoring: each scheduled run returns only videos not seen before |

#### Why this Actor

| | |
|---|---|
| 📺 **Channels and playlists** | A whole channel or course in one run, one row per video |
| 🔍 **Search inside transcripts** | Where a word is said, with a link to the second: brand mentions, quotes, topics |
| 🎞️ **All formats at once** | Text, segments, timestamped text, SRT and VTT in the same row |
| 🌍 **Language control** | Your language order, manual or auto-generated, and the list of all tracks |
| 🔔 **Only new videos** | Transcripts of new uploads on a schedule, for summaries and research feeds |
| 💰 **$2 per 1,000 transcripts** | Videos without captions are free; the popular transcript Actors charge $5-10 per 1,000 |

#### Only new videos: transcripts of new uploads

1. Add channels or playlists, switch on **Only new videos**, give the task a **Monitor name**
2. Save as a task and add a schedule, e.g. every morning
3. **First run** returns the latest videos (up to **Videos per channel or playlist**) and remembers them. **Every later run** returns only videos it has not seen. An empty result means no new uploads

Send the new transcripts to Slack, email, [Google Sheets](https://apify.com/s_actors/google-sheets-import-export) or an AI summary with an integration.

#### Pricing

Pay per result, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Transcript (one video, all formats you chose) | $0.002 | $0.0018 | $0.0016 |

| Task | Cost |
|---|---|
| 1 video | $0.003 |
| The 50 latest videos of a channel | ~$0.10 |
| New videos of 5 channels, daily for a month (~1 new video a day each) | ~$0.33 per month |

Videos without captions, unavailable videos and videos skipped by **Only videos that mention the words** are not charged.

#### Ready-made tasks

Open one, change the videos, channels or playlists, and run:

| Task | What you get |
|---|---|
| [Download YouTube Transcript as Text](https://apify.com/s_actors/youtube-transcript-scraper/examples/download-youtube-transcript) | Full transcript of one video |
| [YouTube Transcript with Timestamps: \[1:23\] Text per Line](https://apify.com/s_actors/youtube-transcript-scraper/examples/youtube-transcript-with-timestamps) | A timestamp on every line |
| [YouTube Channel Transcripts in Bulk: Latest Videos](https://apify.com/s_actors/youtube-transcript-scraper/examples/youtube-channel-transcripts) | A channel's latest videos |

#### FAQ

**Does it work for videos without subtitles?** It uses YouTube's captions: the creator's or the auto-generated ones, which most spoken videos have. A video with no captions at all (music without words, some live streams) gets a free row with `error`. It does not transcribe audio itself.

**Can it translate a transcript?** No. YouTube blocks its machine translation for automated requests, so the Actor returns the languages the video really has (`availableLanguages`). Translate the text with your own tool or an LLM.

**Are auto-generated transcripts accurate?** They are YouTube's speech recognition: good for search, summaries and AI, without punctuation and with some misheard words. Choose **Auto-generated captions: Never** to get only creator-written captions.

**Why does it need a proxy?** YouTube asks many server IPs to sign in before it shows captions. The Actor takes a fresh Apify datacenter IP for each attempt and, if needed, a residential one; the proxy cost is included in the price.

**Very long videos?** Yes: a 4.5-hour course gives about 50,000 words in one row.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Get the transcripts of the last 5 videos of @mkbhd and summarize what he says about battery life."

#### Other YouTube tools

| Tool | What it does |
|---|---|
| [YouTube Comments Scraper](https://apify.com/s_actors/youtube-comments-scraper) | Comments and replies of videos, Shorts and channels, only-new monitoring |
| [YouTube SEO & Rank Tracker](https://apify.com/s_actors/youtube-seo-rank-tracker) | Searches a video ranks for, keyword rankings, tags, suggestions |
| [Google Sheets Import & Export](https://apify.com/s_actors/google-sheets-import-export) | Send the results to a Google Sheet |

#### Is it legal?

The Actor reads only public captions that YouTube shows to any visitor, without logging in, and does not download video or audio. Transcripts are the creators' content: use them for research, accessibility, search and analysis, and respect copyright when you republish them.

# Actor input Schema

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

One per line: video links (youtube.com/watch?v=..., youtu.be/...), Shorts links (/shorts/...), 11-character video IDs, channel links (youtube.com/@handle, /channel/UC...), @handles or playlist links (?list=...). A channel gives its latest videos, a playlist its videos (see Videos per channel or playlist).

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

For channels: how many of the latest uploads (videos, Shorts, past streams). For playlists: how many videos from the top.

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

Preferred caption languages in order, as codes: en, es, de, fr, pt, hi, ja... The first one the video has is used ('en' also matches en-GB). Default: en.

## `anyLanguage` (type: `boolean`):

If a video has none of your languages, return the transcript in its spoken language (the auto-generated track) instead of skipping it. Machine translation is not available.

## `autoGenerated` (type: `string`):

Most videos have only YouTube's auto-generated captions. Manual captions are written by the creator: cleaner, with punctuation.

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

segments: a list of {start, duration, text} in seconds, one per caption line.

## `includeTimestampedText` (type: `boolean`):

timestampedText: one line per caption with its time, like \[1:23] text. Handy for notes and LLM prompts that cite the moment.

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

srt: the transcript as an .srt subtitle file (text).

## `includeVtt` (type: `boolean`):

vtt: the transcript as a WebVTT subtitle file (text).

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

Also return the video description and its tags (keywords).

## `searchWords` (type: `array`):

Find where these words or phrases are said, not case-sensitive. Each video gets matches: the word, the time, the caption line and a link that opens the video at that moment.

## `onlyVideosWithMatches` (type: `boolean`):

With Search words: skip videos where none of the words is said. Skipped videos are free.

## `onlyNew` (type: `boolean`):

For scheduled runs with channels or playlists. The first run returns the transcripts of the latest videos and remembers them; every later run returns only videos it has not seen before. An empty result means no new videos.

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

Name of the memory used by Only new videos. Use a different name for each task.

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

How many videos are processed at the same time.

## `residentialFallback` (type: `boolean`):

YouTube blocks transcripts for many datacenter IPs. After 8 blocked datacenter IPs the Actor tries residential IPs (included in the price). Turn off only if your plan has no residential proxies.

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

Transcripts need Apify Proxy: the Actor takes a fresh datacenter IP for each attempt. Keep the default.

## Actor input object example

```json
{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "maxVideosPerChannel": 10,
  "languages": [
    "en"
  ],
  "anyLanguage": true,
  "autoGenerated": "fallback",
  "includeSegments": true,
  "includeTimestampedText": false,
  "includeSrt": false,
  "includeVtt": false,
  "includeDescription": false,
  "onlyVideosWithMatches": false,
  "onlyNew": false,
  "monitorName": "default",
  "maxConcurrency": 5,
  "residentialFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Text, language, word count and search matches per video.

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

Every field, including segments with timestamps, SRT and VTT.

# 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"
    ],
    "languages": [
        "en"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/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"],
    "languages": ["en"],
}

# Run the Actor and wait for it to finish
run = client.actor("s_actors/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"
  ],
  "languages": [
    "en"
  ]
}' |
apify call s_actors/youtube-transcript-scraper --silent --output-dataset

```

## MCP server setup

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