TikTok Hashtag Scraper - Videos, Views & Tag Analytics
Pricing
Pay per event
TikTok Hashtag Scraper - Videos, Views & Tag Analytics
Scrape TikTok hashtags: every video posted under a tag with its caption, author, views, likes, comments and shares, plus the tag's own total views and video count. Filter by date and likes, sort, and download the videos and covers.
TikTok Hashtag Scraper: videos, views and tag analytics
Give it hashtags and get two things back. One row per video posted under each tag, with the caption, the author and their follower count, the views, likes, comments and shares, the sound and the post date. And one row per hashtag carrying its total view count, which is the number that tells you whether a tag is worth posting under at all.
No login, no API key, no TikTok developer account.
What you get
Per video: video_id, url, description, created_at, handle,
nickname, author_id, author_verified, follower_count,
author_video_count, play_count, like_count, comment_count,
share_count, collect_count, duration_seconds, width, height,
cover_url, play_url, download_url, music_title, music_author,
music_id, hashtags, is_ad, and the hashtag that produced the row.
Counts arrive as integers, not as the 1.2M strings the site shows.
Per hashtag: hashtag, hashtag_id, url, description, view_count,
is_commerce.
Optional: eight extra author fields (bio, avatar, region, following count, lifetime likes), and downloads of the videos, thumbnails, avatars, sound artwork and photo-post slideshow images into the run's key-value store.
Why a hashtag is worth measuring
A hashtag is the only free distribution lever on TikTok. Which tag a post carries decides which feed it is eligible for, and the difference between a tag with 27 billion views and one with 200 billion is the difference between a niche and a firehose.
Two questions this answers and the app does not. Which accounts actually get reach under a tag, which is the video rows grouped by handle and sorted by views. And whether a tag is still alive, which is the post dates on the rows: a tag whose top results are two years old is a tag nobody is posting under now.
The one thing to know before you run it
The videos come from TikTok's search, not from the hashtag page's own feed, because that feed is closed. The endpoint the hashtag page uses to list its videos answers with an empty response. That is not a limitation of this Actor: TikTok's own hashtag page, loaded in a real browser with every parameter it normally sends, gets the same empty response and renders zero videos.
So a tag's videos are fetched by searching for the tag, which does work, and
the run summary reports videosFromSearch rather than implying a feed that
does not exist. In practice the result is the same set of videos you would see
on the tag page, ranked TikTok's way.
video_count on a hashtag row is empty on purpose. TikTok still sends the
field and it reads 0 on every tag tested, including #booktok at 551.1
billion views and #fyp at 128 trillion. Publishing that zero would put a
sortable column in your export claiming the biggest tags on the platform have
no videos in them. view_count is live and correct, and that is the figure the
hashtag row is for.
Input
| Field | Type | Notes |
|---|---|---|
hashtags | array | One per line. #coffee, coffee and the full tag link are the same tag. Required. |
maxVideosPerHashtag | integer | Default 60. Set to 0 for reach figures only. |
includeHashtagStats | boolean | Default on. One extra request per tag. Free. |
resultsPerPage | integer | 1 to 30, default 30. |
sortBy | select | relevance, most_liked, most_viewed, most_commented, most_shared, newest, oldest. |
oldestPostDate | string | YYYY-MM-DD, an ISO timestamp, or 7 days / 3 months. |
newestPostDate | string | Same formats. |
leastDiggs | integer | Minimum likes. |
mostDiggs | integer | Maximum likes. Useful for finding small accounts rather than the same viral posts. |
excludeAds | boolean | Drop rows TikTok marks as advertising. |
scrapeAdditionalAuthorMeta | boolean | Eight extra author fields. Free. |
shouldDownloadVideos | boolean | Store the MP4 and put a working link on the row. |
shouldDownloadCovers | boolean | Store the thumbnail. |
shouldDownloadAvatars | boolean | Store the author avatar. |
shouldDownloadMusicCovers | boolean | Store the sound artwork. |
shouldDownloadSlideshowImages | boolean | Store each image of a photo post. |
maxMediaDownloads | integer | Ceiling across every download option. Default 50. |
country | string | Two-letter code. Results are regional. |
language | string | Two-letter code. |
proxyCountryCode | string | Where the request should appear to come from. |
Filters cost pages, and the summary says so
Every filter is applied to the rows the run collected. TikTok's search endpoint accepts a sort and a date parameter and then ignores both, which was measured rather than assumed: the same tag returned an identical result ordering across every value of each.
So a narrow date window or a high like threshold reads more pages and
returns fewer rows, which is the opposite of how a server-side filter behaves.
The summary carries videosScanned next to videosRejectedByFilters and
pagesRead, so a filter that matched little reads as a filter rather than as
a tag that has gone quiet.
Speed
One tag, three pages: 99 videos in 5.4 seconds, all 99 carrying a view count, 89 carrying a playable media address. The other ten are photo posts, which have no video at all and come back with their slideshow images instead.
The tag's reach figures are one extra request and took 0.3 seconds.
Media links that actually work
A raw media address from TikTok is not a link you can use. Paste one into a browser, a CMS or a colleague's message and it returns 403. Turn on a download option and the file is stored in the run's key-value store with a public link on the row, which works anywhere.
Photo posts have no video. Those rows carry slideshow_images and the
slideshow download option stores each image.
What people use this for
Finding creators to work with. Video rows grouped by handle, sorted by views, filtered to accounts under a follower ceiling. That is a shortlist of people getting reach in a niche without the follower count to price accordingly.
Content research. Sort by most liked within a date window and you have the formats that are working under a tag this month, not the ones that worked in 2024.
Tag selection. Run twenty candidate tags with maxVideosPerHashtag at 0
and you get twenty reach figures in a few seconds, for the price of twenty
requests.
Brand monitoring. A branded tag run daily, with the post-date filter set to the last day, is every new post carrying your tag.
Notes
View, like and comment counts are live and change through the day. A run is a snapshot.
A tag that does not exist is reported by name with the reason, rather than returning zero rows that look like a tag nobody uses.
Free Apify plans are capped at 10 results per run. The run stops collecting at that point rather than doing the whole crawl and discarding it.