YouTube Shorts Scraper (Trending & Country Discovery)
Pricing
Pay per usage
YouTube Shorts Scraper (Trending & Country Discovery)
Scrape YouTube Shorts effortlessly with the YouTube Shorts Scraper. Extract video URLs, titles, creators, views, likes, comments, and upload dates. Perfect for trend tracking, content analysis, and marketing research. Fast, accurate, and scalable for bulk Shorts data collection.
Pricing
Pay per usage
Rating
5.0
(1)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
YouTube Shorts Scraper — Channel, Keyword & Country Trending Data
YouTube Shorts Scraper pulls structured data from any YouTube channel or keyword search and returns every Short as typed JSON — views, likes, comments, duration, hashtags, and full channel stats. Set a country and language to localize discovery, sweep an entire keyword market past the item cap, or turn on the country-localized trending Shorts feed to see what's breaking out in a specific market right now. Every response is ready to feed straight into an LLM, a vector store, or a monitoring pipeline — no HTML parsing required.
What is YouTube Shorts Scraper (Trending & Country Discovery)?
YouTube Shorts Scraper is an Apify Actor that turns a channel handle, channel URL, or keyword search into a structured feed of YouTube Shorts. No YouTube account, login, or API key is required — every field comes from the same InnerTube endpoints youtube.com itself calls for anonymous visitors. Point it at one or more channels or search terms and it returns each Short's title, view/like/comment counts, duration, hashtags, and the uploading channel's profile (subscribers, verification, join date, description). Set country and language once, and both the results YouTube surfaces for a keyword and the optional trending Shorts feed follow that market — running a country-localized trending feed alongside ordinary channel and keyword scraping in the same job is what sets this Actor apart from the other Shorts scrapers on the Apify Store (checked 2026-07-26).
Key capabilities:
- 📍 Channel & keyword input — mix handles (
@MrBeast), usernames, full channel URLs, and search terms in onestartUrlslist - 🌍 Country + language localization — every request carries a 2-letter InnerTube region (
gl) and interface language (hl) - 🔥 Country-localized trending Shorts feed —
getTrendingpulls the selected country's trending Shorts alongside your channel/keyword results, taggedisTrending: true - 🧹 Full-market sweeps —
scrapeAllResultspages a keyword search until YouTube stops returning results, ignoringmaxResults - ↕️ Three sort orders — newest, oldest, or by view count (popular)
- 📅 Publish-date filtering — restrict results with
publishedAfter
What data can you get with YouTube Shorts Scraper?
Every run can return three kinds of rows, all sharing the same 48-key schema so they stay one clean table.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Channel & keyword Shorts | title, viewCount, likes, duration, commentsCount, hashtags, descriptionLinks, subtitles, formats | Content monitoring, competitor and format research |
| Country-localized trending Shorts | isTrending, trendingCountry, discoveryCountry, discoveryLanguage plus every standard Short field | Regional trend discovery and market comparison |
| Channel profile (nested on every Short) | channelName, numberOfSubscribers, isChannelVerified, channelJoinedDate, channelTotalVideos, channelTotalViews, channelDescription, channelAvatarUrl, channelBannerUrl | Influencer vetting and channel-growth tracking |
🔥 Country-localized trending Shorts feed
Turning on getTrending fetches the trending Shorts feed for whichever country you set, in addition to your channel/keyword results. Each trending row is tagged with isTrending: true and carries trendingCountry (the resolved country name) and discoveryCountry/discoveryLanguage (the codes the run used). Coverage runs off a fixed list of 106 countries read directly from the source (from Algeria to Zimbabwe); a country outside that list returns zero trending rows rather than fabricated data, and the Actor logs which country was skipped. A typical trending row looks like this:
{"isTrending": true,"trendingCountry": "India","discoveryCountry": "IN","discoveryLanguage": "en","fromChannelListPage": "trending","input": "__trending__:IN"}
Channel profile on every Short
Every hydrated Short also carries the uploading channel's profile — resolved from the channel's own "About" tab, not just the video page. The same information is written twice: once as top-level columns (channelName, numberOfSubscribers, isChannelVerified, channelJoinedDate, channelLocation, and more) and again bundled into a nested aboutChannelInfo object with the same 16 keys, so you can read a specific column or hand off the whole channel object in one field.
How does YouTube Shorts Scraper differ from the official YouTube API?
YouTube publishes the YouTube Data API v3, but it was not built for Shorts discovery. Its search.list and videos.list endpoints return regular video metadata gated behind a Google Cloud project, an API key, and a shared daily quota (developers.google.com/youtube/v3/determine_quota_cost, checked 2026-07-26); there is no dedicated Shorts endpoint and no country-localized trending-Shorts feed. The closest official substitute — videos.list with chart=mostPopular and a regionCode — returns general trending videos, not Shorts specifically, so callers have to approximate "Shorts" with a duration or hashtag heuristic on top (a limitation the official-API-based coregent/youtube-most-popular-shorts Actor documents on its own listing, checked 2026-07-26).
| Feature | YouTube Data API v3 | YouTube Shorts Scraper |
|---|---|---|
| Setup | Google Cloud project + API key | Apify token only |
| Access model | Shared daily quota across all calls | Per-run, pay-per-result |
| Shorts identification | No native flag — duration/hashtag heuristic required | Native — pulled from Shorts-specific surfaces (/shorts, Shorts search filter, trending mirror) |
| Country-localized trending feed | Not available for Shorts specifically | getTrending + country, tagged isTrending/trendingCountry |
| Channel profile per result | Separate channels.list call required | Bundled on every row (channelName through aboutChannelInfo) |
| Keyword + channel search in one schema | Two different endpoints, two shapes | One row schema for both |
Use the official API when you already operate inside Google Cloud and only need standard video metadata under your own quota. Use YouTube Shorts Scraper when you want Shorts-specific discovery, per-country trending, and channel profile data returned together without building the heuristic layer yourself.
What is the difference between YouTube's Trending tab and a country-localized trending Shorts feed?
YouTube's own Trending tab (youtube.com/feed/trending) mixes long-form videos, music, gaming, and Shorts into one ranked list for a single region — it does not isolate Shorts, and there is no way to request "just the trending Shorts" from it directly. A country-localized trending Shorts feed, which is what getTrending returns here, is scoped to Shorts only and is selected per country via the country input, so you can pull India's trending Shorts and Germany's trending Shorts as two separate, comparable result sets rather than filtering one blended list by hand.
That distinction matters for anyone doing cross-market content research: a blended trending list tells you what's popular in a country overall, while a Shorts-only, country-scoped feed tells you what's breaking out in short-form specifically — the format advertisers and creators are increasingly planning around. YouTube Shorts Scraper returns both angles from one input: set startUrls for channel/keyword Shorts, and add getTrending for the country-scoped trending Shorts layer, both landing in the same dataset with isTrending distinguishing the two.
🧭 How to scrape YouTube Shorts with YouTube Shorts Scraper?
- Open YouTube Shorts Scraper on the Apify Store and click Try for free
- Add one or more entries to
startUrls— a channel handle (@MrBeast), a channel URL, or a keyword - Set
country,language,sortOrder, andpublishedAfterfor the localization and filtering you need - Click Start
- Download the dataset as JSON, CSV, Excel, HTML table, or XML, or stream it through the Apify API
{"startUrls": ["@MrBeast", "cooking hacks"],"maxResults": 25,"sortOrder": "popular","country": "us","language": "en"}
How to run multiple queries in one job
startUrls is an array — add as many channels and keywords as you want in one run, mixed freely. Each entry is scraped in turn and its rows are tagged with input so you can tell which query produced which row. There is no separate batch endpoint; adding more entries to the same list is the batching mechanism.
⬇️ Input
All nine fields are optional — the Actor ships with a working default so a first run needs no configuration.
| Parameter | Required | Type | Constraints | Description |
|---|---|---|---|---|
startUrls | No | array | default ["rainbowicecream9780"] | 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). |
maxResults | No | integer | min 1, max 10000, default 10 | Maximum number of Shorts to scrape per channel or keyword. Higher = more data, longer run. |
publishedAfter | No | string | datepicker, pattern accepts YYYY-MM-DD or <number> (day|week|month|year)(s) | 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. |
sortOrder | No | string | enum newest / popular / oldest, default newest | Order of results: Newest first, Oldest first, or by Popularity (views). |
country | No | string | default us | 2-letter ISO country code used as the InnerTube region (gl), e.g. us, in, br, gb, de, jp. Changes which Shorts YouTube surfaces for a keyword and which trending feed is pulled. |
language | No | string | default en | 2-letter language code used as the InnerTube interface/relevance language (hl), e.g. en, hi, es, pt, de. Affects localized titles and result relevance. |
scrapeAllResults | No | boolean | default false | For keyword searches, keep paginating until YouTube stops returning results, ignoring maxResults. Use for full market/trend sweeps. Higher cost and longer runs. |
getTrending | No | boolean | default false | Additionally fetch the trending Shorts feed for the selected country and add those rows (tagged isTrending=true). Coverage depends on a third-party trending mirror and a fixed country list; unavailable countries return no trending rows rather than fake data. |
proxyConfiguration | No | object | proxy editor, prefill {"useApifyProxy": false} | 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. |
Example input
{"startUrls": ["@MrBeast", "cooking hacks", "https://www.youtube.com/@mkbhd"],"maxResults": 20,"publishedAfter": "2026-06-01","sortOrder": "newest","country": "gb","language": "en","scrapeAllResults": false,"getTrending": true,"proxyConfiguration": { "useApifyProxy": true }}
⚠️ publishedAfter only recognizes three exact phrasings. The date filter compiles to a cutoff only when the string contains "7" with "day", "30" with "day", or "1" with "year" — for example "7 days", "30 days", or "1 year". Any other value the schema itself accepts and the datepicker can produce — an absolute YYYY-MM-DD date, or the schema's own documented examples "2 weeks" and "1 month" — does not match any of those three patterns, so the filter is silently skipped and all results are returned unfiltered instead of erroring. If you need "last 2 weeks," ask for "14 days" and re-derive the cutoff yourself, or filter the exported data on the date field after the run.
⚠️ maxResults is floored at 10 for channel and keyword scraping. Internally the Actor requests max(10, maxResults) video IDs before hydrating them, so setting maxResults to 1–9 still fetches and charges for up to 10 Shorts per channel/keyword. The trending feed (getTrending) does respect maxResults down to 1.
⬆️ Output
Every result — channel, keyword, or trending — is one dataset row on a fixed 48-key schema, in the same key order every run. Fields the source page doesn't expose come back as null, false, or [] rather than a missing key. Export as JSON, CSV, Excel, HTML table, or XML, or read the dataset through the Apify API. Every pushed row is charged under the row_result event — the Actor does not push separate uncharged accounting or error rows.
| Field | Description |
|---|---|
title | The Short's title |
translatedTitle | Reserved field — always null in the current build |
type | Always "shorts" |
id | 11-character YouTube video ID |
url | https://www.youtube.com/shorts/<id> |
thumbnailUrl | Best available thumbnail; falls back to the hqdefault.jpg CDN URL |
viewCount | View count, parsed from YouTube's compact number format (e.g. 1.2M) |
date | Publish date as ISO 8601, midnight UTC — date precision only, no time-of-day |
likes | Like count, when YouTube's response exposes it |
location | Recording location, when the video declares one, else null |
channelName | Uploading channel's display name |
channelUrl | Canonical channel URL |
channelUsername | Channel handle without the @ normalization applied to inputChannelUrl |
collaborators | Reserved field — always null in the current build |
channelId | Channel's UC… identifier |
channelDescription | Channel "About" description |
channelJoinedDate | Channel creation date as YouTube displays it |
channelDescriptionLinks | Links found in the channel description |
channelLocation | Channel's stated location |
channelAvatarUrl | Channel avatar image URL |
channelBannerUrl | Channel banner image URL |
channelTotalVideos | Total videos on the channel |
channelTotalViews | Total channel views |
numberOfSubscribers | Subscriber count |
isChannelVerified | true if the channel carries YouTube's verification badge |
inputChannelUrl | Normalized https://www.youtube.com/@handle form of the channel |
isAgeRestricted | Always false in the current build — not detected |
aboutChannelInfo | Nested object bundling 16 of the channel fields above (channelDescription, channelJoinedDate, channelDescriptionLinks, channelLocation, channelUsername, channelAvatarUrl, channelBannerUrl, channelTotalVideos, channelTotalViews, numberOfSubscribers, isChannelVerified, channelName, channelUrl, channelId, inputChannelUrl, isAgeRestricted) |
duration | Video duration as h:mm:ss (or 00:mm:ss under an hour) |
commentsCount | Comment count, when extractable |
text | Description text; falls back to the title when YouTube returns no description |
translatedText | Reserved field — always null in the current build |
descriptionLinks | Links found in the description |
subtitles | Array of {url, languageCode, name} caption tracks, or null if none |
order | 1-based position of this row within its input's result set |
commentsTurnedOff | true if comments are disabled on the video |
fromYTUrl | The page URL used as the request's referer (channel Shorts tab, search results page, or trending feed) |
isMonetized | true/false when YouTube's player response exposes monetization, else null |
hashtags | Hashtags parsed from the description (or the title if the description has none) |
formats | Array of {quality, url} stream entries; url is truncated to 120 characters |
isMembersOnly | Always false in the current build — not detected |
input | The original startUrls entry that produced this row, or "__trending__:<gl>" for trending rows |
fromChannelListPage | "shorts", "search", or "trending" — which surface produced this row |
isPaidContent | Always false in the current build — not detected |
isTrending | true only for rows pulled via getTrending |
trendingCountry | Resolved trending-mirror country name for trending rows, else null |
discoveryLanguage | The language (hl) used for this run |
discoveryCountry | The country (gl) used for this run |
The default dataset view surfaces 21 of these columns for quick scanning (type, isTrending, trendingCountry, discoveryCountry, discoveryLanguage, title, id, url, thumbnailUrl, viewCount, date, likes, channelName, channelUrl, numberOfSubscribers, duration, commentsCount, commentsTurnedOff, text, descriptionLinks, hashtags) — every field above is still present in the underlying row; open Full table or export the dataset to see all 48.
Scraped Shorts
[{"title": "I Survived 7 Days In An Abandoned City","translatedTitle": null,"type": "shorts","id": "aB3dE5fG7Hi","url": "https://www.youtube.com/shorts/aB3dE5fG7Hi","thumbnailUrl": "https://i.ytimg.com/vi/aB3dE5fG7Hi/hqdefault.jpg","viewCount": 48213905,"date": "2026-07-18T00:00:00.000Z","likes": 1820347,"location": null,"channelName": "MrBeast","channelUrl": "https://www.youtube.com/@MrBeast","channelUsername": "MrBeast","collaborators": null,"channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA","channelDescription": "SUBSCRIBE FOR A COOKIE!","channelJoinedDate": "Feb 20, 2012","channelDescriptionLinks": ["https://mrbeast.store"],"channelLocation": "United States","channelAvatarUrl": "https://yt3.ggpht.com/abcXYZ=s176-c-k-c0x00ffffff-no-rj","channelBannerUrl": "https://yt3.googleusercontent.com/def456","channelTotalVideos": 850,"channelTotalViews": 75482910345,"numberOfSubscribers": 415000000,"isChannelVerified": true,"inputChannelUrl": "https://www.youtube.com/@MrBeast","isAgeRestricted": false,"aboutChannelInfo": {"channelDescription": "SUBSCRIBE FOR A COOKIE!","channelJoinedDate": "Feb 20, 2012","channelDescriptionLinks": ["https://mrbeast.store"],"channelLocation": "United States","channelUsername": "MrBeast","channelAvatarUrl": "https://yt3.ggpht.com/abcXYZ=s176-c-k-c0x00ffffff-no-rj","channelBannerUrl": "https://yt3.googleusercontent.com/def456","channelTotalVideos": 850,"channelTotalViews": 75482910345,"numberOfSubscribers": 415000000,"isChannelVerified": true,"channelName": "MrBeast","channelUrl": "https://www.youtube.com/@MrBeast","channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA","inputChannelUrl": "https://www.youtube.com/@MrBeast","isAgeRestricted": false},"duration": "00:00:52","commentsCount": 12043,"text": "I Survived 7 Days In An Abandoned City #survival #shorts","translatedText": null,"descriptionLinks": [],"subtitles": [{ "url": "https://www.youtube.com/api/timedtext?v=aB3dE5fG7Hi&lang=en", "languageCode": "en", "name": "English (auto-generated)" }],"order": 1,"commentsTurnedOff": false,"fromYTUrl": "https://www.youtube.com/@MrBeast/shorts","isMonetized": true,"hashtags": ["survival", "shorts"],"formats": [{ "quality": "360p", "url": "https://rr3---sn-abc123.googlevideo.com/videoplayback?expire=..." }],"isMembersOnly": false,"input": "@MrBeast","fromChannelListPage": "shorts","isPaidContent": false,"isTrending": false,"trendingCountry": null,"discoveryLanguage": "en","discoveryCountry": "US"},{"title": "5 Cooking Hacks That Actually Work","translatedTitle": null,"type": "shorts","id": "kL9mN2pQ4Rs","url": "https://www.youtube.com/shorts/kL9mN2pQ4Rs","thumbnailUrl": "https://i.ytimg.com/vi/kL9mN2pQ4Rs/hqdefault.jpg","viewCount": 2318744,"date": "2026-07-10T00:00:00.000Z","likes": 94210,"location": null,"channelName": "Kitchen Quick Tips","channelUrl": "https://www.youtube.com/@kitchenquicktips","channelUsername": "kitchenquicktips","collaborators": null,"channelId": "UCabc123def456ghi789jkl","channelDescription": null,"channelJoinedDate": null,"channelDescriptionLinks": [],"channelLocation": null,"channelAvatarUrl": "https://yt3.ggpht.com/ghi789=s176-c-k-c0x00ffffff-no-rj","channelBannerUrl": null,"channelTotalVideos": 312,"channelTotalViews": null,"numberOfSubscribers": 184000,"isChannelVerified": false,"inputChannelUrl": "https://www.youtube.com/@kitchenquicktips","isAgeRestricted": false,"aboutChannelInfo": {"channelDescription": null,"channelJoinedDate": null,"channelDescriptionLinks": [],"channelLocation": null,"channelUsername": "kitchenquicktips","channelAvatarUrl": "https://yt3.ggpht.com/ghi789=s176-c-k-c0x00ffffff-no-rj","channelBannerUrl": null,"channelTotalVideos": 312,"channelTotalViews": null,"numberOfSubscribers": 184000,"isChannelVerified": false,"channelName": "Kitchen Quick Tips","channelUrl": "https://www.youtube.com/@kitchenquicktips","channelId": "UCabc123def456ghi789jkl","inputChannelUrl": "https://www.youtube.com/@kitchenquicktips","isAgeRestricted": false},"duration": "00:00:38","commentsCount": 891,"text": "5 cooking hacks that actually work #cookinghacks #shorts","translatedText": null,"descriptionLinks": [],"subtitles": null,"order": 2,"commentsTurnedOff": false,"fromYTUrl": "https://www.youtube.com/results?search_query=cooking+hacks","isMonetized": null,"hashtags": ["cookinghacks", "shorts"],"formats": [{ "quality": "360p", "url": "https://rr2---sn-xyz789.googlevideo.com/videoplayback?expire=..." }],"isMembersOnly": false,"input": "cooking hacks","fromChannelListPage": "search","isPaidContent": false,"isTrending": false,"trendingCountry": null,"discoveryLanguage": "en","discoveryCountry": "US"},{"title": "Monsoon Street Food Tour in 60 Seconds","translatedTitle": null,"type": "shorts","id": "tV7wX1yZ3Ab","url": "https://www.youtube.com/shorts/tV7wX1yZ3Ab","thumbnailUrl": "https://i.ytimg.com/vi/tV7wX1yZ3Ab/hqdefault.jpg","viewCount": 6104822,"date": "2026-07-22T00:00:00.000Z","likes": 302118,"location": null,"channelName": "Street Eats India","channelUrl": "https://www.youtube.com/@streeteatsindia","channelUsername": "streeteatsindia","collaborators": null,"channelId": "UCmno456pqr789stu012vwx","channelDescription": "Street food across India, one Short at a time.","channelJoinedDate": "Mar 4, 2019","channelDescriptionLinks": [],"channelLocation": "India","channelAvatarUrl": "https://yt3.ggpht.com/mno456=s176-c-k-c0x00ffffff-no-rj","channelBannerUrl": "https://yt3.googleusercontent.com/pqr789","channelTotalVideos": 640,"channelTotalViews": 912400000,"numberOfSubscribers": 3200000,"isChannelVerified": true,"inputChannelUrl": "https://www.youtube.com/@streeteatsindia","isAgeRestricted": false,"aboutChannelInfo": {"channelDescription": "Street food across India, one Short at a time.","channelJoinedDate": "Mar 4, 2019","channelDescriptionLinks": [],"channelLocation": "India","channelUsername": "streeteatsindia","channelAvatarUrl": "https://yt3.ggpht.com/mno456=s176-c-k-c0x00ffffff-no-rj","channelBannerUrl": "https://yt3.googleusercontent.com/pqr789","channelTotalVideos": 640,"channelTotalViews": 912400000,"numberOfSubscribers": 3200000,"isChannelVerified": true,"channelName": "Street Eats India","channelUrl": "https://www.youtube.com/@streeteatsindia","channelId": "UCmno456pqr789stu012vwx","inputChannelUrl": "https://www.youtube.com/@streeteatsindia","isAgeRestricted": false},"duration": "00:00:59","commentsCount": 4520,"text": "Monsoon street food tour in 60 seconds #streetfood #india #shorts","translatedText": null,"descriptionLinks": [],"subtitles": null,"order": 1,"commentsTurnedOff": false,"fromYTUrl": "https://www.youtube.com/feed/trending","isMonetized": true,"hashtags": ["streetfood", "india", "shorts"],"formats": [{ "quality": "360p", "url": "https://rr5---sn-def456.googlevideo.com/videoplayback?expire=..." }],"isMembersOnly": false,"input": "__trending__:IN","fromChannelListPage": "trending","isPaidContent": false,"isTrending": true,"trendingCountry": "India","discoveryLanguage": "en","discoveryCountry": "IN"}]
How can I use the data extracted with YouTube Shorts Scraper?
- 🎬 Creators & marketers — pull a competitor's channel Shorts, sort by
viewCount, and readhashtagsanddurationoff the top performers to reverse-engineer a working format. - 🤖 AI engineers and LLM developers — an agent issues a channel or keyword query, receives typed JSON back, and passes
title,text, andhashtagsstraight into the model as grounding context — no scraping code to maintain. - 📊 Market researchers — set
countryper target market and compareisTrendingrows across regions to track which formats are breaking out where, or diffviewCountacross scheduled runs to measure share-of-voice over time. - 📦 Product and growth teams — track
numberOfSubscribersandchannelTotalVideosacross a competitor set to spot channels scaling output before their view counts catch up.
🔥 How do you monitor trending Shorts across countries over time?
Monitoring is a diff, not a single run: schedule the same country (and, if relevant, the same startUrls) on a recurring interval, and compare each run's dataset against the previous one to see what changed. Between runs, watch viewCount and likes on repeat ids to measure momentum on Shorts you're already tracking, and watch order and the presence/absence of an id in the isTrending: true rows to see which Shorts entered or dropped out of a country's trending feed. For channel tracking, numberOfSubscribers and channelTotalVideos diffed run over run show growth rate without opening the channel page.
A practical loop: run the Actor daily against a fixed set of country codes with getTrending: true, keep each day's dataset, and alert when a video ID appears in isTrending rows for a new country, or when its viewCount crosses a threshold you define. Schedule this through Apify Schedules on the Actor's page — set the cron interval and the same input JSON runs unattended, with each run's results available as a separate dataset through the Apify Console or the API.
Integrate YouTube Shorts Scraper and automate your workflow
YouTube Shorts Scraper works with any language or tool that can send an HTTP request, since it runs as a standard Apify Actor.
REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<YOUR_USERNAME>/youtube-shorts-scraper-trending-country-discovery").call(run_input={"startUrls": ["@MrBeast", "cooking hacks"],"maxResults": 25,"country": "us","language": "en","getTrending": True,})for short in client.dataset(run["defaultDatasetId"]).iterate_items():print(short["title"], short["viewCount"], short["isTrending"])
Scheduled monitoring and delivery
There is no built-in webhook trigger inside the Actor itself, but Apify's platform-level Schedules run the same input on a cron interval, and Webhooks can notify your endpoint when a run finishes. Combine both to get a recurring pull with no polling loop on your side — read the resulting dataset through the Apify API once notified.
Is it legal to scrape YouTube Shorts?
Yes — scraping publicly accessible YouTube pages is generally lawful, and YouTube Shorts Scraper returns only what any visitor already sees on a Short's page, a channel's Shorts tab, a search results page, or the trending feed. Courts have repeatedly held that accessing public web data does not itself violate anti-hacking statutes — see hiQ Labs, Inc. v. LinkedIn Corp., 9th Circuit, 2019, on scraping publicly available profile data.
What this Actor returns is public content and channel metadata — views, likes, titles, hashtags, and a channel's public profile — not private personal data behind a login, so the framework that mainly applies is YouTube's own Terms of Service and, for any bulk reuse of the collected data, ordinary database and copyright rules rather than GDPR/CCPA-style personal-data regimes. Scraping for internal monitoring or research carries a different risk profile than scraping to train or redistribute content commercially. Consult your legal team for commercial use cases involving bulk data storage or redistribution.
❓ Frequently asked questions
Which countries and languages can I localize discovery to?
country and language accept any 2-letter code YouTube itself supports for its gl/hl parameters, so channel and keyword discovery can be localized to essentially any YouTube market. The optional trending feed is narrower: it depends on a third-party trending mirror covering a fixed list of 106 countries, and a country outside that list returns zero trending rows rather than fabricated ones.
What controls do I have over result order and date range?
sortOrder sorts the returned Shorts as newest, oldest, or popular (by viewCount) after they're fetched. publishedAfter is meant to restrict results to Shorts published after a given date — but see the limitation below before relying on it for anything other than "7 days", "30 days", or "1 year".
Does publishedAfter actually filter on "2 weeks" or "1 month" like its own description says?
No — and this is worth knowing before you rely on it. The input schema documents "7 days", "2 weeks", "1 month", and "1 year" as valid relative values, and its datepicker also accepts an absolute YYYY-MM-DD date. In the current build, only strings containing "7" + "day", "30" + "day", or "1" + "year" compile to an actual cutoff date. "2 weeks", "1 month", and any absolute date silently fall through to no filtering at all — the run returns every result regardless of publish date, with no error or warning. Use "7 days", "30 days", or "1 year" if you need the filter to work, or filter the exported date field yourself for any other window.
How does YouTube Shorts Scraper handle YouTube's anti-bot measures?
It talks to the same InnerTube endpoints the youtube.com website calls, with a desktop browser header set and a dynamically extracted client version rather than a hardcoded one, and retries failed requests up to three times with exponential backoff. It does not run a browser, so there's no headless-browser fingerprint to detect. Apify Proxy is optional and off by default; turning it on routes requests through Apify's proxy pool instead of a direct connection.
Does YouTube Shorts Scraper extract country-localized trending Shorts?
Yes — set getTrending: true and every trending row is tagged isTrending: true, with trendingCountry naming the resolved country and discoveryCountry/discoveryLanguage recording the codes used for that run. If the selected country isn't on the trending mirror's fixed 106-country list, no trending rows are returned for that run, but channel/keyword results (if any were requested) are unaffected.
How many Shorts does YouTube Shorts Scraper return per query?
maxResults accepts 1–10,000, but channel and keyword scraping fetch at least 10 Shorts per input regardless of a lower maxResults value — the Actor requests max(10, maxResults) IDs internally before hydrating them. Setting scrapeAllResults: true ignores maxResults for keyword searches entirely and pages until YouTube stops returning continuation tokens. The trending feed respects maxResults down to 1.
How do I monitor trending Shorts in a market over time?
Schedule the same country and getTrending: true input on a recurring interval through Apify Schedules, keep each run's dataset, and diff id, viewCount, and order between runs to see what entered, climbed, or dropped out of that country's trending Shorts feed.
Does YouTube Shorts Scraper work with Claude, ChatGPT, and AI agent frameworks?
Yes, as a standard HTTP endpoint through the Apify API — any agent framework that can make a request (LangChain, CrewAI, a custom tool definition) can call it and receive typed JSON back, enabling a grounded agent that retrieves live Shorts data before answering.
How does YouTube Shorts Scraper compare to other YouTube Shorts scrapers?
Checked on the Apify Store on 2026-07-26: easyapi/youtube-trending-videos-shorts-scraper scrapes YouTube's single blended trending page (videos and Shorts together) and documents only proxyConfiguration as configurable input — no channel or keyword scraping, no country selection. coregent/youtube-most-popular-shorts uses the official YouTube Data API v3 with a 50-country dropdown and category filters, but is a "most popular by search" tool, not channel/keyword scraping, and applies a duration/text heuristic to approximate Shorts since the API has no native Shorts flag (its own documented limitation). constructive_calm/youtube-shorts-scraper-pro is the closest match — channel, keyword, hashtag, and URL input with a computed viral score and engagement rate, plus optional comment scraping and video downloads — but its documented input has no country/language localization and no trending-feed control. YouTube Shorts Scraper's difference is combining localized channel/keyword discovery with a country-scoped trending Shorts feed in one schema.
Can I use YouTube Shorts Scraper without managing proxies or YouTube credentials?
Yes. No YouTube account, login, or API key is required — the Actor calls InnerTube endpoints directly. proxyConfiguration defaults to off (useApifyProxy: false); turn on Apify Proxy only if you're running from a region where direct connections are unreliable. The only credential you supply is your own Apify token when calling the Actor via the API.
💬 Your feedback
Found a bug, or need a field YouTube exposes that isn't in the output yet? Let the Scrapier team know through the Actor's Issues tab on Apify. Reports that include the startUrls entry and country/language used are the fastest to reproduce and fix.