TikTok Trending Hashtags Scraper With Exact View & Post Counts
Pricing
$19.99/month + usage
TikTok Trending Hashtags Scraper With Exact View & Post Counts
TikTok Trending Hashtags Scraper With Exact View & Post Counts Scrape trending TikTok hashtags with real-time metrics, related tags, growth data, and top content insights. This actor delivers structured JSON or CSV, perfect for tracking trends, researching audiences.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
1
Bookmarked
9
Total users
0
Monthly active users
16 hours ago
Last modified
Categories
Share
Scrape TikTok trending hashtags and resolve every one of them to its exact lifetime view count and post count — real integers, not the rounded strings TikTok prints on screen.
TikTok's Creative Center trends page renders hashtag volume as 212.2K posts and 188.7M views. Those are display strings. You cannot sort on them, you cannot threshold on them, and you cannot divide one by the other. This TikTok hashtag scraper takes each hashtag one step further, to TikTok's public challenge endpoint, and returns the true numbers — 492043129 views, 255650 posts — plus the saturation and efficiency metrics that only exact integers make possible.
These are two different measurements, and this actor labels them as such. The Creative Center figure is scoped to the market whose leaderboard you are reading;
statsV2is the hashtag's global lifetime total.#rainbowpfpgenuinely shows188.7Mon the US leaderboard while its global lifetime count is492,043,129. Both numbers are returned, in separately labelled columns. Neither is a rounding of the other, and the actor never presents one as the other.
What this TikTok hashtag scraper does
- Exact global lifetime view & post counts. Every hashtag is resolved to
viewCountExactandvideoCountExactfrom TikTok'sstatsV2payload — real integers, worldwide, all-time. The market-scoped strings TikTok displays are kept alongside them in their own columns. - Real challenge IDs and canonical URLs. Each row carries TikTok's own
challengeIdand a workinghttps://www.tiktok.com/tag/<name>link. - Views-per-post efficiency.
viewsPerPost= exact global views ÷ exact global posts. A hashtag with 1.2B views across 106K posts behaves very differently from one with 828M views across 2.1M posts, and only the exact integers reveal it. - Saturation against the run set.
saturationVsRunMedianplaces each hashtag against the median views-per-post of the same run, withsaturationSampleSizeprinted beside it so the ratio is never read out of context. - Post volume tiers.
postVolumeTierbuckets each hashtag as micro / small / mid / large / massive from its absolute post count. - Volume threshold filters.
minViewCountandminPostCountfilter on the real integers — impossible against a string like188.7M. - Bring your own hashtag list. Measure any hashtags you name, trending or not. This is the volume path, and it needs no trending dependency at all.
- Trending discovery by country. Read TikTok's current leaderboard for any of 72 markets over a 7-day or 30-day window.
- Uncharged accounting row on every run. Records what was measured, what resolved, and what each filter removed, so a filtered or partially blocked run is auditable rather than mysterious.
Honest limits — read this before you buy
This actor runs fully logged out, with no TikTok account and no cookies. That is deliberate and it is what keeps it reliable. It also imposes two hard limits that competing TikTok trending hashtag scrapers tend not to state:
- Trending discovery returns exactly 3 hashtags per market and window. Rows 4 and beyond sit behind TikTok's "Log in to view more" wall. Verified against every pagination, page-size and sort parameter TikTok's page accepts. No public scraper can return a genuine "Top 100" logged out. If you need volume, use the custom hashtag list, which is unbounded.
- Only the 7-day and 30-day windows are real. TikTok's UI still advertises 120 days; it silently serves the 7-day data for it. The 365-day and 3-year options do not exist at all. This actor therefore offers 7 and 30 only, and normalises any legacy value with a warning in the log rather than pretending.
Fields that TikTok does not expose to logged-out traffic are not shipped as empty columns: no rank-change arrow, no "new to top 100" flag, no promoted flag, no audience demographics, no related hashtags, no top creators. Each of those is login-walled, and an always-blank column is worse than an absent one.
Use cases
- Hashtag research for TikTok marketing — find which trending hashtags actually convert attention into views per post before you commit a content calendar to them.
- Competitive and campaign benchmarking — track the exact lifetime volume of your branded hashtag against a set of rivals in one run.
- Content strategy and saturation analysis — a hashtag with 2.1M posts is a crowded room; the tier and saturation columns tell you which ones you can still rank in.
- Social listening and trend datasets — export to CSV, JSON or Excel, or pull the dataset straight from the Apify API into a warehouse.
- Agency reporting — real integers survive a spreadsheet;
188.7Mdoes not.
Input
| Field | Key | Type | Default | What it does |
|---|---|---|---|---|
| 🎯 Measurement Source | measureMode | enum | trending | trending (top 3 per market/window), custom (your list only), trending_and_custom (both, de-duplicated) |
| #️⃣ My Hashtags | hashtagsToMeasure | array | [] | Hashtags to measure, with or without #. Required for custom mode |
| 🌍 Market | marketCode | enum | US | Which country's trending leaderboard to read (72 markets) |
| 🕐 Trending Window | windowDays | enum | 7 | 7 or 30. These are the only real TikTok windows |
| 🔢 Resolve Exact View & Post Counts | resolveExactCounts | boolean | true | Fetch the true global lifetime integers. Off = exact columns stay null, never guessed |
| 🧭 Exact-Count Route | statsRouteCountry | enum | auto | Residential exit region for the exact-count lookup. auto tries CA, AU, NZ, JP, SG, BR, MX until one answers |
| ⚡ Parallel Stat Lookups | statsConcurrency | integer | 6 | Concurrent exact-count lookups, 1–12 |
| 👁️ Minimum Lifetime Views | minViewCount | integer | 0 | Drop hashtags below this exact global lifetime view count. 0 disables |
| 📝 Minimum Lifetime Posts | minPostCount | integer | 0 | Drop hashtags below this exact global lifetime post count. 0 disables |
| 🏷️ Industry Label Contains | industryContains | string | "" | Keep only hashtags whose industry label matches, case-insensitive |
| 🛡️ Proxy Configuration | proxyConfiguration | object | disabled | Optional, for the trending-discovery request. The exact-count lookup always uses its own residential route |
Input example
{"measureMode": "trending_and_custom","marketCode": "US","windowDays": "7","hashtagsToMeasure": ["payday", "rainbowpfp", "fyp"],"resolveExactCounts": true,"statsConcurrency": 6,"minViewCount": 0,"minPostCount": 0}
Backward compatibility
Input written for the original TikTok Trending Hashtags Scraper still runs unchanged. result_type, country, top100_period, analytics_period, top100_industry, hashtag_list, hashtags and period are all accepted and mapped onto the interface above; when supplied, they take precedence over the fields on this page. Inputs that TikTok's live surface can no longer honour — top100_new_on_board, total_hashtags, numeric top100_industry IDs — are accepted and reported as ignored in the run log, rather than silently falling back to unfiltered data.
Output
Every hashtag becomes one dataset row.
{"rowType": "trending","hashtagName": "payday","rank": 2,"marketCode": "US","marketName": "United States","windowDays": 30,"industryName": "Beauty & Personal Care","industryNames": ["Beauty & Personal Care"],"viewsFormatted": "828.6M","postsFormatted": "2.1M","viewCountExact": 16810394190,"videoCountExact": 4403431,"viewsPerPost": 3817.6,"viewsPerPostRunMedian": 1924.5,"saturationVsRunMedian": 1.984,"saturationSampleSize": 3,"postVolumeTier": "large","isCommerce": false,"challengeId": "22989","hashtagUrl": "https://www.tiktok.com/tag/payday","statsSource": "tiktok.com/api/challenge/detail statsV2 (via CA)","statsFetchedAt": "2026-07-19T00:00:00Z","errorReason": null,"sourceUrl": "https://ads.tiktok.com/creative/creativeCenter/trends/hashtag?region=US&period=30","scrapedAt": "2026-07-19T00:00:00Z"}
In that row viewsFormatted/postsFormatted are the US leaderboard figures and viewCountExact/videoCountExact are the global lifetime totals — two different measurements, both real.
| Field | Type | Notes |
|---|---|---|
rowType | string | trending, custom, or accounting |
hashtagName | string | Hashtag without the #. Unicode-safe |
rank | number | Leaderboard position, trending rows only. null on custom rows |
marketCode / marketName | string | The resolved market. Never labelled global |
windowDays | number | 7 or 30 |
industryName / industryNames | string / array | TikTok tags some hashtags with more than one industry; both are returned |
viewsFormatted / postsFormatted | string | Exactly what TikTok's leaderboard displays for the selected market. Not the same quantity as the exact columns |
viewCountExact | number | Exact global lifetime views from statsV2 |
videoCountExact | number | Exact global lifetime posts from statsV2 |
viewsPerPost | number | Exact global views ÷ exact global posts. null when either is missing |
viewsPerPostRunMedian | number | Median across the run. null below 3 observations |
saturationVsRunMedian | number | This hashtag ÷ the run median. null below 3 observations |
saturationSampleSize | number | How many hashtags the median was computed over |
postVolumeTier | string | micro / small / mid / large / massive, from the absolute post count |
isCommerce | boolean | TikTok's commerce flag. Genuinely false for nearly every hashtag |
challengeId | string | TikTok's own numeric hashtag ID |
hashtagUrl | string | Canonical tiktok.com/tag/... link |
statsSource / statsFetchedAt | string | Provenance of the exact counts |
errorReason | string | Typed reason when a hashtag could not be resolved |
sourceUrl / scrapedAt | string | Provenance of the row |
Legacy keys hashtag_id, hashtag_name, video_views, publish_cnt, rank, industry_info, country_info, period, rank_diff_type and analytics are also present on every row, carrying the same real values, so existing integrations keep working.
Each run also pushes one uncharged accounting row (rowType: "accounting") recording how many hashtags were measured, how many resolved to exact counts, how many were removed by each filter, and which proxy tier was used — so a heavily filtered run is auditable rather than looking broken. Blocked or unparseable pages likewise produce an uncharged row with a typed errorReason instead of a charged empty result.
Data accuracy notes
Routing. TikTok answers the exact-count endpoint with an empty body for US and EU traffic — including Apify's own datacenter egress — while serving it normally elsewhere. Measured across rotated residential exits: Canada 4/4, Australia 4/4, New Zealand 4/4, Japan 4/4, Singapore 4/4, Brazil 4/4, Mexico 4/4 returned real data; United States 0/8, United Kingdom 0/8, Germany 0/8, Ireland 0/4, Italy 0/4, Spain 0/4, Poland 0/4, India 0/4 returned nothing. The actor therefore routes exact-count lookups through a residential exit in a region that answers, falling through the list until one does. Because the counts are worldwide lifetime totals, the route has no effect on the values.
TikTok's challenge payload contains two stat blocks. stats.videoCount is a hard zero on every hashtag tested and stats.viewCount is rounded — 491400000 where the true figure is 491447586. This actor reads statsV2 exclusively. Where a value is genuinely unavailable it is returned as null; it is never returned as 0.
Compliance
This actor collects only publicly available, logged-out hashtag statistics. It uses no account, no cookies and no credentials. Review TikTok's terms and your local regulations before running it at scale.