TikTok Hashtag Scraper
Scrape any TikTok hashtag for videos, views, likes, comments, shares and author data. 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 — a run that returns nothing costs nothing beyond the start fee. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-06-23, 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 |
sessionCookies | Optional — leave empty and the run works as normal. Hashtag feeds are pulled keyless first; a built-in session only covers the tags that come back empty. Supply your own TikTok account cookie here to get a private rate limit that no other user shares. In Chrome, on a logged-in tiktok.com tab: F12 → Application → Cookies → copy the `sessionid` value. Paste one per line; several are rotated. | array |
notionConnector | Optional. Deliver results to your connected Notion via Apify MCP connectors. | string |
notionParentId | Optional Notion database/data-source id. | string |
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.
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 every TikTok video using a sound: views, likes, comments, shares, author and music data. $0.25 per 1,000 videos, flat at every volume.
TikTok Followers & Following Scraper
Extract any TikTok account's public followers or following list with bios, avatars, regions, verified badges and counts.
Instagram Comments Scraper
Scrape Instagram post and reel comments at $0.40 per 1,000, flat at every volume, plus a $0.001 run start. Text, likes, replies, author, verified badge.
Twitter (X) Search Scraper
Scrape X (Twitter) search results by keyword and advanced query. Full text, engagement, author, media. $0.40 per 1,000 tweets plus a $0.00005 run start.
Twitter (X) List Scraper
Scrape every tweet from any X (Twitter) list: full text, likes, retweets, views, media, hashtags and author profile.
Threads Scraper
Scrape public Threads profiles and recent posts without login: bios, followers, post text, likes, timestamps and media URLs. From $0.40 per 1,000 results.
Where this tool sits
- Categories
- Social Media Scrapers
- Platforms
- TikTok
⚡ TikTok Hashtag Scraper — Videos by Hashtag (No Login, No API Key)
Pull every video under any TikTok hashtag — no login, no API key, no proxy. Feed it hashtags (with or without #) or /tag/ URLs and get back each video with views, likes, comments, shares, saves, video & cover URLs, music/sound, author and timestamps. Export to JSON, CSV or Excel, call it from the API, or have results delivered straight to Notion. Just $0.25 per 1,000 results — the cheapest TikTok hashtag scraper on the market.
> No account. No signing keys. No msToken to paste. Paste a hashtag and run.
Why this scraper wins
- 🔓 Keyless, sign-free, proxy-free — no login, no API key, no signing keys, and no proxy needed. It just works.
- 🛡️ Not fooled by IP-reputation decoys — TikTok serves flagged addresses a stripped page with placeholder numbers. This Actor does not read that page, so the counts you get are the real ones.
- 💸 $0.25 / 1,000 results, pay-per-result — the lowest rate on the market, billed only for videos actually returned. Empty and failed runs cost nothing.
- 🧹 Clean, flat records — one tidy object per video, ready for sheets, dashboards or LLM pipelines.
- 📬 Built-in Notion delivery — push every run into Notion via Apify connectors, zero extra code.
- 🚦 Honest errors — a clear
errorCoderow (BLOCKED,RATE_LIMITED,NO_RESULTS) when something goes wrong, instead of silent emptiness.
What you can scrape
| Mode | Input | Returns |
|---|---|---|
| Hashtag | hashtags (e.g. cats, #spacex) | Videos under each hashtag |
| Tag URL | a /tag/ URL in startUrls | Videos under that hashtag |
You can mix both in one run — hashtags parsed out of /tag/ URLs are merged with the hashtags list and de-duplicated, so a tag listed twice is only scraped (and only billed) once.
Want profiles, search and single videos too? Use the all-in-one TikTok Scraper.
Input
| Field | Type | Description |
|---|---|---|
hashtags | array | Hashtags (with or without #) to pull videos from. |
startUrls | array | Or paste TikTok /tag/ URLs, e.g. https://www.tiktok.com/tag/cats. |
resultsPerPage | integer | Max videos per hashtag (1–2000, default 50). Charged per result. |
sessionCookies | array | Optional. Your own TikTok sessionid cookie(s), one per line — see *Throughput and your own cookie*. |
proxyConfiguration | object | Optional — this scraper needs no proxy. |
notionConnector | string | Optional Notion connector ID for delivery via Apify MCP connectors. |
notionParentId | string | Optional Notion database/data-source id. |
Input field names follow the conventions used across similar Actors on the Store, so switching an existing workflow over is usually a drop-in change.
Example input
{
"hashtags": ["cats", "#spacex"],
"startUrls": ["https://www.tiktok.com/tag/parkour"],
"resultsPerPage": 200
}
Throughput and your own cookie
Runs work out of the box: every tag is pulled keyless first, exactly as before, and that path needs nothing from you. Only when a tag comes back empty does the run retry it through a built-in session, so a quiet tag returns videos instead of a blank.
That built-in session is shared across everyone using the Actor, so under heavy concurrent load it can be rate-limited. If you are pulling a lot of tags and want a rate limit nobody else shares, paste your own TikTok sessionid into sessionCookies (Chrome: F12 → Application → Cookies → sessionid, one per line). It is optional, it replaces the built-in session rather than adding to it, and an expired or missing cookie just means the run stays on the keyless path instead of failing.
Calling it from the API
curl -X POST "https://api.apify.com/v2/acts/Dami_Studio~tiktok-hashtag-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"hashtags":["cats"],"resultsPerPage":100}'
The response is the dataset itself — an array of the records shown below — so it drops straight into a script with no second call.
Output (one record per video)
{
"ok": true,
"type": "video",
"id": "7300000000000000000",
"webVideoUrl": "https://www.tiktok.com/@catlover/video/7300000000000000000",
"text": "best nap ever 😴 #cats #catsoftiktok",
"createTime": "2024-06-12T14:00:00.000Z",
"hashtags": ["cats", "catsoftiktok"],
"region": "US",
"playCount": 2400000,
"diggCount": 318000,
"commentCount": 4200,
"shareCount": 9100,
"collectCount": 15000,
"downloadCount": 800,
"isAd": false,
"video": {
"duration": 23,
"cover": "https://...jpg",
"dynamicCover": "https://...webp",
"playAddr": "https://...mp4",
"downloadAddr": "https://...mp4"
},
"music": { "id": "...", "title": "original sound", "authorName": "catlover", "original": true, "duration": 23 },
"author": { "id": "...", "uniqueId": "catlover", "nickname": "Cat Lover", "avatar": "https://...jpg" }
}
Field reference
| Field | Meaning |
|---|---|
id | TikTok's own numeric video id, as a string. Stable — use it as your primary key. |
webVideoUrl | Canonical tiktok.com/@handle/video/<id> link you can open in a browser. |
text | The caption exactly as posted, emoji and hashtags included. |
createTime | Posting time as an ISO-8601 UTC string, ready to sort or bucket by day. |
hashtags | Every hashtag parsed out of the caption — useful for co-occurrence analysis. |
region | Two-letter country code of the posting account, when TikTok exposes it. |
playCount / diggCount | Views and likes. |
commentCount / shareCount / collectCount | Comments, shares, and saves/bookmarks. |
downloadCount | Times the video was downloaded, when reported. |
isAd | true for promoted/branded content, so you can filter paid posts out of organic analysis. |
video.duration | Length in seconds. |
video.cover / video.dynamicCover | Static thumbnail and animated preview. |
video.playAddr | Direct MP4 without the watermark. |
video.downloadAddr | Direct MP4 with the standard TikTok watermark. |
music.* | Sound id, title, creator handle and whether it is an original sound — this is how you spot a trend built on one audio track. |
author.* | Poster's id, @handle, display name and avatar. |
Media URLs (cover, playAddr, downloadAddr, avatar) are CDN links that expire after a while. If you need the files, fetch them soon after the run rather than months later.
What people use it for
- Trend tracking — run the same hashtag on a schedule and diff
playCountday over day to see what is actually accelerating rather than what is merely large. - Creator discovery — group results by
author.uniqueIdand rank by median views to find accounts that consistently perform inside a niche. - Sound research — group by
music.idto find the audio track a trend is riding before it saturates. - Competitive/brand monitoring — watch a branded hashtag and catch the videos driving it, including whether they are ads (
isAd). - Dataset building — flat records with stable ids feed straight into a warehouse, a spreadsheet or an LLM pipeline.
Pricing
$0.25 per 1,000 videos ($0.00025 each), with no run-start fee. Flat rate — no volume tiers, no plan gates, no minimums — and you are charged only for videos actually returned. That single number applies on every plan, from your very first run, and it is the cheapest rate on the market for this job.
> Price change on 19 August 2026: the per-video rate stays at $0.25 per 1,000, and a $0.001 run-start fee is added. There is no run-start fee before that date.
Billing
One charge applies today: $0.00025 per video actually delivered, and nothing else. There is no run-start fee until 19 August 2026, when a $0.001 fee per run begins. Diagnostics, duplicates, blocked look-ups and no-result runs never incur the per-result fee — a run that returns nothing is free today.
Because billing is per delivered video, resultsPerPage is also your budget control: resultsPerPage: 100 across 3 hashtags can cost at most 300 × $0.00025 = $0.075. Duplicate videos appearing under several of your hashtags are pushed once and billed once.
Limitations — the honest list
- Public data only. Private accounts, friends-only posts and deleted videos are not reachable, and never will be by a keyless Actor.
- Hashtag feeds are ranked, not exhaustive. TikTok decides which videos a tag page surfaces and in what order. You get up to 2,000 per hashtag, and that is a large sample of the tag — not a guarantee of every video ever posted under it.
- Counts are point-in-time.
playCountand friends are whatever TikTok reported at the moment of the run. For trend work, schedule repeated runs and store the snapshots. - Some fields can be null.
region,downloadCount,musicand parts ofauthorare absent on some videos depending on what TikTok returns; the record is still emitted with the fields it does have. - Requests are paced. The Actor deliberately throttles itself to stay well inside upstream rate limits. Large pulls therefore take minutes, not seconds — a 2,000-video hashtag is roughly a few minutes of runtime. Raise the run timeout if you queue many big hashtags in one go.
- Upstream hiccups are reported, not hidden. If a hashtag cannot be fetched you get an uncharged
errorCoderow (BLOCKED,RATE_LIMITED,NO_RESULTS) explaining which tag failed and why; the run still endsSUCCEEDEDand other hashtags still deliver. - A misspelled hashtag returns nothing. There is no fuzzy matching —
#catsoftikokis simply a different (empty) tag. - Provide at least one hashtag or
/tag/URL. With neither, there is nothing to scrape.
FAQ
Do I need a TikTok account? No. Public hashtag pages are pulled keyless, and sessionCookies is optional — supply one only if you want a rate limit that nobody else shares.
Do I need a proxy? No. This scraper needs no proxy at all — that's a key advantage. It works from any IP. The proxyConfiguration field exists only if you want to route traffic through your own network for policy reasons.
How many videos can I get per hashtag? Up to 2,000 per hashtag via resultsPerPage; the default is 50.
Do I write # or not? Either. A leading # is stripped for you, so cats and #cats are the same input.
Can I run several hashtags at once? Yes — pass an array. Each is scraped up to resultsPerPage, and videos that appear under more than one of them are de-duplicated so you are not billed twice.
Are the view counts real? Yes. TikTok shows flagged addresses a decoy page with placeholder numbers; this Actor does not read that page, so the counts it returns are the ones TikTok actually reports.
Can I download the videos? The record includes both a watermark-free (video.playAddr) and a watermarked (video.downloadAddr) MP4 URL. Fetch them yourself soon after the run — CDN links expire.
How do I get results into Notion? Connect Notion in Apify, then pass notionConnector (and optionally notionParentId). Every delivered row is written to your database automatically.
It returned an errorCode row — why? That's the Actor telling you exactly what happened (BLOCKED, RATE_LIMITED, NO_RESULTS) instead of failing silently. Those rows are free.
Is scraping this legal? The Actor reads only public information that TikTok serves to anyone, and no personal login is involved. You remain responsible for how you use the data — check your local rules on personal data before storing profiles at scale.