# YouTube Full Channel Transcripts Scraper (`techforce.global/youtube-full-channel-transcripts-scraper`) Actor

Bulk YouTube channel transcript scraper. Extract subtitles/captions and video + channel metadata from all videos of a channel. Export or push to Notion, Slack & more.

- **URL**: https://apify.com/techforce.global/youtube-full-channel-transcripts-scraper.md
- **Developed by:** [Techforce Global](https://apify.com/techforce.global) (community)
- **Categories:** Agents, Social media, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.50 / 1,000 results

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/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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

### YouTube Full Channel Transcripts Scraper & MCP Connector

Pull the **transcripts of every video on any YouTube channel** — all of them, or up to a limit you set — together with rich video and channel metadata. **No YouTube API key, no manual copy-pasting captions, no per-video clicking.**

Built for researchers, content teams, analysts, and builders who need a channel's entire spoken content as clean, structured data — in minutes, not days of scrubbing through videos.

> **Paste a channel URL → get every video's transcript + metadata → deliver it straight into Notion, Slack, Jira, or your CRM.**

---

### ⭐ Why This Actor?

- ✅ **Just paste a channel URL** — accepts `@handle`, `/channel/UC…`, `/c/name`, `/user/name`, or even a single video URL (the channel is resolved automatically). No login, API key, or session tokens required.
- ✅ **Whole channel or a capped batch** — set `maxVideos` to `0` for **every video on the channel**, or any number for a quick sample.
- ✅ **Fast by default** — videos are processed in parallel (tunable), so a 50-video channel finishes in about a minute instead of several.
- ✅ **Language-aware transcripts** — choose preferred languages in priority order, with automatic fallback to any available track (including auto-generated captions).
- ✅ **Never silently drops videos** — clips with no captions are still emitted with an empty transcript and a `transcriptError` note, so your dataset stays complete.
- ✅ **Pick exactly the fields you want** — toggle video- and channel-level metadata (views, likes, subscribers, country, total views, join date, and more) to keep runs fast and datasets clean.
- ✅ **Anti-bot resilient** — runs through **Apify Proxy** (residential by default) and supports optional YouTube cookies to slip past "confirm you're not a bot" walls.
- ✅ **Deliver anywhere via MCP connectors** — push transcripts straight into Notion, Slack, Jira, GitHub, Linear, Airtable, and more.
- ✅ **Export-ready** — JSON, CSV, Excel, or direct API integration for your own pipeline.

---

### 📝 Use Cases & ROI

| Use Case | Time Saved | What You Get |
| --- | --- | --- |
| **Content research & repurposing** | 4–8 hrs/channel | Every video's full transcript, ready to summarize, clip, or repost |
| **Competitor & market analysis** | 3–6 hrs/channel | Searchable text of a competitor's entire back catalog |
| **Training data / RAG & AI** | 5–10 hrs/dataset | Clean, structured transcripts to feed models, search, or Q&A |
| **SEO & topic mining** | 2–4 hrs/batch | Keywords, descriptions, and spoken content across a channel |
| **Accessibility & archiving** | 2–5 hrs/channel | Text records of talks, lectures, or podcasts with timestamps |

---

### 🚀 How to Use

1. Open the Actor on Apify.
2. Add one or more **Channel URLs** (e.g. `https://www.youtube.com/@rajshamani`).
3. Set **Maximum videos** — `0` for the entire channel, or a number to cap it (default: `10`).
4. _(Optional)_ Set **Transcript languages** in priority order (default: `en`), and turn on **timestamped segments** if you need per-line timings.
5. _(Optional)_ Tune **Parallel videos** for speed, and paste **YouTube cookies** if you hit bot checks.
6. _(Optional)_ Toggle the **video** and **extended channel** metadata fields you want.
7. _(Optional)_ Pick an **MCP connector** to deliver each transcript into Notion, Slack, Jira, etc.
8. Click **Run** — results stream into the dataset as each video is processed.
9. Download as CSV, Excel, or JSON — or let the connector push them into your tools automatically.

> 🌐 **Proxy**: requests run through **Apify Proxy** (residential group by default) because YouTube frequently blocks datacenter IPs. You normally don't need to change this.
> 🍪 **Cookies** (optional but recommended for large channels): paste cookies exported from a logged-in YouTube session (e.g. via the *Get cookies.txt LOCALLY* extension) to reduce bot-check challenges.
> 💡 First time with a connector? Run once with a connector selected — the run log prints the connector's available tool names, so you know what to put in **Connector tool name**.

---

### 🧩 Input Configuration

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `channelUrls` | Array | ✔️ Yes | One or more YouTube channel URLs. `@handle`, `/channel/ID`, `/c/name`, `/user/name`, and full video URLs are all accepted. |
| `maxVideos` | Integer | Optional | Max videos to scrape per channel. `0` = **all videos**. Default: `10`. |
| `maxConcurrency` | Integer | Optional | How many videos to process at once (1–50). Higher is faster but uses more proxy bandwidth. Default: `10`. |
| `transcriptLanguages` | Array | Optional | Preferred transcript language codes in priority order (e.g. `en`, `hi`, `es`). Falls back to any available track. Default: `["en"]`. |
| `includeTranscriptText` | Boolean | Optional | Include the transcript as one plain-text string. Default: `true`. |
| `includeTranscriptSegments` | Boolean | Optional | Include the transcript as `{text, start, duration}` segments with timestamps. Default: `false`. |
| `proxyConfiguration` | Object | Optional | Proxy used for requests. Defaults to **Apify Proxy** with the `RESIDENTIAL` group — recommended. |
| `cookies` | String | Optional | YouTube cookies in Netscape `cookies.txt` format to bypass bot checks. Kept secret. |
| **Video metadata** | Boolean toggles | Optional | `includeChannelName`, `includeChannelId`, `includeDatePublished`, `includeViewCount` (on by default); `includeDateText`, `includeRelativeDateText`, `includeLikes`, `includeComments`, `includeKeywords`, `includeThumbnail`, `includeDescription` (off by default). |
| **Extended channel metadata** | Boolean toggles | Optional | `includeSubscriberCount` (on by default); `includeChannelHandle`, `includeChannelCreationDate`, `includeChannelCountry`, `includeChannelTotalViewCount`, `includeChannelTotalVideoCount` (off by default). Each adds an extra request. |
| `mcpConnector` | Connector | Optional | Deliver each transcript into a connector you've authorized (Notion, Slack, Jira, GitHub, Linear, Airtable, …). |
| `deliveryMode` | Enum | Optional | `summary` (one call with the full transcript), `chunked` (split long transcripts across a few calls/pages), `perSegment` (one call per timestamped segment), or `none`. Default: `summary`. |
| `mcpTool` | String | Optional | Tool to call on the connector (e.g. `create_page`, `send_message`, `create_issue`). |
| `mcpArguments` | Object | Optional | Arguments for the tool; string values support `{placeholders}`. |
| `mcpMessageTemplate` | String | Optional | Template rendered per video/segment, exposed as the `{message}` placeholder. |

#### Example — Scrape a whole channel

```json
{
    "channelUrls": [{ "url": "https://www.youtube.com/@rajshamani" }],
    "maxVideos": 0,
    "transcriptLanguages": ["en", "hi"]
}
````

#### Example — Quick sample with timestamps and full channel metadata

```json
{
    "channelUrls": [{ "url": "https://www.youtube.com/@rajshamani" }],
    "maxVideos": 10,
    "includeTranscriptSegments": true,
    "includeSubscriberCount": true,
    "includeChannelCountry": true,
    "includeChannelTotalViewCount": true,
    "includeChannelTotalVideoCount": true
}
```

#### Example — Scrape and post each transcript to Slack

```json
{
    "channelUrls": [{ "url": "https://www.youtube.com/@rajshamani" }],
    "maxVideos": 25,
    "mcpConnector": "<your-slack-connector>",
    "deliveryMode": "summary",
    "mcpTool": "send_message",
    "mcpArguments": { "channel": "#transcripts", "text": "{message}" },
    "mcpMessageTemplate": "*{title}*\n{videoUrl} — {language}, {segmentCount} segments\n\n{transcript}"
}
```

#### Example — Scrape and create a Notion page per video (chunked for long videos)

```json
{
    "channelUrls": [{ "url": "https://www.youtube.com/@rajshamani" }],
    "maxVideos": 0,
    "mcpConnector": "<your-notion-connector>",
    "deliveryMode": "chunked",
    "mcpTool": "create_page",
    "mcpArguments": {
        "parent": { "page_id": "<your-page-id>" },
        "pages": [
            {
                "properties": { "title": "{title} (part {part}/{partCount})" },
                "content": "{transcript}"
            }
        ]
    }
}
```

#### Placeholders available in arguments / template

**All modes:** `{videoUrl}` · `{videoId}` · `{title}` · `{channelName}` · `{channelId}` · `{datePublished}` · `{viewCount}` · `{subscriberCount}` · `{language}` · `{segmentCount}` · `{transcript}` · `{message}`
**Chunked mode adds:** `{part}` · `{partCount}`
**Per-segment mode adds:** `{start}` · `{duration}` (`{dur}`) · `{text}`

***

### 📦 Output Fields

Each field below is included only if its toggle is on. Every record always carries `videoId`, `videoUrl`, and `title`.

| Field | Description |
| --- | --- |
| `videoId` | YouTube video ID |
| `videoUrl` | Canonical watch URL |
| `title` | Video title |
| `transcript` | Full transcript as a single plain-text string |
| `transcriptSegments` | Timestamped segments: `{text, start, duration}` |
| `transcriptLanguage` | Language code of the returned transcript |
| `transcriptIsGenerated` | Whether the captions were auto-generated |
| `transcriptError` | Present only when no transcript could be fetched |
| `channelName` / `channelId` | Channel name and ID |
| `datePublished` / `dateText` / `relativeDateText` | Upload date (ISO, human, and relative) |
| `viewCount` / `likes` / `comments` | Video engagement counts |
| `keywords` / `thumbnail` / `description` | Video tags, thumbnail URL, and description |
| `channelHandle` | Channel `@handle` |
| `subscriberCount` | Channel subscriber count |
| `channelCreationDate` | Channel join/creation date |
| `channelCountry` | Channel country |
| `channelTotalViewCount` / `channelTotalVideoCount` | Channel lifetime views and total video count |

#### Example Output

```json
[
    {
        "videoId": "dQw4w9WgXcQ",
        "videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        "title": "Bill Gates on India, AI & the Future | FO335 Raj Shamani",
        "transcript": "Welcome back to the Figuring Out podcast. Today we have a very special guest...",
        "transcriptLanguage": "en",
        "transcriptIsGenerated": false,
        "channelName": "Raj Shamani",
        "channelId": "UCF9hUft_7Rb0gVpZFXVDPUg",
        "datePublished": "2024-11-12",
        "viewCount": 1284530,
        "subscriberCount": 5600000
    }
]
```

> You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
> Note: some extended channel fields (creation date, country, totals) are only available when the channel publishes them, and may come back `null` otherwise.

***

### 🔌 Integrations & Delivery

Deliver transcripts into any MCP connector you've authorized in Apify — no glue code, no webhooks:

- **Notion** — create a page per video (use `chunked` mode for long transcripts so Notion never times out)
- **Slack / Discord** — post transcripts or summaries to a channel
- **Jira / GitHub / Linear** — open issues or tasks from video content
- **Airtable / Google Sheets** — append a structured row per video
- …or any other MCP-compatible connector

Credentials stay private — delivery runs through the **Apify MCP Proxy**, so the Actor never sees your connector tokens. You can also consume the dataset directly via the **Apify API**, or wire it into **n8n, Zapier, and Make**.

> ⚙️ **Delivery modes:** `summary` sends the full transcript in one call, `chunked` splits a long transcript across a few calls/pages, and `perSegment` sends one call per timestamped line (requires **timestamped segments** enabled). MCP delivery only runs on the Apify platform and never affects what's saved to the dataset.

***

### 🛠️ How It Works

`my_actor/main.py` reads the input, then for each channel:

1. Optionally fetches channel-level metadata (subscribers, country, totals, join date) via `yt-dlp` plus a light About-page read.
2. Lists the channel's videos with `yt-dlp` (flat extraction, honoring `maxVideos`).
3. Processes videos **in parallel** (bounded by `maxConcurrency`); for each video it fetches full metadata only if a toggled field needs it, then pulls the transcript with `youtube-transcript-api`.
4. Builds a record with just the enabled fields, pushes it to the dataset, and — if a connector is configured — delivers it via MCP.

**Built with:** [Apify SDK for Python](https://docs.apify.com/sdk/python/) · [yt-dlp](https://github.com/yt-dlp/yt-dlp) · [youtube-transcript-api](https://pypi.org/project/youtube-transcript-api/) · [MCP](https://modelcontextprotocol.io/)

***

### 🆘 Support

For issues, custom scraping requests, or feature suggestions:

**Email**: bhavin.shah@techforceglobal.com

***

#### Need a Custom Pipeline?

Want multi-channel batch runs, scheduled refreshes, deeper enrichment, or a full data-warehouse integration?

#### [📅 Book a Free 15-min Consultation](https://calendly.com/techforce-infotech-pvt-ltd/intro-meeting?month=2026-01)

***

Made with ❤️ by **[Techforce](https://www.techforceglobal.com)**
Specialists in High-Performance Web Scrapers and AI Automation.

***

### Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by YouTube or Google. YouTube® is a trademark of Google LLC; all trademarks are property of their respective owners. The Actor collects only publicly available information (video metadata and publicly published captions) and does not log into, or scrape behind the authentication of, any platform. Use the data responsibly and in compliance with applicable laws (including GDPR/CCPA) and the terms of the platforms you operate on.

# Actor input Schema

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

One or more YouTube channel URLs. Handle (https://www.youtube.com/@rajshamani), /channel/ID, /c/name, /user/name and full video URLs (the channel is resolved automatically) are all accepted.

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

Maximum number of videos to scrape per channel. Set to 0 to scrape ALL videos of the channel.

## `maxConcurrency` (type: `integer`):

How many videos to process at the same time. Higher is faster but uses more proxy bandwidth and may increase the chance of rate-limiting. 8-12 is a good balance.

## `transcriptLanguages` (type: `array`):

Preferred transcript language codes in priority order (e.g. en, hi, es). The scraper tries them in order and falls back to any available transcript (including auto-generated) if none match.

## `includeTranscriptText` (type: `boolean`):

Include the transcript joined into a single plain-text string.

## `includeTranscriptSegments` (type: `boolean`):

Include the transcript as an array of {text, start, duration} segments with timestamps.

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

YouTube blocks requests from Apify's shared datacenter IPs with a "Sign in to confirm you're not a bot" error. Use Apify Proxy with the RESIDENTIAL group to avoid this. Required for reliable scraping.

## `cookies` (type: `string`):

Optional but recommended. Paste cookies exported from a logged-in YouTube session (e.g. via the 'Get cookies.txt LOCALLY' browser extension) in Netscape cookies.txt format. Helps bypass bot-check challenges that proxies alone don't solve.

## `includeChannelName` (type: `boolean`):

Include the channel name on each video row.

## `includeChannelId` (type: `boolean`):

Include the channel ID on each video row.

## `includeDateText` (type: `boolean`):

Include the human-readable upload date text.

## `includeRelativeDateText` (type: `boolean`):

Include the relative upload date text (e.g. "2 months ago").

## `includeDatePublished` (type: `boolean`):

Include the ISO publish date of the video.

## `includeViewCount` (type: `boolean`):

Include the view count of the video.

## `includeLikes` (type: `boolean`):

Include the like count of the video.

## `includeComments` (type: `boolean`):

Include the comment count of the video.

## `includeKeywords` (type: `boolean`):

Include the video tags/keywords.

## `includeThumbnail` (type: `boolean`):

Include the video thumbnail URL.

## `includeDescription` (type: `boolean`):

Include the video description.

## `includeChannelHandle` (type: `boolean`):

Extract the channel @handle (extra request).

## `includeSubscriberCount` (type: `boolean`):

Extract the channel subscriber count (extra request).

## `includeChannelCreationDate` (type: `boolean`):

Extract the channel creation/join date (extra request).

## `includeChannelCountry` (type: `boolean`):

Extract the channel country (extra request).

## `includeChannelTotalViewCount` (type: `boolean`):

Extract the channel's total lifetime view count (extra request).

## `includeChannelTotalVideoCount` (type: `boolean`):

Extract the channel's total number of videos (extra request).

## `mcpConnector` (type: `string`):

Optionally deliver each video's transcript into a connector you have authorized — Notion, Slack, Linear, Airtable, Jira, GitHub, or any MCP-compatible connector. Leave empty to only save the results to the dataset.

## `deliveryMode` (type: `string`):

How to deliver each video to the connector: 'summary' (one call with the full transcript), 'chunked' (split a long transcript across a few calls/pages so services like Notion never time out), 'perSegment' (one call per timestamped transcript segment — requires timestamped segments enabled), or 'none' (save to dataset only).

## `mcpTool` (type: `string`):

Name of the tool to call on the connector (e.g. 'create\_page' for Notion, 'send\_message' for Slack, 'create\_issue' for Jira/GitHub). If unsure, run once with a connector selected — the log lists the connector's available tools.

## `mcpArguments` (type: `object`):

Arguments passed to the connector tool. String values support {placeholders}. Available in every mode: {videoUrl}, {videoId}, {title}, {channelName}, {channelId}, {datePublished}, {viewCount}, {subscriberCount}, {language}, {segmentCount}, {transcript} (full text) and {message} (the rendered template below). In 'chunked' mode {transcript} holds one part and {part}/{partCount} give the 1-based part number and total (e.g. 'Transcript {title} (part {part}/{partCount})'). In 'perSegment' mode also: {start}, {dur}/{duration} and {text}. Example for Slack: {"channel": "#transcripts", "text": "{message}"}.

## `mcpMessageTemplate` (type: `string`):

Optional template rendered and exposed as the {message} placeholder in the tool arguments. Summary example: '{title} ({videoUrl}) — {language}, {segmentCount} segments:\n\n{transcript}'. Per-segment example: '\[{start}] {text}'.

## Actor input object example

```json
{
  "channelUrls": [
    {
      "url": "https://www.youtube.com/@rajshamani"
    }
  ],
  "maxVideos": 10,
  "maxConcurrency": 10,
  "transcriptLanguages": [
    "en"
  ],
  "includeTranscriptText": true,
  "includeTranscriptSegments": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "includeChannelName": true,
  "includeChannelId": true,
  "includeDateText": false,
  "includeRelativeDateText": false,
  "includeDatePublished": true,
  "includeViewCount": true,
  "includeLikes": false,
  "includeComments": false,
  "includeKeywords": false,
  "includeThumbnail": false,
  "includeDescription": false,
  "includeChannelHandle": false,
  "includeSubscriberCount": true,
  "includeChannelCreationDate": false,
  "includeChannelCountry": false,
  "includeChannelTotalViewCount": false,
  "includeChannelTotalVideoCount": false,
  "deliveryMode": "summary",
  "mcpTool": "",
  "mcpArguments": {},
  "mcpMessageTemplate": ""
}
```

# 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 = {
    "channelUrls": [
        {
            "url": "https://www.youtube.com/@rajshamani"
        }
    ],
    "transcriptLanguages": [
        "en"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("techforce.global/youtube-full-channel-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 = {
    "channelUrls": [{ "url": "https://www.youtube.com/@rajshamani" }],
    "transcriptLanguages": ["en"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("techforce.global/youtube-full-channel-transcripts-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "channelUrls": [
    {
      "url": "https://www.youtube.com/@rajshamani"
    }
  ],
  "transcriptLanguages": [
    "en"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call techforce.global/youtube-full-channel-transcripts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=techforce.global/youtube-full-channel-transcripts-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Full Channel Transcripts Scraper",
        "description": "Bulk YouTube channel transcript scraper. Extract subtitles/captions and video + channel metadata from all videos of a channel. Export or push to Notion, Slack & more.",
        "version": "0.1",
        "x-build-id": "IP1Yt6PQ6EGoU7TRa"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/techforce.global~youtube-full-channel-transcripts-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-techforce.global-youtube-full-channel-transcripts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/techforce.global~youtube-full-channel-transcripts-scraper/runs": {
            "post": {
                "operationId": "runs-sync-techforce.global-youtube-full-channel-transcripts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/techforce.global~youtube-full-channel-transcripts-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-techforce.global-youtube-full-channel-transcripts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "channelUrls"
                ],
                "properties": {
                    "channelUrls": {
                        "title": "Channel URLs",
                        "type": "array",
                        "description": "One or more YouTube channel URLs. Handle (https://www.youtube.com/@rajshamani), /channel/ID, /c/name, /user/name and full video URLs (the channel is resolved automatically) are all accepted.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxVideos": {
                        "title": "Maximum videos",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of videos to scrape per channel. Set to 0 to scrape ALL videos of the channel.",
                        "default": 10
                    },
                    "maxConcurrency": {
                        "title": "Parallel videos",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "How many videos to process at the same time. Higher is faster but uses more proxy bandwidth and may increase the chance of rate-limiting. 8-12 is a good balance.",
                        "default": 10
                    },
                    "transcriptLanguages": {
                        "title": "Transcript languages",
                        "type": "array",
                        "description": "Preferred transcript language codes in priority order (e.g. en, hi, es). The scraper tries them in order and falls back to any available transcript (including auto-generated) if none match.",
                        "default": [
                            "en"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeTranscriptText": {
                        "title": "Include full transcript text",
                        "type": "boolean",
                        "description": "Include the transcript joined into a single plain-text string.",
                        "default": true
                    },
                    "includeTranscriptSegments": {
                        "title": "Include timestamped transcript segments",
                        "type": "boolean",
                        "description": "Include the transcript as an array of {text, start, duration} segments with timestamps.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "YouTube blocks requests from Apify's shared datacenter IPs with a \"Sign in to confirm you're not a bot\" error. Use Apify Proxy with the RESIDENTIAL group to avoid this. Required for reliable scraping.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    },
                    "cookies": {
                        "title": "YouTube cookies (Netscape format)",
                        "type": "string",
                        "description": "Optional but recommended. Paste cookies exported from a logged-in YouTube session (e.g. via the 'Get cookies.txt LOCALLY' browser extension) in Netscape cookies.txt format. Helps bypass bot-check challenges that proxies alone don't solve."
                    },
                    "includeChannelName": {
                        "title": "Channel Name",
                        "type": "boolean",
                        "description": "Include the channel name on each video row.",
                        "default": true
                    },
                    "includeChannelId": {
                        "title": "Channel ID",
                        "type": "boolean",
                        "description": "Include the channel ID on each video row.",
                        "default": true
                    },
                    "includeDateText": {
                        "title": "Date Text (Video)",
                        "type": "boolean",
                        "description": "Include the human-readable upload date text.",
                        "default": false
                    },
                    "includeRelativeDateText": {
                        "title": "Relative Date Text (Video)",
                        "type": "boolean",
                        "description": "Include the relative upload date text (e.g. \"2 months ago\").",
                        "default": false
                    },
                    "includeDatePublished": {
                        "title": "Date Published (Video)",
                        "type": "boolean",
                        "description": "Include the ISO publish date of the video.",
                        "default": true
                    },
                    "includeViewCount": {
                        "title": "View Count (Video)",
                        "type": "boolean",
                        "description": "Include the view count of the video.",
                        "default": true
                    },
                    "includeLikes": {
                        "title": "Likes (Video)",
                        "type": "boolean",
                        "description": "Include the like count of the video.",
                        "default": false
                    },
                    "includeComments": {
                        "title": "Comments (Video)",
                        "type": "boolean",
                        "description": "Include the comment count of the video.",
                        "default": false
                    },
                    "includeKeywords": {
                        "title": "Keywords (Video)",
                        "type": "boolean",
                        "description": "Include the video tags/keywords.",
                        "default": false
                    },
                    "includeThumbnail": {
                        "title": "Thumbnail (Video)",
                        "type": "boolean",
                        "description": "Include the video thumbnail URL.",
                        "default": false
                    },
                    "includeDescription": {
                        "title": "Description (Video)",
                        "type": "boolean",
                        "description": "Include the video description.",
                        "default": false
                    },
                    "includeChannelHandle": {
                        "title": "Channel Handle",
                        "type": "boolean",
                        "description": "Extract the channel @handle (extra request).",
                        "default": false
                    },
                    "includeSubscriberCount": {
                        "title": "Subscriber Count",
                        "type": "boolean",
                        "description": "Extract the channel subscriber count (extra request).",
                        "default": true
                    },
                    "includeChannelCreationDate": {
                        "title": "Channel Creation Date",
                        "type": "boolean",
                        "description": "Extract the channel creation/join date (extra request).",
                        "default": false
                    },
                    "includeChannelCountry": {
                        "title": "Channel Country",
                        "type": "boolean",
                        "description": "Extract the channel country (extra request).",
                        "default": false
                    },
                    "includeChannelTotalViewCount": {
                        "title": "Channel Total View Count",
                        "type": "boolean",
                        "description": "Extract the channel's total lifetime view count (extra request).",
                        "default": false
                    },
                    "includeChannelTotalVideoCount": {
                        "title": "Channel Total Video Count",
                        "type": "boolean",
                        "description": "Extract the channel's total number of videos (extra request).",
                        "default": false
                    },
                    "mcpConnector": {
                        "title": "Deliver to (MCP connector)",
                        "type": "string",
                        "description": "Optionally deliver each video's transcript into a connector you have authorized — Notion, Slack, Linear, Airtable, Jira, GitHub, or any MCP-compatible connector. Leave empty to only save the results to the dataset."
                    },
                    "deliveryMode": {
                        "title": "Delivery mode",
                        "enum": [
                            "summary",
                            "chunked",
                            "perSegment",
                            "none"
                        ],
                        "type": "string",
                        "description": "How to deliver each video to the connector: 'summary' (one call with the full transcript), 'chunked' (split a long transcript across a few calls/pages so services like Notion never time out), 'perSegment' (one call per timestamped transcript segment — requires timestamped segments enabled), or 'none' (save to dataset only).",
                        "default": "summary"
                    },
                    "mcpTool": {
                        "title": "Connector tool name",
                        "type": "string",
                        "description": "Name of the tool to call on the connector (e.g. 'create_page' for Notion, 'send_message' for Slack, 'create_issue' for Jira/GitHub). If unsure, run once with a connector selected — the log lists the connector's available tools.",
                        "default": ""
                    },
                    "mcpArguments": {
                        "title": "Connector tool arguments",
                        "type": "object",
                        "description": "Arguments passed to the connector tool. String values support {placeholders}. Available in every mode: {videoUrl}, {videoId}, {title}, {channelName}, {channelId}, {datePublished}, {viewCount}, {subscriberCount}, {language}, {segmentCount}, {transcript} (full text) and {message} (the rendered template below). In 'chunked' mode {transcript} holds one part and {part}/{partCount} give the 1-based part number and total (e.g. 'Transcript {title} (part {part}/{partCount})'). In 'perSegment' mode also: {start}, {dur}/{duration} and {text}. Example for Slack: {\"channel\": \"#transcripts\", \"text\": \"{message}\"}.",
                        "default": {}
                    },
                    "mcpMessageTemplate": {
                        "title": "Message template",
                        "type": "string",
                        "description": "Optional template rendered and exposed as the {message} placeholder in the tool arguments. Summary example: '{title} ({videoUrl}) — {language}, {segmentCount} segments:\\n\\n{transcript}'. Per-segment example: '[{start}] {text}'.",
                        "default": ""
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
