YouTube Shorts Scraper (Trending & Country Discovery) avatar

YouTube Shorts Scraper (Trending & Country Discovery)

Pricing

Pay per usage

Go to Apify Store
YouTube Shorts Scraper (Trending & Country Discovery)

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

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

0

Monthly active users

3 days ago

Last modified

Share

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.

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 one startUrls list
  • 🌍 Country + language localization — every request carries a 2-letter InnerTube region (gl) and interface language (hl)
  • 🔥 Country-localized trending Shorts feedgetTrending pulls the selected country's trending Shorts alongside your channel/keyword results, tagged isTrending: true
  • 🧹 Full-market sweepsscrapeAllResults pages a keyword search until YouTube stops returning results, ignoring maxResults
  • ↕️ 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 TypeExtracted FieldsPrimary Use Case
Channel & keyword Shortstitle, viewCount, likes, duration, commentsCount, hashtags, descriptionLinks, subtitles, formatsContent monitoring, competitor and format research
Country-localized trending ShortsisTrending, trendingCountry, discoveryCountry, discoveryLanguage plus every standard Short fieldRegional trend discovery and market comparison
Channel profile (nested on every Short)channelName, numberOfSubscribers, isChannelVerified, channelJoinedDate, channelTotalVideos, channelTotalViews, channelDescription, channelAvatarUrl, channelBannerUrlInfluencer vetting and channel-growth tracking

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).

FeatureYouTube Data API v3YouTube Shorts Scraper
SetupGoogle Cloud project + API keyApify token only
Access modelShared daily quota across all callsPer-run, pay-per-result
Shorts identificationNo native flag — duration/hashtag heuristic requiredNative — pulled from Shorts-specific surfaces (/shorts, Shorts search filter, trending mirror)
Country-localized trending feedNot available for Shorts specificallygetTrending + country, tagged isTrending/trendingCountry
Channel profile per resultSeparate channels.list call requiredBundled on every row (channelName through aboutChannelInfo)
Keyword + channel search in one schemaTwo different endpoints, two shapesOne 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.

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?

  1. Open YouTube Shorts Scraper on the Apify Store and click Try for free
  2. Add one or more entries to startUrls — a channel handle (@MrBeast), a channel URL, or a keyword
  3. Set country, language, sortOrder, and publishedAfter for the localization and filtering you need
  4. Click Start
  5. 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.

ParameterRequiredTypeConstraintsDescription
startUrlsNoarraydefault ["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).
maxResultsNointegermin 1, max 10000, default 10Maximum number of Shorts to scrape per channel or keyword. Higher = more data, longer run.
publishedAfterNostringdatepicker, 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.
sortOrderNostringenum newest / popular / oldest, default newestOrder of results: Newest first, Oldest first, or by Popularity (views).
countryNostringdefault us2-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.
languageNostringdefault en2-letter language code used as the InnerTube interface/relevance language (hl), e.g. en, hi, es, pt, de. Affects localized titles and result relevance.
scrapeAllResultsNobooleandefault falseFor keyword searches, keep paginating until YouTube stops returning results, ignoring maxResults. Use for full market/trend sweeps. Higher cost and longer runs.
getTrendingNobooleandefault falseAdditionally 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.
proxyConfigurationNoobjectproxy 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 19 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.

FieldDescription
titleThe Short's title
translatedTitleReserved field — always null in the current build
typeAlways "shorts"
id11-character YouTube video ID
urlhttps://www.youtube.com/shorts/<id>
thumbnailUrlBest available thumbnail; falls back to the hqdefault.jpg CDN URL
viewCountView count, parsed from YouTube's compact number format (e.g. 1.2M)
datePublish date as ISO 8601, midnight UTC — date precision only, no time-of-day
likesLike count, when YouTube's response exposes it
locationRecording location, when the video declares one, else null
channelNameUploading channel's display name
channelUrlCanonical channel URL
channelUsernameChannel handle without the @ normalization applied to inputChannelUrl
collaboratorsReserved field — always null in the current build
channelIdChannel's UC… identifier
channelDescriptionChannel "About" description
channelJoinedDateChannel creation date as YouTube displays it
channelDescriptionLinksLinks found in the channel description
channelLocationChannel's stated location
channelAvatarUrlChannel avatar image URL
channelBannerUrlChannel banner image URL
channelTotalVideosTotal videos on the channel
channelTotalViewsTotal channel views
numberOfSubscribersSubscriber count
isChannelVerifiedtrue if the channel carries YouTube's verification badge
inputChannelUrlNormalized https://www.youtube.com/@handle form of the channel
isAgeRestrictedAlways false in the current build — not detected
aboutChannelInfoNested object bundling 16 of the channel fields above (channelDescription, channelJoinedDate, channelDescriptionLinks, channelLocation, channelUsername, channelAvatarUrl, channelBannerUrl, channelTotalVideos, channelTotalViews, numberOfSubscribers, isChannelVerified, channelName, channelUrl, channelId, inputChannelUrl, isAgeRestricted)
durationVideo duration as h:mm:ss (or 00:mm:ss under an hour)
commentsCountComment count, when extractable
textDescription text; falls back to the title when YouTube returns no description
translatedTextReserved field — always null in the current build
descriptionLinksLinks found in the description
subtitlesArray of {url, languageCode, name} caption tracks, or null if none
order1-based position of this row within its input's result set
commentsTurnedOfftrue if comments are disabled on the video
fromYTUrlThe page URL used as the request's referer (channel Shorts tab, search results page, or trending feed)
isMonetizedtrue/false when YouTube's player response exposes monetization, else null
hashtagsHashtags parsed from the description (or the title if the description has none)
formatsArray of {quality, url} stream entries; url is truncated to 120 characters
isMembersOnlyAlways false in the current build — not detected
inputThe original startUrls entry that produced this row, or "__trending__:<gl>" for trending rows
fromChannelListPage"shorts", "search", or "trending" — which surface produced this row
isPaidContentAlways false in the current build — not detected
isTrendingtrue only for rows pulled via getTrending
trendingCountryResolved trending-mirror country name for trending rows, else null
discoveryLanguageThe language (hl) used for this run
discoveryCountryThe 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 read hashtags and duration off 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, and hashtags straight into the model as grounding context — no scraping code to maintain.
  • 📊 Market researchers — set country per target market and compare isTrending rows across regions to track which formats are breaking out where, or diff viewCount across scheduled runs to measure share-of-voice over time.
  • 📦 Product and growth teams — track numberOfSubscribers and channelTotalVideos across a competitor set to spot channels scaling output before their view counts catch up.

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 ApifyClient
client = 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.

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.

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.

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.