YouTube Video Scraper By Hashtag
Pricing
$19.99/month + usage
YouTube Video Scraper By Hashtag
YouTube Video Scraper by Hashtag extracts videos associated with any YouTube hashtag, capturing titles, descriptions, creators, metrics, timestamps, and video URLs. Perfect for trend tracking, content research, hashtag analysis, and automating structured YouTube hashtag-based data collection.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
2
Monthly active users
10 days ago
Last modified
Categories
Share
YouTube Hashtag Scraper — Videos, Shorts and View Counts
YouTube Video Scraper by Hashtag pulls videos and Shorts straight from YouTube's own public search results, matched by hashtag, plain keyword, or @handle. Every row returns the video's thumbnail URL, title, video ID, canonical URL, view count, and type (video or shorts), plus YouTube's own hashtag summary line when the search surfaces one. Content strategists, trend researchers, and SEO teams use it to see exactly what a hashtag or keyword actually surfaces on YouTube before building content or a campaign around it. No YouTube account, API key, or developer quota is required — you supply search terms and get structured rows back.
🔍 What is YouTube Video Scraper by Hashtag?
YouTube Video Scraper by Hashtag is an Apify Actor that runs your search terms through YouTube's public search pages, follows YouTube's own pagination, and returns one structured dataset row per unique video or Short. It does not require a YouTube account, sign-in, or API key — it reads the same search results any visitor sees.
- Three genuine search types in one run —
#chatgptruns a hashtag search,chatgptruns a keyword search,@mkbhdruns a handle search. Terms are used exactly as typed, never rewritten into a different search kind. - Core identifying fields returned — video ID, title, canonical watch/Shorts URL, and the largest thumbnail YouTube served.
- Engagement and classification data — view count and a
video/shortstype flag, set only from YouTube's explicit signals rather than guessed from duration. - Shorts included by default, isolatable on demand — ordinary searches include Shorts pulled from YouTube's live Shorts shelf, and a dedicated switch narrows a run to Shorts only.
- Bulk, per-term limits — scrape many search terms in one run, with a result cap applied individually to each term.
- Standard Apify export formats — every run's dataset can be downloaded as JSON, CSV, Excel, or HTML table, or read via the Apify API.
📦 What data can I extract with YouTube Video Scraper by Hashtag?
Each row returns identifying, engagement, and hashtag-context data for one video or Short — these are the exact seven keys the Actor's row-builder writes, and every row carries all seven:
| Field | Example value | Use case |
|---|---|---|
thumbnailUrl | "https://i.ytimg.com/vi/aB3xY7zT9Qk/hq720.jpg?sqp=..." | Preview images for a content grid or report |
title | "ChatGPT Explained in 5 Minutes" | Topic and keyword analysis, listing display |
id | "aB3xY7zT9Qk" | Stable key for joining against other datasets, building the video URL |
url | "https://www.youtube.com/watch?v=aB3xY7zT9Qk" | Direct link for review, embedding, or outreach |
viewCount | 214830 | Ranking videos by traction, trend measurement |
type | "video" | Separating ordinary uploads from Shorts in analysis |
hashtagCategoryData.categoryInfoText | "2.6M videos • 822K channels" | Sizing a hashtag's overall footprint before committing to it |
Engagement and classification data
viewCount and type are the two fields that let you rank and segment results. viewCount carries YouTube's exact digit count on ordinary search rows ("483,437 views" → 483437), but on Shorts rows it carries YouTube's own abbreviated form expanded to an integer ("4.5M views" → 4500000) — rounded to whatever precision YouTube chose to display, not exact to the digit. viewCount is null when YouTube served no count at all, such as a live stream showing a "watching now" figure instead of views. type is set only when YouTube itself routes the video to /shorts/<id> or the Shorts player — never inferred from video length — so a short ordinary upload is never mislabeled as a Short.
Search-type and targeting fields
hashtagCategoryData.categoryInfoText is a literal flat key containing a dot, not a nested object, and it is populated only on hashtag searches (#chatgpt) — keyword searches, handle searches, and Shorts-only runs return null for it, because YouTube itself does not render that summary line on those result pages. Combined with the type field, it lets you separate "how big is this hashtag" research from ordinary keyword or creator lookups in the same run.
🆚 How does YouTube Video Scraper by Hashtag differ from the official YouTube Data API?
The YouTube Data API v3's search.list method caps maxResults at 50 per page (default 5) and exposes no hashtag-specific or Shorts-specific filter parameter — a hashtag or a Shorts request is just plain text or a duration guess, not a distinct search mode (per Google's search.list reference documentation, checked 2026-08-04). It also requires a Google Cloud project, an API key, and quota management, since every call is metered against a shared daily unit pool.
| Feature | YouTube Data API v3 | YouTube Video Scraper by Hashtag |
|---|---|---|
| Setup | Google Cloud project + API key | None — no key, no login |
| Hashtag as a distinct search mode | Not documented; # is just query text | Hashtag, keyword, and @handle are three distinct, verbatim search kinds |
| Shorts-only filter | Not documented | scrapeShortsOnly boolean input |
| Results per query | 50 per page (maxResults max), paginated via pageToken | Up to 500 requested per term; real ceiling is YouTube's own search depth |
| Usage metering | Daily quota units, shared per project | Pay-per-result dataset rows, no quota to track |
| Hashtag summary text ("2.6M videos • 822K channels") | Not exposed by the API | Returned as hashtagCategoryData.categoryInfoText |
Why can't I just filter search.list by hashtag or Shorts?
Because the official API was not built around either concept: search.list takes a free-text q parameter and a small set of generic filters (duration, category, license), and Google's own reference lists no hashtag or Shorts-specific parameter (checked 2026-08-04). In practice that means matching a hashtag's actual result set — including the videos YouTube itself groups under it — requires reproducing YouTube's search-page logic outside the API. This Actor reads that same public search surface directly, so #chatgpt and chatgpt return the different result sets YouTube itself produces, and scrapeShortsOnly reads YouTube's live Shorts shelf instead of approximating it from a duration filter.
Use the official API when you need OAuth-scoped access to a channel's own private data or you are already inside Google's quota system for other calls. Use this Actor when you need hashtag- or Shorts-aware search results at volume without provisioning API credentials.
💡 How to use data extracted from YouTube
Content strategists and marketers
Run a shortlist of hashtags and keywords relevant to a campaign, set maxResults to see deep into each term's result set, and sort the returned rows by viewCount to find which angle YouTube is already rewarding. The hashtagCategoryData.categoryInfoText field tells you a hashtag's overall size before you commit content to it, and type lets you split the Shorts opportunity from long-form.
Social media and SEO agencies
Agencies tracking hashtag performance for multiple clients can run the same term list on a schedule and diff viewCount and result composition (type) run over run, without maintaining a Google Cloud project or API key per client account.
Market research and trend intelligence
Feed a batch of category or competitor hashtags in one run and compare hashtagCategoryData.categoryInfoText and result volume across terms to map where attention is concentrated on YouTube right now, or track a @handle's recent search footprint.
AI agents and automated pipelines
Because the Actor is invoked over the standard Apify API, an agent framework can call it as a tool, pass in a hashtag or topic, and read back structured title/url/viewCount rows to ground a summary or a recommendation — no scraping or HTML parsing logic inside the agent itself.
🔼 Input sample
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
hashtags | Yes | array of strings | One or more search terms, used verbatim. #chatgpt runs a hashtag search, chatgpt a keyword search, @mkbhd a handle search. A term is never rewritten, so a keyword and a hashtag return genuinely different result sets. | ["#chatgpt", "prompt engineering", "@mkbhd"] |
maxResults | No | integer (min 1, max 500, default 10) | How many videos to collect for each term. YouTube exhausts a search term at roughly 300 results (measured: 301 on #chatgpt over 34 continuation pages), so higher values simply stop when the term runs out, and the run log records where it stopped. | 100 |
scrapeShortsOnly | No | boolean (default false) | Return only YouTube Shorts. Shorts rows carry YouTube's abbreviated view count and no hashtag summary line, because YouTube serves neither on the Shorts-filtered page. | false |
proxyConfiguration | No | object (default {"useApifyProxy": false}) | Optional proxy — Apify Proxy or your own proxyUrls list. Whichever you pick is attached to every request. With Apify Proxy the Actor escalates to residential and retries a term YouTube blocks; a custom proxy list is never silently swapped for Apify Proxy. | {"useApifyProxy": true} |
{"hashtags": ["#chatgpt", "prompt engineering", "@mkbhd"],"maxResults": 100,"scrapeShortsOnly": false,"proxyConfiguration": {"useApifyProxy": true}}
Common pitfall: setting maxResults to 500 expecting exactly 500 rows back per term. YouTube's own search depth is the real ceiling — a term measured to exhaustion (#chatgpt) ran out at 301 videos over 34 continuation pages. Check the run log for the line stating how many rows a term produced and whether it was exhausted or hit maxResults.
🔽 Output sample
One dataset row per unique video, deduplicated by video ID within each term. Export it as JSON, CSV, Excel, or an HTML table directly from the Apify Console, or pull it through the Apify API.
{"thumbnailUrl": "https://i.ytimg.com/vi/aB3xY7zT9Qk/hq720.jpg?sqp=-oaymwEnCNAFEJQDSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLDsample","title": "ChatGPT Explained in 5 Minutes","id": "aB3xY7zT9Qk","url": "https://www.youtube.com/watch?v=aB3xY7zT9Qk","viewCount": 214830,"type": "video","hashtagCategoryData.categoryInfoText": "2.6M videos • 822K channels"}
All seven fields are always present in the row, even when a value could not be read from YouTube — in that case the field is null, never an empty string, a placeholder, or a fabricated 0.
🎯 How do you filter and target specific videos?
This Actor exposes three real targeting axes — there is no location, date-range, or rating filter, so this section covers exactly what exists rather than padding it out.
- Search-type precision (
hashtagsterm formatting) — the same string produces a different result set depending on how it is written.#chatgptruns YouTube's hashtag search and returns the hashtag's own summary line;chatgptruns an ordinary keyword search;@mkbhdruns a handle search that is text-matched, not a channel listing. Pick the form that matches what you actually want to measure. - Content-type scope (
scrapeShortsOnly) — leave itfalseto get YouTube's normal mixed result set (videos and Shorts together, in YouTube's own order), or set ittrueto isolate only the Shorts shelf for short-form-specific research. - Volume and pagination (
maxResults) — set the ceiling per term from 1 to 500. The Actor follows YouTube's continuation tokens until it reaches that number, YouTube's own search runs out, or three consecutive continuation pages return no new videos — whichever happens first.
Three real examples:
{ "hashtags": ["#chatgpt"], "maxResults": 200 }
Hashtag search, deep pagination — returns the hashtag's own summary line plus up to 200 tagged videos and Shorts.
{ "hashtags": ["fitness"], "scrapeShortsOnly": true, "maxResults": 150 }
Keyword search scoped to Shorts only — short-form content research for a topic, no hashtag summary line.
{ "hashtags": ["@mkbhd"], "maxResults": 50, "proxyConfiguration": { "useApifyProxy": true } }
Handle search with Apify Proxy enabled, so a blocked request escalates to residential automatically instead of failing the term.
▶️ Want to try other YouTube scrapers?
| Scraper | What it extracts |
|---|---|
| YouTube Channel & Playlists Scraper | A channel's profile, videos, Shorts, live streams, community posts, and its Playlists/Podcasts tabs, with exact view and like counts |
| YouTube Most Replayed Scraper With Channel Details | A video's most-replayed heatmap peaks plus the publishing channel's ID, handle, avatar, and subscriber text |
| TikTok Data Scraper — Video, Hashtag & Sound Performance | TikTok videos, hashtags, and sounds tracked across runs, with view/like/comment deltas and velocity |
| TikTok Trending Creator Insights Scraper With Per-Video Stats | Trending TikTok creators per market, enriched with per-video plays, likes, comments, and shares |
| TikTok Shop Data Scraper: Reviews & Sentiment Analysis | TikTok Shop products with full reviews, reviewer trust signals, and optional AI sentiment analysis |
⚙️ How to extract YouTube data programmatically
Every run is a standard Apify Actor call: one API call to start the run, one dataset ID back, structured JSON rows to read.
Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run_input = {"hashtags": ["#chatgpt", "prompt engineering"],"maxResults": 100,"scrapeShortsOnly": False,}run = client.actor("<your-username>/youtube-video-scraper-by-hashtag").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["viewCount"], item["url"])
Export to spreadsheets or CRM
Download the dataset as CSV directly from the Apify Console or via the API, then map title to a Headline column, url to a Link column, and viewCount to a numeric Views column for sorting in a spreadsheet or importing into a CRM/content-planning tool.
⚖️ Is it legal to scrape YouTube?
Yes. This Actor collects only what YouTube's own public search pages display to any anonymous visitor — no login, no private content, and no account-gated data. The seven fields it returns (thumbnail, title, video ID, URL, view count, type, and hashtag summary text) describe published video content, not individuals; the Actor does not extract creator names, channel handles, comments, or any other personal identifier. That makes this business/content data rather than personal data, so the applicable framework is YouTube's Terms of Service and ordinary database-rights considerations around YouTube's compiled search index, not GDPR or CCPA. Consult legal counsel for commercial applications involving bulk storage of personal data.
❓ FAQ
What happens if a scraped video is later deleted or made private?
The row you already collected keeps the title, thumbnail, and view count YouTube served at run time — the Actor does not re-check videos after the run ends, so a later deletion or privacy change on YouTube's side does not retroactively change or remove data already in your dataset.
Can I get YouTube's hashtag summary line along with the video rows?
Yes — hashtagCategoryData.categoryInfoText (e.g. "2.6M videos • 822K channels") is returned on every row when the search term is a hashtag. It is null on keyword searches, handle searches, and Shorts-only runs, because YouTube itself does not render that line on those result pages.
How accurate is the view count data?
It is exactly what YouTube served at request time. Ordinary search rows carry YouTube's exact digit count; Shorts rows carry YouTube's own abbreviated form (e.g. "4.5M views") expanded to an integer, so it is rounded to whatever precision YouTube chose to display, not exact to the digit.
How many videos can I get per run?
Up to maxResults (max 500) for each search term you provide — the limit is per term, not per run. In practice YouTube itself is the real ceiling: a term scraped to exhaustion (#chatgpt) ran out at 301 videos over 34 continuation pages, and the run also stops early if three consecutive continuation pages return no new videos.
How do I search by hashtag, keyword, or username in the same run?
Add each term to hashtags in the form you want it treated: #tag for a hashtag search, a bare word or phrase for a keyword search, @handle for a handle search. Every term in the list is used exactly as typed, so you can mix all three kinds in a single run.
Does YouTube Video Scraper by Hashtag work with Claude, ChatGPT, and AI agent frameworks?
It has no dedicated MCP server; it is callable as a standard Apify Actor over the Apify API, so any agent framework that can make an HTTP call and read the apify-client library can invoke it as a tool and read back the dataset rows.
How does this Actor compare to the other YouTube scrapers in this collection?
It is the base, hashtag-and-search-focused member of a family of YouTube Actors — see "Want to try other YouTube scrapers?" above for the channel-level and most-replayed-heatmap variants. Within this Actor's own scope, rows are pushed and charged exactly once per unique video, type is set only from explicit YouTube signals rather than a duration guess, and a missing value is always null rather than a placeholder string or a fabricated zero.
Can I use this Actor without a YouTube API key or developer account?
Yes. No YouTube Data API key, no Google Cloud project, and no YouTube login are required — you only need an Apify account to run the Actor.
Conclusion
YouTube Video Scraper by Hashtag turns a list of hashtags, keywords, or handles into structured video and Shorts data — thumbnail, title, ID, URL, view count, type, and hashtag context — without a YouTube API key, login, or quota to manage. It fits content research, trend tracking, and agency reporting workflows that need to see what YouTube's own search actually surfaces for a term, at the volume a single run allows. Start it from the Apify Console or the Apify API with a list of search terms to get your first dataset back.