# YouTube Scraper : Videos, Channels & Comments (`techforce.global/youtube-scraper`) Actor

Scrape YouTube videos, channels & comments by keyword, hashtag, or URL, no API key or quota limits. Get titles, views, likes, upload dates, channel stats, and comments as clean JSON

- **URL**: https://apify.com/techforce.global/youtube-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 $9.00 / 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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 Scraper & MCP Connector

Scrape **YouTube videos, channels, and comments** — no API key, no quota limits, no login required. **No manual searching, no `googleapis.com` quota headaches, no scraping dead ends.**

Built for content researchers, growth marketers, and dev teams who need clean video/channel/comment data for a search term, channel, or hashtag in minutes — not an afternoon fighting the YouTube Data API's daily quota.

> **Type a search term, channel, or video URL → get videos, channel stats, and comments → deliver them straight into your CRM, Notion, Slack, or Jira.**

---

### ⭐ Why This Actor?

- ✅ **No YouTube API key, no quotas** — built on [`yt-dlp`](https://github.com/yt-dlp/yt-dlp) and [`youtube-comment-downloader`](https://github.com/egbertbouman/youtube-comment-downloader), not the rate-limited YouTube Data API
- ✅ **Four ways in** — search queries, channel URLs, direct video URLs, or hashtags, all in a single run
- ✅ **Videos, channels, and comments together** — one run returns video metadata, channel stats, and top comments, tagged by `type` so they're easy to split back apart
- ✅ **Anti-bot resilient** — routes every request through **Apify Proxy** with a fresh rotating IP per request, avoiding YouTube's "Sign in to confirm you're not a bot" block
- ✅ **Deliver anywhere via MCP connectors** — push results straight into Notion, Slack, Jira, GitHub, Linear, Airtable, and more
- ✅ **Export-ready** — JSON, CSV, or Excel for your CRM, BI tool, or content pipeline

---

### 📝 Use Cases & ROI

| Use Case | Time Saved | What You Get |
| --- | --- | --- |
| **Content & trend research** | 2–4 hrs/topic | Top videos for a keyword, hashtag, or niche, ranked by views/likes |
| **Competitor channel monitoring** | 1–3 hrs/channel | Full upload history, view/like/comment counts, and subscriber trends |
| **Sentiment & audience analysis** | 2–5 hrs/video | Comment threads with author, likes, and reply counts for qualitative review |
| **Influencer / creator sourcing** | 2–4 hrs/search | Channel-level stats (subscribers, video count, country) to shortlist creators |
| **Data pipeline enrichment** | 1–3 hrs/batch | Structured video/channel/comment records piped into your CRM or warehouse via API/connector |

---

### 🚀 How to Use

1. Open the Actor on Apify
2. Provide at least one of: **Search queries**, **Channel URLs**, **Video URLs**, or **Hashtags**
3. Set **Max videos per input** — how many videos to pull per query/channel/hashtag (default: 20)
4. Set **Max comments per video** and toggle **Scrape comments** / **Scrape channel info** as needed
5. Keep **Proxy configuration** on Apify Proxy (default) — YouTube blocks direct platform IPs
6. _(Optional)_ Pick an **MCP connector** to deliver results into Notion, Slack, Jira, etc.
7. Click **Run** — results land in the dataset within minutes
8. Download as JSON, CSV, or Excel — or let the connector push them into your tools automatically

> 💡 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**.
> 🌐 **Proxy**: requests run through **Apify Proxy** with a new IP rotated in for every request. Running without a proxy will likely get blocked.

---

### 🧩 Input Configuration

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `searchQueries` | Array of strings | One of these four | List of search terms to look up on YouTube. |
| `channelUrls` | Array of strings | One of these four | YouTube channel URLs to scrape (e.g. `https://www.youtube.com/@mkbhd`). |
| `videoUrls` | Array of strings | One of these four | Direct YouTube video URLs to scrape. |
| `hashtags` | Array of strings | One of these four | YouTube hashtags to search (with or without the `#`). |
| `maxVideos` | Integer | Optional | Max videos to scrape per search query, channel, or hashtag (1–500). Default: `20`. |
| `maxComments` | Integer | Optional | Max comments to scrape per video (0–1000). Default: `50`. |
| `scrapeComments` | Boolean | Optional | Enable comment scraping for each video. Default: `true`. |
| `scrapeChannelInfo` | Boolean | Optional | Include channel-level metadata (subscribers, description, etc.) when scraping channels. Default: `true`. |
| `proxyConfiguration` | Object | Optional | Proxy used to fetch pages. Defaults to **Apify Proxy** — required, since YouTube blocks direct platform IPs with a "Sign in to confirm you're not a bot" error. |
| `mcpConnector` | Connector | Optional | Deliver results into a connector you've authorized (Notion, Slack, Jira, GitHub, Linear, Airtable, …). |
| `deliveryMode` | Enum | Optional | `summary` (one call for all results), `chunked` (split many results across calls so services like Notion don't time out), `perItem` (one call per video/channel/comment), 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 call, exposed as the `{message}` placeholder. |

At least one of `searchQueries`, `channelUrls`, `videoUrls`, or `hashtags` must be provided.

#### Example — Just scrape videos for a search term

```json
{
  "searchQueries": ["python tutorial 2024"],
  "maxVideos": 20,
  "maxComments": 50,
  "scrapeComments": true
}
````

#### Example — Scrape a channel, skip comments

```json
{
  "channelUrls": ["https://www.youtube.com/@mkbhd"],
  "maxVideos": 30,
  "scrapeComments": false,
  "scrapeChannelInfo": true
}
```

#### Example — Find and deliver to Slack

```json
{
  "searchQueries": ["apify web scraping"],
  "maxVideos": 15,
  "mcpConnector": "<your-slack-connector>",
  "deliveryMode": "perItem",
  "mcpTool": "send_message",
  "mcpArguments": { "channel": "#content-research", "text": "{message}" },
  "mcpMessageTemplate": "*{title}* — {url}\n{viewCount} views, {likeCount} likes"
}
```

#### Example — Find and create Notion pages

```json
{
  "channelUrls": ["https://www.youtube.com/@mkbhd"],
  "maxVideos": 20,
  "mcpConnector": "<your-notion-connector>",
  "deliveryMode": "perItem",
  "mcpTool": "create_page",
  "mcpArguments": {
    "parent": "<database-id>",
    "title": "{title}",
    "url": "{url}"
  }
}
```

#### Placeholders available in arguments / template

- **Summary / chunked mode**: `{itemCount}`, `{itemsText}` (formatted list of videos/channels/comments), `{message}` (rendered template); `chunked` also gives `{part}` / `{partCount}`.
- **Per-item mode** — always available: `{type}` (`video` / `channel` / `comment`), `{scrapedAt}`, `{message}`, plus whichever fields the record has:
  - **video**: `{videoId}` `{title}` `{description}` `{channelId}` `{channelName}` `{channelUrl}` `{viewCount}` `{likeCount}` `{commentCount}` `{duration}` `{durationStr}` `{thumbnail}` `{isLive}` `{isShort}` `{tags}` `{categories}` `{language}` `{uploadDate}` `{url}`
  - **channel**: `{channelId}` `{channelName}` `{channelUrl}` `{description}` `{subscriberCount}` `{videoCount}` `{thumbnail}` `{country}`
  - **comment**: `{videoId}` `{commentId}` `{text}` `{author}` `{authorId}` `{likes}` `{replyCount}` `{isReply}` `{publishedAt}`

***

### 📦 Output Fields

Each dataset item has a `type` field: `"video"`, `"channel"`, or `"comment"`.

#### Videos

| Field | Description |
| --- | --- |
| `videoId` | YouTube video ID |
| `title` | Video title |
| `description` | First 2000 chars of description |
| `channelName` / `channelId` / `channelUrl` | Uploader info |
| `viewCount` | Total views |
| `likeCount` | Total likes |
| `commentCount` | Total comments |
| `duration` / `durationStr` | Length in seconds / `H:MM:SS` |
| `tags` / `categories` | YouTube tags and categories |
| `thumbnail` | Highest-res thumbnail URL |
| `uploadDate` | `YYYY-MM-DD` |
| `isLive` / `isShort` | Flags |
| `source` | How it was found: `search`, `channel`, or `direct_url` |

#### Channels

| Field | Description |
| --- | --- |
| `channelId` | YouTube channel ID |
| `channelName` / `channelUrl` | Display name / link |
| `subscriberCount` | Subscriber count |
| `videoCount` | Number of public videos |
| `description` | Channel description |
| `country` | Country of origin |

#### Comments

| Field | Description |
| --- | --- |
| `commentId` | Unique comment ID |
| `videoId` | Parent video ID |
| `text` | Comment text |
| `author` / `authorId` | Commenter info |
| `likes` | Comment likes |
| `replyCount` | Number of replies |
| `isReply` | Whether it's a reply |
| `publishedAt` | Relative time string |

#### Example Output

```json
[
  {
    "type": "video",
    "videoId": "dQw4w9WgXcQ",
    "title": "Apify Web Scraping Tutorial 2024",
    "channelName": "Apify",
    "viewCount": 128340,
    "likeCount": 4210,
    "commentCount": 312,
    "durationStr": "12:45",
    "uploadDate": "2024-03-11",
    "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  }
]
```

> You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

***

### 🔌 Integrations & Delivery

Deliver scraped videos, channels, and comments into any MCP connector you've authorized in Apify — no glue code, no webhooks:

- **Notion** — create a page/row per video, channel, or comment
- **Slack / Discord** — post results to a channel
- **Jira / GitHub / Linear** — open issues or tasks for follow-up
- **Airtable / Google Sheets** — append structured rows
- …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**.

***

### ❓ FAQ

**How do I scrape YouTube without the official API?**
This Actor uses `yt-dlp` and `youtube-comment-downloader` instead of the YouTube Data API, so there's no API key to register and no daily quota to run into.

**Can I scrape YouTube comments without an API key?**
Yes — toggle **Scrape comments** on and set **Max comments per video**; comment author, text, likes, and reply counts are included automatically.

**How many videos can I scrape per run?**
Up to 500 per search query, channel, or hashtag (set via **Max videos per input**), across as many inputs as you provide in a single run.

**Does this YouTube scraper need a proxy?**
Yes — YouTube blocks direct requests from datacenter IPs with a "Sign in to confirm you're not a bot" error. Keep **Proxy configuration** on Apify Proxy (default) for reliable results.

**Is scraping YouTube data legal?**
This Actor only collects publicly available information from public YouTube pages and doesn't log into or bypass authentication on any account. You're responsible for using the data in line with YouTube's Terms of Service and applicable laws (GDPR/CCPA, etc.) — see the disclaimer below.

**Can I export the scraped YouTube data to CSV or Excel?**
Yes — every run's dataset can be downloaded as JSON, CSV, HTML, or Excel directly from the Apify Console, or pulled via the Apify API.

***

### 🆘 Support

For issues, custom sourcing requests, or feature suggestions:

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

***

#### Need a Custom Pipeline?

Want multi-channel batch monitoring, deeper enrichment (transcripts, sentiment scoring), or a full CRM/BI 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, Google, or any related company. YouTube® is a registered trademark of Google LLC; all trademarks are property of their respective owners. The Actor collects only publicly available information surfaced on public YouTube pages and does not log into, or scrape behind the authentication of, any account. Use the data responsibly and in compliance with applicable laws (including GDPR/CCPA), YouTube's Terms of Service, and the terms of the platforms you operate on.

# Actor input Schema

## `searchQueries` (type: `array`):

List of search terms to look up on YouTube.

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

YouTube channel URLs to scrape (e.g. https://www.youtube.com/@mkbhd).

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

Direct YouTube video URLs to scrape.

## `hashtags` (type: `array`):

YouTube hashtags to search (with or without the # symbol).

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

Maximum number of videos to scrape per search query, channel, or hashtag.

## `maxComments` (type: `integer`):

Maximum number of comments to scrape per video.

## `scrapeComments` (type: `boolean`):

Enable comment scraping for each video.

## `scrapeChannelInfo` (type: `boolean`):

Include channel-level metadata (subscribers, description, etc.) when scraping channels.

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

YouTube blocks direct requests from Apify's platform IPs with a 'Sign in to confirm you're not a bot' error. Apify Proxy is required for reliable scraping — a fresh IP is rotated in for every request.

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

Optionally deliver scraped videos, channels, and comments into a connector you have authorized — Notion, Slack, Linear, Airtable, Jira, GitHub, or any MCP-compatible connector. Leave empty to only save results to the dataset.

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

How to deliver to the connector: 'summary' (one call covering every scraped result), 'chunked' (split many results across a few calls/pages so services like Notion never time out), 'perItem' (one call per individual video/channel/comment), 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}. In 'summary'/'chunked' mode: {itemCount}, {itemsText} (formatted list of videos/channels/comments), {message} (the rendered template below); 'chunked' also gives {part}/{partCount} (1-based part number and total — put these in a page title, e.g. 'YouTube results (part {part}/{partCount})'). In 'perItem' mode: {type} ('video'/'channel'/'comment') plus whichever of these fields the record has — video: {videoId}, {title}, {description}, {channelId}, {channelName}, {channelUrl}, {viewCount}, {likeCount}, {commentCount}, {duration}, {durationStr}, {thumbnail}, {isLive}, {isShort}, {tags}, {categories}, {language}, {uploadDate}, {url}; channel: {channelId}, {channelName}, {channelUrl}, {description}, {subscriberCount}, {videoCount}, {thumbnail}, {country}; comment: {videoId}, {commentId}, {text}, {author}, {authorId}, {likes}, {replyCount}, {isReply}, {publishedAt}; always available: {scrapedAt}, {message}. Example for Slack: {"channel": "#youtube", "text": "{message}"}.

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

Optional template rendered and exposed as the {message} placeholder in the tool arguments. Summary/chunked example: 'Scraped {itemCount} YouTube results:\n\n{itemsText}'. Per-item example for a video: '{title} — {url} ({viewCount} views, {likeCount} likes)'.

## Actor input object example

```json
{
  "searchQueries": [
    "python tutorial 2024",
    "apify web scraping"
  ],
  "channelUrls": [
    "https://www.youtube.com/@mkbhd"
  ],
  "videoUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "hashtags": [
    "#python",
    "#webdev"
  ],
  "maxVideos": 20,
  "maxComments": 50,
  "scrapeComments": true,
  "scrapeChannelInfo": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "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 = {};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Scraper : Videos, Channels & Comments",
        "description": "Scrape YouTube videos, channels & comments by keyword, hashtag, or URL, no API key or quota limits. Get titles, views, likes, upload dates, channel stats, and comments as clean JSON",
        "version": "1.0",
        "x-build-id": "O284IfR5YkX0pW6fR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/techforce.global~youtube-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-techforce.global-youtube-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-scraper/runs": {
            "post": {
                "operationId": "runs-sync-techforce.global-youtube-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-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-techforce.global-youtube-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",
                "properties": {
                    "searchQueries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "List of search terms to look up on YouTube.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "channelUrls": {
                        "title": "Channel URLs",
                        "type": "array",
                        "description": "YouTube channel URLs to scrape (e.g. https://www.youtube.com/@mkbhd).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "videoUrls": {
                        "title": "Video URLs",
                        "type": "array",
                        "description": "Direct YouTube video URLs to scrape.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "hashtags": {
                        "title": "Hashtags",
                        "type": "array",
                        "description": "YouTube hashtags to search (with or without the # symbol).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxVideos": {
                        "title": "Max videos per input",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of videos to scrape per search query, channel, or hashtag.",
                        "default": 20
                    },
                    "maxComments": {
                        "title": "Max comments per video",
                        "minimum": 0,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of comments to scrape per video.",
                        "default": 50
                    },
                    "scrapeComments": {
                        "title": "Scrape comments",
                        "type": "boolean",
                        "description": "Enable comment scraping for each video.",
                        "default": true
                    },
                    "scrapeChannelInfo": {
                        "title": "Scrape channel info",
                        "type": "boolean",
                        "description": "Include channel-level metadata (subscribers, description, etc.) when scraping channels.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "YouTube blocks direct requests from Apify's platform IPs with a 'Sign in to confirm you're not a bot' error. Apify Proxy is required for reliable scraping — a fresh IP is rotated in for every request.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "mcpConnector": {
                        "title": "Deliver to (MCP connector)",
                        "type": "string",
                        "description": "Optionally deliver scraped videos, channels, and comments into a connector you have authorized — Notion, Slack, Linear, Airtable, Jira, GitHub, or any MCP-compatible connector. Leave empty to only save results to the dataset."
                    },
                    "deliveryMode": {
                        "title": "Delivery mode",
                        "enum": [
                            "summary",
                            "chunked",
                            "perItem",
                            "none"
                        ],
                        "type": "string",
                        "description": "How to deliver to the connector: 'summary' (one call covering every scraped result), 'chunked' (split many results across a few calls/pages so services like Notion never time out), 'perItem' (one call per individual video/channel/comment), 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}. In 'summary'/'chunked' mode: {itemCount}, {itemsText} (formatted list of videos/channels/comments), {message} (the rendered template below); 'chunked' also gives {part}/{partCount} (1-based part number and total — put these in a page title, e.g. 'YouTube results (part {part}/{partCount})'). In 'perItem' mode: {type} ('video'/'channel'/'comment') plus whichever of these fields the record has — video: {videoId}, {title}, {description}, {channelId}, {channelName}, {channelUrl}, {viewCount}, {likeCount}, {commentCount}, {duration}, {durationStr}, {thumbnail}, {isLive}, {isShort}, {tags}, {categories}, {language}, {uploadDate}, {url}; channel: {channelId}, {channelName}, {channelUrl}, {description}, {subscriberCount}, {videoCount}, {thumbnail}, {country}; comment: {videoId}, {commentId}, {text}, {author}, {authorId}, {likes}, {replyCount}, {isReply}, {publishedAt}; always available: {scrapedAt}, {message}. Example for Slack: {\"channel\": \"#youtube\", \"text\": \"{message}\"}.",
                        "default": {}
                    },
                    "mcpMessageTemplate": {
                        "title": "Message template",
                        "type": "string",
                        "description": "Optional template rendered and exposed as the {message} placeholder in the tool arguments. Summary/chunked example: 'Scraped {itemCount} YouTube results:\\n\\n{itemsText}'. Per-item example for a video: '{title} — {url} ({viewCount} views, {likeCount} likes)'.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
