Tiktok Comment Scraper
Pricing
$0.45 / 1,000 result scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
17
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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.

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
| Feature | Details |
|---|---|
| Output Fields | ~41 structured fields per record |
| Dataset Views | 4 tabs (Unified, Overview, Authors, Replies) |
| Input | TikTok video URLs, bare video IDs, or creator profiles |
| Max Comments | Up to 10,000 per video |
| Reply Threads | Enabled by default, linked via parentCommentId / replyId |
| Data source | TikHub hosted API (no proxy setup required) |
How It Works
- Provide inputs — one or more TikTok video URLs, bare numeric video IDs, or creator profiles (
@handle) - 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.
- Normalize — each comment and reply becomes a flat row with unified + type-specific fields, plus built-in text analytics
- Filter & cap — apply
minLikes, date range, andexcludePinned; stop atmaxCommentsper video /maxItemsoverall - 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 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.
| Field | Type | Description |
|---|---|---|
| recordType | String | comment, reply, or error |
| id | String | The row's own ID — commentId for comments, replyId for replies |
| parentId | String | Parent comment's ID for replies; null for top-level comments |
| threadPosition | String | comment for a top-level comment; reply #1, reply #2, … for its replies in order |
| text | String | Comment or reply text |
| likes | Integer | Like count (comment or reply) |
| createdAt | String | ISO 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'sid(=commentId).
Core Comment (12 fields)
| Field | Type | Description |
|---|---|---|
| recordType | String | Row type: comment, reply, or error |
| commentId | String | Unique comment ID |
| videoId | String | Video identifier |
| videoUrl | String | Canonical TikTok video URL |
| inputUrl | String | The original URL or ID you supplied for this row |
| commentText | String | Full comment text |
| createTime | String | ISO 8601 timestamp |
| likeCount | Integer | Number of likes |
| replyCount | Integer | Number of replies |
| isPinned | Boolean | Pinned by creator |
| commentPermalink | String | Direct link to comment |
| scrapedAt | String | Scraping timestamp |
Comment Analytics (6 fields)
| Field | Type | Description |
|---|---|---|
| commentLanguage | String | Detected language code (e.g. en, zh, ja) |
| wordCount | Integer | Word count |
| charCount | Integer | Character count |
| emojiCount | Integer | Number of emojis |
| hashtags | Array | Extracted #hashtags |
| mentions | Array | Extracted @mentions |
Author Metadata (7 fields)
Always included on every comment/reply record.
| Field | Type | Description |
|---|---|---|
| authorId | String | Author's TikTok user ID |
| authorUsername | String | Author's @username |
| authorNickname | String | Display name |
| authorVerified | Boolean | Verified badge |
| authorPrivateAccount | Boolean | Private account |
| authorProfileUrl | String | Link to the author's TikTok profile |
| authorAvatar | String | Profile 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.
| Field | Type | Description |
|---|---|---|
| parentCommentId | String | Parent comment's ID |
| replyId | String | Reply's unique ID |
| replyText | String | Reply text |
| replyLikeCount | Integer | Reply likes |
| replyCreateTime | String | ISO 8601 timestamp |
| replyAuthorId | String | Reply author's user ID |
| replyAuthorUsername | String | Reply author's username |
| replyAuthorVerified | Boolean | Reply author verified |
| replyAuthorNickname | String | Reply author's display name |
| replyAuthorAvatar | String | Reply 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.
| Field | Type | Description |
|---|---|---|
| videoDescription | String | Video caption |
| videoCreateTime | String | Publish timestamp |
| videoLikeCount | Integer | Video likes |
| videoCommentCount | Integer | Video comment count |
| videoShareCount | Integer | Video shares |
| videoViewCount | Integer | Video views |
| videoDuration | Integer | Duration in seconds |
| videoRegion | String | Region code |
| musicTitle | String | Background music title |
| musicAuthor | String | Music 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.
| Field | Type | Description |
|---|---|---|
| recordType | String | Always error |
| error | String | Human-readable failure reason |
| errorCode | String | INVALID_URL, NO_COMMENTS, EXTRACTION_FAILED, REQUEST_FAILED, or PROFILE_NO_VIDEOS |
| videoUrl | String | The video URL that failed |
| inputUrl | String | The original URL or ID you supplied |
| scrapedAt | String | Timestamp of the failure |
Input Parameters
Provide at least one of videoUrls or profileUrls.
| Parameter | Type | Default | Required | Description |
|---|---|---|---|---|
| videoUrls | Array | — | * | TikTok video URLs or bare video IDs to scrape |
| profileUrls | Array | — | * | Creator profiles (@handle, profile URL, or bare handle) — scrapes their recent videos |
| maxVideosPerProfile | Integer | 10 | No | Recent videos to scrape per profile (1–500) |
| maxComments | Integer | 100 | No | Max comments per video (1–10,000) |
| maxItems | Integer | — | No | Global cap on total results (comments + replies) across all videos. Empty = no cap |
| scrapeAllComments | Boolean | false | No | Ignore maxComments and fetch every comment (global maxItems still applies) |
| minLikes | Integer | — | No | Keep only comments/replies with at least this many likes |
| commentDateFrom | String | — | No | Keep only comments/replies created on/after this date (ISO, e.g. 2025-01-01) |
| commentDateTo | String | — | No | Keep only comments/replies created on/before this date |
| excludePinned | Boolean | false | No | Skip creator-pinned comments (and their replies) |
| includeReplies | Boolean | true | No | Include reply threads |
| maxRepliesPerComment | Integer | 50 | No | Max replies per comment (1–500) |
| sort | String | "top" | No | Sort 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
| Metric | Value |
|---|---|
| Concurrency | 1 request at a time |
| Request timeout | 120 seconds |
| Navigation timeout | 60 seconds |
| Retries | Up to 4 per request (exponential backoff) |
| Session pooling | 5 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
parentCommentIdto match them. - Each reply is its own row with a flat structure, making it easy to filter comments vs. replies.
commentPermalinklinks directly to the comment on TikTok.- Language detection uses Unicode script analysis — returns
nullfor ambiguous text.
Pricing
This actor uses Apify's Pay-Per-Event model — you only pay for results you get.
| Event | Trigger | Description |
|---|---|---|
result-scraped | Each comment or reply extracted | Charged 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 scraped | Approx. 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