# YouTube Transcript Scraper (`automly/youtube-transcript-scraper`) Actor

Get YouTube transcripts and captions from any public video, Short, channel or search: full text, timed segments, language, title, channel, publish date and duration. No login or API key. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/automly/youtube-transcript-scraper.md
- **Developed by:** [Automly](https://apify.com/automly) (community)
- **Categories:** Videos, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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.
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

### What is YouTube Transcript Scraper?

**YouTube Transcript Scraper** lets you **get the transcript (captions) of any public YouTube video or Short** as clean text and as timed segments, together with the video's title, channel, publish date and duration. Paste video links, a channel or a search phrase, click **Start**, and download the transcripts as JSON, CSV or Excel.

- 📝 **Full text and timestamps:** the whole transcript as one text, plus every line with its start time and duration
- 🌍 **Any language:** choose the language you want, with an English or original-language fallback
- 📺 **Videos, Shorts, channels and search:** transcribe a list of videos, a channel's latest uploads or the top results of a search
- 🔓 **No login:** no YouTube account, cookies or API key needed

### What can YouTube Transcript Scraper do?

- Get the **transcript of any public YouTube video** or Short from its link or video ID
- Get transcripts of a **channel's latest videos** (up to 100 per run)
- Get transcripts of the **top videos for a YouTube search**
- Tell you whether each transcript was **written by the creator or generated automatically**
- Add the video's **title, channel, publish date, duration** and live-stream flag
- List videos **without captions** with the reason, so you know which ones have none
- Export to Excel, CSV, JSON, HTML or XML, or send the results to Google Sheets, Make, Zapier and more

### What data can you extract from YouTube videos?

| | | |
|---|---|---|
| 📝 Transcript text | ⏱️ Timed segments | 🌍 Transcript language |
| 🤖 Automatic or creator captions | 🎬 Video title | 📺 Channel name, ID and link |
| 📅 Publish date | ⏳ Duration | 🔴 Live stream flag |

### How to get a YouTube transcript

1. [Create a free Apify account](https://console.apify.com/sign-up) (no credit card needed).
2. Open **YouTube Transcript Scraper**.
3. Paste one or more YouTube video links, or add a channel link or a search phrase.
4. Choose the transcript language (for example `en` or `es`).
5. Click **Start**, and download the transcripts when the run finishes.

### ⬇️ Input

| Setting | What it does |
|---|---|
| Video URLs | Links to YouTube videos or Shorts, or bare video IDs |
| Channel URLs | Transcribe a channel's latest videos, e.g. `https://www.youtube.com/@mkbhd` |
| Search query | Transcribe the top videos YouTube finds for this phrase |
| Max videos from channels and search | How many videos to take from channels and search in total (videos you list are always included) |
| Transcript language | The language you want, such as `en`, `es` or `de` |
| Include transcript / metadata / timed segments | Choose what each row contains |

Example:

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

### ⬆️ Output

You get one row per video.

```json
{
  "videoId": "dQw4w9WgXcQ",
  "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "source": "videoUrl",
  "sourceRef": null,
  "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
  "channelName": "Rick Astley",
  "channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
  "channelUrl": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw",
  "publishedAt": "2009-10-24T23:57:33-07:00",
  "durationSeconds": 213,
  "isLive": false,
  "captionStatus": "available",
  "transcriptText": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ ...",
  "transcriptLanguage": "en",
  "isAutoGenerated": false,
  "transcriptCharCount": 2089,
  "segmentCount": 61,
  "transcriptSegments": [
    { "start": 1.36, "duration": 1.68, "text": "[♪♪♪]" },
    { "start": 18.64, "duration": 3.24, "text": "♪ We're no strangers to love ♪" }
  ],
  "fetchedAt": "2026-09-27T12:32:30Z",
  "hasTranscript": true
}
```

`captionStatus` tells you what happened for each video:

| Value | Meaning |
|---|---|
| `available` | You got the transcript |
| `not_requested` | You turned the transcript off, so the row has only the video details |
| `unavailable` | The video has no captions |
| `disabled` | The creator turned captions off |
| `video_unavailable` | The video is private, removed or does not exist |
| `age_restricted` | The video is age-restricted, which needs a signed-in viewer |

Each run also saves a short report (`OUTPUT` in the key-value store) with the counts and any video that could not be read, with the reason. Those videos are not saved as rows and not charged. Rows without a transcript (`hasTranscript` is `false`) are free.

### How can I use YouTube transcripts?

- **AI and LLM pipelines:** summarize videos, answer questions about them or build a searchable knowledge base
- **Content research:** find what top creators in your niche talk about and how they phrase it
- **Repurposing:** turn videos into blog posts, newsletters, social posts or show notes
- **SEO:** find the keywords and topics that rank on YouTube
- **Subtitles and accessibility:** get timed captions you can reuse
- **Monitoring:** transcribe a channel's new videos on a schedule

### ❓FAQ

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

You pay only for videos whose transcript you get. Videos without captions are still listed (`hasTranscript` is `false`) but free, and videos that could not be read are not charged. See the **Pricing** tab for the current price. Every Apify account gets $5 of free usage each month, so you can try it at no cost.

#### What if a video has no transcript in my language?

You get its English transcript if it has one, or else its transcript in the original language. `transcriptLanguage` tells you which language you got. YouTube does not let visitors who are not signed in use its automatic translation, so transcripts are not translated.

#### What is the difference between automatic and creator captions?

Creators can upload their own captions; otherwise YouTube generates them automatically from the speech. `isAutoGenerated` is `true` for YouTube's automatic captions. They are usually good but have no punctuation and can mishear names.

#### Can I get transcripts of YouTube Shorts?

Yes. Paste the Shorts link (`https://www.youtube.com/shorts/...`) like any other video.

#### Why is there no transcript for some videos?

Some videos have no captions at all (often music without lyrics or very new uploads), some creators turn captions off, and age-restricted videos need a signed-in viewer. `captionStatus` tells you which case it is.

#### Do I need a YouTube account or API key?

No. You don't need a YouTube account, cookies or a YouTube Data API key.

#### Is it legal to scrape YouTube transcripts?

This scraper only collects captions and video details that anyone can see on YouTube without signing in. Transcripts can be protected by copyright, so check how you may use them, and ask a lawyer if you are unsure. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

YouTube Transcript Scraper is an independent tool. It is not affiliated with, endorsed by or sponsored by YouTube or Google.

#### Something isn't working. What should I do?

Open the **Issues** tab and tell us the video link and what you expected. We usually reply within a day.

# Actor input Schema

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

Links to YouTube videos or Shorts, or bare 11-character video IDs, e.g. https://www.youtube.com/watch?v=dQw4w9WgXcQ or https://youtu.be/dQw4w9WgXcQ.

## `channelUrls` (type: `array`):

Get the transcripts of a channel's latest videos, newest first, e.g. https://www.youtube.com/@mkbhd.

## `query` (type: `string`):

Get the transcripts of the top videos YouTube finds for this search.

## `maxResults` (type: `integer`):

How many videos to take from the channels and the search in total (1-100). Videos you list under Video URLs are always included.

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

Two-letter language code of the transcript you want, e.g. en, es, de. When a video has no transcript in this language you get its English transcript, or else its original-language one; transcriptLanguage tells you which.

## `includeTranscript` (type: `boolean`):

Get the transcript text and timed segments. Turn off to get only the video details.

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

Add the video's title, channel, publish date, duration and live flag.

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

Add the transcript as timed segments (start, duration, text) next to the full text.

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

Proxy settings. The default works for most runs.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "maxResults": 10,
  "language": "en",
  "includeTranscript": true,
  "includeMetadata": true,
  "includeSegments": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All transcript records produced by this run.

## `overview` (type: `string`):

Dataset presented using the overview view.

# 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=dQw4w9WgXcQ"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/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 = {
    "videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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