TikTok Comments Scraper, No Login: Video Comments & Replies
Pricing
from $0.40 / 1,000 comments
TikTok Comments Scraper, No Login: Video Comments & Replies
TikTok comments scraper and extractor, no login: video links or handles in, one row per comment and reply out. Text, time, likes, reply count, the commenter's handle, name and avatar. Walks past TikTok's false list end and adds a second region's view. Export to CSV, JSON or Excel. Misses free.
Pricing
from $0.40 / 1,000 comments
Rating
0.0
(0)
Developer
Hyperbach
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Features
Share
Every comment and reply of a TikTok video, as data, logged out. Give video links (any form: a short link, a bare id, a photo post) or creators' handles and get one row per comment — the full text, the time, the likes, the reply count, the commenter's handle, display name, ids and avatar, the creator's like and reply flags, the mentions, images and stickers — and, when you ask, every reply as its own row with its parent comment. TikTok's list says it ended long before it does; this Actor walks past its false ends to the list's real end and reads it on a second region's view for the comments the first did not serve. Each video also gets a free row with what was read against TikTok's count and why the walk stopped. No login, no cookie, proxies handled for you.
$1.00 per 1,000 comment rows on the Free plan, $0.80 on Starter. The default input returns about 101 rows for about $0.10. A private, removed or comments-off video, a dead link or a value that names nothing is a free row that says why.

Tested head-to-head on 2026-11-02
The job: the first 100 comments of one TikTok video by URL (the leader's own prefill video, @looooooooch), no replies. Every Actor ran on it the same day from the same harness; a rival's cost is what a buyer account paid, this Actor's is its list price on the Free plan. Fields counts the filled fields of a typical row. Re-measured monthly.
| Actor | Rows | First row | Run time | Cost | Fields | Failures |
|---|---|---|---|---|---|---|
| this Actor | 100 | 4.9 s | 5.4 s | $0.10 | 34 | none |
clockworks/tiktok-comments-scraper | 100 | 7.1 s | 18 s | $0.10 | 14 | none |
apidojo/tiktok-comments-scraper | 100 | 6.3 s | 7.3 s | $0.030 | 11 | none |
Why this TikTok comments scraper
- Past TikTok's false end. TikTok's comment list says
has_more: 0after about 300 to 400 comments on ordinary videos while it holds more: a reader that believes it stops at 324 of a 3,637-comment video. This Actor asks the list page by page to its real end, the empty page whose total echoes the position asked, through the empty pages inside the list (1,706 top-level comments of that video in our study; 390 of a 1,302-comment video, where the false end came at 300). - A second view for what the first did not serve. TikTok serves a video's comment list per region, and each region's list holds comments the others do not. When a video's list ends before your limit, the Actor reads it once more from another region and adds only the comments it had not delivered (one read held 95.5 to 98.1 % of four regions' comments over 9 videos, two reads 96.0 to 99.7 %; 8 more on a 398-comment video in our build run).
- Replies as rows, linked to their comment. Each comment's thread is read to its own end; a reply has
is_replytrue and itsparent_comment_id, and the comment's row carries the thread's own total beside TikTok's reply count (they differ: 86 against 211 on one thread). - The fields the leader's rows lack. The commenter's display name (
author_name),author_sec_uid, the verified flag and label, whole mentions with their user ids (the leader's cut a character), the comment's language, its images and stickers, the creator's own comments and likes, and the video's caption, creator and counts on every row. - Every row says which view it came from.
view_idcandview_regionname TikTok's data centre and region that served the comment: likes and the list's total differ by region and by minute, so compare like with like.readCountrypicks the region of the first read (9 countries). - Free rows, not charged ones. A private (owner-only), removed or comments-off video, an empty list, a dead short link or an unknown handle is one free row with its status from TikTok's own page; a removed video is checked on a second connection first. A comment is delivered and charged once a run, across pages, regions and inputs.
- Plain HTTP, no browser, no account. TikTok's own logged-out answers, no cookie, no signature, nothing of yours. On the 10 test runs of version 0.1.8 on Apify that delivered comments (2026-11-02, 512 MB) the first comments came 2.7 to 6.4 seconds after the start (8.1 and 13.2 s on the two runs whose first connection was dead), a run of 100 comments of one video took 4.1 to 9.4 seconds, and an ordinary video's whole list read on two regions, 396 comments, 17.0 seconds.
Who it's for
- Brand and social media teams — every comment on their own and their competitors' TikTok videos, with the commenters and the likes.
- Researchers and analysts — a video's whole comment list and its replies for sentiment, topic or audience work, with the time, the language and the region of the view on every row.
- Influencer and creator marketers — how audiences answer a creator: the most liked comments, the creator's own replies (
by_creator) and likes (liked_by_creator), the commenters' verified flags. - Developers and data teams — typed rows keyed by the comment id, one free row per video with the verdict and the counts, a run summary to check a pipeline against.
Quick start
The first 100 comments of one video
{"videoUrls": ["https://www.tiktok.com/@looooooooch/video/7332342275151760642"],"commentsPerVideo": 100}
Every comment of a video, with up to 50 replies each
{"videoUrls": ["https://www.tiktok.com/@looooooooch/video/7332342275151760642"],"commentsPerVideo": 0,"repliesPerComment": 50,"maxItems": 5000}
A creator's 3 newest videos, 200 comments each
{"profiles": ["looooooooch"],"videosPerProfile": 3,"commentsPerVideo": 200}
The 20 most liked comments of the last 30 days
{"videoUrls": ["https://www.tiktok.com/@looooooooch/video/7332342275151760642"],"sortBy": "most_liked","commentsPerVideo": 20,"commentsNewerThan": "30 days"}
Switching from clockworks/tiktok-comments-scraper?
Your input works as it is. Each name in the left column is read as this Actor's own field and the run log says so (read <theirs> as <ours>); a name marked not read is ignored with a note. A value in the other Actor's shape, an object list or its own date form, is read too.
| clockworks/tiktok-comments-scraper | this Actor | what to know |
|---|---|---|
postURLs | videoUrls | Video links in every form TikTok serves (a short link, m.tiktok.com/v/<id>.html, an embed link, a photo post, a bare id); a profile link is read as a profile. |
commentsPerPost | commentsPerVideo | Read as the top-level comments per video (the leader counts replies in it); the replies are capped by repliesPerComment. |
topLevelCommentsPerPost | commentsPerVideo | The same meaning: top-level comments per video. |
maxRepliesPerComment | repliesPerComment | The replies read per comment, each its own row with its parent's id. |
profiles | profiles | Handles (@name, name) or profile links; each gives its newest videos from TikTok's logged-out embed. |
resultsPerPage | videosPerProfile | Videos per profile, 1 to 12 (the embed lists 12); a larger value reads 12 and the run log says so. |
profileScrapeSections | not read | Not read: the logged-out embed lists the videos section only (no reposts, no liked videos). |
profileSorting | not read | Not read: the logged-out embed serves the newest videos only; for a creator's popular videos, give their links in videoUrls. |
oldestPostDateUnified | videosNewerThan | A profile's videos uploaded at or after this date (read from the video's id). |
newestPostDate | videosOlderThan | A profile's videos uploaded at or before this date. |
excludePinnedPosts | excludePinnedVideos | Leaves a profile's pinned videos out; without it they are read beside the newest (they do not count toward videosPerProfile). |
What differs:
- The leader's
commentsPerPostcounts replies too; herecommentsPerVideocounts the top-level comments andrepliesPerCommentcaps each comment's replies. A leader input withcommentsPerPostruns as it is (read ascommentsPerVideo). - A reply is its own row with
is_replytrue andparent_comment_id(the leader'srepliesToId); the comment's row carries the thread's own total (replies_total) beside TikTok'sreply_count. - Field names are snake_case:
comment_id(cid),text,created_at(createTimeISO),likes(diggCount),reply_count(replyCommentTotal),author_username(uniqueId),author_id(uid),author_avatar_url(avatarThumbnail),liked_by_creator(likedByAuthor),pinned_by_creator(pinnedByAuthor),video_url(videoWebUrl),input(submittedVideoUrl). Every row also has the commenter's display name and secUid. - A profile reads TikTok's logged-out embed: a creator's 12 newest videos, the pinned ones first.
resultsPerPageabove 12 reads 12, and the popular and oldest sorts are not served. - A private, removed or comments-off video is a free row with its status, not a charged item; a run that delivers no comment costs nothing.
Output
One row per comment or reply (and one free row per video and per profile):
| field | meaning |
|---|---|
record_type | comment on a comment or reply row (charged); video on a video's free row; profile on a profile's free row. |
status | ok, or why an input gave no comment: owner_only, not_found, comments_off, no_comments, link_dead, profile_not_found, invalid_input, duplicate, failed (TikTok refused every connection), not_read (the run ended first). |
input | The value you gave that this row answers (a video link, a short link or a profile). |
comment_id | TikTok's id of the comment or reply. |
is_reply | true on a reply row, false on a top-level comment. |
parent_comment_id | On a reply: the id of the comment whose thread it is in. |
reply_to_comment_id | On a reply to a reply: the id of the reply it answers. |
reply_to_username | On a reply to a reply: the handle of the person it answers, as TikTok shows it. |
video_id | TikTok's id of the video. |
video_url | The video's page. |
text | The comment's whole text, emoji kept; empty for a sticker or an image alone. |
created_at | When the comment was posted (UTC). |
created_at_unix | The same time as a unix timestamp in seconds. |
likes | The comment's likes, as the view in view_idc counts them. |
reply_count | TikTok's reply count of the comment (reply_comment_total), as served; it can differ from the thread's own list (replies_total), and it says 0 on some views for comments that have replies (23 of 30 on one video in our test), so with repliesPerComment every comment's thread is read whatever this count says. |
replies_total | When replies are read: the total of the comment's reply list, as the thread itself reports it. |
replies_read | When replies are read: the reply rows of this comment the run delivered (up to repliesPerComment); on a video row, the replies delivered. |
author_username | The commenter's TikTok handle. |
author_name | The commenter's display name. |
author_id | The commenter's numeric TikTok id. |
author_sec_uid | The commenter's secUid (TikTok's stable profile key). |
author_profile_url | The commenter's profile page. |
author_avatar_url | The commenter's avatar (a signed link that works about 24 hours after the run). |
author_verified | true when TikTok marks the commenter verified. |
author_verified_label | TikTok's verification text, when there is one. |
by_creator | true when the video's creator wrote the comment (TikTok's Creator label). |
liked_by_creator | true when the video's creator liked the comment. |
pinned_by_creator | The creator's pin flag as TikTok serves it (author_pin, stick_position); null when the record has neither. A pinned comment reads true (author_pin: verified in stage 4 on a creator's pinned comment). |
language | TikTok's language code of the comment (un when TikTok could not tell). |
content_kind | What the comment holds: text, image, text_image, sticker, text_sticker. |
images | The comment's images, full size (signed links that work about 30 days). |
sticker_url | The comment's sticker, still image (a signed link that lasts about 30 days: 718.7–720.0 hours measured). |
sticker_animated_url | The comment's sticker, animated (a signed link that lasts about 30 days). |
mentions | The handles the comment mentions, whole, in the order of the text. |
mention_ids | The mentioned accounts' TikTok ids, in the order of mentions. |
hashtags | The hashtags in the comment. |
high_purchase_intent | TikTok's own purchase-intent flag on the comment, as served. |
comment_url | TikTok's own share link for this comment (without the commenter's id and the tracking keys); logged out it opens the video's page, not the comment. |
video_caption | The video's caption. |
video_creator_username | The video creator's handle (on a profile row: the profile's). |
video_created_at | When the video was posted (UTC). |
video_comment_count | The video's comment count as TikTok's page shows it: replies included, rounded above 10,000. |
video_play_count | The video's plays as TikTok's page shows them (rounded above 10,000). |
view_idc | TikTok's data centre that served this row's view (useast5, useast8, useast2b, my, …). |
view_region | The region TikTok served the view to (the read's country). |
video_state | On a video row: the video's state from its page: ok, owner_only, not_found, comments_off. |
verdict | On a video row: COMPLETE (the list's end reached on every view read), CAPPED (commentsPerVideo or maxItems), PARTIAL (stopped early: note says why). |
comments_delivered | On a video row: the top-level comments delivered. |
replies_delivered | On a video row: the replies delivered. |
comments_read | On a video row: the distinct top-level comments read on every view (before filters and the limit). |
list_total | On a video row: the comment list's own exact total on the first view (it differs by region). |
views_read | On a video row: the views read, as <data centre>/<region>. |
second_view_added | On a video row read twice: the top-level comments the second view served that the first did not. |
videos_found | On a profile row: the videos it gave (each has its own video row). |
note | Why a video or profile row has its status or verdict, with the counts. |
raw | With includeRawRecord: the comment's record as TikTok served it. |
scraped_at | When this row was read (UTC). |
Example record:
{"record_type": "comment","status": "ok","input": "https://www.tiktok.com/@looooooooch/video/7332342275151760642","comment_id": "7703557028362568462","is_reply": false,"parent_comment_id": null,"reply_to_comment_id": null,"reply_to_username": null,"video_id": "7332342275151760642","video_url": "https://www.tiktok.com/@looooooooch/video/7332342275151760642","text": "last viewer","created_at": "2026-11-02T12:56:39Z","created_at_unix": 1793624199,"likes": 75,"reply_count": 15,"replies_total": 15,"replies_read": 3,"author_username": "u_33c40fe6","author_name": "[name]","author_id": "i_3495383f2b","author_sec_uid": "i_fb3e4540c6","author_profile_url": "https://www.tiktok.com/@u_33c40fe6","author_avatar_url": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/f0a47e3ee1847d54992354980006727e~tplv-tiktokx-cropcenter:100:100.jpg","author_verified": false,"author_verified_label": null,"by_creator": false,"liked_by_creator": false,"pinned_by_creator": false,"language": "en","content_kind": "text","images": [],"sticker_url": null,"sticker_animated_url": null,"mentions": [],"mention_ids": [],"hashtags": [],"high_purchase_intent": false,"comment_url": "https://m.tiktok.com/v/7332342275151760642.html?share_comment_id=7703557028362568462&share_item_id=7332342275151760642","video_caption": "Summer😊#Inverted ","video_creator_username": "looooooooch","video_created_at": "2024-02-06T04:32:59Z","video_comment_count": 2600000,"video_play_count": 1300000000,"view_idc": "useast5","view_region": "US","video_state": null,"verdict": null,"comments_delivered": null,"replies_delivered": null,"comments_read": null,"list_total": null,"views_read": null,"second_view_added": null,"videos_found": null,"note": null,"raw": null,"scraped_at": "2026-11-02T15:52:27Z"}
Pricing
Pay only for the comments a run delivers, with no platform usage billed to you and no start fee. The price falls with your Apify plan.
| per 1,000 | Free | Starter | Scale | Business |
|---|---|---|---|---|
Comment or reply (comment) | $1.00 | $0.80 | $0.60 | $0.40 |
A comment is $1.00 per 1,000 on the Free plan ($0.001 a comment) and $0.40 on Business. A reply (repliesPerComment) is its own row and is charged like a comment. So the example input, 100 comments of one video, costs $0.10 on Free and $0.04 on Business; 10,000 comments cost $10.00 on Free. Every video's row, every profile's row, a private, removed or comments-off video, a dead link, a value that names nothing, a comment your filters leave out, a repeat of a comment already delivered and a rejected input are free; a run that delivers no comment pays nothing. maxItems counts the charged rows (comments and replies) and stops the run at that count, never past it; before the first request the log says the most the run can cost at your plan's prices. Enterprise plans have their own rates: the Actor's Pricing tab shows the price for your plan.
Usage patterns
- What to give —
videoUrls: TikTok video links in any form (/@user/video/<id>,/photo/<id>,vm.tiktok.com/…,vt.tiktok.com/…,tiktok.com/t/…,m.tiktok.com/v/<id>.html, an embed link, a bare id; a link inside a redirector too).profiles: handles or profile links; each gives itsvideosPerProfilenewest videos (1 to 12), the pinned ones read beside them unlessexcludePinnedVideos. Every video and every profile gets its own free row. To read a hashtag's comments, list its videos with our tiktok-video-scraper (itshashtagsinput) and give their URLs here. - How many comments —
commentsPerVideocaps each video's top-level comments (100 by default; 0 = every comment TikTok's list serves) andrepliesPerCommenteach comment's replies (0 by default: none);maxItemscaps the whole run's charged rows. All three are exact. The video row says how many comments were read and delivered, the list's own total, TikTok's display count and why the walk stopped (verdict: COMPLETE, the list's end on every view read; CAPPED, your limit; PARTIAL, stopped early with the reason innote). - Filters and order — TikTok's list has no filter and no sort of its own (it ignored all 8 such parameters we tried).
commentsNewerThan/commentsOlderThan(a date, a date and time, or7 days),commentKeywords(any of the words or phrases, case-insensitive) andminCommentLikeskeep a comment only when it matches; the rest is read and left out, never charged. The filters pick comments: a kept comment's replies are not filtered and come whole (up torepliesPerComment), as the leader's do.sortBynewest, oldest or most_liked reads the whole list and keeps the firstcommentsPerVideoof that order;ranked(the default, the fastest) keeps TikTok's own order. A filter or a sort reads up to 100 pages of a video (about 5,000 comments: an ordinary video's whole list) plus 10 pages for each comment it keeps; past that the video row says PARTIAL and why, so a filter that matches little on a viral video ends in minutes, not hours. - Regions and the second view — TikTok serves each region its own view of a video's comments: which come first, the likes and the list's total differ.
readCountrypicks the first read's region (US by default; GB, DE, FR, CA, BR, JP, MX, AU). When the list ends before your limit,secondView(on by default) reads it once more from another region (Canada after a US read, the US after any other; when that region's connections are refused, another US connection) and adds only the comments not yet delivered; a refused second view never stops the run, and the video row says so. Every row names its view inview_idcandview_region. TikTok often walls readers in Canada, Brazil, Japan, Mexico and Australia (measured in November 2026): a run from there can end PARTIAL, and a video TikTok refuses is a freefailedrow. The US, the UK, Germany and France read reliably. - What a logged-out reader is not shown — The commenter's bio, region and follower counts are not in the comment record TikTok's logged-out web serves, so this Actor does not offer them (TikTok's app record carries the region and the bio; a rival that reads the app's API can show them). The list holds fewer comments than the video's displayed count: the count includes replies and comments TikTok hides or filters, and it is rounded above 10,000; the video row gives the list's own exact total per region beside it.
Input configuration
| field | type | default | what it does |
|---|---|---|---|
videoUrls | array | [] | TikTok videos to read, one per line: a video or photo link (https://www.tiktok.com/@user/video/7332342275151760642), a short link (vm.tiktok.com/…, vt.tiktok.com/…, tiktok.com/t/…), an m.tiktok.com/v/<id>.html or embed link, or a bare video id. A profile link is read as a profile. Each value gets its own row: the video's, or a free row that says why not (private, removed, comments off, a dead link). |
profiles | array | [] | Creators whose newest videos to read: a handle (@nasa or nasa) or a profile link. TikTok's logged-out profile embed lists a creator's 12 newest videos (the pinned ones first); videosPerProfile picks how many of them are read. |
commentsPerVideo | integer | 100 | The most top-level comments a video delivers (replies are counted apart, by repliesPerComment); 0 = every comment TikTok's list serves to a logged-out reader. The list ends before the video's own count: that count includes replies and comments TikTok does not show logged out; the video row says how far the list went. |
repliesPerComment | integer | 0 | Also read each comment's replies, up to this many per comment, as their own rows with is_reply true and the parent_comment_id; the comment's row then carries the thread's own total. 0 = no replies. Each reply is a row and is charged like a comment. The comment filters pick comments: a kept comment's replies are not filtered. |
sortBy | ranked / newest / oldest / most_liked | "ranked" | ranked: TikTok's own order (the first comments of its list). newest, oldest, most_liked: this Actor reads the list (to its end, or up to 100 pages plus 10 for each comment kept) and keeps the newest, oldest or most liked commentsPerVideo (TikTok's list has no sort of its own). With commentsPerVideo 0 every comment comes in the list's order. |
commentsNewerThan | string | Only comments posted at or after this time: a date (2026-10-01), a date and time (2026-10-01T12:00:00Z) or a span back from now (7 days, 12 hours, 2 weeks). TikTok's list is not in time order, so the list is read (up to 100 pages of a video plus 10 for each comment kept) and the rest is left out, never charged. | |
commentsOlderThan | string | Only comments posted at or before this time (the same forms as commentsNewerThan). | |
commentKeywords | array | [] | Only comments whose text holds any of these words or phrases (case-insensitive). A comment without them is left out and not charged. |
minCommentLikes | integer | 0 | Only comments with at least this many likes (as the read view counts them). 0 = every comment. |
videosPerProfile | integer | 3 | How many of a profile's newest videos to read (1-12: the logged-out profile embed lists 12). The pinned videos (up to 3, first in the list) are not counted: they are read beside the newest unless excludePinnedVideos is on. |
excludePinnedVideos | boolean | false | A profile's pinned videos come first in its list (up to 3); on: they are not read. |
videosNewerThan | string | Only a profile's videos uploaded at or after this time (a date or a span such as 30 days), read from the video's id. | |
videosOlderThan | string | Only a profile's videos uploaded at or before this time (the same forms). | |
readCountry | US / GB / DE / FR / CA / BR / JP / MX / AU | "US" | The country TikTok's comment list is read from. The list is a per-region view: which comments come first, the like counts and the list's total differ by country (an ordinary video showed 13-39 of the same 50 first comments in the US and in other countries). Every row names the data centre and the region it was read from. TikTok often walls readers in Canada, Brazil, Japan, Mexico and Australia (measured in November 2026): a run from there can end PARTIAL, and a video TikTok refuses is a free failed row. The US, the UK, Germany and France read reliably. |
secondView | boolean | true | When a video's list ends before commentsPerVideo (or 0: all), read it once more from another country's data centre and add the comments the first view did not serve (up to a fifth more on ordinary videos; each comment once). Off: one read. |
includeRawRecord | boolean | false | Add each comment's record as TikTok served it, in raw. |
maxItems | integer | 0 | The most charged rows (comments and replies) of the whole run; 0 = no cap beyond your charge limit. Every input still gets its row. |
proxyUrl | string | Your own proxy (scheme://user:pass@host:port) for every call instead of ours. Leave empty: the Actor brings its own connections at no cost to you. | |
feedback | string | A note to the people who maintain this Actor: what you needed and did not get. For example a missing field, a wrong or empty result, or the Actor you switch from or to, and why. The run does not read it: the rows and the charges stay the same. A person reads every note. |
Errors
A run does not fail because of your input. When an input cannot be used — a date that is not a date, an id in the wrong form, two settings that contradict each other — the run ends Succeeded, charges nothing, and says what to change:
- the status message starts with
INPUT REJECTED; - the dataset holds one row,
{"error": true, "code": "…", "message": "…"}, and no results; - the key-value store record
ERRORholds the same object.
From code, check error on the first row before reading results.
A private, removed or comments-off video, a dead short link, a handle TikTok does not know, or a value that names nothing is not an error: it gets one free row with its status and TikTok's own reason, and the run goes on with the others. A run that ends Failed is a fault on our side, never your input; it charges nothing, and we are alerted.
FAQ
Why do I get fewer comments than the video's comment count?
TikTok's count includes every reply and the comments it hides or filters, and above 10,000 it is rounded (2,700,000 for 2,623,615). The top-level comments plus their reply counts came to 71 to 83 % of the count at the list's end on our study's videos. This Actor reads the list to its real end (not to TikTok's early has_more: 0), reads a second region's view for what the first missed, and the video row names what was read against both figures.
Does it get replies?
Yes, when you set repliesPerComment: each comment's thread is read to its own end (up to your cap), every reply is its own row with is_reply true and the parent_comment_id, and a reply to a reply names that reply in reply_to_comment_id. Each reply is charged like a comment.
Does it need my TikTok login or cookies?
No. It reads only what TikTok shows to anyone without an account, over plain HTTP, with its own connections. You never give a password, a cookie or a session, so no account of yours can be blocked.
What happens with a private or removed video, or one with comments off?
Each gets one free row with its status from the video's own page: owner_only (the creator made it private), not_found (removed or a wrong id, checked on a second connection first), comments_off, or no_comments. A dead short link is link_dead, an unknown handle profile_not_found. Nothing is charged for them, and the run goes on.
Is the same comment ever delivered twice?
No. A comment is delivered and charged once a run by its id, across pages (TikTok's ranked pages repeat some comments), across the two views and across inputs; a video named twice (a link and a profile's video) is read once.
How long do the image and avatar links work?
TikTok signs them: an avatar link works about 24 hours after the run, a comment image link about 30 days. Download what you keep.
Integration
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('hyperbach/tiktok-comments-scraper').call({"videoUrls": ["https://www.tiktok.com/@looooooooch/video/7332342275151760642"], "commentsPerVideo": 100, "maxItems": 500});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('hyperbach/tiktok-comments-scraper').call(run_input={'videoUrls': ['https://www.tiktok.com/@looooooooch/video/7332342275151760642'], 'commentsPerVideo': 100, 'maxItems': 500})items = client.dataset(run['defaultDatasetId']).list_items().items
CLI
$apify call hyperbach/tiktok-comments-scraper --input '{"videoUrls": ["https://www.tiktok.com/@looooooooch/video/7332342275151760642"], "commentsPerVideo": 100, "maxItems": 500}'
REST
curl -X POST "https://api.apify.com/v2/acts/hyperbach~tiktok-comments-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H 'Content-Type: application/json' -d '{"videoUrls": ["https://www.tiktok.com/@looooooooch/video/7332342275151760642"], "commentsPerVideo": 100, "maxItems": 500}'
AI agents and MCP
Apify's MCP server offers this Actor as a tool to Claude, Cursor, VS Code and any other MCP client. Connect https://mcp.apify.com?tools=hyperbach/tiktok-comments-scraper and ask, for example: "Get the comments and replies of these TikTok videos with each commenter's username, display name, likes and time". The agent fills the input from the table above and reads the rows from the run's dataset. A field under the name another Actor gives it is read as this Actor's own: postURLs, postUrls, videoUrl, urls as videoUrls; usernames, username, profileUrls, handles as profiles; topLevelCommentsPerPost, commentsPerPost, maxComments, commentsLimit as commentsPerVideo; maxRepliesPerComment, maxReplies, repliesLimit as repliesPerComment (and more). An agent or a person can add feedback to any run and say what was needed and not delivered: a missing field, a wrong or empty result, the Actor switched from or to, and why. The run returns the same rows at the same price, and a person reads every note.
n8n, Make and Zapier
The Apify node in n8n, the Apify app in Make and the Apify integration in Zapier run this Actor on a schedule or from a trigger and read its dataset. A webhook on the run's end (Integrations on the Actor page) sends the rows on to your own endpoint. Nothing to install on our side.
Support
Disagree with a charge? Write to apify@hyperbach.com with the run ID. We will ask Apify to compensate you, and the charge comes back to your Apify account as platform credit.
Did it do the job? A short review on the Store, at any rating, helps the next buyer choose.
See also
- TikTok Followers Scraper — the followers and following lists of any TikTok account, with the exact follower count of every account listed.
- TikTok Creative Center Scraper — TikTok's top ads by country and period with CTR and retention curves, plus trending hashtags and videos.
- TikTok User Search Scraper — the TikTok creators a keyword finds, in TikTok's own order, with exact counts and the e-mails and links in their bios.
- TikTok Profile Scraper — TikTok profiles with the exact follower, like and video counts, the created date and the business category.
- TikTok Ads Library Scraper — every ad an advertiser runs in TikTok's Ad Library, with targeting, reach per country, payer and landing page.
- TikTok Transcript Scraper — the spoken words of TikTok videos, by video link or creator: TikTok's own captions first, speech-to-text where there are none.
This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.