TikTok Hashtag Scraper: Hashtag Reach & Co-Tag Stats avatar

TikTok Hashtag Scraper: Hashtag Reach & Co-Tag Stats

Pricing

from $2.99 / 1,000 results

Go to Apify Store
TikTok Hashtag Scraper: Hashtag Reach & Co-Tag Stats

TikTok Hashtag Scraper: Hashtag Reach & Co-Tag Stats

Extract TikTok hashtag activity in bulk. Collect top videos, creators, metrics, captions, sound usage, and publishing times. Ideal for trend monitoring, audience analysis, and content strategy workflows.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

1

Bookmarked

10

Total users

0

Monthly active users

3 days ago

Last modified

Share

TikTok Hashtag Scraper — Video Views, Tag Reach and Co-Tags

This TikTok hashtag scraper collects the videos posted under any hashtag and attaches TikTok's own lifetime view count and video count to the tag you searched — plus, on request, to every co-tag riding alongside it on those videos. Each row carries engagement (plays, likes, comments, shares), author stats, sound metadata and a tagReachRatio score, so social media managers, agencies and researchers can size a hashtag and rank its videos in one export, without a TikTok account, API key, or browser session of their own. The dataset stays exportable as JSON, CSV, Excel or XML the moment the run finishes.

What is TikTok Hashtag Scraper: Hashtag Reach & Co-Tag Stats?

It is a keyless, logged-out TikTok scraper that answers a question plain hashtag scrapers leave open: how big is this tag, really, and how much of that size did each video actually capture? For every hashtag in startUrls it first reads TikTok's own challenge/detail endpoint for the tag's lifetime view count and video count, then collects the videos TikTok's search surface returns for that tag, and — if you switch it on — resolves the same lifetime numbers for every co-hashtag sitting on those videos. No TikTok account, cookie or developer credential is required or accepted anywhere in the input.

Key features:

  • 🏷️ Discovery by hashtag name. Enter hashtags with or without the #, or paste a TikTok search URL — every target is measured and scraped as a hashtag, never as a profile.
  • 📊 Real hashtag reach, not just names. Every row carries the queried tag's lifetime view_count and video_count, read straight from TikTok's statsV2 block.
  • 🔎 Co-tag reach on demand. Turn on includeCoTagStats and every other hashtag on a video comes back with its own lifetime views, video count, commerce flag and description.
  • 📐 tagReachRatio. A derived score — a video's play count divided by the tag's lifetime views — showing how much of the tag's total reach a single post actually captured.
  • 🔀 Four sort orders. relevance, date, popularity and tagReach re-order the sampled page client-side, without a second request to TikTok.
  • 📤 Export anywhere. JSON, CSV, Excel, XML, or straight off the Apify API.

What data can I extract with TikTok Hashtag Scraper?

Every row is a video plus the queried tag's reach numbers; turning on co-tag reach adds the same numbers for the video's other hashtags.

FieldExample valueUse case
hashtag"travel"The tag you searched, echoed on every row from that tag
id"7501234567890123456"TikTok's video ID
text"3 days in Lisbon on a budget #travel #lisbon"Caption, for keyword and sentiment analysis
createTime / createTimeISO1751049600 / "2026-06-27T18:40:00Z"Unix seconds and true UTC ISO-8601 for the same moment
isAdfalseSponsored-content flag
isMutednullnull, never a fabricated false, when TikTok's payload omits the key
webVideoUrl"https://www.tiktok.com/@someuser/video/750123..."Canonical link back to the video
mediaUrls["https://v16-webapp-prime.tiktok.com/video/..."]Play/download addresses, every bitrate rendition TikTok exposes
diggCount, shareCount, playCount, collectCount, commentCount51200, 2140, 412300, 9930, 806Engagement metrics per video
authorMeta.id / .name / .nickName"6964..." / "someuser" / "Some User"Author identity
authorMeta.verified, .signature, .avatar, .privateAccount, .ttSellerfalse, bio text, avatar URL, false, falseAuthor profile flags
authorMeta.following, .fans, .heart, .video, .digg312, 184000, 4200000, 211, 9800Author-level counters
authorMeta.bioLinknullAlways null — the key does not exist on any surface this actor reads
musicMeta.musicName / .musicAuthor / .musicId"original sound" / "someuser" / "72091..."Sound identity
musicMeta.musicOriginal, .musicAlbum, .playUrl, .coverMediumUrltrue, album title or null, play URL, cover URLSound metadata (musicAlbum is real when TikTok ships one)
videoMeta.height / .width / .duration1920, 1080, 34Video dimensions and length in seconds
videoMeta.coverUrl, .originalCoverUrl, .definition, .format, .downloadAddrcover URLs, "540p", "mp4", download URLMedia and rendering metadata
videoMeta.originalDownloadAddrnullAlways null — TikTok exposes no second "original" address distinct from downloadAddr
mentions[][{"name": "otheruser", "id": "698...", "secUid": "MS4w..."}]@-mentions parsed from the caption's rich-text entities
hashtags[][{"name": "travel"}, {"name": "lisbon"}]Hashtag names on the video (names only, no counts)
queried_tag_id"3054"TikTok's numeric ID for the tag you searched
queried_tag_view_count / queried_tag_video_count"1187456321098" / "48231907"The tag's lifetime views / videos, as strings from statsV2
queried_tag_descriptionnull or a short stringThe tag's TikTok description, when TikTok has one
queried_tag_is_commercefalseTikTok's commerce/branded-hashtag flag for the tag
queried_tag_cover_urlsigned cover URLThe tag's cover image
co_tag_count3Number of other hashtags on this video — always present, free
co_tags[][{"name": "lisbon", "id": "12345", "view_count": "8412990321", "video_count": "1904221", "is_commerce": false, "description": null}]Per-co-tag reach, only when includeCoTagStats is on
tagReachRatio0.000000347playCount ÷ queried_tag_view_count — this video's share of the tag's total reach

Hashtag reach and engagement data

The fields that separate this scraper from a plain hashtag lister live in queried_tag_view_count, queried_tag_video_count, co_tags[] and tagReachRatio. Together they let you rank videos by how much of a tag's total reach they actually captured instead of by raw play count alone — a video with 400,000 plays under a 50-million-view niche tag is a bigger relative hit than one with a million plays under a 100-billion-view tag. co_tag_count is free on every row; the schema notes that 96.7% of videos carry at least one other hashtag, so most rows have something to look up when includeCoTagStats is on.

Fields you filter and segment on

There is no location or category filter here — TikTok hashtags aren't geographic. Segmentation instead runs on hashtag (which tag a row came from), sortOrder (which of the four client-side orderings put the row where it is), createTimeISO (recency), authorMeta.fans (creator size), and co_tag_count / minCoTagVideoCount for filtering the co-tag array down to hashtags with meaningful lifetime volume.

Why not build this yourself?

TikTok's hashtag and search surfaces are not a stable public API, and the parts that look simple are the parts most likely to break a homegrown scraper. Three problems show up immediately:

Pagination doesn't work. TikTok's search endpoint accepts an offset / search_id cursor, but page 2 always answers with a 444-byte empty stub regardless of what the first page's has_more flag claimed. This actor collects the one real page per hashtag and reports the real 30–34-video ceiling instead of looping forever on a cursor that never advances.

The reach endpoint refuses cloud IPs silently. TikTok's challenge/detail endpoint — the source of the lifetime view and video counts — answers HTTP 200 with a 0-byte body from many datacenter exit IPs, which looks like success until you check the length. This actor treats that shape as a refusal, not a "no data" answer, and falls back to issuing the same request from inside a warmed, signed browser session instead of retrying blindly.

Every dead response looks alive. A WAF challenge page, an empty search stub and a real result all return HTTP 200. This actor classifies every response by body size and shape rather than by status code, and escalates through a no-proxy → datacenter → residential ladder only when the shape says the exit IP is untrusted.

Why does hashtag search stop at 30–34 videos?

TikTok's search surface serves a single results page per hashtag and ignores the pagination parameters it accepts. maxData can be set as high as 1,000, but the actor enforces a real 34-video ceiling per hashtag (MEASURED_TAG_CEILING) because nothing beyond that exists to return — it emits what TikTok actually served instead of fabricating additional rows.

Build your own client only if you need to reverse-engineer TikTok's signing scheme yourself and maintain it against every payload change. For sizing hashtags, ranking their videos, and resolving co-tag reach without owning that maintenance burden, this actor does the same work already handled.

How to use data extracted from TikTok Hashtag Scraper?

Social media managers

Put ten candidate hashtags in startUrls with maxData set to 1 and export the rows: each carries queried_tag_view_count and queried_tag_video_count for its tag, so you can rank ten candidates by lifetime size in one run and pick the handful worth attaching to a post, without opening TikTok ten times.

Agencies

Run a client's shortlist of niche hashtags on a schedule and diff queried_tag_video_count and co_tag_count run over run. A rising video count on a client's target tag, or a shrinking co_tag_count average, is a concrete data point for a monthly report instead of a screenshot of the app.

Market research and intelligence

Set includeCoTagStats on and minCoTagVideoCount high enough to drop one-off tags, then look at which co-tags recur across a niche's top hashtags. The distribution of co_tags[].view_count across a sample of tags maps which adjacent tags actually carry comparable audience size, useful for category and expansion research.

AI agents and automated pipelines

tagReachRatio and the queried-tag reach fields are structured enough to feed straight into an agent's ranking step — "which of these hashtags is worth this brand's next post" becomes a sort on one numeric field instead of a scraped screenshot an LLM has to read.

🔼 Input sample

ParameterRequiredTypeDescriptionExample value
startUrlsYesarrayTikTok hashtags to scrape and size. # is optional. A profile URL is accepted for backwards compatibility but is searched as a hashtag, not as a profile.["travel", "smallbusiness"]
maxDataNointeger (min 1, max 1000, default 10)How many videos to collect for each hashtag. TikTok's search surface returns 30–34 videos per hashtag in one page, so values above that return what exists rather than failing.20
sortOrderNostring (enum, default "relevance")Client-side ordering of the videos TikTok returned: relevance (TikTok's own order), date (newest first), popularity (most viewed first), tagReach (highest share of tag reach first). It re-orders the sampled page — it does not change what TikTok serves."tagReach"
includeCoTagStatsNoboolean (default false)When on, each row gets a co_tags[] array with name, id, view count, video count, commerce flag and description for the other hashtags on that video. When off, rows still carry co_tag_count (free) and co_tags is null.true
maxCoTagsPerVideoNointeger (min 1, max 40, default 10)Caps how many of a video's co-tags get a reach lookup. Videos routinely carry 10–40 hashtags. Ignored when co-tag reach is off.8
minCoTagVideoCountNointeger (min 0, default 0)Keep only co-tags whose lifetime video count is at least this number, so tiny one-off tags do not clutter the array. 0 keeps everything. Ignored when co-tag reach is off.50000
proxyConfigurationNoobjectOptional. With nothing selected the actor tries no proxy first, then Apify datacenter, then residential, escalating only when TikTok returns a blocked response body.{"useApifyProxy": false}
{
"startUrls": ["travel", "smallbusiness"],
"maxData": 20,
"sortOrder": "tagReach",
"includeCoTagStats": true,
"maxCoTagsPerVideo": 8,
"minCoTagVideoCount": 50000,
"proxyConfiguration": { "useApifyProxy": false }
}

Common pitfall: raising maxData past 34 does not get you more videos per hashtag — TikTok's search surface serves one page and ignores paging, so the actor returns the real 30–34-video ceiling regardless of how high maxData is set. Use multiple hashtags, not a bigger maxData, to grow a sample.

🔽 Output sample

One row per video, JSON, CSV, Excel or XML. Trimmed but complete-shape example:

{
"hashtag": "travel",
"id": "7501234567890123456",
"text": "3 days in Lisbon on a budget #travel #lisbon #budgettravel",
"createTime": 1751049600,
"createTimeISO": "2026-06-27T18:40:00Z",
"isAd": false,
"isMuted": null,
"authorMeta": {
"id": "6964254822141297665",
"name": "someuser",
"nickName": "Some User",
"verified": false,
"signature": "Budget travel, weekly",
"bioLink": null,
"avatar": "https://p16-sign-va.tiktokcdn.com/....jpeg",
"privateAccount": false,
"ttSeller": false,
"following": 312,
"fans": 184000,
"heart": 4200000,
"video": 211,
"digg": 9800
},
"musicMeta": {
"musicName": "original sound",
"musicAuthor": "someuser",
"musicOriginal": true,
"musicAlbum": null,
"playUrl": "https://sf16-ies-music....mp3",
"coverMediumUrl": "https://p16-sign-va.tiktokcdn.com/....jpeg",
"musicId": "7209100000000000000"
},
"webVideoUrl": "https://www.tiktok.com/@someuser/video/7501234567890123456",
"mediaUrls": ["https://v16-webapp-prime.tiktok.com/video/tos/..."],
"videoMeta": {
"height": 1920,
"width": 1080,
"duration": 34,
"coverUrl": "https://p16-sign-useast2a.tiktokcdn.com/....jpeg",
"originalCoverUrl": "https://p16-sign-useast2a.tiktokcdn.com/....jpeg",
"definition": "540p",
"format": "mp4",
"originalDownloadAddr": null,
"downloadAddr": "https://v16-webapp-prime.tiktok.com/video/tos/..."
},
"diggCount": 51200,
"shareCount": 2140,
"playCount": 412300,
"collectCount": 9930,
"commentCount": 806,
"mentions": [],
"hashtags": [{ "name": "travel" }, { "name": "lisbon" }, { "name": "budgettravel" }],
"queried_tag_id": "3054",
"queried_tag_view_count": "1187456321098",
"queried_tag_video_count": "48231907",
"queried_tag_description": null,
"queried_tag_is_commerce": false,
"queried_tag_cover_url": "https://p16-sign-va.tiktokcdn.com/....jpeg",
"co_tag_count": 3,
"co_tags": [
{
"name": "lisbon",
"id": "12345",
"view_count": "8412990321",
"video_count": "1904221",
"is_commerce": false,
"description": null
}
],
"tagReachRatio": 0.000000347
}

The Apify Console renders two dataset views on top of this row shape: Videos + tag reach (15 columns — hashtag, id, text, createTimeISO, webVideoUrl, authorMeta.name, authorMeta.fans, diggCount, shareCount, playCount, commentCount, queried_tag_view_count, queried_tag_video_count, tagReachRatio, co_tag_count) and Hashtag reach only (10 columns focused on the tag-level numbers). Both are table previews of the same rows — the full row above, with every field listed in the table further up, is always what lands in the dataset and the JSON/CSV/Excel/XML export.

How do you filter and target specific videos?

The real controls here are volume, ordering and co-tag quality — there is no location or price filter to teach, because hashtags aren't geographic or priced. maxData sets the volume ceiling per hashtag (real cap: 30–34). sortOrder decides which of the sampled videos land first: relevance for TikTok's own ranking, date for a recency read, popularity for the biggest videos by play count, or tagReach to put the videos that captured the largest share of the tag's total reach at the top. minCoTagVideoCount is the quality threshold on the co-tag side — set it above zero to drop tiny, one-off co-tags from co_tags[] and keep only hashtags with real lifetime volume, and pair it with maxCoTagsPerVideo to bound how many co-tags get looked up per video.

Three real examples:

{ "startUrls": ["travel", "fitness", "skincare"], "maxData": 1 }

Cheapest possible size comparison across several hashtags — one row per tag, sorted by queried_tag_view_count after export.

{ "startUrls": ["travel"], "maxData": 30, "sortOrder": "tagReach" }

Surface the videos under #travel that captured the largest share of the tag's lifetime reach, not just the ones with the most raw plays.

{
"startUrls": ["travel"],
"maxData": 20,
"includeCoTagStats": true,
"maxCoTagsPerVideo": 5,
"minCoTagVideoCount": 100000
}

Attach reach data only for co-tags with at least 100,000 lifetime videos, capped at 5 co-tags per video, so co_tags[] stays a shortlist of genuinely comparable tags rather than every stray hashtag in the caption.

▶️ Want to try other TikTok scrapers?

ScraperWhat it extracts
../tiktok-profile-videos-api-scraper-reposted-videosA creator's own videos plus their Reposts tab, with the original author of every repost and every caption @mention resolved to an enriched profile
../tiktok-discover-scraper-by-account-name-bioAccount search by keyword — handle, bio, follower count and verification, read from each account's real profile page
../instagram-post-scraper-with-creator-profilesInstagram posts with the creator's profile — followers, bio, category, verification — on the same row
../instagram-profile-reels-scraper-with-creator-profilesInstagram reels from any public profile with the creator's profile attached
../youtube-metadata-scraper-by-duration-date-video-typeYouTube search filtered by length, upload date and video type, enriched into full metadata records

How to extract TikTok data programmatically

This actor runs on the Apify platform: start it from the Console, schedule it, or call it through apify-client from your own code. Every run's rows land in an Apify dataset you can page through the API or export in one call.

Python example

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("tiktok-hashtag-scraper-hashtag-reach-co-tag-stats").call(run_input={
"startUrls": ["travel", "smallbusiness"],
"maxData": 20,
"sortOrder": "tagReach",
"includeCoTagStats": True,
"minCoTagVideoCount": 50000,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["hashtag"], row["playCount"], row["queried_tag_view_count"], row["tagReachRatio"])

Export to spreadsheets or CRM

Export the dataset as CSV or Excel straight from the Storage tab, or through the API. hashtag, webVideoUrl, authorMeta.name, playCount, queried_tag_view_count, queried_tag_video_count and tagReachRatio map cleanly onto spreadsheet columns for a sortable hashtag-size or video-ranking sheet without any reshaping.

Scraping publicly visible TikTok pages is generally lawful in the EU and the US, and this actor reads only what TikTok serves to a logged-out visitor — no login, cookie or account of any kind is used. That said, each row carries author metadata (handle, nickname, avatar, follower count) that can constitute personal data about the video's creator under GDPR and CCPA, so you are responsible for having a lawful basis before storing or reusing it, particularly at bulk scale. Video captions, covers and download URLs remain the property of their creators; check licensing before you republish them. Consult legal counsel for commercial applications involving bulk storage of personal data.

❓ FAQ

What happens if I search a hashtag TikTok doesn't recognize?

TikTok's challenge/detail endpoint answers HTTP 200 with an empty challenge object for a tag it doesn't know. This actor treats that as "no such tag" rather than a real measurement: all six queried-tag reach fields (queried_tag_id, queried_tag_view_count, queried_tag_video_count, queried_tag_description, queried_tag_is_commerce, queried_tag_cover_url) come back null, never a fabricated 0.

Can I get co-tag reach data along with the videos?

Yes — set includeCoTagStats to true. Each row then carries a co_tags[] array with name, id, view_count, video_count, is_commerce and description for every other hashtag on that video, up to maxCoTagsPerVideo (default 10, max 40) and filtered by minCoTagVideoCount. It is off by default because a single hashtag can add over a hundred co-tag lookups once every video's tags are counted.

How accurate are the view and video counts?

The counts are TikTok's own lifetime statsV2 numbers at the moment the run made the request — a snapshot, not a live counter. TikTok's public numbers change continuously, so re-run the actor if you need a current reading rather than reusing an old export.

How many videos can I get per hashtag?

Up to maxData (1–1,000), but TikTok's search surface only serves 30–34 videos per hashtag in a single page and ignores pagination parameters, so the actor enforces a real 34-video ceiling and returns what exists rather than fabricating more.

Can I rank videos by how much of a tag's reach they captured?

Yes — set sortOrder to tagReach. Rows are re-ordered by tagReachRatio, each video's play count divided by the queried tag's lifetime view count, so the video that captured the largest relative share of the tag's total reach comes first.

Does TikTok Hashtag Scraper work with Claude, ChatGPT and AI agent frameworks?

There is no dedicated MCP server for this actor, but any agent framework that can call an HTTP endpoint can run it through the Apify API using apify-client (Python or JavaScript) — start a run, poll or wait for completion, then read the dataset.

How does this compare to other TikTok hashtag scrapers?

Checked on the Apify Store on 2026-07-30: funny_ground/tiktok-hashtag-stats returns hashtag-level counts only — no per-video rows — at $0.50 per 1,000 hashtags on its own listing. clockworks/tiktok-hashtag-scraper returns full per-video rows with author and music metadata but, per its own listing, does not document tag-level lifetime view/video counts, co-tag reach, or a reach-ratio ranking. This actor is the only one of the three, as observed on their listings, that attaches the queried tag's own lifetime reach and a co-tag reach lookup to every video row.

Can I use this without a TikTok API key or developer account?

Yes. There is no credential field anywhere in the input. Every surface this actor reads works logged-out, and the only optional configuration is proxyConfiguration, which is off by default.

Conclusion

TikTok Hashtag Scraper: Hashtag Reach & Co-Tag Stats turns a hashtag search into a sized, rankable dataset — every video row carries the queried tag's own lifetime view and video counts, plus an optional reach lookup for every co-tag riding alongside it. It's built for social media managers picking between candidate tags, agencies auditing client hashtags on a schedule, and researchers mapping which co-tags actually share audience size, all without a TikTok login or API key. Open the actor in Apify Console, drop your hashtags into Hashtags to measure, and click Start.