# YouTube Shorts Scraper 🎬 (keyword & channel Shorts, views) (`tagadanar/youtube-shorts-scraper`) Actor

The Shorts YouTube shows for any keyword or on any channel, with views, title, channel and thumbnail, to spot what is trending. Optional exact views, likes and publish date. Country and language aware. No API key, no login, platform usage included.

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

## Pricing

from $0.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.
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: trending Shorts by keyword and by channel

Get the Shorts YouTube shows for any keyword, or every Short on a channel's Shorts tab, with views, title, channel and thumbnail, to spot what is trending in your niche before everyone else does. Turn on **exact stats** and each Short also gets its exact view count, exact like count, comment count and publish date. No API key, no login, no proxy to set up: **$1 per 1,000 Shorts**, platform usage included.

Built for short-form creators hunting formats that already work, trend and social agencies reporting on a niche, and brands researching what TikTok-style content wins on YouTube.

### What you get

One row per Short, in YouTube's own order, for each keyword and each channel you give:

- **Short**: video ID, `https://www.youtube.com/shorts/…` link, title, thumbnail, hashtags from the title
- **Views as YouTube shows them**: `viewCountText` ("25M views") and the number behind it, `viewCountApprox` (25,000,000)
- **Channel**: name, @handle, channel ID and link (on keyword results the channel ID is always there; name and @handle come with exact stats)
- **Where it came from**: `source` (`search` or `channel`), the keyword or channel you entered, `rank` in that list, country, language, capture time

With **Add exact stats** on, each Short also gets:

- `viewCount`: the exact number (25,812,181, not "25M")
- `likeCount`: the exact number of likes
- `commentCountApprox`, `publishedDate` (YYYY-MM-DD), `description`
- the channel's name, @handle, rounded subscriber count and a verified flag

### Input examples

#### What's trending for a keyword, in the US

```json
{
    "searchQueries": ["espresso", "latte art", "home barista"],
    "maxShortsPerSource": 100
}
```

#### Everything a few creators posted as Shorts, with exact numbers

```json
{
    "channels": ["@mkbhd", "https://www.youtube.com/@khabylame", "UCBJycsmduvYEL83R_U4JriQ"],
    "maxShortsPerSource": 200,
    "includeDetails": true
}
```

#### A niche in another market

```json
{
    "searchQueries": ["recette facile"],
    "country": "FR",
    "language": "fr",
    "maxShortsPerSource": 50
}
```

Channels can be a channel link (`/@handle`, `/channel/UC…`, `/c/…`, `/user/…`, with or without `/shorts`), an `@handle`, or a `UC…` channel ID. A video link in the channel list is skipped and named in the run status, never silently dropped.

### Output example

A real row from a run with exact stats on (`@khabylame`):

```json
{
    "source": "channel",
    "query": null,
    "channelInput": "@khabylame",
    "rank": 2,
    "videoId": "dEdpylMsNyA",
    "url": "https://www.youtube.com/shorts/dEdpylMsNyA",
    "title": "Just give me 5 more minutes 😭#learnfromkhaby #comedy",
    "viewCountApprox": 1000000,
    "viewCountText": "1M views",
    "channelName": "Khaby. Lame",
    "channelHandle": "@khabylame",
    "channelId": "UC86suRFnqiw8zN6LIYxddYQ",
    "channelUrl": "https://www.youtube.com/@khabylame",
    "thumbnailUrl": "https://i.ytimg.com/vi/dEdpylMsNyA/oardefault.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAR7DO1DKKia1HeaP1seVlXf3coKw&usqp=CCk",
    "hashtags": ["learnfromkhaby", "comedy"],
    "viewCount": 1015324,
    "likeCount": 41024,
    "commentCountApprox": 706,
    "publishedDate": "2026-10-01",
    "description": null,
    "channelSubscriberCountApprox": 13000000,
    "channelIsVerified": true,
    "country": "US",
    "language": "en",
    "capturedAt": "2026-10-15T21:52:43.609Z"
}
```

Without exact stats, the row stops at `hashtags` (plus `country`, `language`, `capturedAt`).

### Pricing

| Event | Price |
| --- | --- |
| Short scraped | $0.001 per Short, i.e. **$1 per 1,000 Shorts** |
| Exact stats added (only with "Add exact stats" on) | $0.001 per Short, i.e. **$1 per 1,000 Shorts** |
| Run start | $0.001 per run |

Store discounts apply on top: Bronze $0.0009, Silver $0.0008, Gold $0.0007 per event. A 1,000-Short run with exact stats is $2 at the base price, $1.40 on Gold.

- **You pay for Shorts delivered, not for attempts.** A keyword with no Shorts, a channel that does not exist, a link that is not a channel: nothing is charged beyond the run start, and the run status says which and why.
- **Exact stats are charged only when they arrive.** If YouTube does not answer for one Short, the row still ships with its list data and is not charged the exact-stats fee.
- **Platform usage is included.** There is no proxy setting because there is nothing for you to pay for or configure.

### Limits and honest caveats

- **YouTube's Shorts search runs out.** For one keyword YouTube usually lists about 100-150 distinct Shorts and then starts repeating itself; the run stops there and says so. For more coverage, add related keywords.
- **A channel's Shorts tab is listed newest first** and the run stops where YouTube's own list ends.
- **Views on the list are rounded by YouTube** ("25M views"). Turn on exact stats when the exact number matters.
- **Titles follow your language setting.** YouTube may return its own translation of a title when the language you pick differs from the creator's.
- **Max Shorts per keyword or channel** is capped at 1,000.

### Frequently asked questions

**Do I need a YouTube API key or a Google account?**
No. The actor reads the same pages youtube.com shows a logged-out visitor.

**Can I get the Shorts trending in a specific country?**
Yes. Set `country` (two-letter code like `GB`, `BR`, `IN`) and `language` (`en`, `pt-BR`, `hi`…). Both change what YouTube ranks for a keyword.

**Why does a keyword row have a channel ID but no channel name?**
YouTube's Shorts search results carry only the owner's channel ID. Turn on exact stats to get the channel name, @handle and subscriber count on every row.

**How do I find what is trending right now?**
Run your niche keywords on a schedule (daily or weekly) and compare `rank` and `viewCount` between runs. New Shorts climbing fast are the formats to copy.

**What happens when a channel has no Shorts?**
You get no rows for it and the run status says "this channel has no Shorts tab". Nothing is charged for it.

**Can I export to CSV or Excel?**
Yes, from the dataset tab: CSV, Excel, JSON, XML or via the API.

### Related YouTube actors

- [YouTube Search Scraper](https://apify.com/tagadanar/youtube-search-scraper): videos for any keyword, with views and dates
- [YouTube Channel Scraper](https://apify.com/tagadanar/youtube-channel-scraper): a channel's videos and its About details
- [YouTube Comments Scraper](https://apify.com/tagadanar/youtube-comments-scraper): every comment and reply under a video
- [YouTube Channel Email Scraper](https://apify.com/tagadanar/youtube-channel-email-scraper): creator contact details for outreach
- [YouTube Transcript Scraper](https://apify.com/tagadanar/youtube-transcript-extractor): transcripts for a whole list of videos

# Changelog

This Actor's version history is a separate document: https://apify.com/tagadanar/youtube-shorts-scraper/changelog.md

# Actor input Schema

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

One keyword or phrase per line. You get the Shorts YouTube shows for it with its <b>Shorts</b> search filter, in YouTube's own order. YouTube's Shorts results for one keyword usually run out after about 100-150 Shorts; to go wider, add related keywords. Fill this, <b>Channels</b>, or both.

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

One channel per line: a channel link (<code>https://www.youtube.com/@mkbhd</code>, <code>/channel/UC…</code>, <code>/c/…</code>, <code>/user/…</code>, with or without <code>/shorts</code>), an <code>@handle</code>, or a <code>UC…</code> channel ID. You get the Shorts on the channel's Shorts tab, newest first, with the channel name and @handle on every row.

## `maxShortsPerSource` (type: `integer`):

Stop after this many Shorts for each keyword and each channel. You are charged only for Shorts actually delivered. Ceiling 1,000.

## `includeDetails` (type: `boolean`):

Off: the list as YouTube shows it — title, rounded views ("25M views"), channel. On: each Short also gets its exact view count, exact like count, comment count, publish date, description, hashtags and the channel's name, @handle and subscriber count (keyword results otherwise carry only the channel ID). Billed as an extra event per Short that got the stats; Shorts YouTube did not answer for are not charged it.

## `country` (type: `string`):

Two-letter country code, e.g. <code>US</code>, <code>GB</code>, <code>FR</code>, <code>BR</code>. Search results are what YouTube shows viewers in that country.

## `language` (type: `string`):

Interface language code, e.g. <code>en</code>, <code>fr</code>, <code>es</code>, <code>pt-BR</code>. It changes which Shorts YouTube ranks for a keyword, and titles may come back in YouTube's own translation into this language.

## Actor input object example

```json
{
  "searchQueries": [
    "espresso"
  ],
  "channels": [
    "@mkbhd"
  ],
  "maxShortsPerSource": 25,
  "includeDetails": false,
  "country": "US",
  "language": "en"
}
```

# Actor output Schema

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

One item per Short in the default dataset.

# 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 = {
    "searchQueries": [
        "espresso"
    ],
    "channels": [
        "@mkbhd"
    ],
    "maxShortsPerSource": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/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 = {
    "searchQueries": ["espresso"],
    "channels": ["@mkbhd"],
    "maxShortsPerSource": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/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 '{
  "searchQueries": [
    "espresso"
  ],
  "channels": [
    "@mkbhd"
  ],
  "maxShortsPerSource": 25
}' |
apify call tagadanar/youtube-shorts-scraper --silent --output-dataset

```

## MCP server setup

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