# YouTube Transcript Extractor + AI Moment Finder (`reliable_tools/youtube-transcript-extractor`) Actor

Checks YouTube videos, playlists and channels for available caption tracks and finds moments in transcripts. Transcript text is currently not retrieved. Not affiliated with YouTube or Google.

- **URL**: https://apify.com/reliable_tools/youtube-transcript-extractor.md
- **Developed by:** [Reliable Tools](https://apify.com/reliable_tools) (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

Pay per event

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 Extractor + AI Moment Finder

> **Current status: transcript text is not retrieved.** YouTube now serves caption text only to its own apps, or to browsers that hold a proof-of-origin token. This Actor does not imitate YouTube's apps and does not generate such tokens, so it cannot download caption text at the moment. For each video it reports the basic details, which caption languages exist and a `status` explaining why no transcript was returned. These rows are **not charged**.

This YouTube transcript extractor checks a list of video, playlist or channel links for available captions. When a transcript is available, an AI moment finder can point at clip-worthy moments, product and brand mentions, claims and statistics, audience questions, calls to action or sponsor segments. Each match comes as a short quote with start and end time and a link that opens the video at that second. Quotes are always copied from the transcript lines, never written by the AI.

Not affiliated with, endorsed or sponsored by YouTube or Google. YouTube is a trademark of Google LLC.

### Who this is for

- **Clip editors and social media teams** who want to know which part of a long video is worth a closer look.
- **Brand and sponsorship teams** checking where a product is mentioned.
- **Researchers and fact checkers** who want claims with a timestamp to verify them in the video.
- **Anyone who needs to know which caption languages a video offers.**

### What you get

| Field | What it contains |
|---|---|
| `videoId`, `url`, `title`, `channel`, `durationSeconds`, `thumbnail` | Basic video details |
| `availableLanguages` | Caption languages the video offers |
| `captionLanguage`, `captionAutoGenerated` | The caption track that matches your language choice, and whether YouTube generated it |
| `status` | `transcript_unavailable`, `no_captions`, `blocked` (YouTube showed a bot check; skipped, not charged), `unavailable` or `error` |
| `moments` | When a transcript is available: for each option you picked, `presence` and a list of moments (`startTime`, `endTime`, `link`, `quote`, `probability`, `relevance`) |
| `transcript` | Only when a transcript is available and **Include transcript lines** is on (off by default) |
| `error` | Why no transcript or analysis was returned (these rows are free) |

### The "find" menu

| Option | What it looks for |
|---|---|
| Clip-worthy moments | Self-contained passages that are surprising, funny, emotional, a strong opinion or a memorable insight |
| Product and brand mentions | Lines that name a product, brand, company, app or tool |
| Claims and statistics | Factual claims backed by a number, percentage, study or research result |
| Questions from the audience | Questions from viewers, live chat, comments or listeners being read out or answered |
| Calls to action | Asks to subscribe, like, comment, follow, click a link, sign up, buy or use a code |
| Sponsor segments | Paid sponsor reads and ads inside the video |

### How to run it

1. Add one or more links under **YouTube URLs**: `youtube.com/watch?v=...`, `youtu.be/...`, Shorts, live replays, playlist links or channel links like `youtube.com/@handle`.
2. For playlists and channels, set **Max videos per playlist or channel** (up to 50, newest first). A run handles at most 50 videos.
3. Pick what to look for under **Moments to find**.
4. Click **Start**.

### Example output

```json
{
  "videoId": "UF8uR6Z6KLc",
  "url": "https://www.youtube.com/watch?v=UF8uR6Z6KLc",
  "title": "Steve Jobs' 2005 Stanford Commencement Address",
  "channel": "Stanford",
  "durationSeconds": 904,
  "availableLanguages": ["ar", "en", "es", "it", "ja"],
  "captionLanguage": "en",
  "captionAutoGenerated": false,
  "status": "transcript_unavailable",
  "error": "Transcript not retrieved: YouTube only serves caption text to its own apps or to clients with a proof-of-origin token. ..."
}
```

### How it reads YouTube

- It reads only the public watch, playlist and channel pages, with a user agent that names this Actor.
- It does not request paths that YouTube's robots.txt disallows, does not imitate YouTube's apps, does not use cookies, does not log in and does not use proxies.
- It pauses between requests and handles at most 50 videos per run.

### Pricing

Pay per event. You pay only for videos that return a transcript, and for each moment analysis that runs. Rows without a transcript (currently all rows) are not charged. The current prices are shown on the Pricing tab.

### FAQ

**Why do I get no transcript?**
See the status note at the top. The Actor will not imitate YouTube's apps or work around YouTube's access checks to get caption text.

**Can the AI invent quotes?**
No. The AI only picks line numbers from a transcript. The quote text is copied from those lines by code.

**What about copyright?**
Transcripts are the creator's content. Moments are short quotes with a link back to the video. Check YouTube's terms and copyright rules before you reuse any text.

**Privacy**
The Actor does not target personal data. It returns the public channel name of each video and nothing about viewers. Results stay in your Apify account. Text sent for the AI moment check is processed by our AI sub-processor only to compute the labels for your run.

**I found a bug.**
Open an issue on the Issues tab of this Actor.

### About Reliable Tools

Reliable Tools builds small, dependable Apify Actors that do one job well and charge only for real results. See all our Actors at [apify.com/reliable_tools](https://apify.com/reliable_tools).

# Actor input Schema

## `urls` (type: `array`):

Video URLs (watch, youtu.be, Shorts, live), playlist URLs or channel URLs (@handle, /channel/UC...). Playlists and channels are expanded to the newest videos shown on their first public page. At most 50 videos per run.

## `find` (type: `array`):

Pick what the AI should look for in each transcript. Leave empty for transcripts only. Charged once per video that gets analyzed, no matter how many options you pick.

## `maxVideosPerSource` (type: `integer`):

How many of the newest videos to take from each playlist or channel URL (up to 50). Single video URLs are always included. A run processes at most 50 videos in total.

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

Language code such as en, de, es. Creator subtitles in this language win, then auto-generated ones. If the language is missing, the original language track is used. The AI works best on English.

## `maxMomentsPerOption` (type: `integer`):

Upper limit of moments returned per selected option and video. The highest probability moments are kept.

## `minProbabilityPercent` (type: `integer`):

Only return moments whose AI check probability is at least this value. Lower it to see more borderline moments.

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

Adds the timestamped transcript lines to each result when a transcript is available. Off by default: results contain only the moments (short quotes with a timestamp link).

## Actor input object example

```json
{
  "urls": [
    "https://www.youtube.com/watch?v=UF8uR6Z6KLc"
  ],
  "find": [
    "clip_worthy",
    "claims_statistics"
  ],
  "maxVideosPerSource": 10,
  "language": "en",
  "maxMomentsPerOption": 5,
  "minProbabilityPercent": 60,
  "includeTranscript": false
}
```

# Actor output Schema

## `videos` (type: `string`):

Dataset with one row per video.

# 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 = {
    "urls": [
        "https://www.youtube.com/watch?v=UF8uR6Z6KLc"
    ],
    "find": [
        "clip_worthy",
        "claims_statistics"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("reliable_tools/youtube-transcript-extractor").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 = {
    "urls": ["https://www.youtube.com/watch?v=UF8uR6Z6KLc"],
    "find": [
        "clip_worthy",
        "claims_statistics",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("reliable_tools/youtube-transcript-extractor").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 '{
  "urls": [
    "https://www.youtube.com/watch?v=UF8uR6Z6KLc"
  ],
  "find": [
    "clip_worthy",
    "claims_statistics"
  ]
}' |
apify call reliable_tools/youtube-transcript-extractor --silent --output-dataset

```

## MCP server setup

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

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/uebUP8IJaH7lY9Qkq/builds/mwNZLGZQJNqdEFO51/openapi.json
