TikTok Comments Scraper
Pricing
from $0.40 / 1,000 comment scrapeds
TikTok Comments Scraper
Scrape public TikTok comments and replies from any video — no browser, no login. Provide video URLs or numeric IDs and get comment text, likes, reply counts, timestamps, author info (username, nickname, ID, secUid), and parent-video metadata. Pay-per-comment .
Pricing
from $0.40 / 1,000 comment scrapeds
Rating
0.0
(0)
Developer
Gopalakrishnan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Scrapes public TikTok comments (and optionally replies) from a list of video URLs or numeric IDs. Built as an Apify Actor using got-scraping — no browser required, fetching comments via unsigned API requests over plain datacenter proxies.
Features
- Accepts full TikTok video URLs (e.g.
https://www.tiktok.com/@stoolpresidente/video/7473199106861796654) or bare numeric video IDs (7473199106861796654). - Returns detailed comment records: text, likes, reply counts, creation timestamp, creator-liked badge (
isAuthorLiked), author info (username, nickname, avatar, ID, secUid). - Supports recursive reply thread extraction (sub-comments) matching parent comments.
- Attaches parent-video metadata (
videoId,videoUrl,videoAuthor,videoDesc) to every comment/reply record. - Pay-Per-Event pricing: No start fee ($0.00) and a floor price of $0.0003 per comment/reply scraped.
- Graceful error handling for missing/invalid videos instead of failing the run.
How it works
- Resolve Video details: For each video, the Actor first fetches the HTML detail page using
got-scraping+ datacenter proxy to extract the video's rehydration JSON (__UNIVERSAL_DATA_FOR_REHYDRATION__). This verifies the video exists and obtains metadata (author, description) + the canonicalaweme_id(video ID). - Fetch Comments: It paginates the unsigned TikTok comment list API (
/api/comment/list/) using plain datacenter proxies with rotated session IDs. It implements a retry backoff strategy for transient empty pages to ensure completeness. - Fetch Replies (Optional): If
includeRepliesis enabled, for each top-level comment that hasreply_comment_total > 0, it paginates the TikTok comment reply API (/api/comment/list/reply/) to extract all replies. - Cap and Push: Both comments and replies are streamed into the dataset. The total comments count respects
maxCommentsPerPost.
Input
| Field | Type | Description |
|---|---|---|
postUrls | array (required) | TikTok videos to scrape. Each item may be a bare numeric video ID (7473199106861796654) or a full video URL (https://www.tiktok.com/@stoolpresidente/video/7473199106861796654). |
maxCommentsPerPost | integer (optional) | Cap the number of comments (and replies, if included) fetched per video. Defaults to 100. |
includeReplies | boolean (optional) | When enabled, also fetch replies (sub-comments) for each comment. Defaults to false. |
proxyConfiguration | object | Proxy settings. Datacenter proxies are sufficient. Defaults to { "useApifyProxy": true }. |
Example:
{"postUrls": ["https://www.tiktok.com/@stoolpresidente/video/7473199106861796654","7473199106861796654"],"maxCommentsPerPost": 100,"includeReplies": true,"proxyConfiguration": { "useApifyProxy": true }}
Output
One flat record per comment/reply:
| Field | Type | Description |
|---|---|---|
commentId | string | Unique TikTok comment ID |
text | string or null | Comment body text |
likeCount | integer or null | Number of likes on the comment |
replyCount | integer or null | Number of replies to this comment |
createTime | integer or null | Unix timestamp (seconds) of creation |
createTimeISO | string or null | ISO 8601 string of creation time |
isAuthorLiked | boolean | true if the video creator liked this comment |
authorUniqueId | string or null | Author handle / username |
authorNickname | string or null | Author nickname |
authorId | string or null | Numeric author user ID |
authorSecUid | string or null | Author security UID |
authorAvatar | string or null | URL of the author's avatar thumbnail |
parentCommentId | string or null | Parent comment ID if isReply is true |
replyToReplyId | string or null | ID of the specific reply this comment is replying to, if nested |
isReply | boolean | true if this record is a reply, false if it is a top-level comment |
commentUrl | string or null | Direct URL link to the comment |
videoId | string or null | TikTok Video ID |
videoUrl | string | URL of the TikTok video |
videoAuthor | string or null | Handle of the video creator |
videoDesc | string or null | Description of the video |
scrapeStatus | string | success or error |
scrapeError | string or null | Error details if scrapeStatus is error |
Pay-Per-Event billing
| Event | When charged | No discount | Bronze | Silver | Gold |
|---|---|---|---|---|---|
actor-start | Once per run (flat start fee). | $0.00 | $0.00 | $0.00 | $0.00 |
comment | Once per comment or reply successfully scraped. | $0.0003 | $0.00027 | $0.00024 | $0.00021 |
Base pricing matches the category floor ($0.0003 per comment) with a $0 flat start fee. The Bronze/Silver/Gold tiers apply automatically based on the user's Apify Store membership level.
Set the prices for these events in the Apify Console. Event names must match the Actor.charge calls in src/main.js exactly.
Running locally
$apify run --purge
Configure your test input in storage/key_value_stores/default/INPUT.json. Local runs store results on disk (storage/datasets/default/) and do not sync to the Apify Console.