TikTok Hashtag Scraper
Scrape TikTok hashtag videos: plays, likes, comments, shares, author and sound. No login or API key. $0.25 per 1,000 videos.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
hashtags,startUrls,resultsPerPage(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00025 per result = $0.25 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Result returned | Charged per video returned. Failed/empty runs not charged. | $0.00025 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-19, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
hashtags | Hashtags (with or without #) to pull videos from. | array |
startUrls | Or paste TikTok /tag/ URLs (https://www.tiktok.com/tag/cats). | array |
resultsPerPage | Max videos per hashtag. Charged per result. | integer |
notionConnector | Optional. Deliver results to your connected Notion via Apify MCP connectors. | string |
notionParentId | Optional Notion database/data-source id. | string |
sessionCookies | Optional, leave empty and the run works as normal. Supply your own TikTok account cookie here, and the run uses it where an account is needed. In Chrome, on a logged-in tiktok.com tab: F12 → Application → Cookies → copy the `sessionid` value. Paste one per line; several are rotated. | array |
What you get
A structured dataset — each result includes fields like:
textplayCountdiggCountcommentCountwebVideoUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
1 ready-to-run use cases
TikTok Hashtag Search: Pull Top Videos for Any Tag
Top videos for one hashtag with plays, likes, comments, shares, saves, the creator, the sound and a direct video link. One hashtag per run.
Related tools in Social Media Scrapers
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
TikTok Sound Scraper
Scrape the TikTok videos using a sound: views, likes, comments, shares, caption, author and MP4 links. $0.25 per 1,000 videos.
TikTok Followers and Following Scraper
Get a public TikTok account's following list with no login. Followers need your own cookie. Handles, bios, avatars, regions. $0.35 per 1,000 profiles.
Instagram Comments Scraper
Scrape comments from any public Instagram post or reel: text, author, likes, replies and timestamp. Nothing to log into. $0.40 per 1,000 rows.
Twitter (X) Search Scraper
Scrape X (Twitter) search by keyword or advanced query. Get the full text, engagement, media and author. No login needed from you. $0.40 per 1,000 tweets.
Twitter (X) List Scraper
Scrape every tweet from an X (Twitter) list. Get full text, likes, retweets, views, hashtags, media and author. No login. $0.40 per 1,000 tweets.
Threads Scraper
Scrape public Threads profiles and recent posts with no login. Rows carry bios, followers, post text, likes, timestamps and media URLs. $0.40 per 1,000 rows.
Where this tool sits
- Categories
- Social Media Scrapers
- Platforms
- TikTok
TikTok Hashtag Scraper: videos posted under any tag, with the counts attached
Give it hashtags and you get the videos TikTok is showing under them, one row each, with plays, likes, comments, shares and saves, the author, the sound and a video link without the watermark. 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 |
| Ceiling | 2,000 videos per run |
| Account needed | None from you |
| Price | $0.25 per 1,000 videos, flat on every plan |
🔍 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 a cursor, or at your limit, whichever comes first.
Some field names are TikTok's own rather than the words in the app:
| Field | What it is |
|---|---|
diggCount | Likes. |
collectCount | Saves. |
playAddr | The video file without the watermark. downloadAddr is the watermarked one. |
isAd | Branded content. Useful for keeping promoted posts out of an organic reach read. |
A tag that does not exist or comes back empty gets a row saying so, and the run moves on to the next tag.
📥 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. |
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 TikTok sessionid, used only for tags that came back empty. Use a throwaway account: the value sits in the run input, which anyone who can open the run can read. |
proxyConfiguration | off | Leave it off. It exists for people routing through their own servers at high volume. |
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 | What it is |
|---|---|
id, webVideoUrl | Unique per video, and the link a person can open. Use id as your dedupe key across runs. |
text, hashtags | The caption, and the tags parsed out of it without the #. |
createTime, region | When it was posted, as an ISO timestamp, and the region TikTok reports. |
playCount, diggCount, commentCount, shareCount, collectCount, downloadCount | The six counters, as TikTok reports them at read time. |
video | Duration in seconds, the still and animated covers, and both file links. |
music | The sound: id, title, artist, whether it is the creator's own, and its length. null when the video has none. |
author | The account that posted it: id, handle, display name and avatar. |
🧾 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. NOT_FOUND means TikTok had no such tag, NO_RESULTS means the tag exists but returned nothing, and BLOCKED means that tag would not answer this run, which re-running usually clears. None of the three is charged.
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.
▶️ How to run it
1. Open TikTok Hashtag Scraper and click Try for free. 2. Type tags into Hashtags, one per line, or paste links into Hashtag URLs. 3. Set Max videos per hashtag. It is the total for the run, so start at 50 while you look at the output shape. 4. Click Start. 5. Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.
💰 How much does it cost?
$0.25 per 1,000 videos. Flat on every Apify plan, no volume tiers.
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 people use it for
- Watching a niche tag week by week and tracking 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, duration and play count in one table.
- Separating branded posts from organic ones with
isAdbefore reporting on reach.
🚧 What it does not do
- No comments and no follower lists. Those are separate actors, linked 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 greedy tag can consume the whole run.
- Media links expire. They are signed and short lived. Fetch the file during the run if you
want to keep it.
- 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. Give it at least one tag.
🧭 Which TikTok scraper do you need?
| If you want | Use |
|---|---|
| Videos under a hashtag | This one |
| A profile plus its videos, or a keyword search | TikTok Scraper |
| Follower and likes counts for a list of handles | TikTok Profile Scraper |
| Comments under a video | TikTok Comments Scraper |
| Which hashtags are climbing right now | TikTok Trending Hashtags |
❓ Questions people ask
Do I need a TikTok account? No. The cookie field is optional and only comes into play for tags that came back empty without it.
Is the limit per tag 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.
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.
Can I download the videos? The row carries both file links, watermarked and not. They are signed links that expire, so fetch them promptly, or use the video downloader linked from our store page.
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.
Can I run it on a schedule? Yes. Use Apify's scheduler, or start it from the API and read the dataset when it finishes.
🆘 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.