YouTube Search Scraper - Videos, Views & Channels avatar

YouTube Search Scraper - Videos, Views & Channels

Pricing

from $1.83 / 1,000 video returneds

Go to Apify Store
YouTube Search Scraper - Videos, Views & Channels

YouTube Search Scraper - Videos, Views & Channels

For content research, trend tracking and AI datasets: search YouTube and get one row per video with title, channel, views as text and as a number, length, thumbnail and description. YouTube never says a search found nothing - it returns unrelated videos - so every row carries what was searched.

Pricing

from $1.83 / 1,000 video returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

3 days ago

Last modified

Share

YouTube Search Scraper - videos, views and channels

For competitor and content research, trend spotting, building a video dataset, and feeding an AI pipeline: search YouTube and get one row per video — title, channel, view count, length, thumbnail and description.

The part that makes this one different is uncomfortable to say out loud: YouTube never tells you a search found nothing. It quietly returns unrelated videos instead. Searching for zzzqqqxxnotarealquery12345 returns Japanese gaming clips and a live stream, with no "no results" message anywhere. A scraper that hands those to you as "search results" is not lying on purpose — it simply cannot tell. This one can, and says so.

It also tells you when YouTube changed your query. Search for qwertyuiopasdfghjkl zxcvbnm 9988 and YouTube decides you meant qwertyuiop asdfghjkl zxcvbnm 9988 and returns results for that. Every row carries what was actually searched.

Every number arrives twice: as YouTube writes it and as a number. View count 155,353 views and 155353; length 4:53 and 293 seconds; the publish date exactly as shown (6 months ago) plus publishedApproxDaysAgo (182.6) — named "approx" because a relative phrase is not a date and pretending otherwise invents a fact. A live stream shows 1,234 watching rather than a view count, so its viewCount is left empty rather than filled with the wrong number.

Sorting actually works, and that was measured: the default first result had 155,353 views; with view_count the first result had 4,298,465.

No API key, no login. Export as JSON, CSV or Excel.

What every row carries

  • The video: id, title, URL, description snippet, thumbnail
  • The channel: name, channel id, channel URL, and whether it is verified
  • The numbers: view count as YouTube writes it (155,353 views) and as a number (155353), length as text (4:53) and in seconds (293)
  • What it is: isShort (60 seconds or less), isLive
  • Where it came from: the query, the page, and the rank on that page
  • How well it matches: matchedTermCount / queryTermCount and looksUnrelated - how many of your search terms actually appear in the title, description or channel name

The three things this Actor refuses to fake

1. It never presents unrelated videos as results. When every returned video contains none of your search terms, you get a free row saying so, together with YouTube's own estimate of how many videos match. For a real query that estimate is in the millions; for a nonsense query it was 44.

2. It tells you when YouTube changed your query. Search for qwertyuiopasdfghjkl zxcvbnm 9988 and YouTube decides you meant qwertyuiop asdfghjkl zxcvbnm 9988 and returns results for that. Every row carries both query (what you asked) and searchedFor (what YouTube used), and a free row spells it out.

3. It does not invent a publish date. YouTube only shows relative times. You get publishedText ("6 months ago") exactly as shown, plus publishedApproxDaysAgo (182.6) - named "approx" because that is what it is. No fabricated timestamps.

Live streams show 1,234 watching rather than a view count, so their viewCount is empty rather than filled with a wrong number, and they are not silently dropped by a minimum-views filter.


Example output (one row, shortened)

{
"query": "web scraping tutorial",
"searchedFor": null,
"rank": 1,
"videoId": "hHQlcnubuFI",
"title": "Learn Web Scraping in 5 Minutes (NO PRIOR KNOWLEDGE)",
"url": "https://www.youtube.com/watch?v=hHQlcnubuFI",
"channelName": "CodeHead",
"channelId": "UCFVteOob_YXJHPaGTqlDV2Q",
"channelUrl": "https://www.youtube.com/@codehead01",
"viewCountText": "155,353 views",
"viewCount": 155353,
"lengthText": "4:53",
"lengthSeconds": 293,
"publishedText": "6 months ago",
"publishedApproxDaysAgo": 182.6,
"isShort": false,
"isLive": false,
"channelVerified": false,
"matchedTermCount": 2,
"queryTermCount": 3,
"looksUnrelated": false,
"thumbnailUrl": "https://i.ytimg.com/vi/hHQlcnubuFI/hq720.jpg"
}

Input

FieldKeyWhat it does
Search queriesqueriesOne or more searches; each row says which query produced it
Results per querymaxResultsPerQueryPages are followed automatically (~16-20 per page)
Maximum recordsmaxRecordsThe most rows this run may return and charge for
Sort bysortByrelevance / upload_date / view_count / rating
Drop unrelateddropUnrelatedRemove videos containing none of your search terms
Exclude / only ShortsexcludeShorts, onlyShorts60 seconds or less counts as a Short
Minimum viewsminViewsLive streams have no view count and are not compared
Maximum lengthmaxLengthSeconds0 = no limit; videos with unknown length are kept
Published withinpublishedWithinDaysCompares the approximation, see above
Keywords / match / excludekeywords, keywordMatch, excludeKeywordsText filters over title, description, channel
Only new since last runmonitoringModeFor a schedule watching a query
Forget what was returnedresetMonitoringStateClears that memory once
Maximum requestsmaxRequestsHard ceiling on requests sent to YouTube
Use a proxyuseProxyOff by default - a plain connection works

Frequently asked

How many results can I get per query? YouTube pages the results and this Actor follows the pages. Page 1 and page 2 were measured to share zero videos, so paging genuinely advances rather than repeating the first page.

Does sorting actually work? Yes - measured: the default first result had 155,353 views, and with view_count the first result had 4,298,465.

Does it work with non-English queries? Yes. A Japanese query was measured returning correct Japanese results with view counts and lengths intact.

Do I need a proxy? No. A plain connection returns results. The proxy option exists for the case where YouTube answers with a bot check, and that case is reported as its own free row rather than as an empty result.

Can I get only Shorts? Barely. Measured on 8 September 2026: YouTube returns Shorts in a separate shelf that this Actor does not read, so a search filtered to Shorts usually comes back empty. The filter exists for the occasional short video that does appear in the normal results.

Why is channelId sometimes empty? It is read only from the video's own owner field. Search pages also contain ids belonging to suggested channels; taking the first id on the page would attribute a video to the wrong channel, so this Actor leaves the field empty instead of guessing.


Pricing

Pay per event: you are charged for each video returned. Rows that explain a problem - a rewritten query, a search whose results contain none of your terms, a bot check, an unreadable answer, a filter that matched nothing, a result cut by your maximum - are never charged.