TikTok Hashtag Scraper - Videos
Pricing
from $0.24 / 1,000 results
TikTok Hashtag Scraper - Videos
Scrape TikTok videos by hashtag. Each row has plays, likes, comments, shares and saves, the caption, author and sound, a link to the video, and a flag on branded posts. The limit covers the whole run, not each tag. $0.25 per 1,000 videos.
Pricing
from $0.24 / 1,000 results
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
42
Total users
14
Monthly active users
6 days ago
Last modified
Categories
Share
Scrape the TikTok videos posted under any hashtag: one row per video with plays, likes, comments, shares and saves, the caption, the author, the sound, and a video link. Nothing to log into.
The thing to know before your first run: the limit is run wide, not per tag. Put in three hashtags with a limit of 50 and you get 50 videos in total, and the first tag can use the lot. Run one tag at a time if you need a fair split. A hashtag feed is also what TikTok chooses to show a visitor today, not the full history of the tag.
| Input | Hashtags, or tiktok.com/tag/ links |
| Output | One row per video: plays, likes, comments, shares, saves, caption, hashtags, author, sound, branded flag and both video file links |
| Ceiling | 2,000 videos per run |
| Account needed | None |
| Price | $0.25 per 1,000 videos on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 20,000 |
🔍 What TikTok Hashtag Scraper does
It walks the feed behind each tag and flattens every video into one row. Tags are taken with or
without the #, and a /tag/ link works too.
The same video showing up under two of your tags is returned once and billed once. Paging stops when TikTok stops handing out more of the feed, or at your limit, whichever comes first.
A few field names are TikTok's own rather than the words in the app: diggCount is likes,
collectCount is saves, and isAd marks branded content, which is handy for keeping promoted
posts out of an organic reach read.
📋 What data you get from each TikTok hashtag video
| What you get | Field |
|---|---|
| Video id and the link a person can open | id, webVideoUrl |
| Caption, and the hashtags in it | text, hashtags |
| When it went up, and the region TikTok reports | createTime, region |
| Plays, likes, comments, shares, saves and downloads | playCount, diggCount, commentCount, shareCount, collectCount, downloadCount |
| Branded content flag | isAd |
| Length, still and animated covers | video.duration, video.cover, video.dynamicCover |
| The video file links | video.playAddr, video.downloadAddr |
| The sound: id, title, artist, the creator's own or not, length | music |
| Who posted it: id, handle, display name, avatar | author |
▶️ How to scrape TikTok hashtags
- Open TikTok Hashtag Scraper and click Try for free.
- Type tags into Hashtags, one per line, or paste links into Hashtag URLs.
- Set Max videos per hashtag. It is the total for the run, so start at 50 while you look at the output.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.
Give it at least one tag. A run with nothing in either box fails rather than returning a sample.
💰 How much does it cost to scrape TikTok hashtags?
$0.25 per 1,000 videos on the Free plan. Paid plans pay a little less: $0.248 on Starter, $0.246 on Scale and $0.244 on Business. On the free plan, the $5 Apify gives you each month covers about 20,000 videos.
You pay for videos delivered. Diagnostic rows, and a video that turned up under two of your tags in
the same run, are not charged. resultsPerPage is the ceiling on both the rows and the spend.
📥 What you give it
{"hashtags": ["cats", "spacex"],"resultsPerPage": 50}
| Field | Default | What it is |
|---|---|---|
hashtags | none | Tags, with or without #. The form opens with cats filled in as an example, which is a starting point rather than a default. |
startUrls | none | Or paste links like https://www.tiktok.com/tag/cats. Mix them with hashtags freely. A plain word or #word here counts as a hashtag too. A link that is not a /tag/ link is skipped and named in the run log. |
resultsPerPage | 50 | Videos for the whole run, 1 to 2,000, despite what the field name suggests. This is also your spend cap. |
sessionCookies | none | Optional: your own session, used only for your run and only for tags that came back empty without it. You are responsible for using it within the site's terms. The field is stored encrypted. |
proxyConfiguration | off | Leave it off. It is there if you want to send traffic through your own servers. |
notionConnector, notionParentId | none | Optional. Write each video into a Notion database as well as the dataset. |
📤 What you get back
A real row from a real run. The caption starts with emoji, so it is cut short here, and the media links are trimmed:
{"ok": true,"type": "video","id": "7417800442127633707","webVideoUrl": "https://www.tiktok.com/@lilpawdrama/video/7417800442127633707","text": "...#cat #cutecat #catsoftiktok #catlover #cats #funny #pets #usa_tiktok","createTime": "2024-09-23T11:34:25.000Z","hashtags": ["cat", "cutecat", "catsoftiktok", "catlover", "cats", "funny", "pets"],"region": "US","playCount": 136727,"diggCount": 22693,"commentCount": 127,"shareCount": 437,"collectCount": 1968,"downloadCount": 803,"isAd": true,"video": { "duration": 30, "cover": "https://p16-common-sign.tiktokcdn-us.com/...", "playAddr": "https://v45.tiktokcdn-us.com/...", "downloadAddr": "https://v45.tiktokcdn-us.com/..." },"music": { "id": "7136445672676411393", "title": "Cute", "authorName": "Aurel Surya Lie", "original": false, "duration": 179 },"author": { "id": "7412528791307715627", "uniqueId": "lilpawdrama", "nickname": "lilpawdrama", "avatar": "https://p19-common-sign.tiktokcdn-us.com/..." }}
| Field | How to read it |
|---|---|
id | Unique per video. Use it as your dedupe key across runs. |
hashtags | The tags parsed out of the caption, without the #. |
createTime | When it was posted, as an ISO timestamp. |
playCount and the other counters | As TikTok reports them at read time. A counter TikTok did not send reads 0. |
video.playAddr, video.downloadAddr | Signed links that stop working after a short while. |
music | null when the video has no sound attached. |
🧾 Reading the output
Two kinds of row land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| A video | ok: true and type: "video" | yes |
| A diagnostic | ok: false and an errorCode | no |
Filter on ok == true and you have your data. A tag that fails gets its own row, and the run moves
on to the next tag.
| Code | What it means |
|---|---|
NOT_FOUND | TikTok has no such tag. |
NO_RESULTS | The tag exists but returned nothing, or nothing came back for the whole run. |
RATE_LIMITED | That tag would not answer this run. Re-running usually clears it. |
NOT_SERVED | This video was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
TIME_LIMIT | The run neared its time limit and stopped, keeping every video it had delivered. If none had come back by then, the run ends as failed. |
BAD_INPUT | The input had no hashtag to look up, so the run ends as failed straight away. The row names anything that was skipped. |
One quirk of the Overview table: it shows five columns, so a diagnostic row reads as a nearly blank line there. Open the row itself or download the JSON and everything is present.
💡 What people use it for
- Watching a niche tag week by week and seeing which posts actually travelled.
- Pulling the creators behind a tag, since every row carries the author handle and id.
- Building a swipe file of hooks: caption, sound, length and play count in one table.
- Separating branded posts from organic ones with
isAdbefore reporting on reach.
From a trending tag to the people behind it, in three runs:
- Run TikTok Trending Hashtags for
your country and copy the
hashtagcolumn. - Paste one of those tags here at a time, and sort the rows on
playCount. - Copy
author.uniqueIdfrom the videos that travelled into TikTok Profile Scraper to see who is behind them.
🚧 What it does not do
- No comments and no follower lists. Those are separate actors, in the table below.
- The feed is not an archive. You get what TikTok serves a visitor under that tag now. Old videos that have dropped out of the feed will not come back.
- The limit is shared across your tags. One busy tag can use the whole run.
- Media links expire. They are signed and short lived.
- A counter TikTok does not send reads as
0. On a fresh video that can mean "not published yet" rather than none. - Counts are a snapshot at read time, and TikTok's own figures lag on very new videos.
- An empty input fails the run instead of returning a sample.
- It is not an official TikTok tool. Dami's Studio is independent and is not affiliated with or endorsed by TikTok, or by any other company named on this page.
🧭 Which TikTok scraper do you need?
| If you want | Use |
|---|---|
| Videos posted under a hashtag | This one |
| A profile plus its newest videos, or a keyword search | TikTok Scraper |
| Videos using one sound | TikTok Sound Scraper |
| Follower and like counts for a list of handles | TikTok Profile Scraper |
| Comments under a video | TikTok Comments Scraper |
| The hashtags ranking in a country right now | TikTok Trending Hashtags |
| Posts and reels under an Instagram hashtag | Instagram Hashtag Scraper |
❓ Questions people ask
Do I need a TikTok account to scrape hashtags?
No. The cookie field is optional and only comes into play for tags that came back empty without it.
Is the limit per hashtag or per run?
Per run. The field is called "Max videos per hashtag", but the number you set is the total the run will deliver across all your tags.
Why did I get fewer videos than I asked for?
Either TikTok stopped handing out more of that feed, or an earlier tag in your list had already used the run's allowance.
Do the video links expire?
Every row carries both file links. They are signed links that expire.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made
code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/tiktok-hashtag-scraper. Either way
the run happens on your Apify account at the same price.
Is scraping TikTok legal?
This reads public videos only, never private accounts or messages. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Include the hashtags you used and the run ID, and the log is usually enough for us to see what happened.