# YouTube Shorts Scraper (`spectre_scrape/youtube-shorts-scraper`) Actor

Extract YouTube Shorts data from one or multiple channels/handles without unofficial API quotas. Get video URL, caption, timestamp, likes, dislikes, views and comments count, basic channel info, and more.

- **URL**: https://apify.com/spectre\_scrape/youtube-shorts-scraper.md
- **Developed by:** [Spectre](https://apify.com/spectre_scrape) (community)
- **Categories:** Videos, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## Extract YouTube Shorts analytics — views, trending data & engagement metrics at scale

This powerful youtube shorts extractor allows content creators, marketers, agencies, and AI/ML researchers to seamlessly pull comprehensive youtube shorts data without any coding. It solves the restrictive 10,000 unit daily quota limit of the official API and removes hours of manual research by automating data collection at scale. Get access to complete youtube shorts analytics and measure youtube shorts views reliably to monitor youtube shorts trending content across the platform.

### What data you get

*   Video title, URL, views, likes, comment count
*   Publish date, channel name, subscriber count
*   Engagement rate, hashtags, audio/music used

### Use cases

#### 📈 Trend research
Find viral YouTube Shorts before they peak by systematically tracking fast-growing content across various niches. By extracting data daily, you can quickly identify which topics, sounds, and video formats are gaining exponential traction to capitalize on new trends early. Stop relying on manual scrolling to find youtube shorts viral videos and let the data reveal what audiences actually want to watch right now.

#### ⚔️ Competitor analysis
Track any channel's Shorts performance to see exactly what is working for your direct competitors. Analyze their upload frequency, view velocity, and audience engagement strategies over extended periods of time. This approach allows you to adjust your own content calendar based on empirical evidence of what engages viewers in your specific industry.

#### 🔍 Influencer discovery
Identify rising Shorts creators by niche for potential sponsorships, brand deals, or collaborations. Filter creators based on raw performance metrics—like average view counts and high engagement rates—rather than just looking at total subscriber counts. This ensures your marketing budget goes toward content creators who truly command active, dedicated audiences.

#### 🎯 Content strategy
Analyze which hooks and formats drive massive youtube shorts views to completely revamp your own production workflows. Reverse-engineer top-performing videos to understand the optimal duration, pacing, and keywords that keep viewers watching until the very end. Stop guessing what works and start building your creative briefs around proven data points.

#### 🤖 AI & dataset use
Build YouTube Shorts datasets for ML training by exporting thousands of records in a highly structured format. Feed clean, perfectly formatted metadata directly into your machine learning models for advanced content classification, trend prediction, or automated text generation. This tool provides the reliable pipeline needed for complex AI model development.

#### 👀 Brand monitoring
Monitor mentions and brand-adjacent Shorts content to accurately measure organic reach across the platform. Keep track of how creators and everyday users are talking about your product, your competitors, or your industry sector. Catch emerging conversations early and engage with user-generated content that highlights your brand.

### How it works

1. Enter a YouTube channel URL, username, or keyword.
2. Set your result limit and configure optional filters like the oldest post date.
3. Run the actor — typically takes ~1-2 minutes for 100 results.
4. Download your data immediately as JSON, CSV, or Excel.

### Why use this instead of the YouTube Data API

The official Google API restricts developers with a strict 10,000 unit per day quota limit, which is easily exhausted when analyzing multiple channels. There are no daily limits with this actor, allowing you to scale your data collection without interruptions. Furthermore, it returns several enriched fields that the official API simply doesn't expose in a single request. Best of all, there is no need for complex Google Cloud setup, API key management, or OAuth verification.


### Input parameters

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `channels` | Array | Enter YouTube @handles, usernames, or channel IDs/URLs (one per line). | `["@vsauce"]` |
| `maxResultsShorts` | Integer | Maximum number of Shorts videos to scrape per channel. | `50` |
| `oldestPostDate` | String | Scrape only YouTube Shorts posted on or after this date. Format: YYYY-MM-DD | *(empty)* |
| `proxyConfiguration` | Object | Apify Proxy is recommended to avoid rate limits or blocking. | Apify Proxy |

### Output schema

```json
{
  "title": "Why we are so afraid of spiders",
  "url": "https://www.youtube.com/shorts/abcdefgh",
  "viewCount": 2500400,
  "likes": 182000,
  "commentsCount": 1450,
  "date": "2023-11-20T10:00:00Z",
  "duration": "0:59",
  "channelName": "Vsauce",
  "channelUsername": "@vsauce",
  "numberOfSubscribers": 20000000,
  "text": "Fear of spiders is deeply rooted in our evolutionary history. #science #psychology",
  "hashtags": [
    "science",
    "psychology"
  ]
}
````

### Legal & ethical note

This tool only extracts publicly available data from the web. The user is entirely responsible for complying with the YouTube Terms of Service and any relevant platform regulations. No private, hidden, or authenticated data is accessed or collected at any time.

### Integrating YouTube Shorts Scraper with other apps

YouTube Shorts Scraper can be connected with almost any cloud service or web app thanks to integrations on the Apify platform. These include Make, Zapier, Slack, Airbyte, GitHub, Google Drive, and plenty more.

Alternatively, you can use webhooks to carry out an action whenever an event occurs, e.g. get a notification whenever YouTube Shorts Scraper successfully finishes a run, or initiate a new process, like ordering your data.

### Error item structure and error codes reference

When an error occurs during the scraping process (e.g., rate limits or private videos), the scraper will output an error item in the dataset so you can identify which specific inputs failed without breaking the entire run.

#### Error item schema

```json
{
  "url": "https://www.youtube.com/shorts/invalid_example",
  "error": {
    "code": "VIDEO_NOT_FOUND",
    "message": "The requested Short is unavailable or private."
  }
}
```

#### Common error codes

| Error code | Description | Resolution |
| --- | --- | --- |
| `INVALID_INPUT` | The provided channel URL or username was malformed. | Check the input format and run again. |
| `VIDEO_NOT_FOUND` | The specified video has been deleted or made private. | Remove the URL from your input list. |
| `RATE_LIMIT_EXCEEDED` | Too many requests were sent in a short time. | Enable Apify Proxy or increase delay between requests. |
| `SYSTEM_BUSY` | YouTube temporarily blocked the request. | The actor will automatically retry; if it persists, use Residential Proxies. |

### Can I use YouTube Shorts Scraper with the Apify API?

Yes. You can use the Apify API which will give you programmatic access to the Apify platform. The API is organized around RESTful HTTP endpoints that enable you to manage, schedule, and run Apify Actors. The API also lets you access any datasets, monitor actor performance, fetch results, create and update versions, and more.

You can use the `apify-client` NPM package to access the API using Node.js, or the `apify-client` PyPI package to access the API using Python.

Check out the Apify API reference docs for full details, or click on the API tab for code examples.

### Can I use YouTube Shorts Scraper through an MCP Server?

With Apify API, you can use almost any Actor in conjunction with an MCP server. You can connect to the MCP server using clients like ClaudeDesktop and LibreChat, or even build your own. Read all about how you can set up Apify Actors with MCP.

For YouTube Shorts Scraper, go to the MCP tab and then go through the following steps:

1. Start a Server-Sent Events (SSE) session to receive a `sessionId`
2. Send API messages using that `sessionId` to trigger the scraper
3. The message starts the YouTube Shorts Scraper with the provided input
4. The response should be: `Accepted`

### Turtorial

https://youtu.be/qbY07K0ATbA

### FAQ

**How do I track trending YouTube Shorts by keyword?**
You can instantly track specific topics by inputting your desired keywords directly into the actor's starting parameters. The tool will search the platform and return the top-ranking Shorts for those precise keywords. This immediate access to data shows you exactly which videos are capturing the most views and highest engagement around any given subject.

**Can I use this to build a YouTube Shorts dataset for AI training?**
Yes, this actor is perfectly suited for machine learning experts and AI researchers who need large volumes of text. You can easily schedule daily automated runs to continuously collect data without manual intervention. Over time, this allows you to build a massive, structured dataset packed with rich metadata fields for your specialized training pipelines.

**Does this support YouTube Shorts bulk export?**
Absolutely. Once any extraction run successfully finishes, you can download all of your collected records in bulk using the standard platform tools. Supported formats for your exports include easy-to-use JSON, CSV, XML, Excel, and HTML table formats, making integration into your workflow completely seamless.

**How is this different from the YouTube Shorts API?**
The official youtube shorts api restricts developers with tight quota allocations and requires a complex Google Cloud project just to get started. This actor completely bypasses those hurdles by requiring zero technical setup and imposing no daily limits. You can launch a run in minutes and extract as much information as your project demands.

**Can I monitor a competitor's YouTube Shorts performance?**
Yes. You can paste your competitor's specific channel URLs or basic usernames into the actor and extract their entire Shorts library. This gives you unparalleled instant visibility into their historical view numbers, audience engagement metrics, and posting strategies over significant periods of time.

**What metadata fields does the YouTube Shorts extractor return?**
It returns a comprehensively structured dataset containing the video title, exact URL, total views, likes, and total comment counts. Additionally, it provides the precise publish date, exact channel name, total subscriber count, specific hashtags used, and highly contextual channel details.

**Is this a no-code YouTube Shorts scraper?**
Yes, this youtube shorts scraper is completely accessible for all non-technical users and domain experts. You simply fill out a basic web form with your target channels or keywords and click a start button to run the process directly from your browser. There is absolutely no programming or server management required on your part.

**How many Shorts can I extract per run?**
There is no hard limit built into the tool regarding the number of Shorts you can extract during a single operation. You are entirely free to extract thousands of individual records in a single continuous run. The only thing you need to do is adjust the maximum result limit upward in your initial input settings.

# Actor input Schema

## `channels` (type: `array`):

Enter YouTube @handles, usernames, or channel IDs/URLs (one per line).

## `maxResultsShorts` (type: `integer`):

Maximum number of Shorts videos to scrape per channel.

## `oldestPostDate` (type: `string`):

Scrape only YouTube Shorts posted on or after this date. Format: YYYY-MM-DD

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

Apify Proxy is recommended to avoid rate limits or blocking.

## Actor input object example

```json
{
  "channels": [
    "@vsauce"
  ],
  "maxResultsShorts": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

List of Shorts scraped from YouTube

# 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 = {
    "channels": [
        "@vsauce"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("spectre_scrape/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 = {
    "channels": ["@vsauce"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("spectre_scrape/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 '{
  "channels": [
    "@vsauce"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call spectre_scrape/youtube-shorts-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Shorts Scraper",
        "description": "Extract YouTube Shorts data from one or multiple channels/handles without unofficial API quotas. Get video URL, caption, timestamp, likes, dislikes, views and comments count, basic channel info, and more.",
        "version": "1.0",
        "x-build-id": "IgKxz5aZrPXoxqLhT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/spectre_scrape~youtube-shorts-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-spectre_scrape-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/spectre_scrape~youtube-shorts-scraper/runs": {
            "post": {
                "operationId": "runs-sync-spectre_scrape-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/spectre_scrape~youtube-shorts-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-spectre_scrape-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": [
                    "channels"
                ],
                "properties": {
                    "channels": {
                        "title": "YouTube Channels",
                        "type": "array",
                        "description": "Enter YouTube @handles, usernames, or channel IDs/URLs (one per line).",
                        "default": [
                            "@vsauce"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResultsShorts": {
                        "title": "Max Shorts per channel",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of Shorts videos to scrape per channel.",
                        "default": 50
                    },
                    "oldestPostDate": {
                        "title": "Only scrape newer than (YYYY-MM-DD)",
                        "type": "string",
                        "description": "Scrape only YouTube Shorts posted on or after this date. Format: YYYY-MM-DD"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy is recommended to avoid rate limits or blocking.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
