YouTube Metadata Scraper (Hashtag Video Finder)
Pricing
Pay per usage
YouTube Metadata Scraper (Hashtag Video Finder)
The YouTube Metadata Scraper actor collects video details like titles, views, likes, upload dates, channels, and tags. It supports keyword or channel-based scraping for large-scale data extraction. Ideal for analytics, SEO tracking, research, and automating YouTube content monitoring.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
0
Bookmarked
31
Total users
0
Monthly active users
13 days ago
Last modified
Categories
Share
YouTube Hashtag Video Scraper — Metadata, Tags & Transcripts
YouTube Metadata Scraper (Hashtag Video Finder) opens YouTube's real hashtag feeds — not a search for the literal #tag text — and returns full metadata for every video behind them: exact view and like counts, channel identity with the real @handle, the video's own hashtags, comments, and captions or transcripts, all as typed JSON with no HTML parsing required. Add direct video URLs or keyword searches to the same run for a comparison corpus. Configure the input below and start a run on Apify.
What is YouTube Metadata Scraper (Hashtag Video Finder)?
It is an Apify Actor that discovers YouTube videos three ways — by opening a hashtag's real browse feed (both the All-videos and Shorts tabs), by resolving direct video links or IDs, or by running a keyword search — then enriches every video it finds with full watch-page metadata, channel details, top-level comments and caption/transcript text. Output is one flat JSON row per video. No YouTube account, login, or API key is required to run it; the Actor reads only what a logged-out visitor can already see. It's built for content strategists, growth marketers, researchers and developers who need structured YouTube data without maintaining scraping infrastructure themselves.
What YouTube video data is publicly available to scrape?
Everything a logged-out visitor can see on a video's watch page or a hashtag's feed page is publicly accessible — no YouTube account is required to view it.
| Data category | Publicly available | Restricted behind |
|---|---|---|
| Title, description, category, creator tags | Yes | — |
| Exact view, like and comment counts | Yes | — |
| Channel identity — handle, display name, subscriber count, avatar, verified badge | Yes | — |
| The video's own hashtags and all served thumbnails | Yes | — |
| Top-level comments | Yes | — |
| Comment replies | Not returned by this Actor | Out of scope — only top-level comments are fetched |
| Caption/transcript tracks | Yes, when YouTube exposes them | Some tracks are only served to a residential-looking viewer, not a datacenter IP |
| Members-only video content | No | Channel membership login |
YouTube Metadata Scraper (Hashtag Video Finder) only returns publicly visible data — what any visitor sees. Nothing behind a login wall.
What data can I extract with YouTube Metadata Scraper (Hashtag Video Finder)?
Every video row carries video identity and thumbnails, channel and creator details, engagement counts and status flags, and hashtag provenance plus nested comments and transcripts — 40 fields in total, and every one of them is already in the Actor's default dataset view (nothing is held back in a narrower table).
| Field name | Description |
|---|---|
id | YouTube video ID |
url | Canonical watch URL |
title | Video title |
description | Full video description |
category | YouTube category |
tags | Creator keyword tags |
thumbnail | Default hqdefault thumbnail URL, constructed from the ID |
thumbnails_urls | Every real thumbnail URL YouTube served for the video |
description_links | Outbound links in the description, redirect-unwrapped |
channelID | Channel ID (UC...) |
channelURL | Channel URL in /channel/UC... form |
channelUsername | Real @handle without the @ — empty when YouTube exposes none, never invented |
channelDisplayName | Channel display name |
channelHandle | Real channel handle including the @ |
channelHandleUrl | youtube.com/@handle URL |
author_avatar_url | Channel avatar image URL |
Engagement, status and quality flags
| Field name | Description |
|---|---|
viewCount | Exact view count |
likeCount | Exact like count |
commentCount | Comment count as shown by YouTube (rounded above roughly 1,000) |
lengthInSeconds | Duration in seconds |
channelSubscribers | Subscriber count as YouTube abbreviates it, e.g. "2.93M" |
is_verified | Channel carries a verified/official-artist badge |
is_live_now | Currently live or a live broadcast |
is_comments_off | Comments disabled — only evaluated on a healthy page, so a blocked page can never fake true |
is_members_only | Members-only video |
is_paid_content | Paid/sponsored content flag |
isShort | true only when discovered on the hashtag Shorts tab — false means "not discovered as a Short," not "proven long-form" |
Hashtag provenance, timestamps and nested data
| Field name | Description |
|---|---|
uploadDatetime | Exact upload timestamp, ISO-8601 with offset |
publish_date_since | Relative upload text, e.g. "2 years ago" |
foundViaHashtag | The hashtag feed this video came from (empty for URL/keyword rows) |
foundViaKeyword | The search keyword this video came from (empty for hashtag/URL rows) |
discoverySource | hashtag_all | hashtag_shorts | keyword_search | direct_url |
hashtagFeedPosition | Position in the hashtag feed as served in that run (null for URL/keyword rows — YouTube's hashtag order is not reproducible run to run) |
videoHashtags | Hashtags the video itself carries: the #-chips above the title, #-tokens in the title, and #-tokens in the description |
relatedHashtags | The video's other hashtags, excluding the one you searched — the co-occurrence signal |
hashtagVideoCountText | Size of the hashtag you opened, abbreviated by YouTube, e.g. "44M videos" |
hashtagChannelCountText | Channels using the hashtag, abbreviated, e.g. "5.2M channels" |
transcripts | Caption tracks as {language, content}, de-duplicated, capped at 6 per row |
comments | Top-level comments as {id, text, author, authorChannelId, likeCount, publishedTime, replyCount} |
scrapedAt | UTC timestamp of when the row was collected |
🤖 Add-on: Need additional YouTube data?
If you need more than video-level data, pair this Actor with YouTube Channel Finder With Creator Analytics to enrich a discovered channel with engagement rate and upload cadence, or YouTube Comments Scraper with Replies when you need full comment threads — including replies and AI sentiment scoring — rather than the top-level comments this Actor returns.
How does YouTube Metadata Scraper (Hashtag Video Finder) differ from the official YouTube API?
The YouTube Data API v3 is Google's official, quota-metered public API — it has no endpoint that returns YouTube's curated hashtag browse feed; its closest surface is search.list, a keyword search, which is a measurably different corpus from the hashtag feed this Actor opens directly.
| Feature | YouTube Data API v3 | YouTube Metadata Scraper (Hashtag Video Finder) |
|---|---|---|
| Hashtag feed access | No dedicated endpoint — only keyword search via search.list | Opens the actual hashtag browse feed (both All and Shorts tabs) |
| Setup | Google Cloud project, API key, and quota approval | An Apify account — no third-party API key |
| Quota | Default project quota is 10,000 units/day; search.list costs 100 units per call, videos.list costs 1 unit (Google's quota-cost documentation) | No YouTube-side quota consumed; Actor-side concurrency and timeouts are documented below |
| Captions/transcripts | captions.download requires OAuth authorization from the video's own channel owner (Google's captions documentation) — cannot fetch an arbitrary public video's transcript | Reads whatever caption tracks YouTube publicly exposes on the watch page, no OAuth |
| Output shape | Separate calls per resource (videos, channels, comments) that you must stitch together | One flattened row per video combining metadata, channel identity and hashtag provenance |
Use the official API when you need Google-guaranteed data freshness for your own channel or already hold OAuth-scoped access. Use this Actor when you need the hashtag feed itself, transcripts for videos you don't own, or a single combined row without stitching multiple API calls together.
How to use YouTube Metadata Scraper (Hashtag Video Finder)
This Actor runs on the Apify platform — no separate signup or API key beyond an Apify account is needed to start it.
- Open the Actor's page in the Apify Console using your Apify account.
- Provide at least one of
hashtags,urls, orkeywords— the schema marks all three optional, but the Actor raises an error and stops immediately if none are supplied. - Set the filters that matter for your run —
hashtagTab,maxVideosPerHashtag,max_comments,include_transcripts, orpublishedAfter. - Click Start.
- Download results as JSON, CSV, Excel or another format Apify's dataset export supports, or stream them via the API as the run progresses.
How to scale to bulk video extraction
hashtags, urls and keywords are all array inputs — list as many tags, links or search phrases as you need in a single run rather than looping over separate runs. The Actor processes up to 4 videos concurrently and pushes each finished row to the dataset as soon as it's ready, so results start arriving before the run finishes. Shard across multiple runs only if you want to parallelize beyond that concurrency limit or isolate billing per batch.
What can you do with YouTube video and hashtag data?
- 🏷️ A content strategist mapping a niche uses
videoHashtagsandrelatedHashtagsto see which tags creators actually pair with a topic before publishing. - 📈 A growth marketer sourcing creators uses
channelHandle,channelSubscribersandis_verifiedto shortlist active channels around a hashtag before outreach. - 🔬 A researcher studying platform behavior uses
hashtagFeedPositionanddiscoverySourceto compare what a hashtag feed surfaces against a plain keyword search on the same topic. - 🗣️ A brand or community team uses
commentsandcommentCountto gauge the volume and tone of engagement on videos tied to a campaign hashtag. - 🤖 An AI engineer builds a RAG index or research agent by feeding
title,descriptionandtranscriptsdirectly into a vector store or an LLM's context window — every field arrives as typed JSON, so it can be passed straight into an agent's tool response without extra parsing.
⚠️ How does YouTube Metadata Scraper (Hashtag Video Finder) handle rate limits and blocking?
Every request goes through a proxy — Apify Proxy defaults to a RESIDENTIAL exit in the US, because YouTube frequently returns an HTTP 200 with an empty title on unrecognized exits. If the chosen exit gets rejected (HTTP 403, 429, 503, or an HTTP-200 page with no playable title), the Actor automatically escalates to Apify RESIDENTIAL/US and logs the switch rather than silently returning empty rows — this detection covers both hard blocks and the "200 OK but blocked" case that a status-code check alone would miss. Each request is retried up to 3 times per proxy mode with a short randomized delay, capped at a fixed total attempt ceiling before giving up. Each video itself gets up to 3 independent retries, escalating the proxy mode between attempts, before it is skipped — a skipped video's row is never saved and never charged. Concurrency is capped at 4 videos in flight at once to keep runs stable. This Actor does not solve CAPTCHAs.
⬇️ Input
All 17 parameters are optional in the schema, but the Actor requires at least one of hashtags, urls, or keywords to be filled in — a run with all three empty fails immediately.
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
hashtags | No | array | Tags with or without the leading #. Full youtube.com/hashtag/<tag> links work too. Spaces are removed. | ["minecraft", "sourdoughstarter"] |
hashtagTab | No | string — enum all / shorts / both, default "all" | Which hashtag tab to page. The two tabs measured zero video overlap between them. | "both" |
maxVideosPerHashtag | No | integer, min 1, max 1000, default 30 | Cap on videos collected per tag. With both, the cap applies to each tab separately (up to 2× per tag). | 50 |
skipUnknownHashtags | No | boolean, default true | On: log a warning and continue past a tag with no public videos. Off: stop the run. | true |
includeVideoHashtags | No | boolean, default true | Fill videoHashtags from the #-chips above the title, the title text, and the description. | true |
includeRelatedHashtags | No | boolean, default true | Fill relatedHashtags per row and write a run-level co-occurrence ranking to the HASHTAG_INSIGHTS key-value record. | true |
urls | No | array | Watch links, youtu.be links, /shorts/, /live/, /embed/ links, or bare 11-character video IDs. | ["https://www.youtube.com/shorts/w2VtJa-QmDc"] |
keywords | No | array | Ordinary YouTube search phrases, one per line — a comparison corpus to hashtag discovery. | ["minecraft build"] |
max_results_per_keyword | No | integer, min 1, max 100000, default 10 | Videos to take per keyword. YouTube's own search runs dry after roughly 130–485 results per keyword. | 20 |
sort_order | No | string — enum relevance / upload_date / view_count / rating, default "relevance" | Applies to keyword search only. YouTube's live UI currently honours only Relevance and View count. | "view_count" |
publishedAfter | No | string — datepicker, absolute or relative | Keep only videos uploaded on/after this date, checked after download. | "3 months" |
max_comments | No | integer, min 0, max 5000, default 2 | Top-level comments to pull per video. 0 skips comment requests entirely. | 10 |
include_transcripts | No | boolean, default true | Attach caption/transcript text when YouTube exposes it. | true |
transcript_format | No | string — enum text / timestamps, default "text" | text: a single string in transcripts[].content. timestamps: a list of {start, dur, text} objects. | "timestamps" |
include_english_auto | No | boolean, default false | Add YouTube's machine-generated English captions when no uploaded track exists. | false |
include_non_english | No | boolean, default false | Add other-language caption tracks. Capped at 6 tracks per row; caption collection aborts after 150 seconds. | false |
proxyConfiguration | No | object — proxy editor, default {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountryCode": "US"} | Proxy/exit network. Honoured on every request; auto-escalates to Apify RESIDENTIAL (US) if the chosen exit is rejected. | see default |
Example input
{"hashtags": ["minecraft", "sourdoughstarter"],"hashtagTab": "both","maxVideosPerHashtag": 30,"skipUnknownHashtags": true,"includeVideoHashtags": true,"includeRelatedHashtags": true,"urls": ["https://www.youtube.com/shorts/w2VtJa-QmDc"],"keywords": ["minecraft build"],"max_results_per_keyword": 10,"sort_order": "relevance","publishedAfter": "3 months","max_comments": 10,"include_transcripts": true,"transcript_format": "text","include_english_auto": true,"include_non_english": false,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountryCode": "US"}}
⬆️ Output
Results are typed, normalized JSON — one row per video, with a consistent schema across runs — downloadable as JSON, CSV, Excel or another format Apify's dataset export supports. Every field the Actor collects is charged under a single row_result event on Actor.push_data; a video only reaches the dataset (and only gets charged) after it passes an internal quality gate requiring a non-empty title, a view count, and a resolvable channel identity, and after it survives the publishedAfter date filter if one was set — videos that fail either check are skipped, logged, and never pushed, so you are never billed for an empty or unusable row.
Example output
{"id": "w2VtJa-QmDc","url": "https://www.youtube.com/watch?v=w2VtJa-QmDc","title": "El LOBO solo ATACA a este ESQUELETO en Minecraft #soymanuel #minecraft #shorts","description": "Minecraft build tutorial with a wolf vs skeleton fight. #minecraft #shorts","lengthInSeconds": 19,"uploadDatetime": "2026-06-17T16:47:11-07:00","publish_date_since": "1 month ago","category": "Gaming","tags": ["minecraft", "gameplay", "shorts"],"thumbnail": "https://i.ytimg.com/vi/w2VtJa-QmDc/hqdefault.jpg","thumbnails_urls": ["https://i.ytimg.com/vi/w2VtJa-QmDc/hqdefault.jpg","https://i.ytimg.com/vi/w2VtJa-QmDc/maxresdefault.jpg"],"channelID": "UCabc123def456","channelURL": "https://www.youtube.com/channel/UCabc123def456","channelUsername": "SoyManuelYouTube","channelDisplayName": "Soy Manuel","channelSubscribers": "2.51M","author_avatar_url": "https://yt3.googleusercontent.com/abc123","is_verified": true,"viewCount": 10721435,"likeCount": 542311,"commentCount": 8420,"is_live_now": false,"description_links": [],"is_comments_off": false,"is_members_only": false,"is_paid_content": false,"transcripts": [{ "language": "EN", "content": "Hoy vamos a construir una casa en Minecraft..." }],"comments": [{"id": "Ugz123abc","text": "This is amazing!","author": "@viewerhandle","authorChannelId": "UCviewer789","likeCount": 214,"publishedTime": "2 weeks ago","replyCount": 3}],"foundViaHashtag": "minecraft","foundViaKeyword": "","discoverySource": "hashtag_shorts","hashtagFeedPosition": 1,"isShort": true,"videoHashtags": ["soymanuel", "minecraft", "shorts"],"relatedHashtags": ["soymanuel", "shorts"],"hashtagVideoCountText": "44M videos","hashtagChannelCountText": "5.2M channels","channelHandle": "@SoyManuelYouTube","channelHandleUrl": "https://www.youtube.com/@SoyManuelYouTube","scrapedAt": "2026-07-30T09:12:44+00:00"}
How does it work?
This Actor reaches YouTube's real hashtag feed by calling the same internal browse endpoint the site itself uses for youtube.com/hashtag/<tag> (browse ID FEhashtag, with a tag- and tab-specific parameter built to match what YouTube's own page sends), paging it with continuation tokens until it hits your requested cap or the feed runs out. Every discovered video, plus any direct URL or keyword-search result, is then loaded through the same watch-page pipeline: the page's embedded ytInitialData and ytInitialPlayerResponse JSON blocks are parsed for metadata, comments and channel identity, and caption tracks are fetched separately when requested. Requests are routed through Apify Proxy (residential by default) with automatic retries and proxy escalation if YouTube rejects an exit. Only data visible on the public page is returned — nothing behind a login wall — and the output schema stays the same regardless of how YouTube's page layout changes underneath it.
Integrations
YouTube Metadata Scraper (Hashtag Video Finder) works with whatever you already use to move data around — call it directly over HTTP, or wire it into a no-code workflow.
Calling YouTube Metadata Scraper (Hashtag Video Finder) programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("youtube-metadata-scraper-hashtag-video-finder").call(run_input={"hashtags": ["minecraft"],"hashtagTab": "both","maxVideosPerHashtag": 30,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["viewCount"])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
No-code tools (n8n, Make, LangChain)
In n8n, trigger a run with Apify's native n8n integration node, or a generic HTTP Request node pointed at the Actor's run endpoint, then pass the dataset items downstream in the same workflow. In Make, add an Apify module, select this Actor, and feed its output dataset into whatever scenario steps come next. Any HTTP-capable agent framework — including custom LangChain tools — can call the same Apify API endpoint used above.
Is it legal to scrape YouTube videos?
Scraping publicly visible YouTube pages is generally lawful — this Actor returns only what a logged-out visitor can already see, and never bypasses a login wall or Members-only content. Because rows include commenters' display names, channel handles and other identifiers tied to real people, personal-data protection law (GDPR in the EU/UK, CCPA in California, and similar regimes elsewhere) governs how you store and use that data once collected: you need a lawful basis, and reasonable limits on retention and further use. Use of this Actor is also bound by YouTube's own Terms of Service, which restrict some forms of automated collection. Consult legal counsel if your use case involves bulk storage of personal data.
❓ Frequently asked questions
What YouTube video fields does YouTube Metadata Scraper (Hashtag Video Finder) return?
It returns title, viewCount, channelDisplayName, videoHashtags and transcripts among 40 total fields — see What data can I extract above for the full list.
Does it require a YouTube account or login?
No. The Actor reads only publicly visible pages and never authenticates as a YouTube user. It does require a residential-looking proxy exit for reliable results — see the input table above — which Apify Proxy provides by default.
How many videos can I extract in one run?
maxVideosPerHashtag allows up to 1,000 per tag per tab, though YouTube's own hashtag feed is only measurably reachable to roughly 200–500 videos on the All tab and up to about 950 on the Shorts tab before it runs dry. Keyword search (max_results_per_keyword) allows up to 100,000, though YouTube's search itself typically stops producing new results after roughly 130–485 videos per keyword.
What happens if a hashtag doesn't exist or a keyword returns no videos?
A hashtag with no public videos returns an empty feed with no tag header. With skipUnknownHashtags (default true), the Actor logs a warning and continues with your remaining tags; set it to false to stop the run instead so a typo doesn't pass unnoticed. A keyword that returns nothing is logged and simply contributes no rows — it does not fail the run.
Can I scrape multiple hashtags, videos or keywords at once?
Yes. hashtags, urls and keywords are all array inputs, so a single run can cover any combination of tags, direct links and search phrases together.
Does YouTube Metadata Scraper (Hashtag Video Finder) work with Claude, ChatGPT and other AI agent tools?
Yes, as an HTTP endpoint — any agent framework that can call the Apify API (including the apify-client shown above) can trigger a run and read back the resulting dataset.
How does it compare to other YouTube hashtag video scrapers?
As observed on their Apify Store listings on 2026-07-30: streamers/youtube-video-scraper-by-hashtag documents a pay-per-result price and an error-item pattern for invalid inputs, but its README does not state whether it opens YouTube's actual hashtag browse feed or simply searches the tag text. coregent/youtube-video-finder explicitly documents the opposite choice — its own FAQ states that its hashtag input "is search-for-the-tag rather than the exact curated hashtag feed — no public API exposes that feed directly" — and it does not scrape comments at all. This Actor opens the real hashtag feed (both All and Shorts tabs) and also returns top-level comments and transcripts.
Does it return data in a format LLMs can use directly?
Yes. Every field is typed, normalized JSON with consistent names across runs — no HTML parsing or CSS selectors involved. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when YouTube changes its layout or anti-bot system?
The Actor is maintained and its output schema is designed to stay stable across YouTube page changes. No specific update turnaround time is published or guaranteed.
Can I use it without managing proxies or browser infrastructure?
Yes. Apify Proxy (residential by default) and the retry/escalation logic described above are handled for you — you only choose a proxyConfiguration, you don't run or maintain any proxy or browser infrastructure yourself.
Which fields work best for AI training data and RAG indexing?
For RAG, index title, description and transcripts — the highest-information text fields. For structured training data, viewCount, likeCount, commentCount, lengthInSeconds and uploadDatetime return as consistent typed primitives across every row.
🔗 Related scrapers
| Scraper | What it extracts |
|---|---|
| YouTube Channel Finder With Creator Analytics | Discovers YouTube channels by keyword or URL and enriches them with engagement rate, growth momentum and upload cadence |
| YouTube Comments Scraper with Replies | Full comment threads including replies, with optional AI sentiment, emotion and toxicity enrichment |
| TikTok Hashtag Scraper | TikTok videos by hashtag or keyword, with the full engagement set and download URLs |
| TikTok Discover Scraper | TikTok videos from a keyword, #hashtag, @username, or search/tag URL |
| TikTok Profile Videos API Scraper | Every video a TikTok creator has posted, from public profiles with no login |
💬 Your feedback
Found a bug or missing a field? Open an issue on this Actor's Issues tab in Apify Console, or reach out through Apify's support channels. Active maintenance against YouTube's changing markup is what keeps this Actor's output schema stable — your reports are how issues get found.