YouTube Shorts Scraper
Scrape YouTube Shorts by channel or keyword. Titles, ids, URLs, exact views and likes, publish dates, thumbnails. No API key. $0.40/1k.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
channelUrls,searchQueries,maxItems(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0004 per short = $0.4 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Short scraped | Each YouTube Short written to the dataset. Sample and diagnostic rows are never charged. | $0.0004 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-15, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
channelUrls | YouTube channels to pull Shorts from, newest first. Any format works: https://www.youtube.com/@MrBeast, @mkbhd, https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA, youtube.com/c/mkbhd, youtube.com/user/PewDiePie, or a bare UC... id. Up to 20 targets per run in total, counting keywords. | array |
searchQueries | Search YouTube Shorts for these words or phrases. One row per matching Short. You can mix keywords and channels in the same run. | array |
maxItems | Total number of Shorts to return across all channels and keywords. The budget is split evenly between the targets, so four targets and 60 rows gives you fifteen of each. Keep it low while you are testing - you pay per row. | integer |
maxItemsPerTarget | Hard cap on how many Shorts to take from each channel or keyword. Leave it empty and the maximum-rows budget is simply split evenly between your targets. | integer |
includeStats | On by default. Adds one small request per Short to turn the rounded "27M views" the feed shows into the exact 27,549,434, and to add the exact like count, the publish date and the duration in seconds. Turn it off for a faster run that returns only what the feed itself carries. The price per row is the same either way. | boolean |
sortBy | "Newest first" orders the Shorts this run collected by their real publish date. "Feed order" keeps the order YouTube served them in. | string |
proxyUrls | Leave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port. | array |
What you get
A structured dataset — each result includes fields like:
videoIdtitleurlviewCountlikeCountpublishedAtpublishedTimeTextdurationSecondsthumbnailchannelNamechannelIdchannelUrlviewCountTextpositionExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Social Media Scrapers
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
TikTok Scraper - Profiles, Videos, Hashtags & Search
Scrape TikTok profiles, videos, hashtags and search. Play, like, comment and share counts. No login needed from you. $0.25 per 1,000.
Instagram Scraper - Profiles, Posts & Reels (No Login)
Scrape Instagram profiles, posts and reels as JSON: followers, caption, likes, comments, media URLs. No login or API key. $0.45 per 1,000 items.
Tweet Scraper
Scrape X (Twitter) tweets by handle or URL, no API key. Rows carry text, likes, retweets, views and author. Search needs your X cookie.
Twitter (X) User Scraper - Profiles & Followers, No Login
Scrape X (Twitter) profiles: followers, following, post count, name, bio and verification. No API key, no login. $0.14 per 1,000 profiles.
TikTok User Scraper - Profiles, Followers & Stats (No Login)
Scrape TikTok profiles without a login. Get follower, following, likes and video counts, bio, verified flag and avatar. $0.35 per 1,000 profiles.
Reddit Scraper
Scrape Reddit posts with no login or API key. Rows carry titles, selftext, scores, authors, comment counts and permalinks. $0.50 per 1,000 rows, flat.
Where this tool sits
- Categories
- Social Media Scrapers
YouTube Shorts Scraper: Shorts from a channel or a keyword, with exact view and like counts
Give it channels and you get their Shorts feeds, newest first. Give it keywords and you get the Shorts that match. Every row carries the exact view count and like count, not the rounded "15M" the feed prints, plus the publish date, duration, thumbnail and channel.
Worth knowing before you plan around it: a keyword search returns YouTube's best matches for that phrase, not every Short that exists, and newest first only sorts what the run collected.
| Input | Channel links, @handles, UC ids, keywords, or a mix |
| Output | One row per Short |
| Ceiling | 20 targets and 5,000 rows per run |
| Account needed | None from you |
| Price | $0.40 per 1,000 Shorts, flat on every plan |
🎞️ What YouTube Shorts Scraper does
Channel Shorts come from the channel's own Shorts tab, so they are Shorts because YouTube filed them there, not because something guessed from their length. Keyword Shorts come from the Shorts filter on search, and the ordinary long videos YouTube mixes into that filter are dropped rather than returned.
With includeStats on, each Short gets one extra small request that turns the feed's rounded "15M views" into the exact 15198235, and adds the exact like count, the real publish date and the duration. Turn it off for a quicker run that returns only what the feed itself carries. The price per row is the same either way.
maxItems is the budget for the whole run, split evenly between your targets. Four targets and 60 rows gives fifteen of each. A Short that two of your targets both return is dropped before it is enriched, so it is never returned or billed twice.
📥 What you give it
{
"channelUrls": ["https://www.youtube.com/@MrBeast", "@mkbhd"],
"searchQueries": ["cooking hacks"],
"maxItems": 60,
"sortBy": "newest"
}
| Field | What it is |
|---|---|
channelUrls | Channel links, @handles, /channel/UC, /c/, /user/ and legacy vanity links, or a bare UC id. |
searchQueries | Keywords. One row per matching Short. Mix them with channels in the same run. |
maxItems | Rows across the whole run, split evenly between targets. 1 to 5,000. This is your spend cap. |
maxItemsPerTarget | Optional hard cap per channel or keyword. Leave it empty and the budget simply splits evenly. |
includeStats | Adds the exact view count, like count, publish date and duration. |
sortBy | newest orders the collected Shorts by real publish date. feed keeps YouTube's own order. |
proxyUrls | Leave it empty. Fill it in only if you want the traffic to leave through servers you already pay for. |
Channels and keywords together count towards the 20 target limit. The input form starts maxItems at 20, includeStats on and sortBy at newest, so an API caller that wants something else should send it. Run it with empty input and you get one labelled sample row, uncharged, so you can see the shape before spending.
📤 What you get back
A real row from a real run:
{
"ok": true,
"charged": true,
"recordType": "short",
"input": "https://www.youtube.com/@MrBeast",
"searchQuery": null,
"videoId": "T_SMf9j50uc",
"title": "Can We Build an Entire Village?",
"url": "https://www.youtube.com/shorts/T_SMf9j50uc",
"viewCount": 15198235,
"viewCountText": "15M views",
"viewCountIsApproximate": false,
"likeCount": 569725,
"publishedAt": "2026-09-18T16:00:01.000Z",
"publishedTimeText": null,
"durationSeconds": 39,
"thumbnail": "https://i.ytimg.com/vi/T_SMf9j50uc/frame0.jpg",
"channelName": "MrBeast",
"channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
"channelUrl": "https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA",
"position": 1,
"statsError": null,
"scrapedAt": "2026-09-21T01:23:09.898Z"
}
| Field | What it is |
|---|---|
videoId, url | The 11 character id, and the /shorts/<id> link. The same video also plays at /watch?v=<id>. |
viewCount, viewCountIsApproximate | The exact figure when stats came back. When they did not, the count is parsed from the feed text and this flag turns true. |
likeCount | Exact, or null when the creator hides likes or the stats request failed. |
publishedAt, publishedTimeText | A real UTC timestamp when stats came back. The relative string is what search rows carry instead. |
input, searchQuery | The target that produced the row, so you can join results back to your list. searchQuery is null on channel rows. |
position | Where the Short sat within its target after ordering, starting at 1. |
statsError | Why the extra request failed for that Short, when it did. null otherwise. |
🧾 Reading the output
Three kinds of row can land in your dataset, and recordType is the field that tells them apart.
| Row | How to spot it | Billed |
|---|---|---|
| A Short | recordType: "short" | yes |
| The free sample | recordType: "sample", _sample: true | no |
| A diagnostic | recordType: "diagnostic", ok: false, an errorCode | no |
charged is a row-type marker written alongside recordType: real rows carry true, the sample and diagnostics carry false. Treat it as "this is a data row", not as a receipt. The run's own charged event count is the receipt.
Common error codes: NO_RESULTS when a channel has never posted a Short, NOT_FOUND when a handle does not resolve, RATE_LIMITED or SERVER_ERROR when YouTube pushed back, NETWORK when it could not be reached, and TIME_BUDGET when the run ran out of time before reaching a target.
The Overview table hides all three of those columns. In the Console table the sample row and the diagnostics look like ordinary Shorts. Download the JSON, or filter on recordType, before counting anything.
▶️ How to run it
1. Open YouTube Shorts Scraper and click Try for free. 2. Press Start with the input empty first. You get the free sample row and can see the shape. 3. Paste channels into Channel URLs or handles, or keywords into Keywords. 4. Set Maximum rows. Keep it small while you are testing. 5. Download the dataset as JSON, CSV or Excel, or read it over the Apify API.
💰 How much does it cost?
$0.40 per 1,000 Shorts. Flat on every Apify plan, no volume tiers.
You pay per Short row delivered. The sample row, diagnostic rows, duplicates inside a run and the long videos discarded from a filtered search are never billed. A channel that has never posted a Short delivers no charged rows, just one uncharged diagnostic saying so.
💡 What people use it for
- Tracking what a competitor posts as Shorts and how the view counts move week to week.
- Finding the format that works for a keyword before shooting your own.
- Pulling exact view and like counts for a report, which the feed's rounded text cannot give you.
- Feeding Short links into a downloader or a transcript actor for the ones worth studying.
🚧 What it does not do
- No comments, descriptions, hashtags, audio or transcripts. Rows describe the Short, not what is
in it. Other actors cover those, two of them linked below.
- Keyword results are matches, not an index. YouTube decides what a phrase returns, and a second
run can return a slightly different set.
newestsorts what this run collected, not YouTube's whole catalogue for that target.- Hidden likes stay hidden.
likeCountcomes backnullrather than guessed. - Nothing signed in. Members-only and age-restricted Shorts are not reachable.
- 20 targets per run, counting channels and keywords together.
- A channel with no Shorts tab returns a diagnostic, not an empty success.
🧭 Which YouTube scraper do you need?
| If you want | Use |
|---|---|
| Shorts, with exact view and like counts | This one |
| Ordinary videos by keyword, or a channel's uploads | YouTube Scraper |
| A channel's full upload list, with a higher ceiling | YouTube Channel Scraper |
| The spoken words in a Short | YouTube Transcript Scraper |
| The Short itself as a file | YouTube Downloader |
❓ Questions people ask
Do I need a YouTube account? No. Everything here works signed out, and there is no API key.
Is maxItems per target? No, per run. It is split evenly between your targets unless you set maxItemsPerTarget.
Why is one row's view count rounded? Its stats request did not come back. viewCountIsApproximate is true on exactly those rows, and statsError says what happened.
Can I get Shorts published between two dates? Not directly. Sort by newest, pull more rows than you need, and filter on publishedAt yourself.
Is scraping YouTube legal? This reads public Shorts and public channel pages, nothing signed in. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Include the channel or keyword you used and the run ID, and the log is enough for us to see what happened.