TikTok Hashtag Scraper & Video Comments avatar

TikTok Hashtag Scraper & Video Comments

Pricing

from $5.99 / 1,000 results

Go to Apify Store
TikTok Hashtag Scraper & Video Comments

TikTok Hashtag Scraper & Video Comments

TikTok Hashtag Scraper — Scrape TikTok videos by hashtag and extract video details, creators, views, likes, shares, captions, timestamps, and comments. Analyze hashtag trends, audience engagement, viral content, and competitor activity with structured data.

Pricing

from $5.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

a day ago

Last modified

Share

TikTok Hashtag Scraper — Videos, Comments and Replies, No Login

TikTok Hashtag Scraper & Video Comments searches TikTok for any hashtag or keyword, then reopens every returned video's comment section to pull the comment thread — and, on request, the reply thread under each comment — as linked child rows. Every run returns three row types, video, comment, and reply, each carrying a parentId to its parent, as typed JSON ready to pass to an LLM, load into a spreadsheet, or feed a monitoring pipeline. No TikTok account, cookie, or login is required to reach any of it.

What is TikTok Hashtag Scraper & Video Comments?

TikTok Hashtag Scraper & Video Comments is an Apify Actor that queries TikTok's own keyword-search surface for one or more hashtags or keywords, keeps the videos that surface returns, and then — for every one of those videos — pages through TikTok's comment endpoint to collect the comment thread underneath it. Turn on the reply toggle and it goes one level deeper, opening the reply thread under any comment that reports at least one reply. What sets this Actor apart from a plain hashtag/keyword video scraper is that the comment and reply data is not a bolt-on: every comment row carries parentId set to the video it belongs to, and every reply row carries parentId set to the comment it answers, so a full conversation tree reconstructs with a single group-by — no separate scraper, no video-URL list to hand-build first. No TikTok account, session cookie, or credential of any kind is read from the input schema or used by the request layer; every surface this Actor calls is reached logged out.

Key capabilities:

  • Hashtag and keyword video discoverystartUrls accepts a bare word, a #tag form, or a full /tag/<name> URL; a @username or profile URL is logged as a search term rather than silently scraped as a profile feed.
  • Real per-video comment threads — pages TikTok's comment endpoint per video, in pages of 20, to return up to maxCommentsPerVideo top-level comments.
  • Reply threads on demandincludeReplies opens the reply thread under every comment that reports one or more replies, capped by maxRepliesPerComment.
  • An engagement floor for commentsminCommentLikes drops low-engagement comments and replies before they are ever pushed to the dataset.
  • Four real sort orderssortOrder re-ranks the video set TikTok returned by its own relevance order, upload date, like count, or comment count, before the per-hashtag cap is applied.
  • Comments never eat the video budgetmaxData counts parent video rows only; a run with 10 videos and 25 comments each still reports 10 against maxData.

📊 What data can you get with TikTok Hashtag Scraper & Video Comments?

Every run can return three result types in one dataset, distinguished by the type column on each row.

Result TypeExtracted FieldsPrimary Use Case
videoid, text, createTimeISO, webVideoUrl, authorMeta.* (handle, follower/heart/video counts, verified, bio), musicMeta.* (sound title, author, album, play URL), videoMeta.* (resolution, duration, cover, download address), mediaUrls, diggCount, shareCount, playCount, collectCount, commentCount, mentions, hashtags, commentsScraped, repliesScrapedVideo-level engagement research and creator discovery for a hashtag or keyword
commentcid, commentText, commentLikes, commentCreateTimeISO, uniqueId, nickname, uid, secUid, avatarThumbnail, likedByAuthor, pinnedByAuthor, replyCommentTotal, commentLanguage, commentMentions, parentId (= the video's id)Audience reaction and sentiment research on the top videos for a hashtag
replySame shape as comment, plus repliesToId; parentId is set to the comment's cid rather than the video's idReconstructing full conversation threads under a comment, not just its top-level text

Comment and reply threads linked by parentId, no login required

The reason this Actor covers both video discovery and comment depth in one run is the parentId linkage on every child row: a comment row's parentId is its video's id, and a reply row's parentId is the comment id it answers, so the whole thread — video, top comments, and their replies — rebuilds from the flat dataset with one group-by, without a second scraper or a hand-built list of video URLs to feed it. None of that requires a TikTok account: the comment and reply endpoints are reached with browser-impersonating HTTP requests and no session cookie, and the input schema has no login, cookie, or credential field at all — the only optional network setting is proxyConfiguration.

{ "type": "comment", "id": "7465341854516691742", "parentId": "7464712852234980630",
"commentText": "The world is too expensive", "commentLikes": 54245,
"uniqueId": "annovajed", "replyCommentTotal": 83 }

Video engagement and creator metadata

Every video row carries the same engagement counters TikTok shows on the video itself — diggCount, shareCount, playCount, collectCount, commentCount — plus the creator's own stats nested under authorMeta (fans, heart, video, following) and the sound under musicMeta. A metric TikTok omits on a given video comes back as null, never a fabricated 0, so an empty field is distinguishable from a genuinely zero count. This is the row type to sort or filter on when the question is "which videos under this hashtag are actually performing," before drilling into their comment threads.

Why not build this yourself?

TikTok has no public, general-availability API that lets a third party search videos by hashtag or keyword and read their comment threads — the platform's own developer-facing surfaces are scoped to a business's own authorized content, not to an arbitrary public search. Reaching the real surfaces this Actor uses instead means: pulling a signed search request out of a warmed browser session (TikTok's own in-page fetch() call to /api/search/general/full/, with a multi-field signed parameter set that TikTok's own web app builds at runtime); recognizing that a page's HTTP status is useless for detecting a block, because every dead TikTok surface still answers 200 — a 0-byte body means a signed-endpoint refusal and a small HTML body around 1.4 KB is a WAF challenge page, and only the byte shape tells the two apart; and running a proxy ladder that escalates from no proxy to datacenter to residential based on that byte shape, never on status code. Maintaining that signed-parameter set, the body-shape detection, and the proxy escalation logic as TikTok's web app changes is what this Actor does so you don't have to reverse-engineer it yourself.

What is the difference between a TikTok hashtag scraper and a TikTok comment scraper?

A hashtag scraper searches TikTok's keyword-search surface for a #tag or keyword and returns the videos that surfaced — it tells you what exists under a tag, but says nothing about how people reacted to any one of those videos. A comment scraper instead takes a specific, already-known video URL and returns the comment thread underneath it — useful once you know which video you care about, but it cannot discover videos on its own. The distinction matters because most workflows actually need both steps in sequence: find the videos worth reading, then read what people said under them, and stitching two separate Actors together means running one, extracting video URLs from its output, then feeding those into the other. TikTok Hashtag Scraper & Video Comments returns both in one dataset — hashtag-discovered video rows with their comment and reply rows interleaved right after each one, linked by parentId — so there is no intermediate URL-extraction step between discovery and comment depth.

How to scrape TikTok hashtags with TikTok Hashtag Scraper & Video Comments?

  1. Open the Actor's page on the Apify Store and start a new run.
  2. Enter one or more hashtags or keywords in startUrls — this is the only required input.
  3. Set maxData for videos per hashtag and sortOrder for how TikTok's own video set should be ranked before that cap is applied.
  4. Turn on includeComments (on by default) and set maxCommentsPerVideo, minCommentLikes, includeReplies, and maxRepliesPerComment for how deep to go into each video's comment section.
  5. Start the run, then download or stream results from the dataset as JSON, CSV, or another supported export format.

Example run input using the Actor's real parameter names:

{
"startUrls": ["travel", "#coffee"],
"maxData": 10,
"sortOrder": "likes",
"includeComments": true,
"maxCommentsPerVideo": 25,
"minCommentLikes": 0,
"includeReplies": true,
"maxRepliesPerComment": 5,
"proxyConfiguration": { "useApifyProxy": false }
}

How to run multiple hashtags in one job

startUrls accepts an array, so a single run searches every hashtag or keyword in the list, one after another, each with its own video/comment/reply rows tagged by the hashtag field they came from. There is no need to launch a separate run per tag — a marketing team tracking five campaign hashtags can list all five in one startUrls array and get a single dataset back, filterable by hashtag at read time.

⬇️ Input

All nine fields below come directly from the Actor's input schema.

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarrayHashtags or keywords to search, one entry per search. Accepts a bare word (travel), a #tag form (#travel), or a full /tag/<name> URL — all three resolve to the same search term. A @username or profile URL is used as a search term, not scraped as a profile feed.["travel", "#coffee"]
maxDataNointegerVideo rows to keep per hashtag, counted after sortOrder is applied. Comments and replies are additional rows and are never counted here. TikTok's own keyword-search surface returns at most ~30–34 videos per term regardless of how high this is set (min 1, max 1000, default 10).10
sortOrderNostring (select)Re-ranks the videos TikTok returned for a hashtag before the maxData cap is applied. relevance keeps TikTok's own order; date sorts by upload time; likes (its legacy alias popularity does the same thing) sorts by diggCount; comments sorts by commentCount. Default relevance."likes"
includeCommentsNobooleanFetch the comment thread for every returned video. Turn off for a videos-only run. When on, all comment/reply rows are additionally mirrored to a separate per-run dataset named tiktok-comments-<runId>. Default true.true
maxCommentsPerVideoNointegerTop-level comments to keep per video, paginated 20 at a time from TikTok's comment endpoint (min 0, max 500, default 20).25
minCommentLikesNointegerDrop comments and replies with fewer than this many likes before they are pushed. 0 keeps everything (min 0, default 0).0
includeRepliesNobooleanAlso open the reply thread under every comment that reports at least one reply. Comments TikTok reports zero replies for are never queried. Default false.true
maxRepliesPerCommentNointegerReplies to keep per comment once includeReplies is on; forced to 0 (ignored) while it is off (min 0, max 200, default 0).5
proxyConfigurationNoobjectApify Proxy configuration. Every surface this Actor calls — the video search and the comment/reply fetches — works with no proxy configured at all; when a proxy is set, it is used by both. Defaults to no proxy (useApifyProxy: false).{ "useApifyProxy": false }

Example JSON input

{
"startUrls": ["travel"],
"maxData": 20,
"sortOrder": "comments",
"includeComments": true,
"maxCommentsPerVideo": 50,
"minCommentLikes": 10,
"includeReplies": true,
"maxRepliesPerComment": 10,
"proxyConfiguration": { "useApifyProxy": false }
}

Common pitfall: turning on includeReplies but leaving maxRepliesPerComment at its default of 0. The reply toggle only decides whether the Actor looks for replies; the actual per-comment reply count is capped by maxRepliesPerComment, so a run with includeReplies: true and maxRepliesPerComment: 0 will still finish with zero reply rows. Set both together.

⬆️ Output

Results are typed, normalized JSON with a consistent field set across video, comment, and reply rows — fields that don't apply to a given row type come back null rather than being omitted, so one table view renders all three. Datasets are downloadable from the Apify platform in JSON, CSV, Excel, XML, or HTML, or read live through the Apify API. When includeComments is on, every comment and reply row is additionally mirrored into a separate per-run dataset named tiktok-comments-<runId>, so a clean comments-only export doesn't require filtering the mixed default dataset first.

Every row pushed to the default dataset — video, comment, and reply alike — is billed as one row_result event; check the Actor's Pricing tab on the Apify Store for the current per-event rate. The mirrored copy written to tiktok-comments-<runId> is a plain dataset write, not a separate Actor.push_data call with its own charged event, so it is not billed again on top of the row that already charged in the default dataset.

Scraped results

[
{
"hashtag": "travel",
"type": "video",
"isChild": false,
"parentId": null,
"id": "7464712852234980630",
"text": "3 days in Rome on a budget",
"createTimeISO": "2025-01-28T18:46:40Z",
"webVideoUrl": "https://www.tiktok.com/@creator/video/7464712852234980630",
"authorMeta": { "name": "creator", "nickName": "Creator", "fans": 184000, "bioLink": null },
"diggCount": 5800000,
"playCount": 41000000,
"shareCount": 91000,
"collectCount": 720000,
"commentCount": 9290,
"commentsScraped": 2,
"repliesScraped": 1
},
{
"hashtag": "travel",
"type": "comment",
"isChild": true,
"parentId": "7464712852234980630",
"videoId": "7464712852234980630",
"id": "7465341854516691742",
"cid": "7465341854516691742",
"commentText": "The world is too expensive",
"commentLikes": 54245,
"commentCreateTimeISO": "2025-01-29T14:20:22Z",
"uniqueId": "annovajed",
"nickname": "Dejavonna_",
"replyCommentTotal": 1,
"repliesToId": null,
"likedByAuthor": false,
"pinnedByAuthor": false
},
{
"hashtag": "travel",
"type": "reply",
"isChild": true,
"parentId": "7465341854516691742",
"videoId": "7464712852234980630",
"id": "7465342001233308161",
"cid": "7465342001233308161",
"commentText": "Depends entirely where you go",
"commentLikes": 812,
"commentCreateTimeISO": "2025-01-29T15:02:07Z",
"uniqueId": "budget_backpacker",
"nickname": "Budget Backpacker",
"replyCommentTotal": 0,
"repliesToId": "7465341854516691742"
},
{
"hashtag": "travel",
"type": "comment",
"isChild": true,
"parentId": "7464712852234980630",
"videoId": "7464712852234980630",
"id": "7465350012239001122",
"cid": "7465350012239001122",
"commentText": "Which hostel did you stay at?",
"commentLikes": 340,
"commentCreateTimeISO": "2025-01-29T16:41:09Z",
"uniqueId": "wanderluster22",
"nickname": "wanderluster",
"replyCommentTotal": 0,
"repliesToId": null,
"likedByAuthor": true,
"pinnedByAuthor": false
}
]

How can I use the data extracted with TikTok Hashtag Scraper & Video Comments?

  • Community managers and content strategists: sort video rows by commentCount, then read the linked comment rows to find the objections, questions, and requests that should drive the next script or reply.
  • AI engineers and LLM developers: have an agent call the Actor with a hashtag, receive structured video/comment/reply JSON, and pass it to a model as grounded context for a brand-monitoring or trend-summary assistant.
  • Market researchers: export comment and reply rows to CSV for a hashtag and run your own sentiment or keyword pass over commentText offline, without touching video metadata at all.
  • Competitor and campaign research teams: compare which creators' videos under a hashtag generate real comment volume versus passive view counts, using commentCount alongside playCount.

📈 How do you monitor hashtag engagement over time?

Hashtag engagement monitoring means running the same startUrls list on a recurring schedule and comparing each new run's rows against the previous run's for the same video and hashtag. Because diggCount, playCount, commentCount, commentsScraped, and repliesScraped are all recomputed fresh from that run's own search and comment fetches, a video whose commentsScraped or diggCount climbs between runs is a genuine engagement signal, not an artifact of the scrape. The fields worth diffing are diggCount/playCount/commentCount on video rows for overall traction, and commentLikes/replyCommentTotal on comment rows to see whether a specific thread is still gaining replies.

A practical workflow: run the same hashtag set daily or weekly, key each run's rows by id (video) or cid (comment/reply) plus the run date, then alert when a tracked video's commentCount or diggCount jumps sharply between runs, or when a new video appears under a monitored hashtag for the first time. This Actor has no scheduler of its own — recurring runs are set up with Apify's Schedule feature on the Actor's page, which triggers a fresh run on the interval you configure and writes each run to its own dataset for comparison.

Integrate TikTok Hashtag Scraper & Video Comments and automate your workflow

TikTok Hashtag Scraper & Video Comments works with any language or tool that can send an HTTP request, and with the Apify API and client libraries for scripted access.

REST API with Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"startUrls": ["travel", "#coffee"],
"maxData": 10,
"sortOrder": "likes",
"includeComments": True,
"maxCommentsPerVideo": 25,
"includeReplies": True,
"maxRepliesPerComment": 5,
}
run = client.actor("tiktok-hashtag-scraper-video-comments").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["type"], item.get("hashtag"), item.get("id"))

MCP for query-grounded AI agents

Any Apify Actor, including this one, is callable through Apify's hosted MCP server at mcp.apify.com, or locally via npx @apify/actors-mcp-server with an APIFY_TOKEN environment variable. An MCP-connected agent can call the Actor as a tool — passing a hashtag or keyword list as startUrls — receive structured video/comment/reply JSON back, and generate a grounded answer about what people are posting and saying under a hashtag, without the agent developer writing any TikTok-specific scraping code. Compatible with Claude Desktop, Claude Code, Cursor, and other MCP clients.

Scheduled monitoring and delivery

The Actor itself has no push-webhook feature, but the Apify platform supports scheduled runs (via Schedules) and run-completion webhooks for any Actor, including this one — so a recurring hashtag check can be wired to notify Slack, trigger a Zapier/Make workflow, or write to a data warehouse whenever a scheduled run finishes.

Scraping publicly visible web pages is generally lawful in the United States — courts have held that accessing data not gated behind a login is not a violation of the Computer Fraud and Abuse Act, most notably in hiQ Labs, Inc. v. LinkedIn Corp., 9th Circuit, 2019. TikTok Hashtag Scraper & Video Comments reads only content TikTok serves to a logged-out visitor: no account, cookie, or credential is used or accepted anywhere in its input, and it cannot reach private, follower-only, or age-gated content as a result. Comment text and commenter handles are personal data in many jurisdictions, so GDPR, CCPA, or equivalent regimes govern how you store and process them once collected — this is not legal advice, and TikTok's own Terms of Service still apply to how you use the platform. Consult your legal team for commercial use cases involving bulk data storage.

❓ Frequently asked questions

Do I need to include the # symbol when entering hashtags?

No. startUrls accepts travel, #travel, or a full https://www.tiktok.com/tag/travel URL, and all three are normalized to the same search term before the run starts.

What does sortOrder actually change?

It re-ranks the videos TikTok's search already returned, before the maxData cap trims the list — relevance keeps TikTok's own order, date sorts by upload time, likes (or its popularity alias) sorts by diggCount, and comments sorts by commentCount. It does not change which videos are found, only the order they're kept in when the cap is applied.

How does TikTok Hashtag Scraper & Video Comments handle TikTok's anti-bot measures?

It treats HTTP status as unreliable — every dead TikTok surface still answers 200 — and instead classifies each response by body shape: an empty body means a signed-endpoint refusal, a small HTML body means a WAF challenge page, and only a real JSON payload counts as success. A proxy ladder escalates from no proxy to Apify datacenter to residential proxy based on that shape, and the video-search step runs inside a warmed browser session so its search request carries the same signed parameters TikTok's own web app generates.

Does TikTok Hashtag Scraper & Video Comments extract comment replies, not just top-level comments?

Yes — switch on includeReplies and set maxRepliesPerComment. Reply rows come back with type: "reply" and parentId set to the cid of the comment they answer, so they attach directly under the right comment when grouped. Only comments that report at least one reply are ever queried for replies.

How many videos, comments, and replies can I get per run?

Up to maxData videos per hashtag (TikTok's own keyword-search surface tops out at roughly 30–34 videos per term regardless of a higher setting), up to maxCommentsPerVideo (max 500) top-level comments per video, and up to maxRepliesPerComment (max 200) replies per comment once replies are turned on.

No. There is no login, cookie, or credential field anywhere in the input schema, and none is used by the request layer for either the video search or the comment/reply fetches. That also means the Actor cannot see private accounts, follower-only posts, or anything behind an age gate.

How do I use TikTok Hashtag Scraper & Video Comments to monitor hashtag engagement over time?

Run the same startUrls list on a recurring Apify Schedule, key each run's video and comment rows by id/cid plus the run date, and alert when a tracked video's commentCount, diggCount, or commentsScraped moves sharply against its own previous run.

Does TikTok Hashtag Scraper & Video Comments work with Claude, ChatGPT, and AI agent frameworks?

Yes. It's reachable through Apify's hosted MCP server at mcp.apify.com for MCP-native clients, and callable as a standard HTTP endpoint by any agent framework that can issue a request and parse JSON — which enables a grounded agent that retrieves live hashtag and comment data before answering a question.

How does TikTok Hashtag Scraper & Video Comments compare to other TikTok scrapers?

As observed on the Apify Store on 2026-07-30, newpo/super-tiktok-scraper scrapes hashtag and user-page videos but does not fetch comments at all; alien_force/tiktok-scraper-with-comments fetches comments and replies but only for TikTok video URLs you already have, with no hashtag or keyword discovery step; and openclawai/tiktok-douyin-bilibili-scraper covers multiple platforms but states on its own listing that its TikTok comment mode requires a pasted browser session cookie to return results. TikTok Hashtag Scraper & Video Comments is the only one of the three, as checked, that both discovers videos from a hashtag or keyword and returns their full comment and reply threads, with no TikTok cookie or login supplied anywhere.

Can I use TikTok Hashtag Scraper & Video Comments without managing proxies or TikTok credentials?

Yes on both counts. Every surface this Actor calls works with proxyConfiguration left unset, and proxyConfiguration is the only network-related input field in the schema — there is no username, password, or cookie field to manage at all. Setting a proxy is entirely optional and only helps if you're running at higher volume.

Your feedback

Found a bug or missing a field? Let us know through the Issues tab on this Actor's Apify Store page — it's actively monitored and helps prioritize fixes and new fields.