YouTube Shorts Scraper
Pricing
$19.99/month + usage
YouTube Shorts Scraper
YouTube Shorts Scraper extracts data from YouTube Shorts, including titles, captions, creators, thumbnails, metrics, sounds, hashtags, and timestamps. Ideal for trend tracking, content research, competitor analysis, and automating structured YouTube Shorts insights at scale.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
YouTube Shorts Scraper — Views, Likes and Channel Data
YouTube Shorts Scraper pulls Shorts from any YouTube channel or search keyword and returns them as structured JSON — title, view count, likes, duration, publish date, comments, hashtags, and the uploading channel's subscriber count, avatar, and about-page details. Point it at a channel handle, a full URL, or a plain keyword like "funny shorts," and every Short it finds lands in your dataset as one typed row. Content strategists, social listening teams, and researchers use it to track a channel's Shorts output or scan a topic across many creators at once, without ever opening a video player.
What is YouTube Shorts Scraper?
YouTube Shorts Scraper is an Apify Actor that reads a channel's Shorts feed or a Shorts-filtered YouTube search and returns each Short as a structured dataset row. No YouTube account, login, or API key is required — it sends anonymous requests to YouTube's own internal endpoints, the same ones the youtube.com web app uses to render the page you'd see as a visitor.
- Discovery by four input shapes — channel handle (
@MrBeast), plain username (mrbeast), full channel or Shorts URL, or a free-text search keyword — the Actor detects which one you gave it - Automatic keyword fallback — if a channel-style input has no Shorts tab content, the Actor retries it as a keyword search instead of returning nothing
- Engagement fields — view count, likes, comment count, and whether comments are turned off
- Channel context on every row — subscriber count, join date, verification badge, avatar and banner URLs, and a nested
aboutChannelInfosummary, with no separate channel lookup needed - Sort and date filters — newest, oldest, or most popular by views, plus a publish-date cutoff (see the constraints below before you rely on it)
- Export as JSON, CSV, or Excel, or read the dataset straight through the Apify API
What data can I extract with YouTube Shorts Scraper?
Every Short is one dataset row with 41 fields covering the video itself, the channel that posted it, and how the Actor found it. The default dataset view surfaces the 17 most-used columns; every field below is written to the underlying row regardless of which columns you display.
| Field | Example value | Use case |
|---|---|---|
title | "Satisfying sounds #asmr #funny" | Headline text for indexing or display |
type | "shorts" | Constant record-type marker |
id | "gnuiMgTzKMQ" | 11-character YouTube video ID |
url | "https://www.youtube.com/shorts/gnuiMgTzKMQ" | Canonical watch link |
thumbnailUrl | "https://i.ytimg.com/vi/gnuiMgTzKMQ/hqdefault.jpg" | Preview image |
viewCount | 1180 | Engagement ranking, popularity sort |
date | "2026-06-24T10:01:00.000Z" | Freshness filtering, timeline sorting |
likes | 198 | Engagement ranking |
location | null | Recording location, when YouTube exposes it |
channelName | "Coco Creator Rainbow" | Display / grouping |
channelUrl | "https://www.youtube.com/channel/UC3N1..." | Canonical channel link |
channelUsername | "rainbowicecream9780" | The channel's @handle |
channelId | "UC3N1VbltR6aREupzvJ8y-sw" | Stable channel identifier |
channelDescription | "Thank you so much!..." | Channel bio text |
channelJoinedDate | "Aug 9, 2021" | Channel age |
channelDescriptionLinks | [] | Outbound links in the channel bio |
channelLocation | "United States" | Channel's stated country |
channelAvatarUrl | "https://yt3.googleusercontent.com/..." | Profile image |
channelBannerUrl | "https://yt3.googleusercontent.com/..." | Channel banner image |
channelTotalVideos | 193 | Channel output volume |
channelTotalViews | 917769889 | Channel-wide reach |
numberOfSubscribers | 1390000 | Reach / audience size |
isChannelVerified | false | Trust signal |
inputChannelUrl | "https://www.youtube.com/@rainbowicecream9780" | Normalized handle URL |
isAgeRestricted | false | Content gating flag |
aboutChannelInfo | { "channelName": "...", "numberOfSubscribers": 1390000, ... } | Same channel fields bundled as one nested object |
duration | "00:00:26" | Format filtering, runtime analysis |
commentsCount | 0 | Engagement, null when not found |
text | "" | Full Short description |
descriptionLinks | [] | Outbound links parsed from the description |
subtitles | null | Caption tracks: url, languageCode, name |
order | 1 | Rank within this run's result set after sorting |
commentsTurnedOff | false | Whether the creator disabled comments |
fromYTUrl | "https://www.youtube.com/@rainbowicecream9780/shorts" | The page the Actor listed this Short from |
isMonetized | null | Monetization flag, when YouTube reports it |
hashtags | ["asmr", "funny"] | Parsed from the description or title |
formats | [{ "quality": "1080p", "url": "https://...(truncated)..." }] | Stream metadata — see the note below |
isMembersOnly | false | Channel-membership gating flag |
input | "https://www.youtube.com/@rainbowicecream9780" | The original startUrls entry that produced this row |
fromChannelListPage | "shorts" | "shorts" or "search" — how the video was discovered |
isPaidContent | false | Paid-promotion disclosure flag |
Engagement and channel fields
viewCount, likes, commentsCount, and commentsTurnedOff are the per-video engagement signals. numberOfSubscribers, channelTotalVideos, channelTotalViews, isChannelVerified, and channelJoinedDate describe the channel behind the Short — all fetched in the same run, so you never need a second lookup to know who posted a viral Short and how established their channel is.
Discovery and freshness fields
order and fromChannelListPage tell you how a row was found — its rank in the run and whether it came from a channel's Shorts tab or a keyword search. date, combined with sortOrder and publishedAfter, is what you filter and sort on for anything time-sensitive.
One field to note: formats[].url is a stream URL truncated to 120 characters with "..." appended — a format fingerprint, not a working download link. If you need playable video files, this is a metadata scraper, not a downloader.
⚠️ maxResults and publishedAfter don't behave exactly as described
Two input parameters have real edge cases worth knowing before your first run, verified directly from the Actor's source.
maxResults has a floor of 10. Internally, the Actor computes its collection target as max(10, maxResults) — so setting maxResults to any value from 1 to 9 still collects up to 10 Shorts, not fewer. The dataset is not trimmed back down to your requested number afterward. If you need exactly one or two rows, filter after the run rather than relying on a low maxResults.
publishedAfter only recognizes three literal patterns. The schema's datepicker accepts an absolute date (YYYY-MM-DD) or a relative phrase, but the filter logic checks for substrings, not a real date parser: a value containing both "7" and "day" (e.g. "7 days"), a value containing both "30" and "day" (e.g. "30 days"), or a value containing both "1" and "year" (e.g. "1 year"). Anything else — an absolute YYYY-MM-DD date, "2 weeks", "1 month", "14 days" — matches none of the three checks, so no cutoff is applied and the run returns every Short it finds, unfiltered by date. Use the exact phrases "7 days", "30 days", or "1 year" if you need the filter to actually take effect.
How does YouTube Shorts Scraper differ from the official YouTube Data API?
YouTube publishes an official Data API v3, and its search.list endpoint can list a channel's uploads or search across YouTube — but it has no dedicated Shorts resource type or filter parameter. Using it for a bulk Shorts-only feed means fetching contentDetails.duration for every candidate video and filtering to short runtimes yourself. It also requires a Google Cloud project and an API key, and every call is metered against a daily quota that Google sets and can change — check Google's current Data API documentation for the live terms before planning volume around it.
| Feature | YouTube Data API v3 | YouTube Shorts Scraper |
|---|---|---|
| Setup required | Google Cloud project, API key | Apify account only |
| Daily quota | Google-set unit quota, subject to change | No API quota to manage |
| Dedicated Shorts filter | No distinct Shorts resource type | Reads the channel's Shorts tab directly, plus a Shorts-typed search request |
| Keyword search fallback | You build and paginate search.list yourself | Built in — retries as a keyword search automatically |
| Channel about-page fields | Separate channels.list call per channel | Included on the same row as aboutChannelInfo |
| Output shape | Raw per-endpoint API JSON | One flat, typed dataset row per Short |
Why doesn't the Data API just return Shorts?
Shorts are not a first-class resource type in the Data API — they are ordinary uploads under 60 seconds shown in a distinct UI surface, not a separately filterable category. search.list will hand back both Shorts and regular videos mixed together for any query. This Actor's own code has to work around the same gap: it uses YouTube's internal "Type: Shorts" search parameter first, and when a result doesn't come back tagged clearly as a Short, it falls back to inspecting the thumbnail overlay style and video length to confirm it. That's the practical reason a purpose-built scraper exists here rather than a thin Data API wrapper.
Use the official Data API when you already have a Google Cloud project, need other YouTube resources beyond Shorts, or want Google's supported terms for a production integration. Use YouTube Shorts Scraper when you want Shorts specifically, without managing quota, keys, or a duration-filtering step yourself.
How to use data extracted from YouTube Shorts?
Content strategists and creators
Point startUrls at your own channel or a handful of competitors, set sortOrder to "popular", and pull title, viewCount, likes, duration, and hashtags for the Shorts that are actually landing. Comparing your top performers' hashtags and duration against a competitor's gives you a concrete pattern to test next, instead of guessing from the public view counter alone.
Agencies and social listening
Run the same keyword or client-channel list on a recurring Apify schedule and diff viewCount, numberOfSubscribers, and commentsCount run over run to flag a Short that's accelerating or a channel that's growing fast enough to matter for a brand-monitoring report.
Market research and trend intelligence
Search a topic keyword instead of a channel — "funny shorts", "cooking hacks" — and group the results by channelName and hashtags to see which creators and tags are currently active in a niche, using date and viewCount together to separate a sustained trend from a single viral spike.
AI agents and automated pipelines 🤖
Because every row is typed JSON with a stable 41-key shape, it drops straight into an agent tool call or a RAG index. text, title, and hashtags carry the descriptive content for retrieval; channelName, numberOfSubscribers, and date give an agent the structured facts it needs to answer "who's currently posting about X, and how big are they" without re-scraping anything itself.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array | Where to scrape Shorts from. Add one or more: channel handles (@MrBeast), usernames (mrbeast), full URLs (https://www.youtube.com/@MrBeast), or search keywords (e.g. funny shorts). Default ["rainbowicecream9780"]. | ["@MrBeast", "cooking hacks"] |
maxResults | No | integer | Maximum number of Shorts to scrape per channel or keyword. Ranges from 1 to 10,000. Higher = more data, longer run. Minimum 1, maximum 10000, default 10. | 50 |
publishedAfter | No | string | Filter by publish date. Use a date (YYYY-MM-DD) or relative time (e.g. 7 days, 2 weeks, 1 month, 1 year). Leave empty to include all Shorts. See the constraints above — only "7 days", "30 days", and "1 year" are actually applied. | "7 days" |
sortOrder | No | string | Order of results: Newest first, Oldest first, or by Popularity (views). Enum: "newest" (Newest), "popular" (Popular), "oldest" (Oldest). Default "newest". | "popular" |
proxyConfiguration | No | object | Turn on Apify Proxy for more reliable scraping (useful in EU or restricted regions). Off = direct connection; works in most regions and for Apify QA. | {"useApifyProxy": false} |
Example input
{"startUrls": ["@MrBeast", "mrbeast", "https://www.youtube.com/@MrBeast", "funny shorts"],"maxResults": 50,"publishedAfter": "30 days","sortOrder": "popular","proxyConfiguration": { "useApifyProxy": false }}
Common pitfall: mixing a channel entry with a single common word. A one-word startUrls entry like "funny" first resolves to @funny/shorts; if that channel's Shorts tab comes back empty, the Actor automatically retries the same entry as a keyword search — so you may get keyword-search results back for what looked like a channel handle. Use the full @handle or channel URL when you specifically mean a channel.
⬆️ Output
Every run pushes typed, normalized JSON — the same 41 keys on every row, in the same order, whether the row came from a channel's Shorts tab or a keyword search. Missing values come back as null (or [] for list fields) rather than a missing key, so downstream code never needs a presence check. Export as JSON, CSV, or Excel, or read the dataset through the Apify API.
Each row pushed to the dataset is billed once under the row_result charged event. An input that turns up nothing — a channel with no Shorts, or a search with no results — contributes zero rows and is not charged.
Example output
{"title": "Satisfying sounds #asmr #funny #animation #shortvideo #music #shorts","type": "shorts","id": "gnuiMgTzKMQ","url": "https://www.youtube.com/shorts/gnuiMgTzKMQ","thumbnailUrl": "https://i.ytimg.com/vi/gnuiMgTzKMQ/hqdefault.jpg","viewCount": 1180,"date": "2026-06-24T10:01:00.000Z","likes": 198,"location": null,"channelName": "Coco Creator Rainbow","channelUrl": "https://www.youtube.com/channel/UC3N1VbltR6aREupzvJ8y-sw","channelUsername": "rainbowicecream9780","channelId": "UC3N1VbltR6aREupzvJ8y-sw","channelDescription": "Thank you so much! I appreciate you all watching the videos.","channelJoinedDate": "Aug 9, 2021","channelDescriptionLinks": [],"channelLocation": "United States","channelAvatarUrl": "https://yt3.googleusercontent.com/nVSr8lanf5UPU4Mc6oWOmKWqQ8VoFceHcQsM5sW63ZPp4r1S6M6pHr4stNOMGyknf1ig1Wjh3A=s160-c-k-c0x00ffffff-no-rj","channelBannerUrl": "https://yt3.googleusercontent.com/Wg27ZtirmK5sH4Bx7atk4CugZubFCTwsXZsKdITtWPT6aTiikJgl26heFNxnM16UJi0-qnlUxQ=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj","channelTotalVideos": 193,"channelTotalViews": 917769889,"numberOfSubscribers": 1390000,"isChannelVerified": false,"inputChannelUrl": "https://www.youtube.com/@rainbowicecream9780","isAgeRestricted": false,"aboutChannelInfo": {"channelDescription": "Thank you so much! I appreciate you all watching the videos.","channelJoinedDate": "Aug 9, 2021","channelDescriptionLinks": [],"channelLocation": "United States","channelUsername": "rainbowicecream9780","channelAvatarUrl": "https://yt3.googleusercontent.com/nVSr8lanf5UPU4Mc6oWOmKWqQ8VoFceHcQsM5sW63ZPp4r1S6M6pHr4stNOMGyknf1ig1Wjh3A=s160-c-k-c0x00ffffff-no-rj","channelBannerUrl": "https://yt3.googleusercontent.com/Wg27ZtirmK5sH4Bx7atk4CugZubFCTwsXZsKdITtWPT6aTiikJgl26heFNxnM16UJi0-qnlUxQ=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj","channelTotalVideos": 193,"channelTotalViews": 917769889,"numberOfSubscribers": 1390000,"isChannelVerified": false,"channelName": "Coco Creator Rainbow","channelUrl": "https://www.youtube.com/channel/UC3N1VbltR6aREupzvJ8y-sw","channelId": "UC3N1VbltR6aREupzvJ8y-sw","inputChannelUrl": "https://www.youtube.com/@rainbowicecream9780","isAgeRestricted": false},"duration": "00:00:26","commentsCount": 0,"text": "","descriptionLinks": [],"subtitles": null,"order": 1,"commentsTurnedOff": false,"fromYTUrl": "https://www.youtube.com/@rainbowicecream9780/shorts","isMonetized": null,"hashtags": [],"formats": [],"isMembersOnly": false,"input": "https://www.youtube.com/@rainbowicecream9780","fromChannelListPage": "shorts","isPaidContent": false}
How do you filter and target specific Shorts?
Targeting on this Actor comes down to three real controls: what you search on, how you sort what comes back, and how much of it you keep.
Channel vs. keyword decides completeness. A channel handle, username, or URL scopes the run to exactly that creator's Shorts tab — accurate but limited to what they've posted. A free-text keyword scopes it to a Shorts-filtered YouTube search — broader, but a mix of creators and less predictable per-channel coverage. Mix both in the same startUrls array to cover a client list and a topic search in one run.
sortOrder is applied after the Shorts are collected, not as a live YouTube query parameter — "popular" re-ranks the fetched batch by viewCount descending, while "newest" and "oldest" re-rank by date. It changes the order you receive results in, not which Shorts get fetched in the first place.
publishedAfter and maxResults are the volume and freshness controls — but see the constraints section above before you rely on either one for precision: publishedAfter only recognizes "7 days", "30 days", and "1 year", and maxResults below 10 doesn't reduce the row count below 10.
{ "startUrls": ["@MrBeast"], "sortOrder": "popular", "maxResults": 50 }
{ "startUrls": ["funny shorts", "cooking hacks"], "sortOrder": "newest", "maxResults": 100 }
{ "startUrls": ["mrbeast"], "publishedAfter": "7 days", "sortOrder": "newest" }
🔗 Related scrapers
| Scraper | What it extracts |
|---|---|
| YouTube Search Scraper — Channel Contact Links | YouTube search results with channel contact details |
| YouTube Video Details & Comments Scraper | Full video metadata plus comment threads |
| YouTube Playlist Scraper — Creator Contact Links | Playlist contents with creator contact data |
| YouTube Channel Keyword Research Scraper | Channel-level keyword and content research |
| TikTok Video Scraper — Hashtag, Sound and Reach | Short-form TikTok videos by hashtag or sound |
| Instagram Reels Hashtag Scraper | Short-form Instagram Reels by hashtag |
How to extract YouTube Shorts data programmatically
YouTube Shorts Scraper runs as a standard Apify Actor — one API call in, structured JSON out. Start it from the Apify Console, call it through apify_client, or trigger it on a recurring Apify schedule or webhook.
Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<YOUR_USERNAME>/youtube-shorts-scraper").call(run_input={"startUrls": ["@MrBeast", "cooking hacks"],"maxResults": 50,"sortOrder": "popular",})for short in client.dataset(run["defaultDatasetId"]).iterate_items():print(short["title"], short["viewCount"], short["channelName"])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
Export to spreadsheets or CRM
Export the dataset as CSV or Excel directly from the Apify Console, or pull it through the API and map title, channelName, numberOfSubscribers, viewCount, and url into your tracking sheet or CRM columns — every field name stays the same across runs, so the mapping only needs to be set up once.
Is it legal to scrape YouTube Shorts data?
Scraping publicly visible video and channel data is broadly treated as permissible where no login or authentication is bypassed, and YouTube Shorts Scraper reads only what any anonymous visitor already sees on a channel's Shorts tab or in search results.
Titles, view counts, channel names, subscriber counts, and descriptions are public creator and business data — the kind YouTube surfaces to every visitor to promote the content — not private personal data, so GDPR's personal-data regime does not attach to this output the way it would to a private profile scrape. What does apply is YouTube's own Terms of Service and general database-rights and unfair-competition rules covering systematic reuse of a compiled dataset.
Consult legal counsel for commercial applications involving bulk storage of personal data, or before republishing extracted content as a competing product.
❓ FAQ
What if a channel has zero Shorts, or the search keyword returns nothing?
That input simply contributes zero rows — the Actor does not write a placeholder or error item to the dataset for it. Check the run log, which prints a line like 📊 <input>: 0 Shorts saved to dataset for every startUrls entry, successful or not.
Can I get channel data along with the Shorts?
Yes. Subscriber count, join date, verification status, avatar, banner, and total video/view counts are fetched automatically for every Short's channel and included on the same row — both as flat fields and bundled again under aboutChannelInfo. No separate channel lookup is needed.
How accurate is the view and like data?
The Actor returns the compact view and like counts exactly as YouTube displays them on the page at request time (for example, "1.2K" parses to 1200). Accuracy depends on YouTube's own reporting and updates whenever you re-run the Actor; there is no caching layer in between.
How many Shorts can I get per run?
Up to 10,000 per startUrls entry, set by maxResults. Note the floor covered above: any maxResults value under 10 still collects up to 10 Shorts rather than fewer, since the internal collection target is max(10, maxResults).
Does publishedAfter support any date I type in?
No — only the exact phrases "7 days", "30 days", and "1 year" are recognized by the current filter logic. An absolute YYYY-MM-DD date or any other relative phrase ("2 weeks", "1 month", "14 days") does not match, and the run returns every Short unfiltered by date. See the constraints section above.
Does sortOrder change which Shorts get collected, or just the order?
Just the order. sortOrder is applied after the Shorts are fetched — "popular" re-ranks the collected batch by view count, "newest"/"oldest" re-rank by publish date. It does not change which Shorts are found in the first place.
Does YouTube Shorts Scraper work with Claude, ChatGPT, and AI agent frameworks?
Yes, as a standard HTTP endpoint. Any agent framework that can call the Apify API — LangChain, CrewAI, a custom tool definition — can invoke it and receive typed JSON directly. It is not currently offered through an MCP server.
How does YouTube Shorts Scraper compare to other YouTube Shorts scrapers?
Checked on the Apify Store on 25 July 2026: streamers/youtube-shorts-scraper is the most-used dedicated Shorts scraper and documents an explicit error-item system (codes like CHANNEL_HAS_NO_SHORTS, VIDEO_UNAVAILABLE) written to the dataset alongside normal rows, plus MCP server access — this Actor instead simply contributes zero rows for an input that fails, logged rather than written as a dataset item. tictechid/anoxvanzi-Transcriber and convertfleetdotonline/youtube-downloader solve different problems entirely — transcription and direct-download URL resolution, respectively — rather than structured Shorts metadata and channel data.
Can I use YouTube Shorts Scraper without a YouTube API key or developer account?
Yes. No Google Cloud project, API key, or YouTube login is required — only an Apify account to run the Actor.
Conclusion
YouTube Shorts Scraper turns any channel's Shorts feed or a topic keyword into structured, 41-field JSON rows — engagement numbers, publish dates, and full channel context in a single run, with no YouTube API key to manage. It's built for content strategists benchmarking creators, agencies tracking clients on a schedule, and researchers or AI pipelines that need Shorts data in a stable schema rather than a raw page scrape. Open YouTube Shorts Scraper on Apify, paste in a channel or keyword, and start the run.
💬 Your feedback
Found a bug, or need a field that YouTube exposes but this Actor doesn't return yet? Open an issue on the Actor's Issues tab — reports that include the exact startUrls value you ran are the fastest to reproduce and fix.