# YouTube Transcript Scraper: Bulk Videos, Shorts & Timestamps (`hirepulse/youtube-transcript-scraper`) Actor

YouTube transcripts as clean text: paste video URLs or IDs, up to 1,000 per run. Videos, Shorts and live replays, any caption language, optional timestamps. No API key, no browser. Pay only for delivered transcripts: $0.003 each. Built for AI agents (MCP), RAG and n8n.

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

from $3.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: Bulk Videos, Shorts & Timestamps

**Paste YouTube links, get transcripts.** Clean plain text for every video, with title, channel, length and caption language. Up to 1,000 videos per run, in any language YouTube has captions for, with optional timestamps.

No API key, no YouTube account, no browser. A typical video takes one to three seconds.

### What you can ask it

- "Get the transcript of this video and summarize it."
- "Transcribe these 200 lecture videos so I can search them."
- "Give me the Spanish captions of this video, with timestamps."
- "Which of these videos mention 'pricing'? Pull their transcripts."

### What it is good for

- **AI agents and RAG**: feed video content to an LLM as text.
- **Research and content teams**: summarize, quote and repurpose videos.
- **SEO and marketing**: analyze what competitors say in their videos.
- **Accessibility and archiving**: keep searchable text of video libraries.

### Input

Only `videos` is required.

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `videos` | array of strings | *required* | Video URLs or 11-character IDs. Regular links, `youtu.be`, Shorts, embeds and live links all work. Up to 1,000 per run. |
| `language` | string | video's main captions | Two-letter code such as `en`, `es`, `de`. Used when the video has captions in that language. |
| `include_timestamps` | boolean | `false` | Add a `segments` array with start time, duration and text of every caption line. |

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

### Output

One record per video:

```json
{
    "video_id": "jNQXAC9IVRw",
    "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "status": "ok",
    "title": "Me at the zoo",
    "channel": "jawed",
    "duration_seconds": 19,
    "language": "en",
    "is_auto_generated": false,
    "transcript": "All right, so here we are in front of the elephants ...",
    "word_count": 39,
    "note": null
}
```

With `include_timestamps`, every record also has:

```json
"segments": [
    { "start": 1.2, "duration": 2.16, "text": "All right, so here we are in front of the elephants" }
]
```

| `status` | Meaning | Charged |
| --- | --- | --- |
| `ok` | Transcript delivered. | Yes |
| `no_captions` | The video has no captions at all. | No |
| `unavailable` | Private, removed, age-restricted or region-locked. `note` says why. | No |
| `failed` | Could not be fetched after three attempts. Try again. | No |
| `invalid_input` | Not a YouTube video URL or ID. | No |

A small run summary is saved to the key-value store under `OUTPUT`.

#### Live streams and replays

- **Replays of finished live streams work** like any other video. In a test on 14 October 2026, all 6 recent NASA stream replays returned full transcripts (up to 18,000 words for a 2.3-hour broadcast).
- A stream that is **live right now** usually has no captions yet. It returns `no_captions` with a `note` that says it is live, so run it again after the stream ends.
- A **scheduled** stream that has not started returns `unavailable`, and the `note` says when it begins.
- Neither of these is charged.

#### Reliability

In a test of 300 different videos, every video got a definite answer: 280 transcripts and 20 `no_captions`, with no failed lookups. Each video gets up to three attempts on fresh connections before it is marked `failed`, and a `failed` video is never charged.

### Pricing

Pay per event. Platform usage and proxies are included.

| Event | Price | When |
| --- | --- | --- |
| `transcript` | $0.003 | Each delivered transcript (`status: "ok"`). |
| `apify-actor-start` | $0.00005 | Once per run. |

1,000 transcripts cost $3. Videos without captions, unavailable videos and failures are **not charged**. Set a maximum cost per run and the Actor processes only as many videos as that limit can pay for.

#### Free Apify plan

On the free plan the first 3 videos of each run are processed, so you can try the Actor. Use a paid Apify plan to process full lists.

### Use from AI agents (MCP)

Connect the [Apify MCP server](https://mcp.apify.com) with this Actor enabled:

```
https://mcp.apify.com?tools=hirepulse/youtube-transcript-scraper
```

Tips for agents:

- Pass one or many videos in a single call; a batch is faster than one call per video.
- Leave `include_timestamps` off unless the user needs time codes: transcripts of long videos are large.
- Check `status` on every record before using `transcript`.

### Limitations

- Transcripts come from YouTube's captions. A video without captions returns `no_captions`; this Actor does not run speech recognition.
- Auto-generated captions carry YouTube's recognition errors and usually have no punctuation. `is_auto_generated` tells you which kind you got.
- Captions are returned in their original language; there is no translation.
- Age-restricted, private and members-only videos are not accessible.
- YouTube changes its systems from time to time. If a video returns `failed`, running it again usually works.

### More tools from HirePulse

- [ATS Job Scraper](https://apify.com/hirepulse/ats-job-pulse): every open job from a company's own careers page (Greenhouse, Lever, Ashby, Workable and more), with full descriptions and change tracking.
- [Google Jobs Scraper](https://apify.com/hirepulse/google-jobs-scraper): job listings from Google Jobs for any role and city, with salaries and apply links, from $1 per 1,000 jobs.
- [Keyword Search Volume](https://apify.com/hirepulse/keyword-search-volume): monthly Google search volume, CPC, difficulty and keyword ideas for 94 countries.
- [Domain SEO Overview](https://apify.com/hirepulse/domain-seo-overview): estimated organic traffic, ranking keywords and competitors of any website.

# Actor input Schema

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

YouTube video URLs or 11-character video IDs. Regular links, youtu.be links, Shorts, embeds and live links all work. Up to 1,000 per run. Each delivered transcript is one charged result; videos without captions are not charged.

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

Two-letter language code such as "en", "es" or "de". If the video has captions in this language they are used; otherwise the video's main captions are returned and the "language" field tells you which. Leave empty for the video's main captions.

## `include_timestamps` (type: `boolean`):

Add a "segments" array with the start time, duration and text of every caption line. Off by default to keep the output small.

## Actor input object example

```json
{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "https://youtu.be/jNQXAC9IVRw"
  ],
  "include_timestamps": false
}
```

# Actor output Schema

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

Dataset items, one per video, with the transcript text and video details.

## `runSummary` (type: `string`):

How many transcripts were delivered, and how many videos had no captions, were unavailable, failed or were skipped.

# 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",
        "https://youtu.be/jNQXAC9IVRw"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hirepulse/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",
        "https://youtu.be/jNQXAC9IVRw",
    ] }

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

```

## MCP server setup

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