YouTube Shorts Scraper - Channels, Hashtags & Details
Pricing
$30.00/month + usage
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
Maintained by CommunityActor stats
14
Bookmarked
412
Total users
2
Monthly active users
4 days ago
Last modified
Categories
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
viewCountTextpreserves 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
dataQualityScoreandmissingFieldsso 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
OUTPUTsummary 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
| Field | Description |
|---|---|
channel | YouTube channel names, handles, or URLs. Examples: youtube, @adidas, https://www.youtube.com/@zara/shorts. Ignored when hashtags are provided. |
hashtag | Hashtags with or without #. Examples: fashion, #style. Hashtags take precedence over channels. |
videoUrls | Direct YouTube Shorts URLs. Direct video URLs take precedence over hashtags and channels. |
numberOfResults | Maximum 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. |
needVideoDetails | Defaults 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. |
fallbackToBrowser | Defaults to false. Enable it to open Shorts in a browser when HTTP extraction misses important fields such as commentCount. Slower, but more complete. |
includeChannelDetails | Defaults 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. |
maxConcurrency | Browser page concurrency. Keep 1 or 2 for best detail reliability. Values above 5 are capped by the Actor. |
maxRunSeconds | Optional 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. |
proxyConfiguration | Proxy 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.
| Field | Description |
|---|---|
id | YouTube Shorts video ID. |
title | Short title or caption text. |
author | Channel handle when available, or channel display name from lightweight identity recovery. |
videoUrl | Direct Shorts URL. |
coverImage | Thumbnail URL. |
subscriberCount | Channel subscriber count as a number, when available. |
likeCount | Like count as a number, when available. |
description | Video description, when exposed by YouTube. |
durationSeconds | Short duration in seconds, when available. |
durationText | Readable Short duration such as 0:17, when available. |
viewCount | Best numeric view count available. |
viewCountText | Original listing/detail view text when it matches viewCount, or a normalized fallback such as 5,000,000 views. |
commentCount | Comment count as a number, when available. |
publishedAt | ISO publish date when available. |
amountOfVideos | Channel video count as a number, when available. |
profileBanner | Channel banner URL, when available. |
profilePicture | Channel avatar URL, when available. |
channelId | YouTube channel ID. |
channelUrl | Channel URL. |
channelInfo | Channel description, stats, and social links where available. |
hashtag | Hashtag source for hashtag runs. |
source | Normalized input source used for the result. |
sourceType | channel, hashtag, or video. |
position | Result position in the source listing. |
detailStatus | success, partial, failed, not_requested, or no_results. |
browserFallbackStatus | Status of optional browser fallback when it was attempted. |
browserFallbackError | Error message from optional browser fallback when it fails. |
dataQualityScore | Completeness score from 0 to 100 based on important fields. |
missingFields | Important fields that were not available for this row. |
The default key-value store also contains an OUTPUT record with:
resultsandoverviewdataset API links.summary.totalResults,successfulResults,partialResults,failedResults, andnoResultSources.summary.detailStatusCounts,sourceTypeCounts, andsourceCounts.summary.missingFieldCountsandfieldCompletenessso you can quickly see which fields YouTube did not expose.summary.gracefullyStopped,stopReason, andtimeBudgetwhen a run stops early to avoid the hard platform timeout.summary.recommendationswith actionable next steps such as enablingfallbackToBrowserfor missing detail fields or enablingincludeChannelDetailsfor 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
maxConcurrencyat1or2for detail runs. - Use
videoUrlswhen 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: falsewhen you still need video metrics but do not need creator profile enrichment. - Use
includeChannelDetails: truewhen creator profile metadata matters; it first uses cached HTTP profile requests and only needs browser fallback for harder pages. - Use
fallbackToBrowser: truewhen you need slower browser recovery for missing important fields such ascommentCount. - Use
needVideoDetails: falseonly 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.