# YouTube Transcript Scraper — Bulk, SRT & JSON · $5/1k 💰 (`srd836/youtube-transcript-pro`) Actor

Extract timed transcripts, SRT subtitles and plain text from YouTube videos or entire channels. Pay only for delivered transcripts, from $5/1,000 — built for RAG developers, content teams and AI agents.

- **URL**: https://apify.com/srd836/youtube-transcript-pro.md
- **Developed by:** [David González](https://apify.com/srd836) (community)
- **Categories:** Videos, Agents, Developer tools
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 transcript delivereds

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/platform/actors/running/actors-in-store#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

### Bulk YouTube transcripts to SRT, JSON and plain text — from $5 per 1,000 videos

This **YouTube transcript scraper** extracts captions from YouTube videos — or from a channel's latest uploads — and delivers **three formats in every single item**: timed JSON segments, ready-to-use **SRT subtitles**, and clean **plain text**. Paste video URLs or a channel URL, press Start, and download the whole dataset as JSON, CSV or Excel. No browser automation, no audio downloads — it fetches YouTube's own caption data, which makes it fast and cheap. Perfect for **bulk YouTube transcript to SRT** conversion and as a simple **YouTube channel transcripts API** for your pipelines.

> **Unofficial tool** — not affiliated with or endorsed by YouTube or Google.

### Why use this scraper

- 💰 **$5 per 1,000 transcripts** — half of what the most-used YouTube transcript scraper on the Store charges ($10 per 1,000), with no subscription and no minimum.
- 🧾 **Three formats in one item** — `segments` (start/duration/text), `srt` and `plainText` come together in every result. No extra runs, no post-processing, no "export add-on".
- 🛡️ **Robust by design** — every video is tried through two different YouTube clients (web → Android) with automatic retries and exponential backoff. When the standard web route returns empty captions (a common YouTube quirk), the Android route usually still delivers.
- ✅ **You never pay for failures** — videos without captions, unavailable videos and failed requests are never charged. If a run delivers nothing because of errors, it fails loudly with instructions instead of pretending everything is fine — and charges nothing.

### Use cases

- **AI & RAG developers** — feed timed transcripts into LLM pipelines, vector stores and summarization chains. One flat JSON item per video means zero glue code between scraping and embedding.
- **Content & localization teams** — pull ready-made `srt` files in bulk to subtitle, repurpose or translate videos without touching a subtitle editor.
- **Researchers & SEO analysts** — point it at a channel, schedule it, and always have the latest transcripts as clean `plainText` for keyword, topic and trend analysis.

### Sample output

One flat dataset item per video. Real example (segments and text trimmed for brevity):

```json
{
    "videoId": "jNQXAC9IVRw",
    "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "status": "success",
    "language": "English",
    "languageCode": "en",
    "isAutoGenerated": false,
    "segmentsCount": 6,
    "segments": [
        { "start": 1.2, "duration": 2.16, "text": "All right, so here we are, in front of the elephants" },
        { "start": 5.318, "duration": 2.656, "text": "the cool thing about these guys is that they have really..." }
    ],
    "srt": "1\n00:00:01,200 --> 00:00:03,360\nAll right, so here we are, in front of the elephants\n\n2\n...",
    "plainText": "All right, so here we are, in front of the elephants the cool thing about these guys is that they have really...",
    "title": "Me at the zoo",
    "channelName": "jawed",
    "channelId": "UC4QobU6STFB0P71PMvOGN5A",
    "durationSeconds": 19,
    "viewCount": 403439055,
    "publishDate": "2005-04-23T20:31:52-07:00"
}
```

Item `status` values:

- `success` — transcript delivered (the only case that is charged).
- `no_captions` — the video is playable but has no caption track at all. Free.
- `error` — the video could not be processed; the `error` field explains what happened and what to do. Free.

### Input

The minimum you need is a list of videos — everything else has sensible defaults:

```json
{ "videoUrls": ["https://www.youtube.com/watch?v=arj7oStGLkU", "jNQXAC9IVRw"] }
```

| Field | Type | Description |
|---|---|---|
| `videoUrls` | array | YouTube videos to transcribe. Accepts full URLs (`watch`, `youtu.be`, `shorts`, `embed`, `live`) or bare 11-character video IDs. |
| `channelUrl` | string | Optional. A channel URL (e.g. `https://www.youtube.com/@TED`). The Actor grabs the channel's latest videos from its Videos tab. Can be combined with `videoUrls`. |
| `maxVideos` | integer | How many of the channel's latest videos to take (default 10, max 30). |
| `language` | string | Preferred caption language as an ISO code (e.g. `en`, `es`, `pt`). Fallback order: manual captions in that language → auto-generated in that language → any manual captions → any captions. Empty = best available. |
| `includeMetadata` | boolean | Add title, channel, duration, view count and publish date to each item (default `true`). |
| `proxyConfiguration` | object | Proxies for YouTube requests. If runs fail with HTTP 403/429, switch to Apify Proxy with the **RESIDENTIAL** group. |

### Pricing

Simple pay-per-event pricing — you only pay for transcripts that are actually delivered:

| Event | Price |
|---|---|
| `transcript` (one delivered transcript, all 3 formats included) | **$0.005** |

**1,000 results ≈ $5.** Videos without captions (`no_captions`) and failed videos (`error`) cost $0. A run that delivers nothing because of errors fails and charges nothing.

### FAQ

#### How do I get transcripts for an entire YouTube channel?

Set `channelUrl` to the channel's URL (e.g. `https://www.youtube.com/@TED`) and `maxVideos` to how many of its latest uploads you want (up to 30). The Actor reads the channel's Videos tab and transcribes them automatically — schedule the run and you have a hands-off channel transcript monitor.

#### How do I convert YouTube videos to SRT subtitles in bulk?

Paste any number of video URLs into `videoUrls` and run. Every successful item already contains a complete, correctly timed `srt` string — download the dataset and you have your subtitle files, no separate conversion step.

#### Can it transcribe videos that have no captions at all?

No — it extracts existing caption tracks, it does not run speech-to-text. Videos without any captions are reported (free) as `no_captions`.

#### Which caption language do I get?

The best track matching your `language` input, preferring human-made captions over auto-generated ones. The `language`, `languageCode` and `isAutoGenerated` fields in each item tell you exactly which track was used.

#### Why did a video I know has subtitles come back as no\_captions?

Captions can be disabled by the uploader for embedding/API access, or the video may be age-restricted. Try another video from the same channel; if the problem persists, open an issue.

#### Why is my run failing with HTTP 403 or 429?

YouTube is rate-limiting your IP. The built-in retries and client rotation absorb most of it; if a run still fails, enable Apify Proxy with the **RESIDENTIAL** group in `proxyConfiguration` and run again.

### Limitations (honest ones)

- Only **public, playable** videos. Private, members-only, age-restricted or region-blocked videos come back as `error` or `no_captions`.
- Channel mode reads the first page of the channel's Videos tab: up to **30 latest videos**, regular uploads only (no Shorts tab, no live tab).
- Auto-generated captions are YouTube's own ASR — quality depends on the audio. `isAutoGenerated` tells you which kind you got.
- No machine translation: you get caption tracks that actually exist on the video.
- Heavy usage from datacenter IPs can be rate-limited by YouTube. The built-in retries and client rotation absorb most of it; if a run still fails with 403/429, enable **RESIDENTIAL** proxies in the input.

### 🤖 For AI Agents & MCP

This Actor is public on the Apify platform, which means AI agents can call it programmatically via the [Apify MCP server](https://mcp.apify.com/) or the Apify API. An agent can pass a video or channel URL, receive structured JSON transcripts back, and pipe them straight into summarization, Q\&A or RAG workflows — with per-transcript pricing that keeps agent runs predictable.

### More actors by srd836

- [Google Sheets Import & Export](https://apify.com/srd836/google-sheets-import-export) — sync scraped data to and from Google Sheets.
- [Shopify Store Spy — AliExpress Price Match](https://apify.com/srd836/dropship-price-spy) — analyze Shopify stores and match products against AliExpress prices.
- [Naukri Jobs Scraper](https://apify.com/srd836/naukri-jobs-scraper) — extract job listings from Naukri.com.

### Support

Found a bug or hit an edge case? Open a ticket in the **Issues** tab — every issue is read and answered, usually within a few days.

***

*Looking for a way to download YouTube transcripts in bulk, convert bulk YouTube transcript to SRT, use a YouTube channel transcripts API, extract YouTube captions with timestamps, scrape YouTube subtitles to plain text, or feed YouTube video transcripts into an LLM or RAG pipeline? This YouTube transcript scraper does all of that in one run, at $5 per 1,000 videos.*

# Actor input Schema

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

YouTube videos to transcribe. Accepts full URLs (watch, youtu.be, shorts, embed, live) or bare 11-character video IDs.

## `channelUrl` (type: `string`):

A YouTube channel URL (e.g. https://www.youtube.com/@TED). The Actor resolves the channel's latest videos from its Videos tab and transcribes them. Can be combined with Video URLs.

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

How many of the channel's latest videos to transcribe (only used together with Channel URL). Maximum 30 (first page of the channel's Videos tab).

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

Preferred caption language as an ISO code (e.g. "en", "es", "pt"). Fallback order: manual captions in this language → auto-generated in this language → any manual captions → any captions. Leave empty to take the best available track.

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

Adds title, channel name, channel ID, duration, view count and publish date to every item.

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

Proxies used for YouTube requests. YouTube blocks datacenter IPs, so Apify Proxy with the RESIDENTIAL group is preselected and strongly recommended. Turning it off usually ends in HTTP 403/429.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=arj7oStGLkU",
    "https://youtu.be/jNQXAC9IVRw"
  ],
  "channelUrl": "https://www.youtube.com/@TED",
  "maxVideos": 10,
  "language": "en",
  "includeMetadata": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "videoUrls": [
        "https://www.youtube.com/watch?v=arj7oStGLkU",
        "https://youtu.be/jNQXAC9IVRw"
    ],
    "language": "en",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("srd836/youtube-transcript-pro").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 = {
    "videoUrls": [
        "https://www.youtube.com/watch?v=arj7oStGLkU",
        "https://youtu.be/jNQXAC9IVRw",
    ],
    "language": "en",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("srd836/youtube-transcript-pro").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 '{
  "videoUrls": [
    "https://www.youtube.com/watch?v=arj7oStGLkU",
    "https://youtu.be/jNQXAC9IVRw"
  ],
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call srd836/youtube-transcript-pro --silent --output-dataset

```

## MCP server setup

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

```

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/R6WMSrMpTdFSsYEo8/builds/OhhSTqWxRzRay8Irh/openapi.json
