Tiktok Comment Scraper avatar

Tiktok Comment Scraper

Pricing

$0.45 / 1,000 result scrapeds

Go to Apify Store
Tiktok Comment Scraper

Tiktok Comment Scraper

TikTok Comment Scraper extracts comments from TikTok videos, including text, author details, likes, reply counts, mentions, hashtags, and timestamps. Ideal for audience research, sentiment analysis, moderation, trend tracking, and AI-powered comment insights.

Pricing

$0.45 / 1,000 result scrapeds

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

17

Total users

1

Monthly active users

2 days ago

Last modified

Share

TikTok Comment Scraper — Comments, Replies & Analytics

Not just comments — comment intelligence.

Most TikTok comment scrapers hand you raw API fields to clean up yourself. This one gives you comments, replies, author profiles, video context, and built-in text analytics (language, emoji, hashtags, mentions) in clean, flat, spreadsheet-ready rows — with separate Unified, Overview, Authors, and Replies views. ~41 structured fields per record. Export in JSON, CSV, or Excel.

TikTok Comment Scraper


Key Features

  • ~41 Structured Fields per record — comments, replies, authors, analytics
  • Reply Threads — full reply chains linked to parent comments via parentCommentId
  • Replies After Parent — each comment's replies appear right after it, numbered via threadPosition (comment, reply #1, reply #2, …)
  • Author Metadata — username, nickname, verified status, private account flag, avatar (always included)
  • Comment Analytics — language detection, word/emoji counts, hashtag/mention extraction
  • Video Context — video caption, views, likes, shares, duration, music info on every record (always included)
  • Sorting — top comments or newest first
  • Filters — minimum likes, date range, exclude pinned, scrape-all
  • Profile Input — scrape comments across a creator's recent videos from just their @handle
  • Unified Fields — shared id / parentId / text / likes / createdAt / author* columns on both comments and replies, so a single table has no empty cells
  • 4 Dataset Views — Unified, Overview, Authors, Replies on Apify
  • Bare IDs, URLs, or Profiles — accepts full video URLs, bare numeric video IDs, or creator handles
  • Error Rows — failed/blocked videos emit a visible error row instead of vanishing silently
  • No Proxy Needed — data is fetched through TikHub's hosted API (signing + routing handled server-side)
  • Pay-Per-Event — only pay for results you get

Best for: Sentiment analysis, brand monitoring, content research, AI training data, moderation analysis


At a Glance

FeatureDetails
Output Fields~41 structured fields per record
Dataset Views4 tabs (Unified, Overview, Authors, Replies)
InputTikTok video URLs, bare video IDs, or creator profiles
Max CommentsUp to 10,000 per video
Reply ThreadsEnabled by default, linked via parentCommentId / replyId
Data sourceTikHub hosted API (no proxy setup required)

How It Works

  1. Provide inputs — one or more TikTok video URLs, bare numeric video IDs, or creator profiles (@handle)
  2. Fetch browserlessly via TikHub — comments, reply threads, and video metadata are pulled through TikHub's hosted API with cursor-based pagination (no browser, no proxy). Creator profiles are expanded to their recent videos first.
  3. Normalize — each comment and reply becomes a flat row with unified + type-specific fields, plus built-in text analytics
  4. Filter & cap — apply minLikes, date range, and excludePinned; stop at maxComments per video / maxItems overall
  5. Export — push to the dataset (4 views) — each comment followed by its replies

If TikHub can't serve a particular video, the actor automatically falls back to a headful browser path for that video, so a single hard-to-reach video doesn't fail the run.


Output

Comment Record

A single dataset row for a comment \u2014 every field an actual record contains (unified + comment + analytics + author + video):

{
"recordType": "comment",
"id": "7482114472766325535",
"parentId": null,
"threadPosition": "comment",
"text": "\u201cShe DIED\u201d \ud83e\udd19\ud83c\udffc\ud83e\udd19\ud83c\udffc\ud83e\udd19\ud83c\udffc\ud83d\ude02\ud83d\ude2d",
"likes": 1507,
"createdAt": "2025-03-15T19:05:59.000Z",
"commentId": "7482114472766325535",
"videoId": "7481695035033980190",
"videoUrl": "https://www.tiktok.com/@aaron.vankampen/video/7481695035033980190",
"inputUrl": "https://www.tiktok.com/@aaron.vankampen/video/7481695035033980190",
"commentText": "\u201cShe DIED\u201d \ud83e\udd19\ud83c\udffc\ud83e\udd19\ud83c\udffc\ud83e\udd19\ud83c\udffc\ud83d\ude02\ud83d\ude2d",
"createTime": "2025-03-15T19:05:59.000Z",
"likeCount": 1507,
"replyCount": 4,
"isPinned": false,
"commentPermalink": "https://www.tiktok.com/@aaron.vankampen/video/7481695035033980190?comment=7482114472766325535",
"scrapedAt": "2026-03-14T13:29:33.073Z",
"commentLanguage": "en",
"wordCount": 3,
"charCount": 27,
"emojiCount": 8,
"hashtags": [],
"mentions": [],
"authorId": "2904724",
"authorUsername": "nellyyybaby",
"authorNickname": "baby J\ud83d\udc8b",
"authorVerified": false,
"authorPrivateAccount": false,
"authorProfileUrl": "https://www.tiktok.com/@nellyyybaby",
"authorAvatar": "https://p16-common-sign.tiktokcdn-us.com/...",
"videoDescription": "when the cat picked the crib \ud83d\ude02\ud83d\udc31",
"videoCreateTime": "2025-03-14T21:40:12.000Z",
"videoLikeCount": 2100000,
"videoCommentCount": 8452,
"videoShareCount": 15300,
"videoViewCount": 18500000,
"videoDuration": 32,
"videoRegion": "US",
"musicTitle": "original sound",
"musicAuthor": "aaron.vankampen"
}

Reply Record (appears right after its parent comment)

Replies carry the same unified, analytics, and always-on video* fields as comments (omitted below for brevity), plus reply-specific fields:

{
"recordType": "reply",
"id": "7482124949542011655",
"parentId": "7482114472766325535",
"threadPosition": "reply #1",
"text": "\"So now aiiii got da crib!!\" \ud83d\ude03",
"likes": 32,
"createdAt": "2025-03-15T19:46:40.000Z",
"parentCommentId": "7482114472766325535",
"replyId": "7482124949542011655",
"videoId": "7481695035033980190",
"videoUrl": "https://www.tiktok.com/@aaron.vankampen/video/7481695035033980190",
"inputUrl": "https://www.tiktok.com/@aaron.vankampen/video/7481695035033980190",
"replyText": "\"So now aiiii got da crib!!\" \ud83d\ude03",
"replyLikeCount": 32,
"replyCreateTime": "2025-03-15T19:46:40.000Z",
"replyAuthorId": "6812290091522016262",
"replyAuthorUsername": "tony6ixx",
"replyAuthorVerified": false,
"replyAuthorNickname": "Tony \ud83c\udde6\ud83c\uddf1",
"replyAuthorAvatar": "https://p19-common-sign.tiktokcdn-us.com/...",
"authorProfileUrl": "https://www.tiktok.com/@tony6ixx",
"commentLanguage": "en",
"wordCount": 7,
"charCount": 31,
"emojiCount": 1,
"hashtags": [],
"mentions": [],
"scrapedAt": "2026-03-14T13:29:33.329Z"
}

Output — All Fields with Replies (Table View)


Output Schema

Unified Fields (8) — present on every comment and reply row

Comments and replies use different field names (commentId/replyId, commentText/replyText, …), so in a single flat table the "other" type's columns show as blank. These unified fields solve that — they're populated on both row types (in addition to the type-specific fields), so you can build a clean, empty-free table from just these columns. The Unified dataset view uses exactly these.

FieldTypeDescription
recordTypeStringcomment, reply, or error
idStringThe row's own ID — commentId for comments, replyId for replies
parentIdStringParent comment's ID for replies; null for top-level comments
threadPositionStringcomment for a top-level comment; reply #1, reply #2, … for its replies in order
textStringComment or reply text
likesIntegerLike count (comment or reply)
createdAtStringISO 8601 creation timestamp
author*Shared authorId, authorUsername, authorNickname, authorVerified, authorProfileUrl on both types

Rows are pushed in reading order — each comment, then its replies (reply #1, reply #2, …), then the next comment — so threadPosition lets you see the thread structure at a glance.

To join replies to comments: reply.parentId (= reply.parentCommentId) equals the parent's id (= commentId).

Core Comment (12 fields)

FieldTypeDescription
recordTypeStringRow type: comment, reply, or error
commentIdStringUnique comment ID
videoIdStringVideo identifier
videoUrlStringCanonical TikTok video URL
inputUrlStringThe original URL or ID you supplied for this row
commentTextStringFull comment text
createTimeStringISO 8601 timestamp
likeCountIntegerNumber of likes
replyCountIntegerNumber of replies
isPinnedBooleanPinned by creator
commentPermalinkStringDirect link to comment
scrapedAtStringScraping timestamp

Comment Analytics (6 fields)

FieldTypeDescription
commentLanguageStringDetected language code (e.g. en, zh, ja)
wordCountIntegerWord count
charCountIntegerCharacter count
emojiCountIntegerNumber of emojis
hashtagsArrayExtracted #hashtags
mentionsArrayExtracted @mentions

Author Metadata (7 fields)

Always included on every comment/reply record.

FieldTypeDescription
authorIdStringAuthor's TikTok user ID
authorUsernameStringAuthor's @username
authorNicknameStringDisplay name
authorVerifiedBooleanVerified badge
authorPrivateAccountBooleanPrivate account
authorProfileUrlStringLink to the author's TikTok profile
authorAvatarStringProfile image URL

Reply Fields (10 fields)

Included when Include Replies is enabled (default: on). Each reply is a separate dataset row linked to its parent via parentCommentId.

FieldTypeDescription
parentCommentIdStringParent comment's ID
replyIdStringReply's unique ID
replyTextStringReply text
replyLikeCountIntegerReply likes
replyCreateTimeStringISO 8601 timestamp
replyAuthorIdStringReply author's user ID
replyAuthorUsernameStringReply author's username
replyAuthorVerifiedBooleanReply author verified
replyAuthorNicknameStringReply author's display name
replyAuthorAvatarStringReply author's avatar URL

Reply records also include the unified fields (recordType: "reply", id, parentId, text, likes, createdAt, plus author* mirrors), inputUrl, authorProfileUrl (reply author's profile), the analytics fields (commentLanguage, wordCount, charCount, emojiCount, hashtags, mentions) computed on the reply text, videoId, videoUrl, scrapedAt, and the same always-on video metadata (10 fields) as comments.

Video Metadata (10 fields)

Always included on every comment/reply record. Fetched browserlessly via TikHub — same fast path as comments, so it adds no browser launch and negligible time.

FieldTypeDescription
videoDescriptionStringVideo caption
videoCreateTimeStringPublish timestamp
videoLikeCountIntegerVideo likes
videoCommentCountIntegerVideo comment count
videoShareCountIntegerVideo shares
videoViewCountIntegerVideo views
videoDurationIntegerDuration in seconds
videoRegionStringRegion code
musicTitleStringBackground music title
musicAuthorStringMusic creator

Error Rows

When a video can't be scraped (comments disabled, private/deleted, soft-blocked IP, or an invalid input), the actor emits a visible error row instead of silently returning nothing — so failures are easy to spot and retry. Error rows are not charged.

FieldTypeDescription
recordTypeStringAlways error
errorStringHuman-readable failure reason
errorCodeStringINVALID_URL, NO_COMMENTS, EXTRACTION_FAILED, REQUEST_FAILED, or PROFILE_NO_VIDEOS
videoUrlStringThe video URL that failed
inputUrlStringThe original URL or ID you supplied
scrapedAtStringTimestamp of the failure

Input Parameters

Provide at least one of videoUrls or profileUrls.

ParameterTypeDefaultRequiredDescription
videoUrlsArray*TikTok video URLs or bare video IDs to scrape
profileUrlsArray*Creator profiles (@handle, profile URL, or bare handle) — scrapes their recent videos
maxVideosPerProfileInteger10NoRecent videos to scrape per profile (1–500)
maxCommentsInteger100NoMax comments per video (1–10,000)
maxItemsIntegerNoGlobal cap on total results (comments + replies) across all videos. Empty = no cap
scrapeAllCommentsBooleanfalseNoIgnore maxComments and fetch every comment (global maxItems still applies)
minLikesIntegerNoKeep only comments/replies with at least this many likes
commentDateFromStringNoKeep only comments/replies created on/after this date (ISO, e.g. 2025-01-01)
commentDateToStringNoKeep only comments/replies created on/before this date
excludePinnedBooleanfalseNoSkip creator-pinned comments (and their replies)
includeRepliesBooleantrueNoInclude reply threads
maxRepliesPerCommentInteger50NoMax replies per comment (1–500)
sortString"top"NoSort order: top or new


Quick Start

Example 1: Single video with replies

{
"videoUrls": [
"https://www.tiktok.com/@aaron.vankampen/video/7481695035033980190"
],
"maxComments": 100,
"includeReplies": true,
"maxRepliesPerComment": 50,
"sort": "top"
}

Example 2: Creator profiles + filters

Scrape recent videos from two creators, keep only comments with ≥10 likes from 2025.

{
"profileUrls": ["@aaron.vankampen", "https://www.tiktok.com/@tiktok"],
"maxVideosPerProfile": 5,
"minLikes": 10,
"commentDateFrom": "2025-01-01"
}

Example 3: Bare video IDs with a global cap, no pinned comments

{
"videoUrls": [
"7481695035033980190",
"7546661132002413854"
],
"maxItems": 500,
"excludePinned": true,
"includeReplies": true,
"sort": "new"
}

Example 4: Multiple videos, comments only

{
"videoUrls": [
"https://www.tiktok.com/@aaron.vankampen/video/7481695035033980190",
"https://www.tiktok.com/@aaron.vankampen/video/7546661132002413854"
],
"maxComments": 100,
"includeReplies": false,
"sort": "top"
}

Example 5: Every comment on a video, newest first

{
"videoUrls": [
"https://www.tiktok.com/@creator/video/7234567890123456789"
],
"scrapeAllComments": true,
"includeReplies": true,
"sort": "new"
}

Dataset Views

The output is organized into 4 focused tabs on the Apify platform:

Unified

Comments and replies in one table with no empty columns — uses the shared unified fields.

{
"recordType": "reply",
"id": "7482124949542011655",
"parentId": "7481790853061559070",
"threadPosition": "reply #1",
"text": "So now aiiii got da crib!!",
"likes": 32,
"createdAt": "2025-03-15T19:46:40.000Z",
"authorUsername": "tony6ixx",
"authorNickname": "Tony",
"authorProfileUrl": "https://www.tiktok.com/@tony6ixx"
}

Overview

Shows comments and replies together with key fields.

{
"recordType": "comment",
"commentId": "7481802613793686318",
"videoId": "7481695035033980190",
"commentText": "YOU FOUND CODY!!!",
"authorUsername": "duncanstanko",
"likeCount": 489,
"replyCount": 1,
"isPinned": false,
"createTime": "2025-03-14T22:55:34.000Z",
"scrapedAt": "2026-03-14T13:29:31.670Z"
}

Authors

Focused view on commenter profiles.

{
"commentId": "7481802613793686318",
"authorId": "7158470338833777710",
"authorUsername": "duncanstanko",
"authorNickname": "Duncan Stanko",
"authorVerified": false,
"authorPrivateAccount": false,
"authorProfileUrl": "https://www.tiktok.com/@duncanstanko",
"authorAvatar": "https://p16-common-sign.tiktokcdn-us.com/..."
}

Replies

Focused view on reply threads with parent-child linking.

{
"parentCommentId": "7482422764545753902",
"replyId": "7482493179494253342",
"replyText": "He is a comedian. Calm down lol",
"replyAuthorUsername": "wizrd.618",
"replyLikeCount": 107,
"replyCreateTime": "2025-03-16T19:35:28.000Z"
}

Use Cases

Sentiment Analysis

Export comments for sentiment scoring and reaction analysis. Use commentLanguage, wordCount, and emojiCount for NLP preprocessing.

Brand Monitoring

Track public feedback on brand campaigns. Filter by video URL and analyze comment engagement patterns.

Content Research

Study audience reactions to viral content. Compare top comments vs. newest to understand engagement dynamics.

AI Training Data

Collect structured comment datasets for training text classification, sentiment, or moderation models.

Moderation Analysis

Identify patterns in toxic comments, spam, or abuse. Use author metadata to detect bot-like accounts.


Performance

MetricValue
Concurrency1 request at a time
Request timeout120 seconds
Navigation timeout60 seconds
RetriesUp to 4 per request (exponential backoff)
Session pooling5 sessions, 20 uses each

Data Export

Supported formats via Apify platform:

  • JSON
  • CSV
  • Excel
  • HTML

Tips

  • No proxy setup needed — data is fetched through TikHub's hosted API.
  • Replies appear after their parent in the dataset output — look for parentCommentId to match them.
  • Each reply is its own row with a flat structure, making it easy to filter comments vs. replies.
  • commentPermalink links directly to the comment on TikTok.
  • Language detection uses Unicode script analysis — returns null for ambiguous text.

Pricing

This actor uses Apify's Pay-Per-Event model — you only pay for results you get.

EventTriggerDescription
result-scrapedEach comment or reply extractedCharged once per record pushed to dataset

Only successful results are charged — error rows and skipped (pinned) comments are free.

Example cost

At a list price of $0.49 per 1,000 results:

Results scrapedApprox. cost
100$0.05
1,000$0.49
10,000$4.90

The exact event price is set in the Apify Console. Platform compute is billed separately to your Apify account. No proxy is required — data is fetched through TikHub's hosted API.


How data is fetched

This actor uses TikHub's hosted API for fast, reliable, browserless access — no proxy configuration required. TikHub handles request signing and routing server-side, which is what makes runs fast and consistent. It powers:

  • Comment & reply extraction — the primary, browserless data path
  • Video metadata — the 10 video-context fields on every record, fetched browserlessly (no page load)
  • Profile input (profileUrls) — resolving a creator's recent videos

The TikHub key is configured once by the actor operator (as the Apify secret tikhub_api_key, wired in actor.json as @tikhub_api_key) — run users never need to provide anything. TikHub usage is billed to the operator's TikHub account, separate from Apify's result-scraped charge.


Compliance

  • Collects only publicly available TikTok comment data
  • Does not bypass CAPTCHAs or access gated content
  • Does not collect private account data
  • Intended for legitimate research, analytics, and business intelligence
  • Users are responsible for compliance with applicable laws in their jurisdiction

Support

  • Issues: Report via GitHub or Apify support
  • Feature requests: Open an issue with your use case

Built by Coregent Digital Studio — Production-ready TikTok comment extraction