# YouTube Transcript Scraper · No API Key · $0.09/1k (`alfalfa/youtube-transcript-scraper`) Actor

Transcripts of YouTube videos from video URLs, channels, playlists or searches: timed segments, plain text, SRT or WebVTT, any caption language. No API key, no login. $0.09 per 1,000 transcripts on every plan, nothing for videos without captions, no start fee.

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

$0.09 / 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

## YouTube Transcript Scraper: subtitles of any video, channel, playlist or search, no API key

Get the **transcript of YouTube videos** as data. Paste video URLs, a channel, a playlist or a search query, and get one row per video with its subtitles as **timed segments**, as **plain text**, and optionally as a ready-to-save **SRT** or **WebVTT** file. Manual captions are preferred, auto-generated captions are the fallback, in the language you choose. No YouTube account, no Data API key, no quota. Export to JSON, CSV or Excel, or call it from Python, JavaScript, n8n, Make, Zapier or an AI agent.

**$0.09 per 1,000 transcripts** on every plan, **nothing for videos without captions**, no start fee, platform usage and proxies included. Video details and the SRT/WebVTT files are included in that price.

### YouTube transcript as text, timed segments, SRT or WebVTT

One row per video:

| Field | Example |
|---|---|
| `id`, `url`, `title` | `iCvmsMzlF7o`, `https://www.youtube.com/watch?v=iCvmsMzlF7o`, `How to speak so that people want to listen` |
| `channelName`, `channelId`, `channelUrl` | `TED`, `UCAuUUnT6oDeKwE6v1NGQxug`, … |
| `durationText`, `durationSeconds` | `9:59`, `599` |
| `publishedAt`, `viewCount`, `likeCount`, `category`, `description`, `keywords` | the video's own details, for context and filtering |
| `transcriptStatus` | `ok`; `no captions` when the video has no subtitles at all; `empty transcript`; or `details could not be loaded`, `captions could not be loaded`, `transcript could not be loaded` when YouTube refused or did not answer (rerun those videos). Only `ok` rows are charged |
| `transcriptLanguage` | `en English`, or `en English (auto-generated)` |
| `transcript` | timed segments: `[{"start": 16.86, "duration": 3.46, "text": "The human voice: It's the instrument we all play."}, …]` |
| `transcriptText` | the whole transcript as one text, ready for a summary, a search index or a translation |
| `transcriptSrt` or `transcriptVtt` | the same subtitles as a complete SRT or WebVTT file, with **Transcript format** set to SRT or WebVTT |
| `searchQuery`, `inputUrl` | where the video came from |

Segment times are seconds from the start of the video, so a quote can be linked as `youtube.com/watch?v=ID&t=16s`.

### Transcripts from video URLs, channels, playlists and searches

- **Video URLs**: `youtube.com/watch?v=…`, `youtu.be/…`, `/shorts/…`, `/live/…`. One row each.
- **Channel URLs**: `youtube.com/@handle`, `/channel/UC…`, `/c/name`, `/user/name`. Add `/videos`, `/shorts` or `/streams` to pick the tab, or set **Channel content**. Newest first as on the channel page, or **Popular** (most viewed first) or **Oldest** with **Channel video order**.
- **Playlist URLs**: `youtube.com/playlist?list=…`. A channel's uploads playlist (`UU` + channel ID) works too.
- **Search queries**: one per line, filtered by upload date (last hour to this year) and ordered by relevance, upload date, views or rating.
- **Search result URLs** copied from the browser.

**Max videos per source** caps each search, channel or playlist. A search page holds about 20 videos; channels and playlists page 30 at a time and can go into the thousands.

### What people do with YouTube transcripts

- **Knowledge bases and RAG**: the transcripts of a whole channel or a topic search as plain text, one JSON per run, chunked by the timed segments.
- **Summaries and notes**: lectures, conference talks, earnings calls, podcasts and interviews turned into text you can summarize, quote and search.
- **Subtitle files**: SRT or WebVTT of your own or licensed videos for an editor, a player or a translation workflow.
- **Content repurposing and SEO**: blog posts, newsletters and social snippets written from what a video says, with the exact timestamps for quotes.
- **Research and monitoring**: everything a channel said about a product, a company or a claim, with dates and view counts next to the text.
- **Language learning and accessibility**: captions in the original language or any available track, with the timing kept.

### Input examples

A single video with English captions:

```json
{ "startUrls": [{ "url": "https://www.youtube.com/watch?v=iCvmsMzlF7o" }] }
```

The latest 100 videos of a channel as SRT files:

```json
{ "startUrls": [{ "url": "https://www.youtube.com/@TED/videos" }], "maxVideos": 100, "transcriptFormat": "srt" }
```

This month's most viewed Python tutorials, Spanish captions where they exist:

```json
{ "searchQueries": ["python tutorial"], "sortBy": "views", "uploadDate": "month", "maxVideos": 50, "transcriptLanguage": "es" }
```

A playlist, plain text only is fine, so the default format:

```json
{ "startUrls": [{ "url": "https://www.youtube.com/playlist?list=PLWKjhJtqVAbnqBxcdjVGgT3uVR10bzTEB" }], "maxVideos": 500 }
```

### YouTube transcript API: code, n8n, Make, Zapier and AI agents

- **API**: `POST https://api.apify.com/v2/acts/alfalfa~youtube-transcript-scraper/run-sync-get-dataset-items?token=…` with the JSON input above returns the rows directly (runs up to 5 minutes). Longer jobs: start the run, poll, read the dataset. Any Apify client library works.
- **n8n, Make, Zapier**: add the Apify node, pick `alfalfa/youtube-transcript-scraper`, paste the same JSON input and read the run's dataset in the next step. See the [Apify integrations docs](https://docs.apify.com/platform/integrations).
- **AI agents and MCP (Claude, Cursor, VS Code, ChatGPT)**: connect the Apify MCP server with this Actor as a tool, `https://mcp.apify.com/?tools=alfalfa/youtube-transcript-scraper`, and the agent can fetch the transcript of any video it is given. See the [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).

### Pricing: $0.09 per 1,000 transcripts

| Event | Price |
|---|---|
| Transcript | $0.09 per 1,000 videos with a transcript, the same on every plan |
| Video without captions | free: the row is saved with `transcriptStatus` = `no captions` |
| Start fee, platform usage, proxies | none, included |

Examples: 1,000 videos that all have captions cost **$0.09**; a channel of 300 videos where 280 have captions costs **$0.025**; one video costs **$0.00009**. The transcript row carries the video's title, channel, length, views and description at no extra charge.

**Final Actor event price.** The per-transcript price includes the Actor's platform usage and proxy costs; there is no start fee or per-run minimum. Apify's own plan or storage charges, if any, are separate. A run's **Maximum total charge** is honoured: the Actor stops before the budget, so the bill never exceeds it.

Need likes, comments, subscriber counts or channel records next to the videos? The [YouTube Scraper](https://apify.com/alfalfa/youtube-scraper) by the same author does all of that, with transcripts as an option.

### Limits and honesty

- Transcripts exist only where the uploader or YouTube's automatic captioning provided them. Videos without any caption track are saved with `transcriptStatus` = `no captions` and are not charged. Live streams have no transcript while live.
- Auto-generated captions are YouTube's own: no punctuation, occasional misheard words, overlapping timing. In the SRT and WebVTT files each cue ends where the next one starts.
- Public videos only. Private, deleted and members-only videos are reported as unavailable and not charged. Age-restricted videos (`ageRestricted: true`) have no readable transcript without a login.
- Transcript language: manual captions in the requested language, then auto-generated ones in it, then a manual track in any language, then the first track available. `transcriptLanguage` records what was used. Translated caption tracks are not requested.
- Search returns what YouTube's search shows a visitor in the US with English settings: about 20 videos per page and rarely more than 500-600 results per query. Split by upload date for more.
- A 20-hour video produces a transcript of about 1 MB. Rows that do not fit the dataset limit keep the segments and the text and drop the SRT or WebVTT copy; the log says so.

### YouTube Transcript Scraper FAQ

**Do I need a YouTube API key?** No. The Data API does not serve captions of other people's videos anyway; this Actor reads the public captions the way a visitor without an account sees them, and has no quota.

**Which languages are supported?** Every language YouTube offers for the video. Set **Transcript language** to a code such as `en`, `de`, `es`, `fr`, `pt`, `ja`; the fallback order is described above.

**Can I download the transcript as an SRT or VTT file?** Set **Transcript format** to SRT or WebVTT. Each row then carries the complete subtitle file in `transcriptSrt` or `transcriptVtt`; save the field as `<video id>.srt` or `.vtt` and it opens in VLC, YouTube Studio, Premiere or any player.

**How do I get only the text?** `transcriptText` is the whole transcript as one string. In a CSV export it is one cell per video.

**Does it work for Shorts and live streams?** Shorts yes, when they have captions. Finished live streams yes, once YouTube has processed the captions. Streams that are live right now have none.

**How fast is it?** Three requests per video; about 100 transcripts a minute per run at the default concurrency. Long videos take a little longer because the transcript itself is bigger.

**What does a video without captions cost?** Nothing. Only rows with a transcript are charged, so a channel where half the videos lack captions costs half.

**Is this legal?** The Actor reads public pages the way a visitor without an account does and stores nothing but the results in your dataset. Respect YouTube's terms and the copyright of the videos when you reuse the text.

This is an unofficial tool and is not affiliated with, endorsed by or connected to YouTube or Google.

### Examples you can run in one click

Each example opens with its input already filled in and a sample of the results, so you can change any field and run it right away.

- [YouTube video transcript to text](https://apify.com/alfalfa/youtube-transcript-scraper/examples/youtube-video-transcript)
- [YouTube channel transcripts, every video](https://apify.com/alfalfa/youtube-transcript-scraper/examples/youtube-channel-transcripts)

Need something the examples do not cover? Every field is on the Input tab, and any example input works unchanged in an API call or an n8n, Make or Zapier workflow.

### Was this useful?

If this Actor saved you time, a short review on its Store page helps others find it and tells me what to improve next. Missing a field or stuck on an input? Open an Issue on the Actor page; issues are answered within a day.

### Related Actors by the same author

| Actor | What it does | Price |
|---|---|---|
| [YouTube Scraper](https://apify.com/alfalfa/youtube-scraper) | videos of a search, channel or playlist with views, likes, dates, tags, comments, channel records and optional transcripts | $0.50 per 1,000 rows |
| [Google Maps Scraper](https://apify.com/alfalfa/google-maps-scraper) | places from any search and location with address, phone, website, rating and hours, plus reviews and website emails | $0.07 per 1,000 places |
| [Amazon Product Scraper](https://apify.com/alfalfa/amazon-product-scraper) | products from searches, Best Sellers lists and ASINs in 22 Amazon stores with price, rating, BSR and details | $0.28 per 1,000 products |
| [LinkedIn Jobs Scraper](https://apify.com/alfalfa/linkedin-jobs-scraper) | public LinkedIn job postings by keyword, location, date, company or URL, with full description, salary, applicants, seniority and poster | $0.30 per 1,000 jobs |
| [Facebook Posts Scraper](https://apify.com/alfalfa/facebook-posts-scraper) | posts of any public page or profile with reactions, comment counts, media, optional video transcripts | $2 per 1,000 posts |
| [Facebook Ads Library Scraper](https://apify.com/alfalfa/facebook-ads-library-scraper) | ads from the Meta Ad Library by keyword, advertiser page or URL, with creatives, dates, platforms and EU reach | $0.45 per 1,000 ads |
| [Facebook Comments Scraper](https://apify.com/alfalfa/facebook-comments-scraper) | comments and replies of any public post | $0.30 per 1,000 comments |

# Changelog

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

# Actor input Schema

## `startUrls` (type: `array`):

Video URLs (<code>youtube.com/watch?v=...</code>, <code>youtu.be/...</code>, <code>/shorts/...</code>, <code>/live/...</code>), channel URLs (<code>youtube.com/@handle</code>, <code>/channel/UC...</code>, with <code>/videos</code>, <code>/shorts</code> or <code>/streams</code>), playlist URLs (<code>playlist?list=...</code>) or search result URLs. One row with the transcript per video. A watch URL with a <code>list=</code> parameter counts as the video, not the playlist.

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

Search YouTube and transcribe the results, one query per line: <code>python tutorial</code>, <code>earnings call 2026</code>. Each query is one source of up to <b>Max videos</b> videos.

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

Maximum videos per search query, channel or playlist. A search returns about 20 videos per page; channels and playlists can go into the thousands. Single video URLs ignore this limit.

## `transcriptLanguage` (type: `string`):

Preferred language code, e.g. <code>en</code>, <code>de</code>, <code>es</code>, <code>pt</code>. Manual captions in that language come first, then auto-generated ones in it, then a manual track in any language, then the first track available. <code>transcriptLanguage</code> in the row says which one was used.

## `transcriptFormat` (type: `string`):

Timed segments (<code>transcript</code>) and plain text (<code>transcriptText</code>) are always included. Pick SRT or WebVTT to add the whole subtitle file as one more field, <code>transcriptSrt</code> or <code>transcriptVtt</code>: numbered cues timed <code>HH:MM:SS,mmm</code> (SRT) or <code>HH:MM:SS.mmm</code> (WebVTT).

## `sortBy` (type: `string`):

Order of search results (search queries and search URLs only).

## `uploadDate` (type: `string`):

Only search results uploaded within this window (search queries only).

## `channelTab` (type: `string`):

Which tab of a channel URL to read when the URL itself does not say (<code>/videos</code>, <code>/shorts</code>, <code>/streams</code>).

## `channelSort` (type: `string`):

Order of a channel's videos, Shorts or streams: newest first as on the channel page, most viewed first, or oldest first. Channel URLs only; searches follow <b>Search order</b> and playlists keep their own order.

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

Sources processed in parallel (default 5). Videos of one source are transcribed four at a time.

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

Residential proxies are included in the price. Leave the default unless you want your own proxy servers.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.youtube.com/watch?v=iCvmsMzlF7o"
    }
  ],
  "maxVideos": 20,
  "transcriptLanguage": "en",
  "transcriptFormat": "segments",
  "sortBy": "relevance",
  "uploadDate": "any",
  "channelTab": "videos",
  "channelSort": "latest",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `items` (type: `string`):

All rows as JSON. Append ?format=csv for CSV.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.youtube.com/watch?v=iCvmsMzlF7o"
        }
    ],
    "maxVideos": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alfalfa/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 = {
    "startUrls": [{ "url": "https://www.youtube.com/watch?v=iCvmsMzlF7o" }],
    "maxVideos": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

```

## MCP server setup

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