TikTok Comments Scraper & Full Reply Threads avatar

TikTok Comments Scraper & Full Reply Threads

Pricing

Pay per usage

Go to Apify Store
TikTok Comments Scraper & Full Reply Threads

TikTok Comments Scraper & Full Reply Threads

Collect TikTok comments automatically for analysis and reporting. This scraper fetches comment content, engagement stats, reply chains, and timestamps. Useful for sentiment analysis, influencer research, and audience behavior insights.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

0

Monthly active users

3 days ago

Last modified

Share

TikTok Comments Scraper — Full Reply Threads

TikTok Comments Scraper & Full Reply Threads scrapes a video's top-level comments plus every reply beneath each one — paginated past TikTok's 20-reply-per-page ceiling to the real end of the thread — and flags exactly which comments the video's creator personally answered. It's built for creators and community managers auditing which fan questions they've responded to, social listening teams who need full conversation threads rather than a truncated first page, and researchers studying comment-reply dynamics at scale. No TikTok login is required. Every section below documents an input, an output field, or exactly how reply pagination and creator-answer detection work.

What is TikTok Comments Scraper & Full Reply Threads?

This Actor scrapes TikTok's comment and reply API endpoints directly, paging each reply thread on TikTok's own has_more/cursor fields until the thread is genuinely exhausted, and cross-references TikTok's own "Creator" reply label against the video's author to detect real creator responses.

Key capabilities, read from the source:

  • Real reply pagination past the 20-reply ceiling. TikTok's reply endpoint caps each page at 20 rows regardless of the requested count; scrape_reply_thread() keeps requesting pages on the real cursor/has_more fields until the thread reports no more data, verified live to 120+ replies on a single comment — a hard safety stop at 200 pages prevents one huge thread from running forever.
  • Creator-answer detection from two independent real signals. answeredByCreator is set when a reply carries TikTok's own label_text == "Creator" (label_type == 1) or when the replier's username matches the video's own author — creatorAnswerDetectedBy discloses which signal actually fired.
  • Honest "awaiting answer" only when the whole thread was read. creatorAnswerScanComplete is only true once the entire reply thread has been paginated — the awaitingCreatorAnswer filter explicitly excludes comments whose thread was only partially read, rather than guessing "not answered" from an incomplete scan.
  • Byte-size response classification, not just HTTP status. fetch_json() treats a ~1462-byte HTTP 200 body as a WAF challenge page and a 0-byte HTTP 200 body as a signed-endpoint refusal — both distinct from a genuine empty result, so a silent block is never misreported as "0 comments found."
  • Duplicate-comment deduplication before charging. TikTok returns overlapping comment pages on deep runs; cid-based deduplication happens before any row is pushed or billed — the source notes the base scraper this was built from billed 13.3% duplicate rows on deep runs before this fix.
  • Replies routed to a separate child dataset by default. replyDestination keeps the main table at one row per comment (readable, uncluttered) while replies land in their own child dataset table — mainDataset or both are available when you specifically want them interleaved.

What data can I extract with TikTok Comments Scraper & Full Reply Threads?

Every field below is read directly from build_comment_row(), build_reply_row(), and apply_reply_data() in src/main.py — the dataset's default view surfaces 21 of these, with a dedicated repliesOnly view.

Comment fields (type: "comment")

FieldExample ValueNotes
text / diggCount / createTimeISOcomment body / likes / posted date
uniqueId / uid / avatarThumbnailcommenter identity
cid / commentLink / videoWebUrlidentifiers and links
replyCommentTotal47TikTok's own reported reply count for this comment
repliesFetched / replyThreadTotal / replyThreadHasMore / replyThreadComplete47 / 47 / false / trueReal pagination progress and completeness
answeredByCreatortrueWhether the creator genuinely replied
creatorAnswerText / creatorAnswerTime / creatorAnswerLikesthe creator's actual reply content
creatorAnswerDetectedBy"label" or "username"Which real signal confirmed the creator answer
creatorAnswerScanCompletetrueWhether the "not answered" conclusion is actually proven

Reply fields (type: "reply", isChild: true)

FieldExample ValueNotes
parentCid / threadId / replyToReplyIdthread structure
text / diggCount / createTimeISOreply content
isCreatorAnswer / labelText / labelTypecreator-detection fields
videoId / commentLinklinking fields

Why not build this yourself?

TikTok's reply endpoint hard-caps every page at 20 rows no matter what count you request, so a scraper that issues one request and slices the result can never return more than 20 replies even when a thread has hundreds — reaching a full thread requires genuinely paginating on the real cursor/has_more fields until TikTok itself says there's nothing left. Both comment and reply endpoints are also strict about their exact parameter set: the source notes that a single extra query parameter on either endpoint returns an HTTP 200 with a 0-byte body rather than an error, which a naive scraper would likely misread as "no results" rather than "malformed request." Detecting a genuine creator reply additionally requires cross-checking two independent signals (TikTok's own "Creator" label plus a username match against the video's author), since relying on just one can miss cases the other catches.

How to use data extracted from TikTok Comments Scraper & Full Reply Threads?

Creator and community management

Run your own videos with answerStatus: "awaitingCreatorAnswer" to get a clean list of top comments you genuinely haven't replied to yet — filtered honestly, so a comment only appears here if its full thread was actually read and no creator reply was found.

Social listening with full context

Scrape comments on a competitor's or influencer's video with replies enabled to see full back-and-forth conversation threads, not just the first-page snippet a basic scraper would return.

Fan engagement research

Use answerStatus: "answeredByCreator" combined with creatorAnswerText to build a dataset of exactly what and how often a creator engages with their comment section.

AI agents and moderation pipelines

Because creatorAnswerScanComplete explicitly discloses scan completeness, an agent can distinguish a genuinely unanswered comment from one whose reply thread simply wasn't fully paginated, avoiding a false "unanswered" conclusion.

🔼 Input sample

ParameterRequiredTypeDescriptionExample Value
videoUrlsNoarrayTikTok video links; short links are followed automatically.["https://www.tiktok.com/@mrbeast/video/7578547467189374239"]
maxCommentsNointegerTop-level comments to keep per video. Replies don't count against this. Default 10.20
repliesPerCommentNointegerMax replies per comment, paginated past 20 as needed. 0 skips replies. Default 20.50
fetchAllRepliesNobooleanIgnore the per-comment limit and page every thread to the end (capped at 200 pages). Default false.false
replyDestinationNostring enumchildDataset (default), mainDataset, or both."childDataset"
keepNestedRepliesFieldNobooleanKeep the legacy replies[] array nested on each comment row. Default true.true
answerStatusNostring enumany, answeredByCreator, or awaitingCreatorAnswer. Requires replies enabled. Default "any"."awaitingCreatorAnswer"
onlyCommentsWithRepliesNobooleanDrop comments with zero replies. Default false.false
creatorUsernamesNoarrayUsernames to discover videos from, when no videoUrls given.["mrbeast"]
videosPerProfileNointegerVideos to take per username. Default 10.5
videoSortOrderNostring enumlatest, oldest, or popular. Default "latest"."popular"
profileTabsNoarrayWhich profile tab to read for discovery: videos and/or reposts. Default ["videos"].["videos"]
videosPostedAfter / videosPostedBeforeNostring (date)Absolute (2026-01-31) or relative (5 days, 2 weeks) bound on discovered video post dates."2 weeks"
skipPinnedVideosNobooleanExclude pinned videos from username discovery. Default false.false
proxyConfigurationNoobjectOff by default; escalates none → datacenter → residential automatically on a block.{"useApifyProxy": false}
{
"videoUrls": ["https://www.tiktok.com/@mrbeast/video/7578547467189374239"],
"maxComments": 20,
"repliesPerComment": 50,
"answerStatus": "awaitingCreatorAnswer"
}

Common pitfall: answerStatus is silently coerced back to "any" if replies are effectively disabled (repliesPerComment: 0 and fetchAllReplies: false) — the source logs a warning explaining this, since creator answers can only be detected from the reply endpoint. Set repliesPerComment above 0 or turn on fetchAllReplies whenever you use the answer-status filter.

🔽 Output sample

Output is one JSON row per comment, plus one additional row per reply (default: to a separate child dataset), pushed to the run's dataset and charged as one row_result event per row.

{
"type": "comment",
"isChild": false,
"text": "How did you afford all this??",
"diggCount": 8500,
"createTimeISO": "2026-07-01T12:00:00.000Z",
"uniqueId": "example_fan",
"cid": "7300000000000000001",
"replyCommentTotal": 3,
"repliesFetched": 3,
"replyThreadComplete": true,
"answeredByCreator": true,
"creatorAnswerText": "Sponsors! And a lot of planning haha",
"creatorAnswerDetectedBy": "label",
"creatorAnswerScanComplete": true,
"videoWebUrl": "https://www.tiktok.com/@mrbeast/video/7578547467189374239"
}

How do you filter and target specific comments and replies?

Answer status is the highest-value filter for creators. answerStatus: "awaitingCreatorAnswer" combined with onlyCommentsWithReplies: false surfaces exactly the fan questions you haven't gotten to yet — a direct, actionable list rather than a full comment dump you'd have to review manually.

Depth vs. run cost. repliesPerComment trades off thoroughness against run time; fetchAllReplies goes further still (full threads, capped at 200 pages per thread) — reserve it for videos where you specifically need complete conversation archaeology, not a routine scan.

Reply placement matches your workflow. replyDestination: "childDataset" keeps a clean one-row-per-comment main table for a quick overview; switch to "mainDataset" or "both" when you want comments and replies interleaved in a single exportable table instead.

Three real examples:

{ "videoUrls": ["https://www.tiktok.com/@mybrand/video/123"], "answerStatus": "awaitingCreatorAnswer", "repliesPerComment": 30 }

Unanswered-fan-question audit for your own video.

{ "creatorUsernames": ["mrbeast"], "videosPerProfile": 5, "fetchAllReplies": true }

Full-thread archive across a creator's 5 most recent videos.

{ "videoUrls": ["https://www.tiktok.com/@brand/video/456"], "onlyCommentsWithReplies": true, "replyDestination": "mainDataset" }

Conversation-only export, comments and replies in one flat table.

▶️ Want to try other scrapers?

ScraperWhat it extracts
TikTok Profile Scraper — Engagement Rate & Posting CadenceCreator engagement and cadence metrics
TikTok Video Scraper — Hashtag, Sound & ReachVideo-level reach and sound data
TikTok Trending Hashtags Scraper — Daily Growth HistoryHashtag growth tracked over time
Instagram Comment Engagement ScraperPer-post comment threads and commenter identity

How to extract TikTok comment data programmatically

This Actor runs as a standard Apify Actor call — one API call in, structured JSON dataset out, using your Apify API token.

Python example

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("<YOUR_USERNAME>/tiktok-comments-scraper-full-reply-threads").call(run_input={
"videoUrls": ["https://www.tiktok.com/@mrbeast/video/7578547467189374239"],
"answerStatus": "awaitingCreatorAnswer",
"repliesPerComment": 30,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["uniqueId"], item["text"], item["answeredByCreator"])

Export to spreadsheets or CRM

Every dataset supports one-click CSV/Excel export from the Apify Console. Use the dedicated repliesOnly dataset view when replyDestination is mainDataset/both to export just the reply rows.

Scraping publicly visible TikTok comments is generally lawful, since this data is published for anyone to view without logging in — the underlying legal question was tested directly in hiQ Labs v. LinkedIn (9th Cir.), which held that scraping public, non-password-protected data does not violate the U.S. Computer Fraud and Abuse Act. Commenter usernames are personal data under GDPR/CCPA when tied to an identifiable individual, so treat that subset accordingly if you store or reuse it at scale, and consult legal counsel for commercial applications.

❓ FAQ

Can I actually get more than 20 replies per comment?

Yes — verified live to 120+ replies on a single comment. TikTok's reply endpoint caps each individual page at 20, but the Actor keeps paginating on the real cursor/has_more fields until the thread reports no more data, up to a 200-page safety stop.

How does the Actor know a reply is genuinely from the creator?

It checks two independent real signals: TikTok's own label_text == "Creator" reply label, and a username match between the replier and the video's own author. creatorAnswerDetectedBy on the row discloses which one actually confirmed it.

Why would "awaiting creator answer" exclude a comment even with no creator reply visible?

If the comment's reply thread wasn't fully paginated (creatorAnswerScanComplete: false), the Actor won't claim "not answered" as a proven fact — a partial scan can't rule out a creator answer buried deeper in the thread, so that comment is excluded from the filter rather than guessed at.

Am I charged extra for duplicate comments?

No — cid-based deduplication happens before any row is pushed, both within a single video's pagination and across the whole run, so a comment TikTok re-serves on an overlapping page is never billed twice.

Do reply rows count against maxComments?

No — maxComments only caps top-level comments; replies are separate rows that don't count against that limit, controlled instead by repliesPerComment/fetchAllReplies.

How does this compare to other TikTok comment scrapers?

As observed on the Apify Store on 2026-07-26, datadoping/tiktok-comment-reply-scraper covers comment and reply scraping but doesn't document pagination past TikTok's 20-per-page reply ceiling or creator-answer detection — those are specific to this Actor.

Does this work with AI agent frameworks?

Yes — call it as a standard HTTP endpoint via the Apify API from any agent framework capable of making an API call; there's no MCP-specific integration for this Actor.

Conclusion

TikTok Comments Scraper & Full Reply Threads turns a video's comment section into complete, real conversation threads — genuine pagination past TikTok's per-page ceiling, and honest creator-answer detection that never guesses at an unproven negative. It fits creator engagement audits, social listening, and community research that needs full threads, not a truncated first page. Start a run from the Apify Console or the Apify API with your target videos to get your first full-thread export.