YouTube Search Scraper · SERP Rank Tracker & Keywords
Pricing
from $0.70 / 1,000 search results
YouTube Search Scraper · SERP Rank Tracker & Keywords
YouTube search scraper and rank tracker for keyword research and SEO monitoring: search results with their exact position, the rank change since your last run and an only-new mode. Track your own channels or videos per keyword. No login, no API key.
Pricing
from $0.70 / 1,000 search results
Rating
0.0
(0)
Developer
TheQuietStack
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
15 days ago
Last modified
Categories
Share
YouTube Search Scraper · SERP Rank Tracker & Keyword Research
YouTube SERP rank tracker and keyword research: search results with exact positions, rank changes since the last run and a report per keyword.
YouTube search results with their exact position - and what changed since your last run. Track where your channel or your videos rank for any keyword (and pay only for those rows), get exact view counts, optional likes and comment counts, and one keyword report per query: how big the views of the top results are, how fresh they are, how many titles use the keyword, and which channels own the page.
No login, no Google account, no API key, no YouTube Data API quota.
What you get
| This Actor | Typical YouTube search scrapers | |
|---|---|---|
| Position | rank (as shown), typeRank (among videos only), page | a row number, if any |
| Rank tracking | trackChannels / trackVideos; outputMode: "trackedOnly" writes only your rows plus "not in top N" | scrape everything, filter yourself |
| Change since last run | previousRank, rankChange (+3 = up three places), isNew | - |
| Monitoring | onlyNewResults: the next run returns only results you have not received yet | same results again, charged again |
| Noisy order handled | rankSamples: 3 -> median position, best/worst, seen in k of 3 | single snapshot |
| Views | exact (751,311) for videos; Shorts flagged viewsExact: false or made exact with details | "751K" silently turned into 751000 |
| Likes / comments / date | enrichVideoDetails (exact where YouTube shows them exactly) | often missing |
| Keyword report | view distribution, freshness, title match, top channels | - |
| Filters before charging | min views, max age, title words, all query words in title | rarely |
| Duplicates | removed across pages (YouTube repeats results on later pages) | often duplicated |
Use cases
- YouTube SEO rank tracking: schedule a daily run with your keywords,
trackChannels: ["@yourchannel"],outputMode: "trackedOnly"andrankSamples: 3. You get one row per position of your videos and one report row per keyword - including "not in the top 50". - Keyword research before you film: run 20 candidate keywords with
outputMode: "reportsOnly"(one row per keyword). A keyword where the median top video has 2,000 views and 40 % of results are from the last 30 days is a different opportunity than one where the median is 2 million and nothing is newer than a year. - Competitor monitoring: track three competitor channels across your niche keywords and see who moves up.
- New-upload alerts for a topic:
uploadDate: "today"+onlyNewResults: trueon a schedule -> each run delivers only new videos for your keywords, straight into Google Sheets, Slack, Make, n8n or Zapier. - Influencer and sponsor discovery:
resultType: "channels"for channel cards with subscriber counts, or videos withminViewsto find who ranks. - Datasets for research or AI: clean JSON per result with position, query and region.
Input example
{"queries": ["notion template", "notion dashboard"],"resultType": "videos","region": "US","maxResultsPerQuery": 50,"trackChannels": ["@ProductiveSetups"],"outputMode": "trackedOnly","rankSamples": 3,"compareWithPreviousRun": true}
queries- search text, or ayoutube.com/results?search_query=...&sp=...link (its filters are used as they are).resultType(videosdefault,shorts,channels,playlists,all),sortBy(relevance,popularity),uploadDate(today,week,month,year),duration(under3,3to20,over20),features(live,4k,hd,subtitles,creativeCommons,360,vr180,3d,hdr,location,purchased) - exactly YouTube's own filter menu.region- country of the searching visitor (ranks differ by country).maxResultsPerQuery(scan depth, default 50, max 1000),maxPagesPerQuery,maxResults(hard cap on rows per run),rankSamples(1-5).outputMode(all,trackedOnly,reportsOnly),trackChannels,trackVideos,compareWithPreviousRun,onlyNewResults,stateStoreName.keywordReport,enrichVideoDetails.- Filters:
titleIncludes,titleExcludes,requireQueryWordsInTitle,minViews,maxAgeDays,dedupeAcrossQueries;requestDelaySecs.
Output example
Real rows from runs on 01 Oct 2026 (VPS test runs, region US unless noted).
A result with its change since the run four minutes earlier:
{"recordType": "video","query": "home workout no equipment","rank": 4,"typeRank": 4,"page": 1,"inShortsShelf": false,"isTracked": false,"trackedBy": [],"previousRank": 12,"rankChange": 8,"isNew": false,"id": "KeNObkhENKQ","url": "https://www.youtube.com/watch?v=KeNObkhENKQ","title": "TOP 10 Exercises to Get Fit At Home!","channelTitle": "Calisthenicmovement","channelHandle": "@calimove","channelId": "UCZIIRX8rkNjVpP-oLMHpeDw","channelUrl": "https://www.youtube.com/@calimove","channelVerified": true,"videoId": "KeNObkhENKQ","views": 2041196,"viewsText": "2,041,196 views","viewsExact": true,"liveWatching": null,"publishedTimeText": "3 years ago","publishedAtLatest": "2023-10-02T15:35:36.197Z","publishedAtEarliest": "2022-09-28T15:35:36.197Z","durationText": "8:11","durationSeconds": 491,"isLiveNow": false,"isUpcoming": false,"badges": ["4K"],"snippet": "Our Workout Programs https://calimove.com *Follow Along Routine* ...","thumbnailUrl": "https://i.ytimg.com/vi/KeNObkhENKQ/hq720.jpg","searchFilters": "EgIQAQ==","region": "US","scrapedAt": "2026-10-01T15:35:36.197Z"}
Rank tracking with rankSamples: 3 (tracked channel, outputMode: "trackedOnly") - shortened:
{ "query": "notion template", "rank": 1, "rankMin": 1, "rankMax": 2, "seenInSamples": 3, "samples": 3, "isTracked": true, "channelHandle": "@ProductiveSetups", "title": "Become a Notion Expert in 20 minutes | Notion Tutorial for Beginners (Full Guide)" }
A Short from the Shorts shelf with enrichVideoDetails (region DE) - shortened:
{ "recordType": "short", "rank": 1, "inShortsShelf": true, "url": "https://www.youtube.com/shorts/s3mjR7ORVZM", "channelHandle": "@realsun12", "views": 550399, "viewsExact": true, "likes": 6710, "likesExact": true, "comments": 60, "commentsExact": true, "publishedDate": "2025-06-01", "publishedDateApprox": false, "hashtags": ["Notion", "Productivity", "NotionSetup"], "detailsStatus": "ok" }
A keyword report (one per query, recordType: "keyword-report") - top channels shortened to three:
{"recordType": "keyword-report","query": "home workout no equipment","region": "US","youtubeEstimatedResults": 11395842,"resultsScanned": 25,"rankSamples": 1,"pagesFetched": 2,"counts": { "video": 25, "short": 0, "channel": 0, "playlist": 0 },"videoViews": { "sample": 25, "min": 292444, "p25": 1252654, "median": 2337966, "p75": 6575669, "max": 33372274, "exact": true },"freshness": { "videosWithAge": 25, "under7Days": 0, "under30Days": 0, "under365Days": 2, "shareUnder30Days": 0, "shareUnder365Days": 0.08 },"titleMatch": { "titles": 25, "shareWithExactPhrase": 0, "shareWithAllWords": 0.32 },"uniqueChannels": 15,"topChannels": [{ "channelTitle": "MadFit", "channelHandle": "@MadFit", "results": 8, "bestRank": 7 },{ "channelTitle": "growingannanas", "channelHandle": "@growingannanas", "results": 4, "bestRank": 1 },{ "channelTitle": "Calisthenicmovement", "channelHandle": "@calimove", "results": 1, "bestRank": 4 }],"tracked": [{ "tracked": "@productivesetups", "found": false, "bestRank": null, "notInTop": 25, "previousBestRank": null }],"comparedWithRunAt": "2026-10-01T15:31:31.319Z","newSinceLastRun": 10,"goneSinceLastRun": 10}
The run summary (SUMMARY in the key-value store) lists every query with its status (ok, no_results, partial, failed, blocked), results scanned, pages, rows written, what was skipped and why, and why the scan stopped.
How much does it cost?
Pay per event:
| Event | Price | When |
|---|---|---|
search-result | $0.001 | each result row written ($1.00 per 1,000) |
video-details | $0.001 | extra, per row whose likes/comments/date were fetched (enrichVideoDetails) |
keyword-report | $0.005 | each keyword report row |
| Job | Cost |
|---|---|
| 1,000 search results (20 queries x 50) | $1.00 |
| Same with likes, comments and exact dates | $2.00 |
Daily rank check: 30 keywords, top 50, 3 samples, trackedOnly, ~1 hit per keyword | 30 x ($0.005 + $0.001) = $0.18 per day |
Keyword research: 50 candidate keywords, outputMode: "reportsOnly" | 50 x $0.005 = $0.25 |
Never charged: results scanned only to compute ranks or reports, results outside trackedOnly, filtered results, results already delivered by onlyNewResults, duplicates, watch data that was unavailable or failed, queries with no results, failed or blocked queries. Set Max cost per run in Apify and the run stops cleanly at that amount; maxResults is a second hard cap.
Honest numbers
- YouTube's order is not stable for logged-out visitors. Measured on 01 Oct 2026 with four identical requests per query: the top 20 shared 9-20 of 20 videos, but in the top 10 only 1-8 videos kept their exact position. A single snapshot can move a video several places without anything changing. For tracking, use
rankSamples: 3: you get the median position, best and worst, and in how many samples the result appeared. Also expectnewSinceLastRunto be non-zero even minutes apart. - Ranks are positions in what YouTube returned, counted over every result in reading order (each Short of a Shorts shelf counts).
typeRankcounts only results of the same type - the number most rank trackers mean. Ads, "People also watched" and search suggestions are not results and are skipped. Filters never change ranks. - Views of normal videos are exact in the results list. Shorts show only rounded counts there ("550K") -
viewsExact: false- and become exact withenrichVideoDetails. Live streams haveliveWatchinginstead of views. - Ages are YouTube's "3 weeks ago"; you get that text plus
publishedAtLatest/publishedAtEarliest. Exact dates come withenrichVideoDetails.maxAgeDaysdrops a video only when it is certainly older. - Likes and comment counts (details) are exact when YouTube shows them exactly and flagged otherwise.
youtubeEstimatedResultsis YouTube's own estimate, not a count.- Texts are requested in English so numbers and dates are read exactly; queries can be in any language, and
regiondecides the ranking. Shorts in a mixed results page show no channel: tracking them needsenrichVideoDetails.
Polite access - Bot protection is never bypassed
- Only YouTube's public web-client data for the results page and (with details) the watch page - the same requests youtube.com makes for a visitor who is not logged in. The video player / stream endpoint is never called, nothing is downloaded.
- One request at a time with a pause (
requestDelaySecs, default 1 s), hard caps per query and per run, filters applied before charging. - Bot protection is never bypassed. If YouTube answers with HTTP 403 or 429, a captcha or "confirm you're not a bot" page, a consent or login redirect, or an answer without the expected structure, the Actor stops the whole run at once with status FAILED and a clear message (
SUMMARY.blockednames where and why; remaining queries are listed undernotReached). No retries of a block, no proxy or IP rotation, no header tricks, no login, no cookies, no consent clicking. Results read before the stop are written; the blocked query gets no keyword report and no memory update, and nothing is charged for what was not delivered. - A plain server error (5xx) is retried exactly once after 5 seconds; anything else is reported, not retried.
FAQ
Do I need a YouTube API key? No, and there is no daily quota like the YouTube Data API's 100 searches per day.
How deep can it go? As far as YouTube lets a visitor scroll; capped by maxResultsPerQuery (max 1000) and maxPagesPerQuery. Later pages repeat earlier results - duplicates are removed and not charged.
Why do I get fewer rows than results scanned? trackedOnly, filters, onlyNewResults and maxResults. The summary lists every skip reason.
Can I use my own filter combination from the browser? Yes - paste the results link (with &sp=...) as a query.
Does it get e-mails or contact data? No. It returns what YouTube shows publicly in search results: titles, channels, counts.
Is it legal? It reads public pages without logging in. Respect YouTube's Terms of Service and creators' rights when you republish content. This Actor is not affiliated with or endorsed by YouTube or Google.
Use it via API, integrations and AI agents
curl -X POST "https://api.apify.com/v2/acts/thequietstack~youtube-search-tracker/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"queries":["notion template"],"maxResultsPerQuery":50,"keywordReport":true}'
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("thequietstack/youtube-search-tracker").call(run_input={"queries": ["notion template", "notion dashboard"], "trackChannels": ["@yourchannel"],"outputMode": "trackedOnly", "rankSamples": 3, "compareWithPreviousRun": True})for r in client.dataset(run["defaultDatasetId"]).iterate_items():if r["recordType"] == "keyword-report":print(r["query"], [(t["tracked"], t["bestRank"], t["previousBestRank"]) for t in r["tracked"]])
Works with Apify schedules, webhooks and integrations (Google Sheets, Make, n8n, Zapier, Slack), and as a tool for AI agents through the Apify MCP server.
Works with
- YouTube Channel Videos Scraper - every upload of the channels you found, with exact views, likes and dates.