TikTok Comments Scraper - Comments, Authors & Likes
Pricing
from $1.00 / 1,000 results
TikTok Comments Scraper - Comments, Authors & Likes
Scrape comments from TikTok videos using one or more video URLs or IDs. Extract comment text, author, likes, reply count and timestamp in clean structured data. Supports multiple videos in a single run with no login required.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
TikTok Comments Scraper
Collect the comments on TikTok videos — either the exact videos you paste, or by giving usernames and letting the actor walk their recent videos. Every run can filter, resume, track changes across scheduled runs, and pipe results into your own apps.
Why this scraper
- Two ways to pick videos. Paste video links/ids, or give usernames and let the actor discover each account's recent videos.
- Filters that save money. Drop low-like comments, require a word, exclude replies, or keep only recent comments — filtered rows are never returned and never billed.
- Built to survive a flaky source. The mobile endpoint answers only a share of requests and only during certain windows, so each page is sampled patiently until it succeeds rather than given up on.
- Recurring monitoring. Incremental mode labels every comment NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED across runs, so a daily schedule returns only what changed.
- Resume big crawls. Paste a previous run id and already-collected comments are skipped.
- Export to your apps. Optionally pipe results into Notion, Linear, Airtable or Apify through MCP connectors.
- An empty result is never reported as a plain success, so a scheduled run cannot fail quietly.
Data you get
Sample shape: values are illustrative placeholders, not from a live video.
| Field | Example |
|---|---|
| recordType | "comment" |
| sourceMode | "comments" |
| commentId | "7000000000000000000" |
| videoId | "7000000000000000001" |
| videoUrl | "https://www.tiktok.com/video/7000000000000000001" |
| isReply | false |
| replyToCommentId | null |
| text | "Sample comment text" |
| authorUsername | "sampleuser" |
| authorNickname | "Sample User" |
| authorUid | "7000000000000000002" |
| authorAvatarUrl | "https://p16-sign-va.tiktokcdn.com/sample-avatar.jpeg" |
| authorRegion | "US" |
| diggCount | 12 |
| replyCommentTotal | 3 |
| createTime | 1700000000 |
| createTimeIso | "2026-01-01T00:00:00.000Z" |
| scrapedAt | "2026-01-01T00:00:00.000Z" |
| changeType | "NEW" (incremental mode only) |
How to use
Videos mode — the exact videos you care about:
{"mode": "videos","videoUrls": ["https://www.tiktok.com/@tiktok/video/7673909736131038495"],"maxCommentsPerVideo": 50}
Search mode — walk an account's recent videos:
{"mode": "search","usernames": ["tiktok"],"maxVideosPerUser": 10,"maxCommentsPerVideo": 50}
Recurring monitoring — only what changed since yesterday:
{"mode": "videos","videoUrls": ["https://www.tiktok.com/@tiktok/video/7673909736131038495"],"incrementalMode": true,"stateKey": "my-campaign"}
Input parameters
Start
| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | string | videos | videos = scrape the URLs/ids you paste; search = walk usernames' videos. |
Videos mode
| Parameter | Type | Default | Description |
|---|---|---|---|
| videoUrls | array of strings | [] | Video URLs or numeric video ids. Short share links (vm.tiktok.com) are not supported. |
Search mode
| Parameter | Type | Default | Description |
|---|---|---|---|
| usernames | array of strings | [] | TikTok usernames (with or without @). |
| maxVideosPerUser | integer | 10 | How many of each account's recent videos to scan. 0 = unlimited. |
Filters (both modes)
| Parameter | Type | Default | Description |
|---|---|---|---|
| minCommentLikes | integer | 0 | Only keep comments with at least this many likes. 0 = no minimum. |
| commentKeyword | string | - | Only keep comments containing this word or phrase (case-insensitive). |
| excludeReplies | boolean | false | Drop replies and keep only top-level comments. |
| commentsSinceDays | integer | 0 | Drop comments older than this many days. 0 = no date filter. |
| fetchReplies | boolean | false | Also try to collect replies. The source currently returns no reply rows to automated sessions. |
| maxRepliesPerComment | integer | 5 | Reply cap per comment. 0 = unlimited. |
| replyPatienceSeconds | integer | 10 | Time budget per reply request. |
Output & limits
| Parameter | Type | Default | Description |
|---|---|---|---|
| maxCommentsPerVideo | integer | 20 | Comments per video. 0 = unlimited. |
| maxPagesPerVideo | integer | 0 | Safety cap on result pages per video. 0 = no page limit. |
| pagePatienceSeconds | integer | 120 | Per-page time budget; the page keeps being requested until it succeeds or this runs out. |
| maxAttemptsPerPage | integer | 0 | Optional hard ceiling on requests per page. 0 = no ceiling. |
| concurrency | integer | 20 | Parallel requests (1-20). |
Resume and recurring updates
| Parameter | Type | Default | Description |
|---|---|---|---|
| resumeFromRunId | string | - | Previous run or dataset id; comments already collected there are skipped. |
| incrementalMode | boolean | false | Label each comment NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED against the remembered baseline and suppress unchanged rows. |
| stateKey | string | - | Optional name for this monitoring campaign. Empty = derived from the videos and filters. |
| emitUnchanged | boolean | false | Also return comments that did not change. |
| emitExpired | boolean | false | Also return comments that are gone. Only after a run that finished the whole tracked scope. |
Export and connection
| Parameter | Type | Default | Description |
|---|---|---|---|
| mcpConnectors | array | [] | Optional MCP connectors to also send results to. Never changes the dataset. |
| notionParentPageUrl | string | - | Notion parent page for the Notion connector. |
| maxNotifyListings | integer | 50 | Cap on items sent to each connector per run. |
| proxyTier | string | datacenter | datacenter (default, cheapest) or residential. |
| proxy | object | Apify proxy | Proxy configuration. |
About request attempts
The source deliberately answers only a share of requests from automated clients and refuses the rest, and it does so in windows (some minutes let almost nothing through). That refusal is per request, not per session, so the actor fires many requests for the same page in parallel and takes the first one that gets through. concurrency is how many run at once, and pagePatienceSeconds is how long the actor keeps sampling before giving up on a page — so a window that opens partway through is still caught.
A refused request is tiny, and only one winning response is transferred per page, so a run stays cheap even while it samples many times. If a run reports a video as "could not be read", the source was closing every request during that window; raising pagePatienceSeconds (for example to 240) gives it more time to open.
How a run reports its result
An empty dataset is never reported as a plain success.
- Failed run (red). No comments collected and at least one video could not be read.
- Partial run (green, warning). Some comments collected but at least one video could not be read.
- Empty result (green). Every video was read and had no matching comments.
- Clean run (green). Every video was read and returned comments.
Known limitations
- Replies are usually not returned by the source. Inline reply previews carried by the comment list are captured; full reply threads are not offered while the source withholds them. Each attempt still costs a "Reply fetch attempted" charge whether or not it returns anything (the actor still pays for the extra request); any reply rows that do come back are billed separately as ordinary Results.
- Keyword/hashtag video search is not supported. Search mode walks usernames' videos; general TikTok keyword search needs a browser-rendered page, which would make runs far more expensive.
- Short share links (vm.tiktok.com, vt.tiktok.com) are not resolved; paste the full video URL or the numeric video id.
- Only public videos. A private or removed video returns no comments.
- The comment list the source returns can differ slightly between requests, so incremental runs may legitimately report a few NEW comments each time.