YouTube Shorts Scraper - Channels, Hashtags & Details avatar

YouTube Shorts Scraper - Channels, Hashtags & Details

Pricing

$30.00/month + usage

Go to Apify Store
YouTube Shorts Scraper - Channels, Hashtags & Details

YouTube Shorts Scraper - Channels, Hashtags & Details

Scrape YouTube Shorts from direct Short URLs, channel handles, channel URLs, and hashtags. Get titles, URLs, thumbnails, duration, views, likes, comments, publish dates, author handles, subscriber counts, channel IDs, and profile metadata.

Pricing

$30.00/month + usage

Rating

1.8

(3)

Developer

Newbs

Newbs

Maintained by Community

Actor stats

14

Bookmarked

412

Total users

2

Monthly active users

4 days ago

Last modified

Share

YouTube Shorts Scraper

Scrape YouTube Shorts from direct Shorts URLs, channel handles, channel URLs, and hashtag pages. The Actor opens each Short by default, enriches video-level details, and can optionally visit channel pages for deeper creator metadata.

What You Can Get

  • Shorts titles, URLs, video IDs, thumbnails, duration, and source position.
  • Numeric view, like, comment, subscriber, and channel video counts when YouTube exposes them.
  • Author handles or display names, channel IDs, channel URLs, profile pictures, and profile metadata.
  • Publish dates, descriptions, hashtag source tracking, and detail scrape status.
  • Stable outputs for both channel scraping and hashtag scraping.
  • The Marketplace sample input uses one YouTube channel and one result, so Apify test runs stay fast while still showing author, channel, view, and publish-date fields.

Why Use This Actor

  • Works with channel names, handles, full channel URLs, and hashtags.
  • Accepts direct Shorts URLs when you already know the specific videos to enrich.
  • Video detail enrichment is enabled by default, so results include author and engagement data instead of listing-only nulls.
  • Counts are normalized to numbers where possible, while viewCountText preserves matching source text or provides a readable normalized fallback.
  • Listing extraction reads both rendered Shorts cards and YouTube's structured Shorts data, improving view-count and channel-ID coverage.
  • Channel runs try YouTube's lightweight RSS feed directly from handles or channel IDs before page loading, then fall back to navigation API, HTML parsing, and browser listing when needed.
  • Hashtag rows can use lightweight channel RSS identity recovery to fill author display names when direct video metadata is blocked.
  • Detail extraction uses page metadata, YouTube player metadata, and oEmbed metadata before opening a browser fallback, and it can still try player/oEmbed metadata if the Shorts HTML request times out.
  • Browser fallback is optional, so users can choose between faster core metadata and slower maximum completeness.
  • Each row includes dataQualityScore and missingFields so missing YouTube metadata is explicit.
  • Uses Apify Proxy by default on the platform and supports custom proxy configuration.
  • Conservative concurrency defaults improve reliability on YouTube pages.
  • Runs without channel-page enrichment use no-browser HTTP listing and metadata extraction first, then fall back to the browser only when needed.
  • Each run writes an OUTPUT summary with result counts, status breakdowns, source breakdowns, and missing-field counts.
  • Dataset views make results easy to inspect in Apify Console and export to CSV, JSON, Excel, or API workflows.

Use Cases

  • Track viral Shorts around hashtags such as fashion, fitness, travel, real estate, or AI.
  • Discover creators and channels posting Shorts in a niche.
  • Monitor competitor Shorts and engagement.
  • Build lead lists of creators with channel URLs and subscriber counts.
  • Feed trend, content, or social analytics pipelines.
  • Collect Shorts metadata for dashboards, alerts, or research.

Input

FieldDescription
channelYouTube channel names, handles, or URLs. Examples: youtube, @adidas, https://www.youtube.com/@zara/shorts. Ignored when hashtags are provided.
hashtagHashtags with or without #. Examples: fashion, #style. Hashtags take precedence over channels.
videoUrlsDirect YouTube Shorts URLs. Direct video URLs take precedence over hashtags and channels.
numberOfResultsMaximum number of Shorts to return per channel or hashtag, capped at 100 per source. Direct URL runs ignore this field. The default sample returns 1 enriched Short so the first Apify test run finishes quickly.
needVideoDetailsDefaults to true. Collects available likes, views, publish date, description, and author metadata using HTTP extraction first. Set to false only for a faster listing-only run.
fallbackToBrowserDefaults to false. Enable it to open Shorts in a browser when HTTP extraction misses important fields such as commentCount. Slower, but more complete.
includeChannelDetailsDefaults to false so sample runs stay fast. Set to true to enrich each unique creator channel for subscriber count, video count, profile picture, banner, description, and social links. The Actor tries HTTP profile enrichment before browser fallback.
maxConcurrencyBrowser page concurrency. Keep 1 or 2 for best detail reliability. Values above 5 are capped by the Actor.
maxRunSecondsOptional graceful runtime cap. The sample run is prefilled with 240 seconds so Apify tests stop cleanly before a 300-second timeout. Set 0 to use the Apify run timeout.
proxyConfigurationProxy settings. Apify Proxy is used by default on the Apify platform.

Example Inputs

Quick default-style smoke run:

{
"channel": ["youtube"],
"numberOfResults": 1,
"needVideoDetails": true,
"includeChannelDetails": false,
"maxConcurrency": 1,
"maxRunSeconds": 240
}

Scrape enriched Shorts from a hashtag:

{
"hashtag": ["fashion"],
"numberOfResults": 20,
"includeChannelDetails": true,
"maxConcurrency": 2
}

Scrape enriched Shorts from a channel name:

{
"channel": ["youtube"],
"numberOfResults": 10
}

Scrape multiple channel URLs:

{
"channel": [
"https://www.youtube.com/@adidas/shorts",
"https://www.youtube.com/@zara/shorts"
],
"numberOfResults": 25,
"needVideoDetails": true
}

Run faster listing-only scraping:

{
"hashtag": ["style"],
"numberOfResults": 50,
"needVideoDetails": false
}

Run faster video-detail scraping without visiting creator channel pages:

{
"hashtag": ["style"],
"numberOfResults": 10,
"needVideoDetails": true,
"includeChannelDetails": false,
"fallbackToBrowser": false
}

Run slower maximum-completeness detail scraping:

{
"hashtag": ["style"],
"numberOfResults": 10,
"needVideoDetails": true,
"includeChannelDetails": false,
"fallbackToBrowser": true
}

Scrape specific Shorts directly:

{
"videoUrls": [
"https://www.youtube.com/shorts/SWQHAPIY5ag"
],
"needVideoDetails": true,
"includeChannelDetails": false
}

Output

Each dataset row represents one Short.

FieldDescription
idYouTube Shorts video ID.
titleShort title or caption text.
authorChannel handle when available, or channel display name from lightweight identity recovery.
videoUrlDirect Shorts URL.
coverImageThumbnail URL.
subscriberCountChannel subscriber count as a number, when available.
likeCountLike count as a number, when available.
descriptionVideo description, when exposed by YouTube.
durationSecondsShort duration in seconds, when available.
durationTextReadable Short duration such as 0:17, when available.
viewCountBest numeric view count available.
viewCountTextOriginal listing/detail view text when it matches viewCount, or a normalized fallback such as 5,000,000 views.
commentCountComment count as a number, when available.
publishedAtISO publish date when available.
amountOfVideosChannel video count as a number, when available.
profileBannerChannel banner URL, when available.
profilePictureChannel avatar URL, when available.
channelIdYouTube channel ID.
channelUrlChannel URL.
channelInfoChannel description, stats, and social links where available.
hashtagHashtag source for hashtag runs.
sourceNormalized input source used for the result.
sourceTypechannel, hashtag, or video.
positionResult position in the source listing.
detailStatussuccess, partial, failed, not_requested, or no_results.
browserFallbackStatusStatus of optional browser fallback when it was attempted.
browserFallbackErrorError message from optional browser fallback when it fails.
dataQualityScoreCompleteness score from 0 to 100 based on important fields.
missingFieldsImportant fields that were not available for this row.

The default key-value store also contains an OUTPUT record with:

  • results and overview dataset API links.
  • summary.totalResults, successfulResults, partialResults, failedResults, and noResultSources.
  • summary.detailStatusCounts, sourceTypeCounts, and sourceCounts.
  • summary.missingFieldCounts and fieldCompleteness so you can quickly see which fields YouTube did not expose.
  • summary.gracefullyStopped, stopReason, and timeBudget when a run stops early to avoid the hard platform timeout.
  • summary.recommendations with actionable next steps such as enabling fallbackToBrowser for missing detail fields or enabling includeChannelDetails for profile metadata.

Example Output

{
"title": "Street Fashion Style #fashion #style",
"author": "@StreetOutfitStyle",
"videoUrl": "https://www.youtube.com/shorts/K77WBF8wG_c",
"coverImage": "https://i.ytimg.com/vi/K77WBF8wG_c/oardefault.jpg",
"subscriberCount": 1110000,
"likeCount": 45257,
"description": null,
"durationSeconds": 17,
"durationText": "0:17",
"viewCount": 5000000,
"viewCountText": "5 million views",
"commentCount": 2038,
"publishedAt": "2026-03-27T00:00:00.000Z",
"id": "K77WBF8wG_c",
"profilePicture": "https://yt3.ggpht.com/...",
"channelId": "UCLQai45iFoAo3uCWFiqgPtA",
"channelUrl": "https://www.youtube.com/@StreetOutfitStyle/shorts",
"hashtag": "style",
"source": "style",
"sourceType": "hashtag",
"position": 1,
"detailStatus": "success",
"dataQualityScore": 100,
"missingFields": []
}

Performance Notes

With includeChannelDetails: false, listing extraction and detail enrichment first use lightweight HTTP extraction. By default, the Actor returns complete core rows without opening a browser, even if extra fields such as commentCount are unavailable. Set fallbackToBrowser: true when completeness matters more than speed. With includeChannelDetails: true, the Actor now tries HTTP channel profile enrichment once per unique creator before any browser fallback, including structured about-page data for subscriber count, channel video count, total views, description, avatar, and canonical channel URL.

The Marketplace sample input is intentionally one channel, one result, maxConcurrency: 1, and a 240-second soft cap. If you run larger saved inputs, such as two hashtags with 10 detailed results each, set a longer run timeout or keep includeChannelDetails disabled so the Actor can stay mostly on the HTTP path.

For predictable cost and runtime, listing runs are capped at 100 Shorts per source. Split very large jobs into several smaller runs or narrower sources when you need broader coverage.

The Actor also watches the Apify run timeout. If a large job gets close to the hard timeout, it stops early, writes the rows already collected, and records summary.gracefullyStopped, summary.stopReason, and summary.timeBudget in the OUTPUT record. Set maxRunSeconds when you want a shorter soft cap than the Apify run timeout.

For best reliability:

  • Keep maxConcurrency at 1 or 2 for detail runs.
  • Use videoUrls when you already know specific Shorts; this skips listing pages and can avoid browser startup.
  • Use Apify Proxy or a stable custom proxy.
  • Increase memory for larger runs or higher concurrency.
  • Use includeChannelDetails: false when you still need video metrics but do not need creator profile enrichment.
  • Use includeChannelDetails: true when creator profile metadata matters; it first uses cached HTTP profile requests and only needs browser fallback for harder pages.
  • Use fallbackToBrowser: true when you need slower browser recovery for missing important fields such as commentCount.
  • Use needVideoDetails: false only when you need quick title, URL, thumbnail, and listing view data.

For development checks, the local enriched smoke scripts validate important fields such as viewCount, viewCountText, author, publish date, channel ID, and channel URL before a build is published.

Data Quality Notes

YouTube changes page markup and does not expose every field for every video or channel. When a value is unavailable, the Actor returns null or N/A instead of guessing. detailStatus explains whether the Actor successfully enriched the row; partial means the listing row was kept but HTTP detail enrichment did not recover every requested detail and browser fallback was disabled.

FAQ

Can I scrape by channel name?

Yes. Inputs like youtube, @youtube, and https://www.youtube.com/@youtube/shorts are normalized to the channel Shorts page.

Can I scrape hashtags?

Yes. Enter hashtags with or without #. If both hashtag and channel are provided, hashtags take precedence.

Can I scrape one specific Short?

Yes. Use videoUrls with one or more direct Shorts URLs. This skips listing extraction and goes straight to detail enrichment.

Why are some fields null?

Some values are not exposed by YouTube for every Short or channel. The Actor enriches aggressively by default, but it does not fabricate missing data.

Why does a run take longer with details enabled?

The Actor first tries lightweight HTTP extraction. It opens a browser page only when fallbackToBrowser is enabled and important detail fields are missing, or when HTTP listing/profile extraction cannot produce usable rows.

Is this an official YouTube API?

No. This Actor uses HTTP extraction and optional browser fallback to collect publicly visible YouTube Shorts data.

Support

Open an issue on the Actor page if you see a repeatable extraction problem. Include your input, run ID, and one example video URL so the issue can be reproduced.