# YouTube Shorts Scraper - Views, Channels, Hashtags & Transcript (`topapi/youtube-shorts-scraper`) Actor

Scrape YouTube Shorts from channels, hashtags, keyword searches or URLs: exact views, likes, comment count, publish date and time, duration, hashtags, sound, tagged products, channel subscribers and transcript. Monitor mode returns only new Shorts or count changes.

- **URL**: https://apify.com/topapi/youtube-shorts-scraper.md
- **Developed by:** [Top Api](https://apify.com/topapi) (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 $1.70 / 1,000 short scrapeds

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/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

### What does YouTube Shorts Scraper do?

**YouTube Shorts Scraper** collects YouTube Shorts from a channel's Shorts tab, a hashtag feed, a keyword search or a list of Short URLs, and returns one row per Short with exact views, likes and comment count, the publish date and time, duration, hashtags, the sound it uses and the creator's channel stats. Built for creator-economy analysts, social media and influencer marketers, and trend researchers who need Shorts performance data in a spreadsheet or API instead of copying numbers off the app.

Also searched as: YouTube Shorts API · YouTube Shorts views scraper · YouTube hashtag Shorts scraper · YouTube channel Shorts scraper.

<a href="https://console.apify.com/actors/29dVYMtOKzzbFFgtD"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/youtube-shorts-scraper-source.png" alt="YouTube Shorts tab of a channel that YouTube Shorts Scraper turns into rows" style="width:70%"></a>

- **Four ways in, one run:** channels (every Short on the tab, newest, most popular or oldest first), hashtag feeds, keyword searches with YouTube's Shorts filter, and pasted Short URLs or ids - mix them freely.
- **Exact numbers, not "1.2M":** views, likes and comments come from YouTube's own answer for each Short. Across 228 Shorts read on Apify, 95% had an exact like count (the rest are hidden by the creator) and 91% an exact comment count (the rest have comments turned off).
- **The real publish time:** date and time to the second on 228 of 228 Shorts, plus duration, category and creator tags.
- **Sound, products and AI labels:** the sound behind every Short (title, artist, source video, link to the sound page), products tagged in the Short, and YouTube's "How this was made" labels such as Made with AI and Auto-dubbed.
- **Transcript add-on:** the spoken text from YouTube's own caption track, in the Short's original language, with timestamps.
- **Monitor mode:** schedule the same input and get only new Shorts - or new Shorts plus count changes, with deltas.
- **No login, cookies or YouTube API key:** no quota, no OAuth, no proxy setup.
- **Pay only for delivered rows:** no start fee.
- **Export anywhere, works with AI agents:** JSON, CSV, Excel; schedules, webhooks, Make, Zapier, n8n; the Apify API and MCP.

### What data can you get from YouTube Shorts?

<table>
<tr><td>🎬 Short id and URL (`id`, `url`)</td><td>📝 Title and full description (`text`)</td><td>#️⃣ Hashtags (`hashtags`)</td></tr>
<tr><td>👁️ Exact views (`viewCount`)</td><td>❤️ Exact likes (`likes`)</td><td>💬 Exact comment count (`commentsCount`)</td></tr>
<tr><td>📈 Engagement rate and views per day</td><td>📅 Publish date-time (`date`)</td><td>⏱️ Duration (`duration`, `durationSeconds`)</td></tr>
<tr><td>🎵 Sound: title, artist, source video (`sound`)</td><td>🛍️ Tagged products (`taggedProducts`)</td><td>🤖 AI / auto-dub labels (`contentLabels`)</td></tr>
<tr><td>🏷️ Category and creator tags (`keywords`)</td><td>🖼️ Thumbnails and first frame</td><td>🔗 Links in the description</td></tr>
<tr><td>👤 Channel name, handle, id</td><td>👥 Subscribers (`numberOfSubscribers`)</td><td>✅ Verified badge</td></tr>
<tr><td>🌍 Channel country, join date</td><td>📊 Lifetime channel views and videos</td><td>🔗 Channel links and About text</td></tr>
<tr><td>🗣️ Transcript with timestamps (add-on)</td><td>🆕 Monitor fields: `isNew`, `statsDelta`</td><td>🧭 Source, input and position</td></tr>
</table>

On the 25-Short live run below, every row had views, publish time, duration, category, sound and channel subscribers; 84% had a visible like count, 96% open comments and 76% a transcript.

### How to scrape YouTube Shorts with YouTube Shorts Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) - $5 of monthly credit, no card needed.
2. Open [YouTube Shorts Scraper](https://apify.com/topapi/youtube-shorts-scraper) and click **Try for free**.
3. Add channels, hashtags, search keywords or Short URLs, and set **Max Shorts per source**.
4. Optionally set a date window, minimum views or likes, and turn on **Add transcript**.
5. Click **Start**. Rows stream into the dataset as each Short is read.
6. Open **Storage** and **Export** as JSON, CSV or Excel - or put the input on a schedule.

### ⬇️ YouTube Shorts Scraper input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | At least one source; with none, the two sample channels run. |
| `channels` | List | Handles, channel URLs or ids: `@MrBeast`, `nasa`, `https://www.youtube.com/@mkbhd/shorts`, `UCX6OQ3DkcsbYNE6H8uQQuVA`. Prefill: `@MrBeast`, `@NASA` |
| `hashtags` | List | `cooking`, `#asmr`, or a `/hashtag/<tag>/shorts` URL. One word each. |
| `searchQueries` | List | Keywords searched with YouTube's Shorts filter on: `kitchen hacks`. |
| `shortUrls` | List | `/shorts/` links, `youtu.be` links, `watch?v=` links or bare 11-character ids. |
| **🎯 Filters** | | |
| `sortBy` | Select | YouTube's default, Newest first, Most popular, Oldest first (channels only). Default: YouTube's default |
| `postedAfter` / `postedBefore` | Text | `2026-09-01`, `7 days`, `24 hours`. Newest-first feeds stop paging once past the window. |
| **✂️ Refine results** | | |
| `minViews`, `minLikes` | Integer | Exact-count floors. `0` = off. |
| `titleKeywords` | List | Keep Shorts whose title or hashtags contain one of these words. |
| `excludeKeywords` | List | Drop Shorts whose title or description contains one of these words. |
| **➕ Extra data** | | |
| `includeTranscript` | Boolean | Spoken text from YouTube's captions, charged as the **transcript** add-on only on Shorts that have one. Default: `false` |
| `includeChannelDetails` | Boolean | Subscribers, verified badge, banner, About text, country, join date, lifetime views, links. Free. Default: `true` |
| **🔁 Monitoring** | | |
| `monitorMode` | Select | Off / New Shorts only / New Shorts + count changes. Default: Off |
| `monitorStoreName` | Text | Named store that remembers delivered Shorts. Default: `youtube-shorts-monitor` |
| **📦 Output** | | |
| `maxResultsPerSource` | Integer | Cap per channel, hashtag or search; `0` = no cap. Default `30`, prefill `5` |
| `maxItems` | Integer | Cap for the whole run; `0` = none. |
| `compact` | Boolean | Core fields only, sized for AI agents and MCP. |
| **⚙️ Advanced** | | |
| `proxyConfiguration` | Proxy | Fallback only - YouTube is read from the run's own IP first. |
| `maxConcurrency` | Integer | Shorts read at the same time, 1-20. Default `10` |

#### YouTube Shorts input JSON

```json
{
  "channels": ["@MrBeast"],
  "hashtags": ["cooking"],
  "searchQueries": ["kitchen hacks"],
  "shortUrls": ["https://www.youtube.com/shorts/OP-yalWiryc"],
  "maxResultsPerSource": 8,
  "maxItems": 25,
  "includeTranscript": true
}
```

#### Pick the YouTube Shorts source that answers your question

A **channel** gives you everything one creator posted, in order - use it for competitor and creator analytics. A **hashtag** gives you YouTube's own feed for that tag - use it for trend and campaign tracking. A **search** gives you what YouTube ranks for a phrase - use it for discovery. **Do:** `cooking` in `hashtags`. **Don't:** `#cooking recipes` (a hashtag is one word; put phrases in `searchQueries`).

#### Combine sort order and a date window on YouTube Shorts channels

A channel's Shorts tab is strictly newest first, so `postedAfter: "7 days"` stops reading as soon as it reaches older Shorts. **Most popular** reads the channel's top Shorts of all time. Searches accept Newest first and Most popular, but YouTube orders Shorts search results loosely; hashtag feeds have no sort at all and always use YouTube's order.

#### Keep one monitor store per YouTube Shorts watch list

With **New Shorts only**, a scheduled run of the same channels delivers only Shorts it has not delivered before, and on a newest-first channel it stops reading at the first Short it already knows - an empty poll took 1.9 seconds. Use a different `monitorStoreName` for each client or campaign so their memories never mix.

### ⬆️ YouTube Shorts Scraper output

Every Short becomes one dataset item. Here is the table view of a live run with a channel, a hashtag, a keyword search and a Short URL, transcripts on:

<a href="https://console.apify.com/actors/29dVYMtOKzzbFFgtD"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/youtube-shorts-scraper-output.png" alt="YouTube Shorts Scraper output table with views, likes, comments, dates, sound and transcripts" style="width:70%"></a>

One row from that run, trimmed to the key fields:

```json
{
  "id": "LiH-P4rSkLI",
  "url": "https://www.youtube.com/shorts/LiH-P4rSkLI",
  "title": "Can You Pass This Classroom Quiz?",
  "viewCount": 62282923,
  "likes": 1743395,
  "commentsCount": 62763,
  "engagementRate": 0.028999,
  "date": "2026-08-11T16:00:06.000Z",
  "datePrecision": "second",
  "duration": "00:01:14",
  "hashtags": ["#oldnavypartner"],
  "sound": { "title": "Original Sound", "artist": "@MrBeast", "isOriginalSound": true },
  "channelUsername": "MrBeast",
  "numberOfSubscribers": 519000000,
  "isChannelVerified": true,
  "channelLocation": "United States",
  "transcriptLanguage": "en",
  "input": "@MrBeast",
  "sourceType": "channel"
}
```

#### YouTube Shorts fields

Fill = share of the 25 rows of live run `clshusAIx37a9HfdS` with a value (empty lists count as empty).

| Field | Type | What it is | Fill |
|---|---|---|---|
| `id`, `url`, `title` | string | Short id, `/shorts/` URL, title | 100% |
| `text` | string | Full description (`""` when none was added) | 48% |
| `hashtags` | array | Hashtags from title and description | 60% |
| `descriptionLinks` | array | Links in the description `{text, url}` | 12% |
| `viewCount` | integer | Exact views | 100% |
| `likes` / `likesHidden` | integer / boolean | Exact likes; null + `likesHidden: true` when the creator hides them | 84% / 100% |
| `commentsCount` / `commentsTurnedOff` | integer / boolean | Exact comment count; null when comments are off | 96% / 100% |
| `engagementRate` | number | (likes + comments) / views; null when likes are hidden | 84% |
| `viewsPerDay`, `daysSincePublished` | number | Velocity since publishing | 100% |
| `date`, `datePrecision`, `publishedTimeText` | string | Publish date-time (UTC), `second`, "6 days ago" | 100% |
| `duration`, `durationSeconds` | string / integer | Length | 100% |
| `category`, `keywords` | string / array | YouTube category; creator tags | 100% / 12% |
| `sound` | object | Title, artist, artist channel, source video, sound page URL, original or licensed | 100% |
| `contentLabels` | array | "How this was made": Made with AI, Auto-dubbed | 12% |
| `taggedProducts` | array | Products tagged in the Short: title, merchant, URL | 8% |
| `thumbnailUrl`, `thumbnailFrameUrl`, `thumbnails` | string / array | Portrait thumbnail, first frame, every size | 100% / 96% / 100% |
| `isAgeRestricted`, `isFamilySafe`, `isUnlisted`, `isShortsEligible` | boolean | YouTube's flags | 100% |
| `channelName`, `channelUsername`, `channelId`, `channelUrl`, `channelAvatarUrl` | string | Creator identity | 100% |
| `numberOfSubscribers`, `isChannelVerified` | integer / boolean | Subscribers (3 significant digits, as YouTube shows them), badge | 100% |
| `channelTotalViews`, `channelTotalVideos`, `channelJoinedDate` | integer / string | Lifetime channel stats (exact) and join date | 100% |
| `channelLocation`, `channelDescription`, `channelDescriptionLinks`, `channelBannerUrl` | string / array | About panel and banner | 92% / 96% / 60% / 80% |
| `transcript`, `transcriptSegments`, `transcriptLanguage`, `transcriptIsAutoGenerated`, `audioLanguage`, `captionLanguages` | add-on | Spoken text, timed segments, original language | 76% |
| `isNew`, `previousStats`, `statsDelta`, `previousScrapedAt` | monitor | First delivery flag and count changes | monitor runs |
| `input`, `sourceType`, `fromYTUrl`, `order`, `scrapedAt` | provenance | Which input produced the row, and where | 100% |

#### YouTube Shorts error items

When a source returns nothing, an error item says why instead of a silent skip; it is easy to filter on the `error` field: `CHANNEL_DOES_NOT_EXIST`, `CHANNEL_HAS_NO_SHORTS`, `HASHTAG_HAS_NO_SHORTS`, `NO_RESULTS`, `VIDEO_UNAVAILABLE`, `VIDEO_PRIVATE`, `MEMBERS_ONLY`, `AGE_RESTRICTED`, `NOT_A_SHORT` (a regular video URL), `INVALID_INPUT`, and `*_BLOCKED` when YouTube refused every route.

### How can I use YouTube Shorts data?

- 📊 **Creator and channel analysts** - benchmark a channel's entire Shorts back catalogue by views, likes, comments, duration and posting time.
- 🎯 **Influencer marketers** - find creators through hashtag and keyword feeds, then shortlist by subscribers, verified badge, country and engagement rate.
- 🔎 **Trend researchers** - watch a hashtag or keyword daily and see which formats and sounds are rising, with views per day.
- 🛍️ **E-commerce and brand teams** - collect Shorts that tag products and see which merchants and items appear.
- 🎵 **Music and sound analysts** - track which licensed songs and original sounds Shorts use, with a link to each sound page.
- 🤖 **AI and content teams** - feed transcripts, titles and hashtags to an LLM for topic mining, scripts or classification.
- 📈 **Agencies** - schedule Monitor mode on client and competitor channels and get only new uploads or count changes.

### How much does it cost to scrape YouTube Shorts?

YouTube Shorts Scraper is pay-per-result: **$1.70 per 1,000 Shorts**, no start fee (the Pricing tab always shows the live rate). The transcript add-on is **$2.80 per 1,000 Shorts that receive one**.

| Shorts | Cost | With transcripts on every Short |
|---:|---:|---:|
| 10 | $0.017 | $0.045 |
| 100 | $0.17 | $0.45 |
| 1,000 | $1.70 | $4.50 |
| 10,000 | $17.00 | $45.00 |

There is nothing else to pay: Apify platform usage is included in these prices. Measured on Apify at the default 512 MB: the 10-Short prefill in 8 seconds; 50 Shorts from a channel and a hashtag in 29 seconds; 25 Shorts with transcripts in 44 seconds; an empty monitor poll in 1.9 seconds.

### Integrations, API, scheduling & MCP for YouTube Shorts

- **Schedules:** run YouTube Shorts Scraper hourly, daily or weekly from **Schedules**; with Monitor mode each run delivers only new Shorts.
- **Webhooks:** call your URL when a run finishes - push rows to a CRM, a sheet or Slack.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable and Slack through [Apify integrations](https://docs.apify.com/integrations).
- **API:** start runs and read datasets with `apify-client` for [Python](https://apify.com/topapi/youtube-shorts-scraper/api/python) or [JavaScript](https://apify.com/topapi/youtube-shorts-scraper/api/javascript); see the [Apify API reference](https://docs.apify.com/api/v2).
- **MCP / AI agents:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/topapi/youtube-shorts-scraper/api/mcp) and ask for YouTube Shorts in plain language; `compact` keeps answers small.

### More social video scrapers from TopApi

<table>
<tr><td>🎵 <a href="https://apify.com/topapi/tiktok-scraper">TikTok Scraper</a> - profiles, hashtags, feeds</td><td>🎬 <a href="https://apify.com/topapi/tiktok-video-scraper">TikTok Video Scraper</a> - one video by URL</td><td>📸 <a href="https://apify.com/topapi/instagram-scraper">Instagram Scraper</a></td></tr>
<tr><td>🐦 <a href="https://apify.com/topapi/x-profile-scraper">X Profile Scraper</a></td><td>📰 <a href="https://apify.com/topapi/facebook-search-posts-scraper">Facebook Search Posts Scraper</a></td><td>🛒 <a href="https://apify.com/topapi/facebook-marketplace-scraper">Facebook Marketplace Scraper</a></td></tr>
<tr><td>💼 <a href="https://apify.com/topapi/indeed-jobs-scraper">Indeed Jobs Scraper</a></td><td>📈 <a href="https://apify.com/topapi/similarweb-scraper">Similarweb Scraper</a></td><td>⭐ <a href="https://apify.com/topapi/google-maps-reviews-scraper">Google Maps Reviews Scraper</a></td></tr>
<tr><td colspan="3">🧭 <a href="https://apify.com/topapi">All TopApi actors</a></td></tr>
</table>

### YouTube Shorts limits & empty runs

- **Results per source:** a channel's Shorts tab pages through every Short it has (48 per page); a hashtag feed pages on; a Shorts search runs dry after a few hundred results, so split broad topics into several keywords.
- **Rounded at the source:** subscriber counts are what YouTube shows (3 significant digits, e.g. 15.1M). Views, likes, comments, lifetime channel views and video counts are exact.
- **Hidden or off:** a creator can hide likes (5% of 228 Shorts read) or turn comments off (9%); those fields are null, never 0, and `likesHidden` / `commentsTurnedOff` say which.
- **Empty dataset:** your filters removed everything, monitor mode found nothing new, or the source has no Shorts - the status message and an error item say which.
- **Not available signed out:** dislike counts (YouTube removed them in 2021), monetization status, title translations, video locations, collaborator lists (none appeared on 77 Shorts sampled, 60 of them from #collab feeds) and members-only Shorts are not delivered. Video files are not downloaded.

### FAQ

#### How many YouTube Shorts can YouTube Shorts Scraper collect in one run?

As many as the sources hold: a channel's whole Shorts tab, a hashtag feed page after page, and a few hundred results per search. Set `maxResultsPerSource` and `maxItems` to bound the bill; 50 Shorts took 29 seconds on Apify.

#### Can I run YouTube Shorts Scraper on a schedule to get new Shorts automatically?

Yes. Save your input as a task, open **Schedules**, pick the cadence and set **Monitor mode** to New Shorts only. Each run returns only Shorts it has not delivered before; on a newest-first channel it stops at the first known Short.

#### Can YouTube Shorts Scraper track views and likes over time?

Yes. Monitor mode **New Shorts + count changes** re-reads the Shorts it already delivered and returns those whose views, likes or comments moved, with `previousStats` and `statsDelta`.

#### Does YouTube Shorts Scraper return the transcript of a Short?

Yes, with **Add transcript** on: the text of YouTube's own caption track (creator captions or auto-captions) in the Short's original language, with timestamps. On the live run 19 of 25 Shorts had one.

#### Can I integrate YouTube Shorts Scraper with other apps?

Yes - Make, Zapier, n8n, Google Sheets, Slack and more via [Apify integrations](https://docs.apify.com/integrations), or [webhooks](https://docs.apify.com/integrations/webhooks) that fire when a run finishes.

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

Yes. Start runs, fetch datasets and manage schedules with `apify-client` for [Node.js](https://apify.com/topapi/youtube-shorts-scraper/api/javascript) or [Python](https://apify.com/topapi/youtube-shorts-scraper/api/python); the API tab has ready-to-paste code.

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

Yes. Open the [MCP tab](https://apify.com/topapi/youtube-shorts-scraper/api/mcp), connect Claude Desktop, Cursor or another MCP client, and ask for YouTube Shorts in plain language. Turn on `compact` to keep rows small.

#### Do I need a YouTube account, cookies or a YouTube API key for YouTube Shorts Scraper?

No. YouTube Shorts Scraper reads only what YouTube shows a signed-out visitor; there is no Data API quota and nothing to set up.

#### Why did my YouTube Shorts Scraper run return no Shorts?

Most often the filters removed everything (the status message counts them by reason), monitor mode found nothing new, or a source has no Shorts (an error item names it). A hashtag must be one word, and a long video URL returns `NOT_A_SHORT`.

#### How is YouTube Shorts Scraper different from other YouTube Shorts scrapers?

It takes channels, hashtags, searches and URLs in one run, returns the exact publish time to the second plus exact likes and comment counts, adds sound, tagged products and AI labels, has two monitor modes, and charges no start fee.

#### Is it legal to scrape YouTube Shorts?

YouTube Shorts Scraper extracts only publicly available Shorts data; it does not log in or collect private data. Results may still contain personal data such as creator names, which is regulated by laws like GDPR. Make sure you have a legitimate purpose before you use it.

#### Your feedback

We keep improving YouTube Shorts Scraper. Found a bug or missing a field? Open an issue on the [Issues tab](https://apify.com/topapi/youtube-shorts-scraper/issues/open) - we answer within two working days.

# Actor input Schema

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

Channels whose Shorts tab to collect: a handle with or without @, a channel URL or a channel id. e.g. "@MrBeast", "nasa", "https://www.youtube.com/@mkbhd/shorts", "UCX6OQ3DkcsbYNE6H8uQQuVA".

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

Hashtags whose Shorts feed to collect, with or without #. e.g. "cooking", "#asmr", "https://www.youtube.com/hashtag/fitness/shorts". One word per hashtag.

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

Keywords to search on YouTube with the Shorts filter on. e.g. "kitchen hacks", "iphone 17 review". Only Shorts are returned.

## `shortUrls` (type: `array`):

Individual Shorts: /shorts/ links, youtu.be links, watch?v= links or bare 11-character ids. e.g. "https://www.youtube.com/shorts/CEJXqm2eiJ0", "CEJXqm2eiJ0".

## `sortBy` (type: `string`):

Order in which Shorts are collected. Channels support all three; searches support newest and most viewed; hashtag feeds always use YouTube's own order.

## `postedAfter` (type: `string`):

Only Shorts published on or after this date: an ISO date or a relative window. e.g. "2026-09-01", "7 days", "24 hours". Newest-first feeds stop paging once they pass it.

## `postedBefore` (type: `string`):

Only Shorts published on or before this date. e.g. "2026-09-30", "1 day". Leave empty for no upper limit.

## `minViews` (type: `integer`):

Drop Shorts with fewer views (exact count). e.g. 100000. 0 = no minimum.

## `minLikes` (type: `integer`):

Drop Shorts with fewer likes (exact count). Shorts whose creator hides likes are dropped when this is set. 0 = no minimum.

## `titleKeywords` (type: `array`):

Keep only Shorts whose title or hashtags contain at least one of these words (case-insensitive). e.g. "recipe", "#tutorial". Empty = keep all.

## `excludeKeywords` (type: `array`):

Drop Shorts whose title or description contains any of these words. e.g. "giveaway", "#ad".

## `includeTranscript` (type: `boolean`):

Add the spoken text from YouTube's own caption track (creator or auto-generated) with timestamps. Charged as the transcript add-on only on Shorts that have one.

## `includeChannelDetails` (type: `boolean`):

Add each creator's subscribers, verified badge, banner, About text, join date, country, lifetime views, video count and links. Free; one lookup per unique channel.

## `monitorMode` (type: `string`):

Remember delivered Shorts between runs (pairs with a daily schedule). "New only" returns only Shorts not delivered before; "New + count changes" also re-delivers known Shorts whose views, likes or comments moved, with deltas.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the monitor memory. Use a different name per watch list. e.g. "shorts-competitors".

## `maxResultsPerSource` (type: `integer`):

Cap per channel, hashtag or search. A channel's Shorts tab pages through every Short it has; a search runs dry at a few hundred. 0 = no cap.

## `maxItems` (type: `integer`):

Overall cap for the run across all sources. 0 = no overall cap (each source still stops at its own cap).

## `compact` (type: `boolean`):

Core fields only (id, url, title, counts, date, duration, hashtags, channel, sound, transcript) - sized for AI agents and MCP.

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

Fallback proxy. YouTube is read from the run's own IP first; this proxy (and RESIDENTIAL for the publish-date call) is used only where YouTube walls that IP.

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

How many Shorts are read at the same time. Throughput is CPU-bound: 10 at the default 512 MB read about 100 Shorts a minute.

## Actor input object example

```json
{
  "channels": [
    "@MrBeast",
    "@NASA"
  ],
  "sortBy": "default",
  "includeTranscript": false,
  "includeChannelDetails": true,
  "monitorMode": "off",
  "monitorStoreName": "youtube-shorts-monitor",
  "maxResultsPerSource": 5,
  "maxItems": 0,
  "compact": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 10
}
```

# Actor output Schema

## `shorts` (type: `string`):

The dataset of YouTube Shorts (one item per Short, plus error items for sources that returned nothing).

## `summary` (type: `string`):

Per-source outcome (delivered, filtered, already delivered, unavailable), calls per egress, transcripts.

# 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",
        "@NASA"
    ],
    "includeChannelDetails": true,
    "maxResultsPerSource": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/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",
        "@NASA",
    ],
    "includeChannelDetails": True,
    "maxResultsPerSource": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/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",
    "@NASA"
  ],
  "includeChannelDetails": true,
  "maxResultsPerSource": 5
}' |
apify call topapi/youtube-shorts-scraper --silent --output-dataset

```

## MCP server setup

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