# YouTube Shorts Scraper & MCP Connector (`techforce.global/youtube-shorts-scraper`) Actor

Extract every Short from any channel by name, handle, or URL, with views, likes, comments, upload date & hashtags, plus optional video downloads.

- **URL**: https://apify.com/techforce.global/youtube-shorts-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 $8.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Shorts Scraper & MCP Connector

Extract **every Short from any YouTube channel** — title, view count, like count, comment count, duration, upload date, description, and hashtags — with an option to **download the actual video files**. **No manual scrolling through a channel's Shorts shelf, no missing stats, no duplicate entries.**

Built for content researchers, social media teams, and creators who need a clean, structured feed of a channel's Shorts in minutes — not an afternoon of scrolling and copy-pasting.

> **Type a channel name → get every Short with full stats → deliver them straight into your CRM, Notion, Slack, or Jira.**

---

### ⭐ Why This Actor?

- ✅ **Just enter a channel** — accepts a plain name, `@handle`, channel ID, or full channel URL, no manual URL-hunting required
- ✅ **Full engagement stats** — views, likes, comments, upload date, description, and hashtags for every Short, not just the title and thumbnail
- ✅ **Automatic deduplication** — YouTube's Shorts shelf occasionally repeats entries across continuation pages; this Actor filters them out by video ID so your dataset never has the same Short twice
- ✅ **Optional video downloads** — grab the actual video file (or audio-only) for every Short, stored directly in the run's Key-Value Store with a public download link
- ✅ **Fast, resilient extraction** — built on [yt-dlp](https://github.com/yt-dlp/yt-dlp) with a lightweight metadata-only client, and a heavier fallback client kicking in only when a request genuinely fails
- ✅ **Deliver anywhere via MCP connectors** — push scraped Shorts 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** | 1–3 hrs/channel | Every Short a competitor or creator has posted, with stats, ready to sort by views/likes |
| **Trend Monitoring** | 1–2 hrs/week | Repeatable snapshots of view/like velocity across a channel's recent Shorts |
| **Archiving & Repurposing** | 2–5 hrs/batch | Bulk-downloaded video files for captioning, translation, or repost workflows |
| **Reporting & Analytics** | 1–3 hrs/report | Structured Shorts metadata piped into a spreadsheet, BI tool, or dashboard |
| **Workflow Automation** | 1–2 hrs/setup | New Shorts pushed automatically into Notion, Slack, or a task tracker via MCP connector |

---

### 🚀 How to Use

1. Open the Actor on Apify.
2. In **Channel name, handle, or URL**, enter the channel you want to scrape — e.g. `@MrBeast`, `MrBeast`, `https://www.youtube.com/@MrBeast`, or a channel ID like `UCX6OQ3DkcsbYNE6H8uQQuVA`.
3. Set **Max Shorts to scrape** (or `0` for every available Short).
4. Toggle **Download videos** on if you want the actual video files, and pick a **Video quality**.
5. _(Optional)_ Pick an **MCP connector** to deliver results into Notion, Slack, Jira, etc.
6. Click **Start** — results are ready in minutes.
7. Open the **Dataset** tab to view or export results, or let the connector push them into your tools automatically.

> 🎯 **Extended metadata** (on by default): fetches full per-video stats — views, likes, comments, upload date, description, hashtags. Turn it **off** for a faster, listing-only run if you only need titles/URLs/thumbnails.

> 🌐 **Proxy**: requests run through **Apify Proxy** by default to reduce the chance of YouTube rate-limiting or blocking. You normally don't need to change this.

> 💡 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 |
| --- | --- | --- | --- |
| `channelUrl` | String | ✔️ Yes | Channel name, `@handle`, channel ID, or full URL to scrape Shorts from. |
| `maxShorts` | Integer | Optional | Maximum number of Shorts to collect, most recent first. `0` = all available Shorts. Default: `25`. |
| `extendedMetadata` | Boolean | Optional | Fetch full per-video stats (views, likes, comments, description, hashtags). Automatically enabled when downloading videos. Default: `true`. |
| `downloadVideos` | Boolean | Optional | Download the actual video file for each Short into the run's Key-Value Store. Default: `false`. |
| `videoQuality` | String | Optional | `best`, `1080p`, `720p`, `480p`, or `audio`. Only used when `downloadVideos` is on. Default: `best`. |
| `proxyConfiguration` | Object | Optional | Proxy used to access YouTube. Defaults to **Apify Proxy** — recommended to avoid rate-limiting/blocking. |
| `mcpConnector` | Connector | Optional | Deliver results into a connector you've authorized (Notion, Slack, Jira, GitHub, Linear, Airtable, …). |
| `deliveryMode` | Enum | Optional | `summary` (one call with all Shorts), `chunked` (split many Shorts across a few calls), `perShort` (one call per Short), 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 delivery, exposed as the `{message}` placeholder. |

#### Example — Just scrape metadata

```json
{
    "channelUrl": "@MrBeast",
    "maxShorts": 25,
    "extendedMetadata": true
}
````

#### Example — Scrape and download videos

```json
{
    "channelUrl": "@MrBeast",
    "maxShorts": 25,
    "extendedMetadata": true,
    "downloadVideos": true,
    "videoQuality": "720p",
    "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Example — Scrape and deliver to Slack (one message per Short)

```json
{
    "channelUrl": "@MrBeast",
    "maxShorts": 15,
    "mcpConnector": "<your-slack-connector>",
    "deliveryMode": "perShort",
    "mcpTool": "send_message",
    "mcpArguments": { "channel": "#shorts-tracker", "text": "{message}" },
    "mcpMessageTemplate": "*{title}* — {url}\n{viewCount} views, {likeCount} likes"
}
```

#### Example — Scrape and create Notion pages (chunked)

```json
{
    "channelUrl": "@MrBeast",
    "maxShorts": 50,
    "mcpConnector": "<your-notion-connector>",
    "deliveryMode": "chunked",
    "mcpTool": "create_pages",
    "mcpArguments": {
        "parent": { "page_id": "39fe5ea63f43800ab73ac3707c18d0af" },
        "pages": [{
            "properties": { "title": "Shorts {channelName} (part {part}/{partCount})" },
            "content": "{shortsText}"
        }]
    }
}
```

#### Placeholders available in arguments / template

Per-Short delivery (`perShort`): `{channelName}` · `{channelUrl}` · `{id}` · `{title}` · `{url}` · `{viewCount}` · `{likeCount}` · `{commentCount}` · `{uploadDate}` · `{duration}` · `{description}` · `{hashtags}` · `{downloadStatus}` · `{videoDownloadUrl}` · `{thumbnailUrl}` · `{message}`

Summary / chunked delivery: `{channelName}` · `{channelUrl}` · `{shortCount}` · `{shortsText}` (formatted list of Shorts) · `{message}` — chunked mode also adds `{part}` / `{partCount}`

***

### 📦 Output Fields

Each scraped Short is stored as one item in the Actor's dataset. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

| Field | Description |
| --- | --- |
| `channelName` / `channelUrl` | The channel the Short belongs to |
| `title` | Short's title |
| `url` | Direct link to the Short |
| `viewCount` / `likeCount` / `commentCount` | Engagement stats |
| `duration` | Length in seconds |
| `uploadDate` | Upload date (`YYYYMMDD`) |
| `description` | Full video description |
| `hashtags` | Tags/hashtags attached to the Short |
| `videoDownloadUrl` | Direct link to the downloaded video file (if `downloadVideos` is on) |
| `downloadStatus` | `downloaded`, `skipped`, or `failed` |

#### Example Output

```json
{
    "channelName": "MrBeast",
    "channelUrl": "https://www.youtube.com/@MrBeast",
    "id": "abc12345XYZ",
    "title": "I Survived 24 Hours...",
    "url": "https://www.youtube.com/shorts/abc12345XYZ",
    "thumbnailUrl": "https://i.ytimg.com/vi/abc12345XYZ/hqdefault.jpg",
    "duration": 42,
    "viewCount": 15234000,
    "likeCount": 982000,
    "commentCount": 4310,
    "uploadDate": "20260710",
    "hashtags": ["shorts"],
    "downloadStatus": "downloaded",
    "videoDownloadUrl": "https://api.apify.com/v2/key-value-stores/.../records/short-abc12345XYZ.mp4",
    "videoFileKey": "short-abc12345XYZ.mp4"
}
```

***

### 🔌 Integrations & Delivery

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

- **Notion** — create a page per Short, or a batch page per chunk
- **Slack / Discord** — post new Shorts to a channel
- **Jira / GitHub / Linear** — open tasks for captioning, translation, or repost workflows
- **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. The dataset is always saved regardless of connector settings, so a delivery failure never loses data. You can also consume the dataset directly via the **Apify API**, or wire it into **n8n, Zapier, and Make**.

***

### 💰 Cost Estimation

Metadata-only runs are cheap — listing and fetching stats for ~25 Shorts typically takes well under a minute of compute. Enabling **Download videos** is the main cost driver, since each video file is fetched and stored in the Key-Value Store; expect proportionally higher compute time and storage usage for large batches or higher quality settings. Start with a small `maxShorts` value to estimate cost before scaling up.

***

### 🛠️ Tips and Advanced Options

- Enable **Apify Proxy** (default) to reduce the chance of YouTube rate-limiting or blocking requests.
- Leave `extendedMetadata` off if you only need titles/URLs/thumbnails — it's faster since it skips the extra per-video request.
- Use `videoQuality: "audio"` if you only need the soundtrack of Shorts (e.g. for audio trend analysis).
- Large channels can have thousands of Shorts — set a sensible `maxShorts` limit and use Apify's [scheduler](https://docs.apify.com/platform/schedules) to run incremental scrapes over time.

***

### ❓ FAQ

**Is this legal?** This Actor only accesses publicly available pages on YouTube. You are responsible for how you use the scraped data and downloaded videos, and for complying with YouTube's Terms of Service and applicable copyright law in your jurisdiction — downloaded videos remain the property of their original creators.

**Why did a channel return zero Shorts?** The channel may not have any Shorts, may be private, or the name/handle you entered may not match exactly — try pasting the full channel URL instead.

**Why is a Short missing view/like counts?** Some creators hide public engagement stats — this is a legitimate result, not a scraping failure.

***

### 🆘 Support

For issues, custom scraping requests, or feature suggestions:

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

***

#### Need a Custom Pipeline?

Want multi-channel batch runs, deeper enrichment, 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 or Google. YouTube® is a trademark of Google LLC; all trademarks are property of their respective owners. The Actor collects only publicly available information from YouTube's channel and video pages. Use the data responsibly and in compliance with applicable laws (including GDPR/CCPA), YouTube's Terms of Service, and copyright law — downloaded videos remain the property of their original creators.

# Actor input Schema

## `channelUrl` (type: `string`):

The YouTube channel to scrape Shorts from. Accepts a full channel URL (e.g. https://www.youtube.com/@MrBeast), a handle (@MrBeast), a channel ID (UCX6OQ3DkcsbYNE6H8uQQuVA), or a plain channel name (best-effort lookup).

## `maxShorts` (type: `integer`):

Maximum number of Shorts to collect from the channel, starting with the most recent. Set to 0 to fetch all available Shorts (can be slow for large channels).

## `extendedMetadata` (type: `boolean`):

If enabled, fetches full details for each Short (view/like/comment counts, upload date, description, tags). This is slower since it makes one extra request per Short. Automatically enabled when downloading videos.

## `downloadVideos` (type: `boolean`):

If enabled, downloads the actual video file for each Short and stores it in the run's Key-Value Store. A direct download link is added to each dataset item.

## `videoQuality` (type: `string`):

Preferred quality/format for downloaded videos. Only used when 'Download videos' is enabled.

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

Proxy settings used to access YouTube. Using Apify Proxy is strongly recommended to avoid rate limiting/blocking.

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

Optionally deliver scraped Shorts 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 Short), 'chunked' (split many Shorts across a few calls/pages so services like Notion never time out), 'perShort' (one call per individual Short), 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: {channelName}, {channelUrl}, {shortCount}, {shortsText} (formatted list of Shorts), {message} (the rendered template below); 'chunked' also gives {part}/{partCount} (1-based part number and total — put these in a page title, e.g. 'Shorts {channelName} (part {part}/{partCount})'). In 'perShort' mode: {channelName}, {channelUrl}, {id}, {title}, {url}, {viewCount}, {likeCount}, {commentCount}, {uploadDate}, {duration}, {description}, {hashtags}, {downloadStatus}, {videoDownloadUrl}, {thumbnailUrl}, {message}. Example for Slack: {"channel": "#shorts", "text": "{message}"}.

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

Optional template rendered and exposed as the {message} placeholder in the tool arguments. Summary/chunked example: 'Shorts from {channelName} ({shortCount} total):\n\n{shortsText}'. Per-Short example: '{title} — {url} ({viewCount} views, {likeCount} likes)'.

## Actor input object example

```json
{
  "channelUrl": "@MrBeast",
  "maxShorts": 25,
  "extendedMetadata": true,
  "downloadVideos": false,
  "videoQuality": "best",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "deliveryMode": "summary",
  "mcpTool": "",
  "mcpArguments": {},
  "mcpMessageTemplate": ""
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `files` (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 = {
    "channelUrl": "@MrBeast"
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Shorts Scraper & MCP Connector",
        "description": "Extract every Short from any channel by name, handle, or URL, with views, likes, comments, upload date & hashtags, plus optional video downloads.",
        "version": "0.1",
        "x-build-id": "RiuHIgy7MEy89dd85"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/techforce.global~youtube-shorts-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-techforce.global-youtube-shorts-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-shorts-scraper/runs": {
            "post": {
                "operationId": "runs-sync-techforce.global-youtube-shorts-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-shorts-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-techforce.global-youtube-shorts-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": [
                    "channelUrl"
                ],
                "properties": {
                    "channelUrl": {
                        "title": "Channel name, handle, or URL",
                        "type": "string",
                        "description": "The YouTube channel to scrape Shorts from. Accepts a full channel URL (e.g. https://www.youtube.com/@MrBeast), a handle (@MrBeast), a channel ID (UCX6OQ3DkcsbYNE6H8uQQuVA), or a plain channel name (best-effort lookup)."
                    },
                    "maxShorts": {
                        "title": "Max Shorts to scrape",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of Shorts to collect from the channel, starting with the most recent. Set to 0 to fetch all available Shorts (can be slow for large channels).",
                        "default": 25
                    },
                    "extendedMetadata": {
                        "title": "Fetch extended metadata",
                        "type": "boolean",
                        "description": "If enabled, fetches full details for each Short (view/like/comment counts, upload date, description, tags). This is slower since it makes one extra request per Short. Automatically enabled when downloading videos.",
                        "default": true
                    },
                    "downloadVideos": {
                        "title": "Download videos",
                        "type": "boolean",
                        "description": "If enabled, downloads the actual video file for each Short and stores it in the run's Key-Value Store. A direct download link is added to each dataset item.",
                        "default": false
                    },
                    "videoQuality": {
                        "title": "Video quality",
                        "enum": [
                            "best",
                            "1080p",
                            "720p",
                            "480p",
                            "audio"
                        ],
                        "type": "string",
                        "description": "Preferred quality/format for downloaded videos. Only used when 'Download videos' is enabled.",
                        "default": "best"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings used to access YouTube. Using Apify Proxy is strongly recommended to avoid rate limiting/blocking.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "mcpConnector": {
                        "title": "Deliver to (MCP connector)",
                        "type": "string",
                        "description": "Optionally deliver scraped Shorts 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",
                            "perShort",
                            "none"
                        ],
                        "type": "string",
                        "description": "How to deliver to the connector: 'summary' (one call covering every scraped Short), 'chunked' (split many Shorts across a few calls/pages so services like Notion never time out), 'perShort' (one call per individual Short), 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: {channelName}, {channelUrl}, {shortCount}, {shortsText} (formatted list of Shorts), {message} (the rendered template below); 'chunked' also gives {part}/{partCount} (1-based part number and total — put these in a page title, e.g. 'Shorts {channelName} (part {part}/{partCount})'). In 'perShort' mode: {channelName}, {channelUrl}, {id}, {title}, {url}, {viewCount}, {likeCount}, {commentCount}, {uploadDate}, {duration}, {description}, {hashtags}, {downloadStatus}, {videoDownloadUrl}, {thumbnailUrl}, {message}. Example for Slack: {\"channel\": \"#shorts\", \"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: 'Shorts from {channelName} ({shortCount} total):\\n\\n{shortsText}'. Per-Short example: '{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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
