Home › Guides › YouTube Search Scraper
YouTube search data: ranked videos and Shorts with exact views, likes and the channel behind each result
YouTube's search page shows a title, a channel and a rounded "7 months ago" — not the real figures. The YouTube Search Scraper returns one row per video or Short in the order YouTube ranks them, with what the search page hides: the exact publish date, the unrounded view and like count, and the channel behind each result — subscribers, country, lifetime views and viewsPerSubscriber. A search is followed to its end, and again up to four more times while that still brings new videos. No YouTube API key, no login, no cookies.
Who it's for
- Content and SEO teams researching what ranks for a keyword — age, length, chapters, views and likes of the top results before they make their own video.
- Trend and breakout hunters who want the videos that out-grew their channel (
viewsPerSubscriber), not just the biggest channels. - Brand, PR and affiliate teams monitoring the new videos YouTube lists for a product every day, each delivered once.
- Analysts and AI builders who need a topic's whole video set — titles, snippets, YouTube's AI summaries, chapters and exact view counts — as JSON.
What you get
| Group | Fields |
|---|---|
| Rank | Keyword, rank among the different results, which of YouTube's answers it stood in (searchPass), YouTube's own estimated result count |
| Video | Video ID (stable key), URL, title, kind (video or Short), description snippet, YouTube's AI summary where shown, thumbnail |
| Figures | Unrounded views (with an exact flag), likes, publish date and "days since", likeRate, viewsPerDay, viewsPerSubscriber, duration |
| Channel | Channel ID, handle, title, verified badge, subscribers, country, lifetime views, video count; collaborators on a multi-channel video |
Full page (details: full) | Comment count, full description with links restored, hashtags, the page's chapters (creator's or YouTube's) |
| State & context | Live / was-live / upcoming flags, scheduled start, live viewers, badges, tagged-product count, detail level read, scrape time |
A real row from a search on 2026-10-07 with details: "full" (trimmed — the description and chapters shortened):
{
"type": "video",
"searchKeyword": "drone review",
"searchRank": 2,
"searchPass": 1,
"videoId": "rN4hGxTE2hg",
"title": "DJI NEO 2 - The Best Beginner Drone EVER!",
"videoType": "video",
"channelHandle": "@MarkMcGeePhotos",
"channelTitle": "Mark McGee Photos",
"channelIsVerified": true,
"channelSubscribers": 369000,
"channelCountryCode": "GB",
"publishedDate": "2025-11-14",
"publishedText": "Nov 14, 2025",
"durationSeconds": 580,
"views": 558794,
"viewsAreExact": true,
"likes": 6284,
"commentsCount": 328,
"likeRate": 0.0112,
"viewsPerDay": 1709,
"viewsPerSubscriber": 1.514,
"badges": ["4K", "CC"],
"detailLevel": "full"
}
How it gets more than YouTube's first page
YouTube returns a different part of a search every time it is asked, and repeats videos across pages (11 to 26% of a pass in ten measured passes). So the Actor follows a search to its end — 220 to 501 different videos in ten measurements — and then again, up to four more times, while a pass still brings enough new ones (at least 10, and at least 5% of what the search brought before). Four keywords followed this way gave 515 to 664 different videos each; on the platform one keyword gave 515 and 631 in two runs. It does not promise every video for a keyword — the measured numbers above are what to expect.
Three depths, one per row, priced apart. list reads only the search result (no request per video). figures (the default) adds one small request per video for the exact publish date and like count. full reads the video's own page for the comment count, full description, hashtags and the page's chapters. A channelStats request is made once per channel, however many of its videos a run finds.
Exact, or empty — never guessed. Where YouTube shows "7 months ago", the row carries the real date (2026-03-04). Where there is nothing to read — a channel that hides its likes, a stream on air, a premiere that has not started — the field is null, not an estimate.
Input
| Input | What it does |
|---|---|
searchKeywords | One search per line, as you would type it into YouTube (up to 1,000) |
resultTypes | videos, shorts or both (default videos); each kind is searched on its own |
maxVideosPerKeyword · maxVideos | Rows per keyword and kind (default 50) · total rows (default 1,000) |
sort · uploadedWithin · duration · features | YouTube's own filters: relevance/popularity · today/week/month/year · short/medium/long · live, 4k, hd, subtitles, CC, 360, … |
details | list, figures (default) or full — how much is read per video |
channelStats | Add subscribers, country, lifetime views and video count (default on) |
minViews · minViewsPerSubscriber | Keep only videos above a view count · above a views-to-subscribers ratio (decimals allowed) |
exactSpelling · country | Search as typed, not YouTube's correction · two-letter country the search is made for |
onlyNewVideos · listName | Remember delivered videos and skip them next run — keyword monitoring on a schedule |
The videos that out-grew their channel — at least twice their subscriber count in views:
{ "searchKeywords": ["drone review", "fpv drone"], "maxVideosPerKeyword": 100, "minViewsPerSubscriber": "2" }
New videos about your products every day, each delivered once (schedule it daily):
{ "searchKeywords": ["skyrover x1", "dji mini 5 pro"], "uploadedWithin": "today", "maxVideosPerKeyword": 50, "onlyNewVideos": true, "listName": "brand-watch" }
Measured data quality
Share of results with a value, measured on the Apify platform on 2026-10-07 (each column is a separate run of one keyword, so the sets are not identical):
| Field | figures, 300 | full, 300 | list, 300 | Shorts figures, 50 |
|---|---|---|---|---|
| Unrounded view count | 300/300 | 300/300 | 300/300 | 50/50 |
| Publish date | 300/300 | 300/300 | 8/300 (list reads none) | 50/50 |
| Like count | 292/300 | 295/300 | — | 50/50 |
| Channel ID & handle | 300/300 | 300/300 | 300/300 | 50/50 |
| Subscribers | 299/300 | 298/300 | — | 50/50 |
| Chapters | 96/300 | 216/300 | 102/300 | — |
| Comment count (full) | — | 298/300 | — | — |
| Unique videos | 300/300 | 300/300 | 300/300 | 50/50 |
Where a like count is missing, the channel hides it: the 13 rows without one across the first two runs were 8 videos whose pages each show a "Like" button with no number. A video nobody has liked yet reads likes: 0 (21 of 300 in the full run), never null.
Honest limits
- A keyword is not exhausted. YouTube gives a different slice each time; a keyword returned 515 to 664 different videos in our runs, not "all" of them. For a keyword's fullest ranking, run it on its own.
- YouTube limits video pages, not the rest. After a number of
fullpage reads YouTube answers HTTP 403; the Actor then routes those pages through Apify Proxy (slower) and, if none are accepted, delivers the rest with exact figures and says how many. Searches, figures and channel panels were never refused in 67 logged runs. - No order by upload date — YouTube removed it. Use
uploadedWithin, and note that Popularity is "most viewed first" but not a strict sort (4 to 16 of 39 neighbouring pairs out of order in six samples). - No transcripts, tags, categories or comment texts, and no channels or playlists as results — videos and Shorts only. Subscriber and large comment counts are YouTube's rounded figures.
- YouTube can change its pages at any time; a number or date that cannot be read is
null, never estimated.
Speed
On the platform with the default 1 GB (2026-10-07): the prefilled 50-result input took 3 to 7 seconds across 17 runs; 300 results of one keyword with exact figures and channels took 17 to 20 seconds (~500 requests), or 15 seconds as search results only. One keyword followed to its end gave 515 videos as list results in 44 seconds, and 631 with exact figures and channels in 72 seconds. A full run of 300 took 40 to 45 seconds from an address YouTube accepted, longer when pages went through the proxy. A run the platform restarts continues from the rows it already delivered.
Pricing
Pay per result, by depth: one event per delivered row named by its detailLevel — video (search result only), video-exact (exact figures, the default) and video-detailed (whole page). Status rows, filtered-out videos and videos that could not be read are free; a full row whose page YouTube refused is delivered with exact figures and charged as the figures event. Each run also has Apify's run-start event. Current prices are on the actor's Pricing tab on Apify.
See what ranks on YouTube: enter your keywords and get every result with exact views, likes, publish date and the channel behind it — exportable to JSON, CSV or Excel.
Open the YouTube Search Scraper →Related
Search returns videos for a keyword; to pull one channel's whole catalogue with exact stats and outlier detection use the YouTube Channel Videos Scraper, to find the channels themselves use the YouTube Channel Finder, and for the discussion under the results use the YouTube Comments Scraper. For creator outreach, the YouTube Channel Email Scraper pulls public business emails.
Frequently asked questions
Are the view counts exact?
Yes for videos, at every level: YouTube's search results carry the unrounded count. A Short that YouTube returned as a shelf card carries a rounded one; figures and full replace it with the exact count, and viewsAreExact tells you which you have.
Why did I get fewer results than maxVideosPerKeyword?
Most often the search ran out: YouTube's results ended, or following the search again no longer brought enough new videos — the status message names up to five keywords this happened to. A keyword gave 515 to 664 different videos in our measurements; narrow or filtered searches give fewer.
Why does a row have no like count?
With details: "list" likes are not read. With figures and full, likes is null when the channel hides its like counts; a premiere that has not started can also come without one. A video nobody has liked yet reads likes: 0, not null.
Can I sort by upload date?
YouTube no longer offers that order. Use uploadedWithin for recent videos; with figures or full every row then has its publishedDate, except a premiere or stream not started and a video less than a day old whose hour holds midnight UTC.
Does it need a proxy or an API key?
No API key, and nothing to set up. Requests go out directly. The one kind of request YouTube refuses after a while — video pages read with details: "full" — is moved to Apify Proxy by the Actor itself; searches, figures and channel panels were never refused.
YouTube Search Scraper — ranked results, exact figures, the channel behind each one. Pay per row, no API key.
Get YouTube search data on Apify →