# YouTube Transcript Scraper: Bulk Captions & Text (`leathered_latch/youtube-transcripts-scraper`) Actor

Get YouTube transcripts in bulk as full text or timestamped lines, in any language the video has, auto or human captions. A YouTube transcript API with no key or quota. Pay once per transcript.

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

## Pricing

$5.00 / 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: captions as text or timestamped lines

Paste YouTube links, get the transcripts back. One row per video with the full text, or one row per caption line with its start time if you need timestamps.

You pay once per transcript delivered. Videos with no captions, private videos and bad links cost nothing.

### What you get

| Field | Example |
|---|---|
| `title` | Me at the zoo |
| `channelName` | jawed |
| `transcript` | All right, so here we are, in front of the elephants... |
| `wordCount` | 39 |
| `language` | en |
| `isAutoGenerated` | false |
| `availableLanguages` | en, de |
| `durationSeconds` / `viewCount` | 19 / 443223613 |
| `videoUrl` | Link to the video |

Pick **timestamped lines** and each row also carries `segmentIndex`, `startSeconds`, `durationSecondsSegment` and `text`, which is what you want for subtitles, clip finding or chaptering.

#### Sample output (full text mode)

```json
{
  "videoId": "jNQXAC9IVRw",
  "videoUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
  "title": "Me at the zoo",
  "channelName": "jawed",
  "channelId": "UC4QobU6STFB0P71PMvOGN5A",
  "durationSeconds": 19,
  "viewCount": 443223613,
  "language": "en",
  "isAutoGenerated": false,
  "availableLanguages": "en, de",
  "transcript": "All right, so here we are, in front of the elephants the cool thing about these guys is that they have really... really really long trunks and that's cool...",
  "wordCount": 39
}
```

### Quick start

1. Paste video links or IDs into **Videos**, one per line. Watch links, youtu.be, Shorts and live links all work.
2. Set **Preferred language** if you want something other than English.
3. Click **Start**.

The default input runs as-is.

### Use cases

- Turn your own back catalog into blog posts, show notes or captions.
- Search a set of talks or interviews for every mention of a product or name.
- Build subtitle files from the timestamped lines.
- Pull quotes with exact timestamps for research, reporting or citation.
- Check what was said in a video without watching all of it.

### Languages and auto captions

Most videos only have YouTube's automatic captions, and those are on by default. `isAutoGenerated` tells you which kind you got. Turn **Allow auto-generated captions** off if you only want human-made ones.

If your language isn't on the video, you get the closest track and the `language` field says which. `availableLanguages` lists every track so you can re-run in another one.

### What happens when something goes wrong

Each failed video is listed in `RUN_SUMMARY` (in the run's key-value store) with the reason: no captions, private or removed, or not a YouTube link. You're not charged for any of them, and the rest of the batch keeps going.

YouTube sometimes asks servers to "confirm you're not a bot". When that happens the scraper switches to a different connection and retries on its own. In our tests that took 20 of 20 videos through.

### Pricing

One charge per transcript delivered, plus Apify's small start fee per run. Timestamped mode is still one charge per video, however many lines it has. Set a maximum cost per run and the scraper stops at your limit.

### FAQ

**Does it need a YouTube account or API key?**
No.

**Can it do a whole channel or playlist?**
Not yet. Paste the video links. Channel and playlist input is next on the list.

**How accurate are auto captions?**
As accurate as YouTube's. Music, heavy accents and crosstalk make them worse. We don't edit the text.

**Something broke?**
Open an issue with the video link. I answer within a day.

### Limitations

- Videos with captions turned off have no transcript to fetch.
- Age-restricted and members-only videos are skipped.
- Very long videos (several hours) still work, but take a few seconds each.

### Export or use as an API

Download any run's results from the **Storage** tab as CSV, Excel, JSON or XML.

To call it from your own code, send your input to Apify's API and get the rows back in one request:

```
POST https://api.apify.com/v2/acts/leathered_latch~youtube-transcripts-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN
```

It also plugs into Make, Zapier and n8n through Apify's integrations, and AI agents can find and run it through Apify's MCP server.

### Your responsibility

A transcript is the video creator's work. This tool fetches the captions YouTube already shows publicly; it doesn't give you any rights to them. Quoting, research and your own videos are the usual uses. Republishing someone else's transcript, or using it to train an AI model, may need the creator's permission. That call is yours.

If you own content that shows up in these results and want it handled differently, open an issue on the Issues tab. We answer within 14 days.

### Data source and credit

Every row comes from YouTube (Google LLC). We don't own this data, and we don't take credit for it. The captions belong to the creator of each video.

This tool reads only what YouTube shows to any logged-out visitor. No logins, no private data. Each row keeps a link back to the page it came from (the `videoUrl` field), so you can check any result and credit the source when you use it.

Not affiliated with, endorsed by or sponsored by YouTube or Google. All names and trademarks belong to their owners.

### Changelog

- **0.1** First release. Full text or timestamped lines, language choice, auto-caption control, automatic retry through YouTube's bot check.

# Actor input Schema

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

YouTube video URLs or 11-character video IDs, one per line. Watch, youtu.be, Shorts and live links all work.

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

Language code to fetch, e.g. en, es, de, pt-BR. If the video doesn't have it, you get the closest available track and the row says which one.

## `output` (type: `string`):

text = one row per video with the full transcript. segments = one row per caption line with start time. Either way you pay once per video.

## `includeAutoGenerated` (type: `boolean`):

Most videos only have YouTube's automatic captions. Turn off to accept human-made captions only.

## Actor input object example

```json
{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "language": "en",
  "output": "text",
  "includeAutoGenerated": true
}
```

# 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 = {
    "videos": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("leathered_latch/youtube-transcripts-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"] }

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

```

## MCP server setup

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