YouTube Search Scraper - Videos, Views & Channels
Pricing
from $1.83 / 1,000 video returneds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
3 days ago
Last modified
Categories
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/queryTermCountandlooksUnrelated- 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
| Field | Key | What it does |
|---|---|---|
| Search queries | queries | One or more searches; each row says which query produced it |
| Results per query | maxResultsPerQuery | Pages are followed automatically (~16-20 per page) |
| Maximum records | maxRecords | The most rows this run may return and charge for |
| Sort by | sortBy | relevance / upload_date / view_count / rating |
| Drop unrelated | dropUnrelated | Remove videos containing none of your search terms |
| Exclude / only Shorts | excludeShorts, onlyShorts | 60 seconds or less counts as a Short |
| Minimum views | minViews | Live streams have no view count and are not compared |
| Maximum length | maxLengthSeconds | 0 = no limit; videos with unknown length are kept |
| Published within | publishedWithinDays | Compares the approximation, see above |
| Keywords / match / exclude | keywords, keywordMatch, excludeKeywords | Text filters over title, description, channel |
| Only new since last run | monitoringMode | For a schedule watching a query |
| Forget what was returned | resetMonitoringState | Clears that memory once |
| Maximum requests | maxRequests | Hard ceiling on requests sent to YouTube |
| Use a proxy | useProxy | Off 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.