# YouTube Shorts Scraper: Channels & Keyword Search (`deepmine/youtube-shorts-scraper`) Actor

YouTube Shorts scraper: every Short of any channel or keyword search with exact views, likes and comments, publish time, duration, hashtags, the sound and song used, and the channel's subscribers and stats. Type channel names or search terms, or paste Shorts links. No login, no API key.

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

## Pricing

from $1.19 / 1,000 shorts

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

YouTube Shorts scraper: type channel names or search terms, or paste Shorts links, and get one row per Short with its views, exact likes and comments, publish time, duration, hashtags, the sound and song it uses, and the channel's subscribers and stats. No login, no YouTube API key, no browser.

| 🎬 Short | 📺 Channel | 👀 Views | ❤️ Likes | 💬 Comments | 📅 Published | ⏱️ Length | 🎵 Sound |
|---|---|---|---|---|---|---|---|
| [Giving $10,000 To A Random Subscriber](https://www.youtube.com/shorts/aNI2jv7lBPQ) | MrBeast | 18,015,036 | 567,452 | 14,249 | 2026-10-09 16:00 UTC | 00:00:40 | Original Sound |
| [What’s Inside My Briefcase?](https://www.youtube.com/shorts/CEJXqm2eiJ0) | MrBeast | 59,622,596 | 982,473 | 21,268 | 2026-09-27 16:00 UTC | 00:00:40 | Original Sound |
| [New York Street Food #shorts](https://www.youtube.com/shorts/l5licRK8wrg) | lifeofcian | 502,119 | 19,821 | 217 | 2026-09-05 20:01 UTC | 00:00:39 | Original Sound |

<sub>Collected 2026-10-11 with the prefilled input: MrBeast's newest Shorts and the Shorts search "street food".</sub>

**$1.49 per 1,000 Shorts on Starter** ($1.99 Free, $1.29 Scale, $1.19 Business). The prefilled run (20 Shorts) costs about $0.03. Nothing per run, nothing for Shorts your filters leave out, and subtitles are included when you turn them on.

### What you type

| Input | Example | You get |
|---|---|---|
| 📺 Channels | `MrBeast`, `@nasa`, `https://www.youtube.com/@TED` | The channel's Shorts tab: newest first, or most popular / oldest first |
| 🔍 Search Shorts by keyword | `street food` | The Shorts YouTube's Shorts search returns, with its sort and upload-date filters |
| 🔗 Shorts or channel links | `https://www.youtube.com/shorts/...` | The full details of each Short |

Set **📱 Max Shorts per channel or search** (20 when an API call leaves it out). **📅 Published after** keeps only Shorts from that date on, e.g. `2026-09-01` or `30 days`: a channel's Shorts are then read newest first and reading stops soon after the first older Short (only the few already being read are read past it), and nothing is charged for Shorts the date leaves out.

### Speed

Measured on Apify at the default 1,024 MB on 2026-10-11: the prefilled run (20 Shorts) took 5.6-11.3 s of run time over 5 runs, with the first row 2.0-4.7 s in (the slowest was a new build's first start); MrBeast and nasa's Shorts plus the search "street food", 100 each, saved 216-241 Shorts in 20.7-29.9 s (2 runs).

### Moving from streamers' YouTube Shorts Scraper

Its saved inputs run here unchanged: `channels`, `maxResultsShorts`, `oldestPostDate` and `sortChannelShortsBy` (`NEWEST`, `POPULAR`, `OLDEST`). Every row has the keys its rows have, under the same names (`title`, `type`, `id`, `url`, `thumbnailUrl`, `viewCount`, `date`, `likes`, `commentsCount`, `duration`, `text`, `hashtags`, the `channel...` fields, `aboutChannelInfo`, `inputChannelUrl`, `fromYTUrl`, `fromChannelListPage`, `input`...), so code that reads them keeps working.

| | streamers/youtube-shorts-scraper | This Actor |
|---|---|---|
| Price per 1,000 Shorts, Starter | $3.00 | $1.49 |
| Speed, 5 TED Shorts: first row / whole run (2026-10-07) | 15.6 s / 25.9 s | 5.8 s / 8.5 s |
| Date filter | $1.00 per 1,000 extra | free |
| Find Shorts by keyword | no (channels only) | yes |
| Sound and song | no | `soundTitle`, `musicTitle`, `musicArtist` |
| Subtitles | no | optional, no extra cost |

Prices are from the Apify Store on 2026-10-11.

### Output

One row per Short. A real row, shortened:

```json
{
  "title": "One of the best Noodles in Kanpur😍🔥|| Indian Street Food",
  "type": "shorts",
  "id": "fwtbl_bfKMs",
  "url": "https://www.youtube.com/shorts/fwtbl_bfKMs",
  "thumbnailUrl": "https://i.ytimg.com/vi/fwtbl_bfKMs/maxresdefault.jpg",
  "viewCount": 89905,
  "likes": 1685,
  "commentsCount": 4,
  "date": "2026-10-07T06:30:04Z",
  "duration": "00:00:30",
  "durationSeconds": 30,
  "hashtags": [],
  "soundTitle": "Slow Motion Angreza (From \"Bhaag Milkha Bhaag\")",
  "musicTitle": "Slow Motion Angreza (From \"Bhaag Milkha Bhaag\")",
  "musicArtist": "Shankar Ehsaan Loy, Sukhwinder Singh, Loy Mendonsa & Shankar Mahadevan",
  "channelName": "bhukkad dilli ke",
  "channelUrl": "https://www.youtube.com/channel/UCmpdfNHjVuOSvaBR2Wtdu8A",
  "channelUsername": "bhukkaddillike",
  "numberOfSubscribers": 3960000,
  "channelTotalVideos": 1883,
  "channelTotalViews": 4549552598,
  "input": "street food",
  "fromChannelListPage": null,
  "searchQuery": "street food"
}
```

Also in every row: `text` (the description) and `descriptionLinks`, `keywords` (tags), `category`, `dateText`, `isAgeRestricted`, `isMembersOnly`, `isPaidContent`, `isUnlisted`, `commentsTurnedOff`, `collaborators`, `channelId`, `isChannelVerified`, `channelAvatarUrl`, `channelBannerUrl`, `channelDescription`, `channelDescriptionLinks`, `channelJoinedDate`, `channelLocation`, `aboutChannelInfo` (the channel fields again, in one object, as streamers' rows have them), `inputChannelUrl`, `fromYTUrl`, `order` and `scrapedAt`. `subtitles` and `subtitlesStatus` are filled when you turn subtitles on. `translatedTitle`, `translatedText`, `transcriptionUrl`, `aiVideoDescription`, `aiVideoSummary` and `isMonetized` are always `null` (kept so rows line up with streamers' YouTube Actors).

Output tabs: **📱 Shorts**, **📈 Stats**, **🎵 Sounds & Songs**, **📝 Details**, **📺 Channels** and **💬 Subtitles**. Download as JSON, CSV, Excel or HTML, or read it through the Apify API.

### Good to know

- **Views, likes and comments are exact** (10,331,356 likes, 37,487 comments). Subscribers are rounded as YouTube shows them (MrBeast: 521M, saved as 521000000).
- **The publish time is exact** (to the second, UTC) for almost every Short; the few that YouTube's free sources don't date in time keep the day.
- **Sound:** `soundTitle` is what the Shorts player shows on the sound button: `Original Sound`, or the title of the video the sound comes from. When YouTube identified a song, `musicTitle` and `musicArtist` name it.
- **Each Short is charged once per run**, even when two of your channels or searches list it. Your spending limit is respected to the Short.
- **Subtitles** (Shorts that have them): turn them on under 📝 Subtitles; SRT, WebVTT, XML or plain text, at no extra cost.
- Want long videos and live streams too? [YouTube Scraper](https://apify.com/deepmine/youtube-scraper) reads every kind of video with the same fields.

### Related Actors

- [YouTube Scraper](https://apify.com/deepmine/youtube-scraper): channel videos, Shorts and live streams, search, playlists and video links.
- [YouTube Comments Scraper](https://apify.com/deepmine/youtube-comments-scraper): every comment and reply of any video or Short.
- [YouTube Transcript API](https://apify.com/deepmine/youtube-transcript-scraper): transcripts with timestamps, in the video's language or yours.

### Did it help?

A short review helps other people find it: https://apify.com/deepmine/youtube-shorts-scraper/reviews

# Actor input Schema

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

Each channel's Shorts tab, e.g. MrBeast, @nasa or a channel link. Each gives up to 📱 Max Shorts, newest first unless you pick another order below.

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

Words you'd type in YouTube's search box, e.g. street food. Each returns up to 📱 Max Shorts from YouTube's Shorts search.

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

Shorts links (youtube.com/shorts/...) for the full details of each Short. A channel link or @handle reads its Shorts tab, as in 📺 Channels. Empty = none.

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

Shorts per channel and per search term. You pay per Short saved. Left out (API): 20.

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

Order of each channel's Shorts (the Shorts tab's Latest / Popular / Oldest). Empty = newest first. With 📅 Published after set, Shorts are read newest first.

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

Keep only Shorts published on or after this date, e.g. 2026-09-01 or 30 days. A channel's Shorts stop at the first older one. Empty = any date.

## `sortingOrder` (type: `string`):

Order of search results. Empty = YouTube's relevance.

## `dateFilter` (type: `string`):

Only search results uploaded in this period. Empty = any time.

## `transcriptionAndSubtitle` (type: `string`):

Download each Short's own subtitles into the subtitles column. Speech-to-text transcription is not offered: saved inputs that ask for it still run, with a note in the run's status message.

## `subtitlesLanguage` (type: `string`):

A language code such as en, de, es, pt-BR or ja, or any for the video's own language. Only used when subtitles are on.

## `subtitlesFormat` (type: `string`):

How the subtitles are written. Plain text has no times.

## `maxResults` (type: `integer`):

Regular (non-Shorts) videos per channel, playlist or search term. 0 = none (this listing reads Shorts; YouTube Scraper reads every kind).

## `maxResultStreams` (type: `integer`):

Live and past live streams per channel (its Live tab) or search term. 0 = none.

## `lengthFilter` (type: `string`):

Only search results of this length. Empty = any length. Values: under4, between420, plus20.

## `videoType` (type: `string`):

Search for videos or for movies. Empty = videos. Values: video, movie.

## `searchFeatures` (type: `array`):

Only search results with all of these, e.g. HD and Subtitles/CC. Empty = no feature filter. Values: isLive, is4K, isHD, hasSubtitles, hasCC, is360, isVR180, is3D, isHDR, hasLocation, isBought.

## `isHD` (type: `boolean`):

Same as picking it in 'Search: features'. Accepted so saved inputs from other YouTube scrapers run.

## `hasSubtitles` (type: `boolean`):

Same as picking it in 'Search: features'. Accepted so saved inputs from other YouTube scrapers run.

## `hasCC` (type: `boolean`):

Same as picking it in 'Search: features'. Accepted so saved inputs from other YouTube scrapers run.

## `is3D` (type: `boolean`):

Same as picking it in 'Search: features'. Accepted so saved inputs from other YouTube scrapers run.

## `isLive` (type: `boolean`):

Same as picking it in 'Search: features'. Accepted so saved inputs from other YouTube scrapers run.

## `isBought` (type: `boolean`):

Same as picking it in 'Search: features'. Accepted so saved inputs from other YouTube scrapers run.

## `is4K` (type: `boolean`):

Same as picking it in 'Search: features'. Accepted so saved inputs from other YouTube scrapers run.

## `is360` (type: `boolean`):

Same as picking it in 'Search: features'. Accepted so saved inputs from other YouTube scrapers run.

## `hasLocation` (type: `boolean`):

Same as picking it in 'Search: features'. Accepted so saved inputs from other YouTube scrapers run.

## `isHDR` (type: `boolean`):

Same as picking it in 'Search: features'. Accepted so saved inputs from other YouTube scrapers run.

## `isVR180` (type: `boolean`):

Same as picking it in 'Search: features'. Accepted so saved inputs from other YouTube scrapers run.

## `aiVideoDescription` (type: `boolean`):

Accepted so saved inputs from other YouTube scrapers run: not offered, ignored (AI text columns are not written; subtitles are always in the row).

## `aiVideoSummary` (type: `boolean`):

Accepted so saved inputs from other YouTube scrapers run: not offered, ignored (AI text columns are not written; subtitles are always in the row).

## `saveSubsToKVS` (type: `boolean`):

Accepted so saved inputs from other YouTube scrapers run: not offered, ignored (AI text columns are not written; subtitles are always in the row).

## `sortChannelShortsBy` (type: `string`):

NEWEST, POPULAR or OLDEST: order of the Shorts read for 'channels' (the Shorts tab's Latest / Popular / Oldest). Empty = the 'Channel: sort videos by' order.

## `preferAutoGeneratedSubtitles` (type: `boolean`):

Take YouTube's automatic subtitles before a person-made track.

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

Leave as is: Apify datacenter proxy works for every YouTube call this Actor makes.

## Actor input object example

```json
{
  "channels": [
    "MrBeast"
  ],
  "searchQueries": [
    "street food"
  ],
  "maxResultsShorts": 10,
  "transcriptionAndSubtitle": "NONE",
  "subtitlesLanguage": "en",
  "subtitlesFormat": "srt",
  "maxResults": 0,
  "maxResultStreams": 0,
  "preferAutoGeneratedSubtitles": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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 = {
    "channels": [
        "MrBeast"
    ],
    "searchQueries": [
        "street food"
    ],
    "maxResultsShorts": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/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": ["MrBeast"],
    "searchQueries": ["street food"],
    "maxResultsShorts": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("deepmine/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 '{
  "channels": [
    "MrBeast"
  ],
  "searchQueries": [
    "street food"
  ],
  "maxResultsShorts": 10
}' |
apify call deepmine/youtube-shorts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deepmine/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/tDycQr9Lc2YqYlBQx/builds/W4KKLyjiWIZw0teFJ/openapi.json
