YouTube Metadata Scraper (Hashtag Video Finder) avatar

YouTube Metadata Scraper (Hashtag Video Finder)

Pricing

Pay per usage

Go to Apify Store
YouTube Metadata Scraper (Hashtag Video Finder)

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

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

31

Total users

0

Monthly active users

13 days ago

Last modified

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 categoryPublicly availableRestricted behind
Title, description, category, creator tagsYes
Exact view, like and comment countsYes
Channel identity — handle, display name, subscriber count, avatar, verified badgeYes
The video's own hashtags and all served thumbnailsYes
Top-level commentsYes
Comment repliesNot returned by this ActorOut of scope — only top-level comments are fetched
Caption/transcript tracksYes, when YouTube exposes themSome tracks are only served to a residential-looking viewer, not a datacenter IP
Members-only video contentNoChannel 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 nameDescription
idYouTube video ID
urlCanonical watch URL
titleVideo title
descriptionFull video description
categoryYouTube category
tagsCreator keyword tags
thumbnailDefault hqdefault thumbnail URL, constructed from the ID
thumbnails_urlsEvery real thumbnail URL YouTube served for the video
description_linksOutbound links in the description, redirect-unwrapped
channelIDChannel ID (UC...)
channelURLChannel URL in /channel/UC... form
channelUsernameReal @handle without the @ — empty when YouTube exposes none, never invented
channelDisplayNameChannel display name
channelHandleReal channel handle including the @
channelHandleUrlyoutube.com/@handle URL
author_avatar_urlChannel avatar image URL

Engagement, status and quality flags

Field nameDescription
viewCountExact view count
likeCountExact like count
commentCountComment count as shown by YouTube (rounded above roughly 1,000)
lengthInSecondsDuration in seconds
channelSubscribersSubscriber count as YouTube abbreviates it, e.g. "2.93M"
is_verifiedChannel carries a verified/official-artist badge
is_live_nowCurrently live or a live broadcast
is_comments_offComments disabled — only evaluated on a healthy page, so a blocked page can never fake true
is_members_onlyMembers-only video
is_paid_contentPaid/sponsored content flag
isShorttrue 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 nameDescription
uploadDatetimeExact upload timestamp, ISO-8601 with offset
publish_date_sinceRelative upload text, e.g. "2 years ago"
foundViaHashtagThe hashtag feed this video came from (empty for URL/keyword rows)
foundViaKeywordThe search keyword this video came from (empty for hashtag/URL rows)
discoverySourcehashtag_all | hashtag_shorts | keyword_search | direct_url
hashtagFeedPositionPosition in the hashtag feed as served in that run (null for URL/keyword rows — YouTube's hashtag order is not reproducible run to run)
videoHashtagsHashtags the video itself carries: the #-chips above the title, #-tokens in the title, and #-tokens in the description
relatedHashtagsThe video's other hashtags, excluding the one you searched — the co-occurrence signal
hashtagVideoCountTextSize of the hashtag you opened, abbreviated by YouTube, e.g. "44M videos"
hashtagChannelCountTextChannels using the hashtag, abbreviated, e.g. "5.2M channels"
transcriptsCaption tracks as {language, content}, de-duplicated, capped at 6 per row
commentsTop-level comments as {id, text, author, authorChannelId, likeCount, publishedTime, replyCount}
scrapedAtUTC 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.

FeatureYouTube Data API v3YouTube Metadata Scraper (Hashtag Video Finder)
Hashtag feed accessNo dedicated endpoint — only keyword search via search.listOpens the actual hashtag browse feed (both All and Shorts tabs)
SetupGoogle Cloud project, API key, and quota approvalAn Apify account — no third-party API key
QuotaDefault 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/transcriptscaptions.download requires OAuth authorization from the video's own channel owner (Google's captions documentation) — cannot fetch an arbitrary public video's transcriptReads whatever caption tracks YouTube publicly exposes on the watch page, no OAuth
Output shapeSeparate calls per resource (videos, channels, comments) that you must stitch togetherOne 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.

  1. Open the Actor's page in the Apify Console using your Apify account.
  2. Provide at least one of hashtags, urls, or keywords — the schema marks all three optional, but the Actor raises an error and stops immediately if none are supplied.
  3. Set the filters that matter for your run — hashtagTab, maxVideosPerHashtag, max_comments, include_transcripts, or publishedAfter.
  4. Click Start.
  5. 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 videoHashtags and relatedHashtags to see which tags creators actually pair with a topic before publishing.
  • 📈 A growth marketer sourcing creators uses channelHandle, channelSubscribers and is_verified to shortlist active channels around a hashtag before outreach.
  • 🔬 A researcher studying platform behavior uses hashtagFeedPosition and discoverySource to compare what a hashtag feed surfaces against a plain keyword search on the same topic.
  • 🗣️ A brand or community team uses comments and commentCount to 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, description and transcripts directly 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.

ParameterRequiredTypeDescriptionExample value
hashtagsNoarrayTags with or without the leading #. Full youtube.com/hashtag/<tag> links work too. Spaces are removed.["minecraft", "sourdoughstarter"]
hashtagTabNostring — enum all / shorts / both, default "all"Which hashtag tab to page. The two tabs measured zero video overlap between them."both"
maxVideosPerHashtagNointeger, min 1, max 1000, default 30Cap on videos collected per tag. With both, the cap applies to each tab separately (up to 2× per tag).50
skipUnknownHashtagsNoboolean, default trueOn: log a warning and continue past a tag with no public videos. Off: stop the run.true
includeVideoHashtagsNoboolean, default trueFill videoHashtags from the #-chips above the title, the title text, and the description.true
includeRelatedHashtagsNoboolean, default trueFill relatedHashtags per row and write a run-level co-occurrence ranking to the HASHTAG_INSIGHTS key-value record.true
urlsNoarrayWatch links, youtu.be links, /shorts/, /live/, /embed/ links, or bare 11-character video IDs.["https://www.youtube.com/shorts/w2VtJa-QmDc"]
keywordsNoarrayOrdinary YouTube search phrases, one per line — a comparison corpus to hashtag discovery.["minecraft build"]
max_results_per_keywordNointeger, min 1, max 100000, default 10Videos to take per keyword. YouTube's own search runs dry after roughly 130–485 results per keyword.20
sort_orderNostring — 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"
publishedAfterNostring — datepicker, absolute or relativeKeep only videos uploaded on/after this date, checked after download."3 months"
max_commentsNointeger, min 0, max 5000, default 2Top-level comments to pull per video. 0 skips comment requests entirely.10
include_transcriptsNoboolean, default trueAttach caption/transcript text when YouTube exposes it.true
transcript_formatNostring — enum text / timestamps, default "text"text: a single string in transcripts[].content. timestamps: a list of {start, dur, text} objects."timestamps"
include_english_autoNoboolean, default falseAdd YouTube's machine-generated English captions when no uploaded track exists.false
include_non_englishNoboolean, default falseAdd other-language caption tracks. Capped at 6 tracks per row; caption collection aborts after 150 seconds.false
proxyConfigurationNoobject — 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 ApifyClient
client = 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.


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.


ScraperWhat it extracts
YouTube Channel Finder With Creator AnalyticsDiscovers YouTube channels by keyword or URL and enriches them with engagement rate, growth momentum and upload cadence
YouTube Comments Scraper with RepliesFull comment threads including replies, with optional AI sentiment, emotion and toxicity enrichment
TikTok Hashtag ScraperTikTok videos by hashtag or keyword, with the full engagement set and download URLs
TikTok Discover ScraperTikTok videos from a keyword, #hashtag, @username, or search/tag URL
TikTok Profile Videos API ScraperEvery 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.