TikTok Comments Scraper
Pricing
from $0.30 / 1,000 results
TikTok Comments Scraper
Scrape TikTok comments for one video: text, likes, reply counts, timestamps and commenter profiles. Optional replies.
Pricing
from $0.30 / 1,000 results
Rating
0.0
(0)
Developer
Grow Media
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
8 days ago
Last modified
Categories
Share
TikTok Comments Scraper (Apify Actor)
Scrape the comments of one or many TikTok videos — text, likes, reply counts, timestamps and commenter profiles — with optional replies.
Input
{"startUrls": ["https://www.tiktok.com/@billieeilish/video/7050551461734042926","https://www.tiktok.com/@gordonramsayofficial/video/7229884545150061851"],"maxCommentsPerVideo": 100,"maxComments": 200,"includeReplies": false}
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array of strings, required | — | 1–50 video URLs. The list uses Apify's Bulk edit button, so you can paste one URL per line instead of adding them one at a time. Also accepts photo URLs, vm.tiktok.com short links, tiktok.com/t/... share links and bare numeric ids. |
maxCommentsPerVideo | integer | 100 | Items each URL may contribute, 1–10000. Replies count towards it. This is what stops a 190,000-comment video from swallowing the whole run. |
maxComments | integer | 1000 | Items to collect across every URL, 1–100000. Replies count towards it too. |
includeReplies | boolean | false | Also scrape replies. They arrive as their own items with parentId and isReply: true. |
Two caps, and whichever is reached first wins. With
{"startUrls": [A, B], "maxCommentsPerVideo": 100, "maxComments": 150}
the run takes 100 from A, then 50 from B and stops: no single video can hog the budget, and the total can never overshoot what you asked for. A URL with a huge comment section no longer starves the next one — it is cut at its own cap and the run moves on.
URLs are scraped in the order given. A URL that fails mid-way — a deleted video, a transient 5xx — is logged and skipped, and the comments already collected are kept. A URL that cannot be parsed at all fails the run before the first request, so a typo costs nothing. Two URLs pointing at the same video (a short link plus the canonical one) are scraped once.
Output
One dataset item per comment or reply. Field names follow the leading TikTok comment scraper so the two datasets line up column for column:
{"inputSource": "https://www.tiktok.com/@tiktok/video/7698318115607825672","type": "comment","id": "7698455070791303967","parentId": null,"isReply": false,"replyToCommentId": null,"text": "I'm in the wrong servers 😭✌️","createdAt": "2026-10-19T18:58:11.000Z","likeCount": 75,"replyCount": 3,"commentLanguage": "en","awemeId": "7698318115607825672","isAuthorLiked": false,"isPinned": false,"user": {"id": "7327046934728148010","secUid": "MS4wLjABAAAA...","username": "gotthis87","displayName": "Marcus","url": "https://www.tiktok.com/@gotthis87","avatarUrl": "https://p16-common-sign.tiktokcdn.com/...","verified": false}}
| Field | Notes |
|---|---|
inputSource | the URL from startUrls that produced this item |
type | comment or reply |
id, parentId | comment id; parentId is the thread a reply belongs to |
replyToCommentId | for a reply inside a thread, the specific comment answered |
createdAt | ISO-8601 UTC with milliseconds |
likeCount, replyCount | replyCount is 0 on replies |
awemeId | video id |
isPinned | the creator pinned this comment |
user.secUid | stable profile id, for joining to profile data |
user.avatarUrl | TikTok CDN URL, expiring |
user.verified | derived from the profile's verification label |
Not included: user.bio, user.region, user.language, hasEmail,
hasPhone, coverImage, follower counts. user.secUid is emitted instead, so
you can join to that data from another source if you need it.
Ordering is whatever TikTok returns, which is neither newest-first nor like-sorted. If you need the top comments by likes, sort the dataset after collection.