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

What you get

GroupFields
RankKeyword, rank among the different results, which of YouTube's answers it stood in (searchPass), YouTube's own estimated result count
VideoVideo ID (stable key), URL, title, kind (video or Short), description snippet, YouTube's AI summary where shown, thumbnail
FiguresUnrounded views (with an exact flag), likes, publish date and "days since", likeRate, viewsPerDay, viewsPerSubscriber, duration
ChannelChannel 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 & contextLive / 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

InputWhat it does
searchKeywordsOne search per line, as you would type it into YouTube (up to 1,000)
resultTypesvideos, shorts or both (default videos); each kind is searched on its own
maxVideosPerKeyword · maxVideosRows per keyword and kind (default 50) · total rows (default 1,000)
sort · uploadedWithin · duration · featuresYouTube's own filters: relevance/popularity · today/week/month/year · short/medium/long · live, 4k, hd, subtitles, CC, 360, …
detailslist, figures (default) or full — how much is read per video
channelStatsAdd subscribers, country, lifetime views and video count (default on)
minViews · minViewsPerSubscriberKeep only videos above a view count · above a views-to-subscribers ratio (decimals allowed)
exactSpelling · countrySearch as typed, not YouTube's correction · two-letter country the search is made for
onlyNewVideos · listNameRemember 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):

Fieldfigures, 300full, 300list, 300Shorts figures, 50
Unrounded view count300/300300/300300/30050/50
Publish date300/300300/3008/300 (list reads none)50/50
Like count292/300295/300—50/50
Channel ID & handle300/300300/300300/30050/50
Subscribers299/300298/300—50/50
Chapters96/300216/300102/300—
Comment count (full)—298/300——
Unique videos300/300300/300300/30050/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

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 →