TikTok Hashtag Scraper
Pricing
$19.99/month + usage
TikTok Hashtag Scraper
Scrape TikTok hashtags at scale and collect detailed video data. Extract views, likes, comments, shares, captions, sounds, creators, and posting dates. Ideal for trend research, influencer analysis, and content insights. Export clean structured data in JSON, CSV, or Excel.
Pricing
$19.99/month + usage
Rating
5.0
(2)
Developer
Scraper Engine
Maintained by CommunityActor stats
0
Bookmarked
110
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
TikTok Hashtag Scraper — Videos, Engagement and Creator Data
TikTok Hashtag Scraper searches TikTok for any hashtag or keyword you provide and turns every video on the result page into a structured JSON row — caption, exact like/share/play/save/comment counts, creator handle and follower count, sound metadata, and direct video and download URLs. No TikTok login, cookie or API key is needed. Every field keeps the same name and type on every run, so the output loads straight into a spreadsheet, a database, or an LLM pipeline. Start a run on the Actor's Apify Console page to pull the current TikTok search result set for your own hashtag.
What is TikTok Hashtag Scraper?
TikTok Hashtag Scraper is an Apify Actor that runs TikTok's own hashtag and keyword search and converts every video card in the result feed into a clean, typed dataset row — no HTML parsing, no CSS selectors to maintain. It requires no TikTok account, login, or API key: every request the Actor makes is logged out, the same as a visitor browsing tiktok.com/search without signing in. It's built for social media managers tracking a hashtag campaign, content researchers studying what's trending under a tag, and developers or AI engineers who need TikTok video and creator data as clean structured input for a pipeline or agent.
What TikTok hashtag video data is publicly available to scrape?
Everything TikTok Hashtag Scraper returns is visible to any logged-out visitor who searches a hashtag on tiktok.com — no account is required to see it.
| Data category | Publicly visible (no login) | Gated behind TikTok login |
|---|---|---|
| Video caption, ID and canonical URL | Yes | — |
| Engagement counts (likes, shares, plays, saves, comments) | Yes, as a current snapshot | Historical/time-series counts are not exposed by the search surface |
| Creator handle, nickname, avatar, verified flag | Yes | — |
| Creator follower / following / total-likes / video counts | Yes | Full follower and following lists — login required |
| Sound title, author, ID and playable URL | Yes | — |
| Video and download URLs | Yes (TikTok-signed, expiring) | — |
| Hashtags and @mentions in the caption | Yes | — |
| Comment thread text | Not returned by this Actor | A dedicated comments surface, separate from search |
| Creator bio link | Not returned by this Actor | TikTok's search and video-detail payloads never include it |
TikTok Hashtag Scraper only returns publicly visible data — what any visitor sees without logging in. Nothing behind a login wall.
What data can I extract with TikTok Hashtag Scraper?
Each row carries the searched hashtag, the video's own identity fields, the creator and sound metadata attached to it, and the full engagement and media set TikTok's search surface exposes. Coverage figures below are measured by the Actor's source against a live sample of 123 videos across 4 hashtags.
| Field | Description |
|---|---|
hashtag | The term (from startUrls) that produced this row |
id | TikTok's numeric video ID |
text | Video caption/description |
createTime / createTimeISO | Unix timestamp and the equivalent true-UTC ISO-8601 timestamp |
webVideoUrl | Canonical tiktok.com/@<handle>/video/<id> link |
isAd | TikTok's own paid-content flag |
hashtags | Every hashtag on the video, as { "name": "..." } — present on 119/123 (96.7%) of measured videos |
mentions | @handles mentioned in the caption, each as { "userUniqueId", "userId", "secUid" } — rare, present on 4/123 (3.3%) of measured videos |
👤 Creator and sound metadata
| Field | Description |
|---|---|
authorMeta.id / .name / .nickName | Creator's numeric ID, handle (uniqueId) and display name |
authorMeta.verified / .privateAccount / .ttSeller | Verified-badge, private-account and TikTok Shop seller flags |
authorMeta.signature | Creator's bio text; null when the profile has none |
authorMeta.bioLink | Always null — TikTok's search and video-detail payloads never carry a bio link on this surface (0/123 search items, 0/20 detail pages measured) |
authorMeta.avatar | Creator avatar image URL |
authorMeta.following / .fans / .heart / .video / .digg | Creator's following count, follower count, total likes received, video count, and likes the creator has given |
musicMeta.musicName / .musicAuthor / .musicId | Sound title, sound's credited author, and TikTok's sound ID |
musicMeta.musicOriginal | Whether the sound is the creator's own original audio |
musicMeta.musicAlbum | Album name; null for the rest — only 23/123 (18.7%) of measured sounds carry one |
musicMeta.playUrl / .coverMediumUrl | Playable audio URL and sound cover image |
📊 Engagement, video and download fields
| Field | Description |
|---|---|
diggCount / shareCount / playCount / collectCount / commentCount | Likes, shares, plays, saves and comments; null when TikTok omitted that counter for a video |
mediaUrls | Every deduplicated playback/download URL TikTok's payload exposes for the video; empty for photo/slideshow posts, which carry no video file |
videoMeta.height / .width / .duration | Rendition dimensions in pixels and duration in seconds |
videoMeta.coverUrl / .originalCoverUrl | Thumbnail and original-cover image URLs |
videoMeta.definition / .format | Quality label (e.g. 540p) and container format (e.g. mp4) |
videoMeta.downloadAddr / .originalDownloadAddr | TikTok's single download address — both keys hold the identical URL; TikTok does not expose a second, higher-quality file |
isMuted | Always null — the key is absent on 123/123 measured live items |
🤖 Add-on: Need additional TikTok data?
If you need a specific creator's whole upload history rather than a hashtag's search results, pair this Actor with TikTok Profile Videos API Scraper, which pulls every video from a public profile. To search by keyword, hashtag, username or a raw TikTok URL in a single input list, see TikTok Discover Scraper.
Why not build this yourself?
TikTok has no public, self-serve API for searching arbitrary hashtags — its search endpoint is an internal, signed surface meant for the web app, not third-party developers. Building and keeping a scraper for it working means solving three ongoing problems yourself: TikTok rotates the signature scheme and trust cookies (ttwid, msToken) that a search request needs, so a client that doesn't warm up a real browser session gets a silent, HTTP-200 response with an empty body; TikTok challenges unfamiliar sessions with a WAF page that also returns HTTP 200, so status-code checks alone can't tell a real result from a block; and getting past both reliably usually means paying for rotating datacenter and residential proxies on top of the engineering time. This Actor already absorbed that cost once — its original request-based engine went completely dead (HTTP 200, 0-byte body, on every transport tested) and had to be rebuilt around a warmed, signed browser fetch with a proxy ladder that escalates on response shape, not status code.
How to use TikTok Hashtag Scraper
TikTok Hashtag Scraper runs entirely on the Apify platform — no separate signup or credentials beyond your Apify account.
- Open TikTok Hashtag Scraper on its Apify Console page and click Try for free.
- Enter one or more entries in Hashtags or keywords (
startUrls) — the only required input. - Optionally set Maximum videos per hashtag (
maxData), Order rows within each hashtag (sortOrder), and a Proxy route (proxyConfiguration). - Click Start and follow the run log — it reports how many videos were reachable and how many rows were pushed per hashtag.
- Open the Dataset tab and export your results as JSON, JSONL, CSV, Excel, HTML table, or XML.
How to scale to bulk video extraction
startUrls is an array, so a single run can hold as many hashtags or keywords as you want to search — each one is looked up separately and every row it produces carries that term in its own hashtag column, so one dataset can hold several tags at once without mixing them up. Duplicate terms (case-insensitive) are collapsed automatically before the run starts.
What can you do with TikTok hashtag video data?
- 📊 A social media manager tracking a branded hashtag uses
diggCount,shareCountandplayCountto see which videos under the tag are driving reach this week. - 🎯 An influencer marketer scanning a niche hashtag uses
authorMeta.nameandauthorMeta.fansto shortlist creators already posting in that space before reaching out. - 🎵 A trend analyst groups videos by
musicMeta.musicIdto see which sound is carrying a hashtag's growth. - 🗓️ A data team uses
createTimeISOto track how a tag's video volume shifts over time, joining hashtag datasets onid. - 🤖 An AI engineer feeds the typed rows —
text,hashtags,authorMeta— directly into a RAG pipeline or an agent tool, since every field name and type stays fixed across runs and needs no additional parsing.
How does TikTok Hashtag Scraper handle rate limits and blocking?
The Actor opens a warmed, headless browser session that first visits TikTok's /explore page to mint the ttwid and msToken trust cookies a search request needs, then issues an in-page signed fetch to TikTok's own search endpoint. By default it starts with a direct connection — no proxy — and only escalates to Apify's datacenter proxy, then residential proxy, when a response comes back in a shape that means "not trusted": a 0-byte body or a small WAF-challenge page. Escalation is driven purely by that response shape, never by HTTP status, because a dead or blocked TikTok surface still answers with status 200. Once at least one row has been pushed for a hashtag, that hashtag is never retried on a fresh IP, which prevents duplicate rows. If every proxy tier is exhausted for a hashtag without a usable response, the run logs it as failed for that tag and continues with the rest of your list.
⬇️ Input
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
startUrls | Yes | array | Hashtags or keywords, one per line. The # is optional. A https://www.tiktok.com/tag/<name> or /search?q= URL is accepted and the term is read from it. A @username is accepted but is searched as a keyword — this Actor has no profile mode. Default: ["travel"] | ["travel", "photodump"] |
maxData | No | integer | How many rows to keep per hashtag. TikTok's live ceiling is about 30–34 videos per term, so higher values simply return everything that exists. Minimum 1, maximum 1000, default 10 | 20 |
sortOrder | No | string (enum: relevance, date, popularity) | Re-orders the rows this run collected. relevance keeps TikTok's own search order untouched, date sorts collected rows newest-first, popularity sorts by play count. Default relevance | "date" |
proxyConfiguration | No | object | Optional. The run starts with a direct connection, then escalates to datacenter and residential proxy only if TikTok refuses the session. Default {"useApifyProxy": false} | {"useApifyProxy": true} |
Example input
{"startUrls": ["travel", "photodump", "#hiking"],"maxData": 20,"sortOrder": "date","proxyConfiguration": { "useApifyProxy": false }}
⬆️ Output
Every run writes one typed JSON row per video to the Actor's dataset — the same field names and types on every run, regardless of which hashtags you searched. Export the dataset as JSON, JSONL, CSV, Excel, HTML table, or XML from the Dataset tab or the Apify API.
Example output
{"hashtag": "travel","id": "7658445776103804173","text": "one week in the Dolomites #travel #hiking","createTime": 1751584888,"createTimeISO": "2026-07-03T23:21:28Z","isAd": false,"isMuted": null,"authorMeta": {"id": "6727448659015533061","name": "mountainbrynn","nickName": "Brynn","verified": false,"signature": "alps + a backpack","bioLink": null,"avatar": "https://p16-sign.tiktokcdn-us.com/mountainbrynn-avatar.jpeg","privateAccount": false,"ttSeller": false,"following": 412,"fans": 27500,"heart": 1900000,"video": 288,"digg": 1204},"musicMeta": {"musicName": "original sound","musicAuthor": "Brynn","musicOriginal": true,"musicAlbum": null,"playUrl": "https://sf16-ies-music.tiktokcdn.com/original-sound.mp3","coverMediumUrl": "https://p16-sign.tiktokcdn-us.com/original-sound-cover.jpeg","musicId": "7658445751139733806"},"webVideoUrl": "https://www.tiktok.com/@mountainbrynn/video/7658445776103804173","mediaUrls": ["https://v16-webapp-prime.tiktok.com/video/tos/useast2a/mountainbrynn-play.mp4"],"videoMeta": {"height": 1024,"width": 576,"duration": 27,"coverUrl": "https://p16-sign.tiktokcdn-us.com/mountainbrynn-cover.jpeg","originalCoverUrl": "https://p16-sign.tiktokcdn-us.com/mountainbrynn-origcover.jpeg","definition": "540p","format": "mp4","originalDownloadAddr": "https://v16-webapp-prime.tiktok.com/video/tos/useast2a/mountainbrynn-download.mp4","downloadAddr": "https://v16-webapp-prime.tiktok.com/video/tos/useast2a/mountainbrynn-download.mp4"},"diggCount": 857700,"shareCount": 12400,"playCount": 5200000,"collectCount": 91300,"commentCount": 3120,"mentions": [],"hashtags": [{ "name": "travel" }, { "name": "hiking" }]}
How does it work?
TikTok Hashtag Scraper opens a real, headless browser session and visits TikTok's /explore page first to mint the trust cookies a search request needs — the same warm-up a browser goes through before TikTok trusts it. It then runs an in-page fetch of TikTok's own search endpoint, signed with the same parameters a real browser session would send, and reads the video cards out of the response. Every card is passed through a dedicated parser that builds the same fixed set of fields every time, applies your sortOrder, and trims to maxData before pushing rows to the dataset. Only what TikTok's public search page shows a logged-out visitor is ever read — there is no login step and no private data is touched. Because parsing lives in its own layer, the output schema stays stable even when TikTok changes its site or app internals.
Integrations
TikTok Hashtag Scraper runs on the Apify platform, so it works with anything that can call the Apify API or use Apify's existing app integrations.
Calling TikTok Hashtag Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("tiktok-hashtag-scraper").call(run_input={"startUrls": ["travel", "photodump"],"maxData": 20,"sortOrder": "date",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["id"], item["diggCount"])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
No-code tools (n8n, Make, Zapier)
Apify's own apps for Make and Zapier expose a "Run Actor" action — point it at tiktok-hashtag-scraper, map your hashtags into the startUrls field, and pass the run's dataset into the rest of your flow. In n8n, the community Apify node (or a plain HTTP Request node against the Apify API) can start the Actor and fetch its dataset the same way. See Apify's integrations documentation for the full list of supported apps and webhook events.
Is it legal to scrape TikTok hashtag videos?
Scraping publicly available TikTok data is generally lawful, but the creator and video data this Actor returns can qualify as personal data under regimes like GDPR and CCPA because it includes a creator's handle, display name, bio and follower counts alongside their content. TikTok Hashtag Scraper only collects what any logged-out visitor sees on TikTok's public search page — it uses no login and reaches no private data. If you store or process that data at scale, you are responsible for having a lawful basis to do so and for complying with TikTok's own Terms of Service. Consult legal counsel if your use case involves bulk storage of personal data.
❓ Frequently asked questions
What TikTok hashtag video fields does TikTok Hashtag Scraper return?
The top fields are text (caption), diggCount/playCount/shareCount/commentCount (engagement), authorMeta.name and authorMeta.fans (creator identity and reach), createTimeISO (publish time), and webVideoUrl (the canonical link). See the field tables above for every field this Actor returns.
Does TikTok Hashtag Scraper require a TikTok account or login?
No. The Actor makes every request logged out and accepts no credential input of any kind — it works the same way a visitor browsing TikTok's public search page would.
How many TikTok videos can I extract per hashtag?
About 30–34. TikTok's search feed returns one page per term, and a second page comes back empty even when the response claims more results exist. Setting maxData above that measured ceiling does not produce more rows — it simply returns everything the feed actually holds.
What happens if a hashtag search returns zero results?
No dataset rows are pushed for that hashtag, so no item_result charge applies to it. The run log records reachable=0 pushed=0 for that tag so you can confirm TikTok genuinely returned nothing rather than the run failing silently. If every attempt against that tag came back as a blocked response instead of a genuine empty result, the run log reports the tag as failed rather than empty.
Can I scrape multiple hashtags or keywords at once?
Yes. Pass as many entries as you like into startUrls; each is searched independently and every resulting row is labelled with the hashtag value it came from, so one dataset can hold results for several tags without mixing them up.
Does TikTok Hashtag Scraper work with Claude, ChatGPT and other AI agent tools?
It is not exposed through a dedicated MCP server, but it is fully callable as an HTTP endpoint through the Apify API by any agent framework that can make an API call — including custom tool definitions for Claude, ChatGPT, or a LangChain/LlamaIndex agent.
How does TikTok Hashtag Scraper compare to other TikTok hashtag scrapers?
As observed on the Apify Store on 2026-07-30, clockworks' TikTok Hashtag Scraper documents a similar authorMeta/musicMeta/videoMeta output shape but states a hard 400–800-results-per-hashtag ceiling and pushes a separate uncharged error item on failures with an errorCode field — this Actor instead measures and states a real ~30–34-videos-per-hashtag ceiling and pushes no dataset row at all for a hashtag that returns nothing. Lexis Solutions' TikTok Trending Hashtags Scraper, also checked 2026-07-30, targets a different entity entirely — hashtag-level trend and audience analytics gated behind an uploaded TikTok session cookie — rather than the individual videos under a tag.
Does TikTok Hashtag Scraper return data in a format LLMs can use directly?
Yes. Every row is typed, normalized JSON with consistent field names across runs — no HTML to parse and no selectors to write. Pass it directly to an LLM prompt, index it into a vector store, or feed it to an agent tool as-is.
What happens when TikTok changes its layout or anti-bot system?
The output schema is maintained to stay stable even when TikTok's site changes underneath it — this Actor's search engine has already been rebuilt once after TikTok's previous request-based surface stopped returning data entirely. No specific turnaround time is promised for future changes.
Can I use TikTok Hashtag Scraper without managing proxies or browser infrastructure?
Yes. The Actor runs its own headless browser session and proxy ladder — starting with a direct connection and escalating to Apify's datacenter and residential proxies only if needed — entirely inside the Actor run. You don't configure a browser or a proxy pool yourself.
Which TikTok hashtag video fields work best for AI training data and RAG indexing?
For RAG, index text (the caption) alongside hashtags and authorMeta.signature for semantic context. For training data, diggCount, playCount, shareCount, commentCount and createTimeISO return as consistently typed primitives across every row, making them reliable numeric and temporal features.
🔗 Related scrapers
| Scraper | What it extracts |
|---|---|
| TikTok Discover Scraper | Keyword, hashtag, username or TikTok URL search across TikTok's discovery surfaces in one Actor |
| TikTok Profile Videos API Scraper | Every video posted by a specific TikTok creator, from their public profile |
| Instagram Reel Virality Intelligence Scraper | Instagram Reels with engagement and virality metrics — the same video entity on a different platform |
| YouTube Channel Finder With Creator Analytics | Channel-level creator search and analytics on YouTube |
💬 Your feedback
Found a bug, or need a field this Actor doesn't return yet? Let us know by creating an issue on the Actor's Issues tab in Apify Console — technical feedback directly shapes what gets fixed and built next.