# YouTube Shorts Scraper - Shorts by Channel or Keyword (`alom/youtube-shorts-scraper`) Actor

Scrape YouTube Shorts from any channel's Shorts tab or from a Shorts search: title, views, URL, thumbnail and channel, with optional likes, date and duration. Newest or most popular first. No API key, no quota, no login.

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

## Pricing

from $0.80 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## YouTube Shorts Scraper: Shorts by Channel or Keyword

Scrape **YouTube Shorts** into JSON, CSV or Excel, from **any channel's Shorts tab** or from a **Shorts search** by
keyword. You get **one row per Short**: title, URL, view count, thumbnail and channel, and on request likes, comment
count, exact upload time, duration, description and hashtags.

- **No API key, no quota, no login.** It reads what youtube.com shows a logged-out visitor.
- **By channel:** pages through a channel's Shorts tab, newest or most popular first.
- **By keyword:** YouTube's search with the Type filter set to Shorts.
- **Full details** on request (`includeVideoDetails`): likes, exact views, upload time, duration, hashtags.
- **Monitoring:** scheduled runs that return only Shorts you haven't received yet.

This Actor is a focused version of the [YouTube Scraper](https://apify.com/alom/youtube-scraper) (same code). Use
the YouTube Scraper if you also need regular videos, comments, playlists, hashtags or community posts.

### What can you use it for?

- **Trend research:** which Shorts take off for a keyword, and who makes them.
- **Creator analysis:** a creator's most popular Shorts and how often they post.
- **Competitor tracking:** new Shorts from a list of channels every day.

### Input

| Field | What it does |
|---|---|
| `startUrls` | Channel URLs (`youtube.com/@MrBeast`, `/channel/UC…`): their Shorts tab. Single `/shorts/…` URLs work too. |
| `channels` | Optional: channel names or handles (`nasa`, `@mkbhd`). |
| `searchQueries` | Keywords to search Shorts for. |
| `maxResultsShorts` | Max Shorts per channel or keyword. Default 50. |
| `sortVideosBy` | Channels: `NEWEST` (default) or `POPULAR`. |
| `includeVideoDetails` | Open every Short for likes, exact counts, upload time, duration, description. Slower, same price. |
| `onlyNewSinceLastRun` + `monitorName` | Skip Shorts an earlier run with the same monitoring name returned. |

```json
{ "startUrls": [{ "url": "https://www.youtube.com/@MrBeast" }], "searchQueries": ["cooking hacks"], "maxResultsShorts": 200 }
```

`channelUrls`, `youtubeHandles`, `keywords`, `maxShorts` and `sortChannelShortsBy` are understood too.

### Output example

```json
{
    "type": "shorts",
    "id": "9btQkaci6kA",
    "url": "https://www.youtube.com/shorts/9btQkaci6kA",
    "title": "How Zach King Gets Away With Doing Graffiti",
    "viewCount": 1000000000,
    "viewCountText": "1B views",
    "thumbnailUrl": "https://i.ytimg.com/vi/9btQkaci6kA/oar1.jpg?…",
    "likes": null,
    "date": null,
    "duration": null,
    "channelId": "UCq8DICunczvLuJJq414110A",
    "channelName": "Zach King",
    "channelUrl": "https://www.youtube.com/channel/UCq8DICunczvLuJJq414110A",
    "channelUsername": "ZachKing",
    "numberOfSubscribers": 43500000,
    "channelLocation": "United States",
    "channelTotalVideos": 866,
    "fromChannelListPage": "shorts",
    "order": 0,
    "fromYTUrl": "https://www.youtube.com/@ZachKing/shorts",
    "input": "ZachKing",
    "scrapedAt": "2026-10-05T10:50:01.978Z"
}
```

The Shorts tab and search show only the title, a rounded view count and the
thumbnail (`viewCount` is that rounded number); `likes`, `date`, `duration`, `text` (description) and `hashtags` are filled with `includeVideoDetails`
and `null` otherwise. Rows from a channel carry the channel's subscribers, country and totals; rows from search
carry the channel's name and id.

### How much does it cost?

Pay per result, platform usage (compute and proxy) included. One result = one
Short.

| Apify plan | Price per 1,000 results |
|---|---|
| Free | $1.50 |
| Starter (Bronze) | $1.20 |
| Scale (Silver) | $1.00 |
| Business (Gold) and above | $0.80 |

1,000 Shorts cost **$1.50** on the Free plan and **$0.80** on Business. `includeVideoDetails` does not change the price. Inputs that fail (a deleted video, an unknown channel, a URL this Actor doesn't take) produce no row and no
charge, and so do rows skipped by monitoring.

### Monitoring (only new Shorts)

Turn on **Only new Shorts since my last run**, give it a name and schedule the run. Each run returns only the
Shorts no earlier run with that name returned; skipped Shorts are not charged. Works best with channels (newest
first); search results reshuffle between runs.

### Limitations

- **Shorts tiles have no date, duration or likes.** Turn on `includeVideoDetails` for them (about 2 extra requests
  per Short, so roughly 5-10x slower; the price per row stays the same).
- **Shorts search ends after a few hundred results per keyword** (YouTube stops paging). Use several keywords.
- A few search results can be regular videos when YouTube mixes them into the Shorts results.
- The Shorts tab has **Newest** and **Popular** order; there is no date filter for Shorts here (use the YouTube
  Channel Scraper or the YouTube Scraper with `oldestPostDate` for that).
- Playlists, hashtags and regular video URLs are not accepted: they are skipped and named in the status message.

### FAQ

**Do I need a YouTube account or an API key?** No.

**Is it legal?** It collects publicly visible data. You are responsible for how you use it, including data
protection rules for personal data.

**Why did my run say "partial"?** Some inputs could not be finished (for example the run hit its timeout).
Everything scraped so far is in the dataset; the status message says what was missed.

### More scrapers from the same developer

- [YouTube Scraper](https://apify.com/alom/youtube-scraper): videos, channels, Shorts, comments, subtitles and community posts without the API quota
- [YouTube Channel Scraper](https://apify.com/alom/youtube-channel-scraper): every video of a channel with views, dates and the channel's stats
- [YouTube Comments Scraper](https://apify.com/alom/youtube-comments-scraper): comments and replies of any video, top or newest first
- [Google Trends API & Scraper](https://apify.com/alom/google-trends-scraper): interest over time, regions, related queries and Trending Now, a pytrends alternative
- [Threads Scraper](https://apify.com/alom/threads-scraper): posts, profiles, replies and keyword search on Meta Threads, no login
- [Bilibili Scraper](https://apify.com/alom/bilibili-scraper): videos, creators, full comment threads and danmaku from B站, no login
- [Google Hotels Scraper](https://apify.com/alom/google-hotels-scraper): hotel prices from every booking site across dates, room rates and reviews
- [Google Ads Transparency Scraper](https://apify.com/alom/google-ads-transparency-scraper): every Google ad a competitor runs, with the real ad copy
- [Threads Account Finder](https://apify.com/alom/threads-lead-finder): Threads accounts by keyword with followers, bio links and the contacts they list
- [Threads Hashtag & Keyword Monitor](https://apify.com/alom/threads-keyword-monitor): only the new posts for your keywords and #hashtags, for scheduled runs
- [Google Flights Scraper](https://apify.com/alom/google-flights-scraper): flight prices, airlines, layovers and a cheapest-date calendar for any route

### Feedback

Missing a field, found a bug, or need a feature? Open an issue in the **Issues** tab and I'll take a look. If this
Actor saved you time, a short review on the Store page helps other people find it.

# Actor input Schema

## `startUrls` (type: `array`):

Channel URLs (<code>youtube.com/@MrBeast</code>, <code>/channel/UC…</code>): their Shorts tab. Single Shorts URLs (<code>/shorts/…</code>) work too.

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

Handles with or without <code>@</code> (e.g. <code>nasa</code>, <code>@mkbhd</code>). Same as putting the channel URL above.

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

Keywords to search Shorts for (YouTube's search with Type = Shorts).

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

YouTube's Shorts search ends after a few hundred results per keyword.

## `sortVideosBy` (type: `string`):

The sort buttons on a channel's Shorts tab.

## `includeVideoDetails` (type: `boolean`):

Shorts tiles show only the title and rounded views. This opens every Short to add exact views, likes, comment count, upload time, duration, description and hashtags. About 2 extra requests per Short; the price per row stays the same.

## `onlyNewSinceLastRun` (type: `boolean`):

Skip Shorts that an earlier run with the same <b>Monitoring name</b> already returned (they are not charged). Schedule the run for daily or weekly monitoring.

## `monitorName` (type: `string`):

Any name, e.g. <code>competitors-weekly</code>. Runs with the same name share their memory. Defaults to <code>default</code>.

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

How many URLs are processed at the same time.

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

The default (Apify datacenter proxy) works for YouTube and is included in the price. If YouTube starts blocking it, the run switches to residential proxies on its own and says so in the log.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.youtube.com/@MrBeast"
    }
  ],
  "maxResultsShorts": 30,
  "sortVideosBy": "NEWEST",
  "includeVideoDetails": false,
  "onlyNewSinceLastRun": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.youtube.com/@MrBeast"
        }
    ],
    "maxResultsShorts": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("alom/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 = {
    "startUrls": [{ "url": "https://www.youtube.com/@MrBeast" }],
    "maxResultsShorts": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("alom/youtube-shorts-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.youtube.com/@MrBeast"
    }
  ],
  "maxResultsShorts": 30
}' |
apify call alom/youtube-shorts-scraper --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/j7Y7MNTMnxAJrsaut/builds/2uTlVBDP0oRgHUIzg/openapi.json
