# YouTube Channel Shorts – Links, Titles & Views (`scrapingmonkey/youtube-channel-shorts-scraper`) Actor

Collect Shorts from YouTube channel handles or IDs. Export Short links, titles, available view labels, thumbnails, and source-channel context with configurable pagination.

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

## Pricing

from $1.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.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

Collect the Shorts listed by a known YouTube channel. **YouTube Channel Shorts Scraper** reads the Shorts tab and returns short-form video links, titles, available view labels, thumbnails, and channel context.

Set a result-page limit for each channel and keep one row per Short. No YouTube account or cookies are required.

| At a glance | Details |
| --- | --- |
| 📥 Input | Channel handles or UC IDs |
| 📤 Output | Shorts links, titles, view labels, thumbnails, available card fields, and source-channel context |
| 🔐 Login required | No |
| 📄 Collection | Configurable result pages per input |
| 💾 Delivery | One row per Short result, in one table |

### What the YouTube channel Shorts scraper collects 🔎

The Actor selects Shorts entries from the channel's Shorts tab and keeps the information exposed on their cards.

- Short ID, /shorts/ URL, title, and listing position
- Available view count and the original displayed label
- Thumbnail URL and size variants
- Duration, publication wording, description snippet, or badges when the card provides them
- Available creator identity and source-channel profile context

Shorts cards often expose fewer fields than ordinary video cards. The Actor does not infer duration from the content type or fetch every Short's watch page.

### How to scrape YouTube channel Shorts 🚀

1. Prepare the channel handles or IDs you want to collect.
2. Add them to `inputList`, one value per item.
3. Set `pagesPerInput` and start the Actor.
4. Check `status` and export the fields needed for your workflow.

```json
{
  "inputList": [
    "NASA"
  ],
  "pagesPerInput": 1
}
```

### YouTube channel Shorts data fields and output 📦

| Field group | Included data |
| --- | --- |
| Short | ID, /shorts/ URL, type, title, and listing position |
| Public card fields | Available views, duration, publication text, snippet, and flags |
| Images and author | Thumbnail variants and available creator details |
| Source channel | The channel being browsed and exposed profile context |

Complete illustrative success item. The fictional values below demonstrate the output and are not a live result:

```json
{
  "input": "TrailJournal",
  "status": "success",
  "id": "TrailWalk01",
  "url": "https://www.youtube.com/shorts/TrailWalk01",
  "type": "short",
  "title": "A forest viewpoint in 45 seconds",
  "description": null,
  "thumbnail_url": "https://example.com/trail-large.jpg",
  "thumbnails.url": [
    "https://example.com/trail-small.jpg",
    "https://example.com/trail-large.jpg"
  ],
  "thumbnails.width": [
    405,
    1080
  ],
  "thumbnails.height": [
    720,
    1920
  ],
  "duration_seconds": 45,
  "duration_text": "0:45",
  "views": 18300,
  "views_text": "18.3K views",
  "published_text": "2 days ago",
  "badges": [],
  "is_live": false,
  "is_upcoming": false,
  "is_premiere": false,
  "is_members_only": false,
  "stream_status": null,
  "scheduled_start_time": null,
  "accessibility_text": "A forest viewpoint in 45 seconds by Trail Journal",
  "author.id": "UCabcdefghijklmnopqrstuv",
  "author.name": "Trail Journal",
  "author.handle": "@TrailJournal",
  "author.url": "https://www.youtube.com/@TrailJournal",
  "author.avatar_url": "https://example.com/trail-large.jpg",
  "author.avatar_thumbnails.url": [
    "https://example.com/trail-small.jpg",
    "https://example.com/trail-large.jpg"
  ],
  "author.avatar_thumbnails.width": [
    160,
    800
  ],
  "author.avatar_thumbnails.height": [
    160,
    800
  ],
  "author.is_verified": false,
  "source_channel.id": "UCabcdefghijklmnopqrstuv",
  "source_channel.handle": "@TrailJournal",
  "source_channel.name": "Trail Journal",
  "source_channel.url": "https://www.youtube.com/channel/UCabcdefghijklmnopqrstuv",
  "source_channel.canonical_url": "https://www.youtube.com/@TrailJournal",
  "source_channel.vanity_url": "https://www.youtube.com/@TrailJournal",
  "source_channel.description": "Weekend walks, route guides, and quiet places.",
  "source_channel.avatar_url": "https://example.com/trail-large.jpg",
  "source_channel.avatar_thumbnails.url": [
    "https://example.com/trail-small.jpg",
    "https://example.com/trail-large.jpg"
  ],
  "source_channel.avatar_thumbnails.width": [
    160,
    800
  ],
  "source_channel.avatar_thumbnails.height": [
    160,
    800
  ],
  "source_channel.banner_url": "https://example.com/trail-large.jpg",
  "source_channel.banner_thumbnails.url": [
    "https://example.com/trail-small.jpg",
    "https://example.com/trail-large.jpg"
  ],
  "source_channel.banner_thumbnails.width": [
    1060,
    2120
  ],
  "source_channel.banner_thumbnails.height": [
    175,
    350
  ],
  "source_channel.subscribers": 12000,
  "source_channel.subscribers_text": "12K subscribers",
  "source_channel.videos_count": 25,
  "source_channel.videos_count_text": "25 videos",
  "source_channel.views": 500000,
  "source_channel.views_text": "500K views",
  "source_channel.country": "United States",
  "source_channel.joined_date": "Joined Jan 1, 2020",
  "source_channel.keywords": [
    "hiking",
    "trail guides"
  ],
  "source_channel.keywords_raw": "hiking \"trail guides\"",
  "source_channel.external_links.title": [
    "Website"
  ],
  "source_channel.external_links.url": [
    "https://example.com"
  ],
  "source_channel.external_links.display_url": [
    "example.com"
  ],
  "source_channel.external_links.icon_url": [
    "https://example.com/trail-large.jpg"
  ],
  "source_channel.rss_url": "https://www.youtube.com/feeds/videos.xml?channel_id=UCabcdefghijklmnopqrstuv",
  "source_channel.available_countries": [
    "US",
    "GB"
  ],
  "source_channel.is_verified": false,
  "source_channel.is_family_safe": true,
  "source_channel.is_subscriber_count_hidden": false,
  "position": 1
}
```

The table and JSON use the same flat field names, including literal dotted keys. Thumbnail and avatar variants use aligned lists. The first thumbnail URL corresponds to the first width and height. Source-channel link and image fields stay in the same Short's row. A missing duration or publication label remains null rather than being guessed.

Optional values can be `null`, empty strings, `false`, or empty lists. Missing counts are normally `null`; numeric values parsed from abbreviated labels remain approximate. Failed rows preserve `input` and `status` and set the result-data fields to `null`. `position` is the running order of saved results for that input, not a global ranking.

### Input requirements and coverage ⚙️

| Parameter | Type | Default | Rules |
| --- | --- | --- | --- |
| `inputList` | array of strings | Required | One or more channel handles, with or without @, or UC channel IDs. Full channel URLs are not accepted. No fixed batch-size maximum. |
| `pagesPerInput` | integer | `1` | At least 1; no fixed upper bound. Limits result pages for each input. |

Handles allow 1–100 Unicode word characters, periods, hyphens, or middle dots after an optional @. A channel ID must be UC followed by 22 letters, digits, underscores, or hyphens. Other valid values are treated as handles. Leading and trailing spaces are removed.

YouTube controls page size. Collection stops at the requested page limit or when the list ends, whichever comes first. The initial result page counts as page 1; each continuation uses another page. Repeated items within an input are skipped, but repeating the input itself starts a separate collection.

### YouTube channel Shorts use cases 🎯

#### Short-form content inventories

Build a catalogue of Shorts from known channels without mixing in the channel's ordinary video or Live tabs.

#### Creative research

Compare titles, thumbnails, and available view labels across a selected group of creators.

#### Shorts enrichment

Collect Short URLs for a second step with the Short Details, Video Comments, or Transcript Actor where supported.

#### New-content reports

Compare scheduled exports to identify newly listed Shorts and changes in the public view labels.

### Pricing and billable Short rows 💰

Check the Actor's **Pricing** tab for the current pricing model and rate.

Under dataset-item pricing, each saved success or failed row can be billable. Automatic retry attempts do not independently add rows. The number of billable items follows saved results, not requested pages. A collection that ends without results or a failed request can produce a failed row; if a later page fails, earlier saved results remain.

Image variants and other list fields remain in their parent row and do not create separate dataset items.

### YouTube Channel Shorts Scraper API and integrations 🔌

Use the Actor ID from the **API** tab as $ACTOR\_ID and your Apify token as $APIFY\_TOKEN.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["NASA"],"pagesPerInput":1}'
```

The request starts a run. Retrieve the dataset when it finishes, or use a completion webhook to send results to your application. Apify schedules can repeat collection; exports and integrations support JSON, CSV, Excel, Google Sheets, Make, and Zapier workflows.

### Reliability and limits ⚠️

Up to five requests run concurrently, with automatic retries for temporary failures. Invalid, unavailable, or unresolved inputs are visible as failed rows. YouTube can restrict public access or omit fields.

Coverage follows the Shorts tab and the page limit. YouTube frequently omits duration, publication time, description, or author details from Shorts cards. Missing card fields are not evidence that the Short lacks them. The Actor does not promise a complete historical Shorts archive or download video files.

Pagination preserves results already saved, but a page limit, inaccessible continuation, or changing source list can leave a partial collection. A completed run does not prove that every historical item was available.

### Frequently asked questions ❓

#### Will ordinary videos appear in the result?

This Actor selects entries identified as Shorts from the Shorts tab. Use Channel Videos for the Videos tab.

#### Why is duration\_seconds null?

A Shorts card may not expose its duration. The Actor leaves that value absent instead of estimating it.

#### Can I submit a single Short URL?

The input is a channel handle or UC ID. Use YouTube Short Details Scraper for a known Short URL.

#### Can I set an exact number of Shorts?

No. pagesPerInput limits result pages, and YouTube controls the number of Shorts on each page.

#### Does it include a playable video URL?

It returns the public Short page URL and thumbnail references, not a downloaded file or direct playback stream.

### Support, responsible use, and related actors 🛟

For support, share the run ID and a safe public example input through the Actor's support channel. Keep tokens and credentials out of messages.

Use public data and media within the privacy, copyright, and other obligations that apply to your project.

# Actor input Schema

## `inputList` (type: `array`):

Add channel handles or UC channel IDs, one per item. You may include @ before a handle. Do not enter channel links.

## `pagesPerInput` (type: `integer`):

Number of result pages to collect for each input. YouTube controls the page size. Results are saved after each page; collection stops when the list ends. Bootstrap requests do not count as result pages.

## Actor input object example

```json
{
  "inputList": [
    "NASA"
  ],
  "pagesPerInput": 1
}
```

# Actor output Schema

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

Success and failed rows. Check the status column.

# 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 = {
    "inputList": [
        "NASA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/youtube-channel-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 = { "inputList": ["NASA"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/youtube-channel-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 '{
  "inputList": [
    "NASA"
  ]
}' |
apify call scrapingmonkey/youtube-channel-shorts-scraper --silent --output-dataset

```

## MCP server setup

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