TikTok Comments Scraper - Export Comments, Likes & Authors
Pricing
from $0.24 / 1,000 comments
TikTok Comments Scraper - Export Comments, Likes & Authors
TikTok comments scraper: export the comments on public TikTok videos, by link or numeric id. Each row has the text, like count, reply count, commenter handle and avatar, timestamp and any attached images. Top-level comments only, not the replies under them. $0.25 per 1,000 comments.
Pricing
from $0.24 / 1,000 comments
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
61
Total users
28
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
TikTok comments scraper for public videos: paste video or photo links, share links from the app, bare numeric ids or creator usernames, and get one row per comment with the text, like count, reply count, the commenter's handle and avatar, the timestamp, a link back to the video, and any image attached to the comment. Nothing to log into.
One thing to be clear about up front: replies are off unless you switch them on, and then each reply is a row
of its own, charged like a comment. With Add replies off you get the top-level comments only, each with its
replyCount.
| Input | TikTok video or photo links, share links (vm.tiktok.com, vt.tiktok.com), bare numeric ids, or usernames |
| Output | One row per comment: text, likes, reply count, timestamp, attached images, video link, and the commenter's id, handle, name, avatar and verified badge |
| Ceiling | 20,000 comments per run |
| Account needed | None |
| Price | $0.25 per 1,000 comments on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 20,000 |
🔍 What TikTok Comments Scraper does
You give it videos, it pages through each comment section and flattens what it finds. A /video/
link, a /photo/ link, a share link copied from the app or a bare id all work, and you can mix them in one run.
maxComments is the total for the run. By default it is split evenly across the videos you passed: ten
videos with maxComments: 500 is roughly 50 from each. Set maxCommentsPerVideo and each video gets that
many instead, still inside the run total. A video with fewer comments than its share does not hand the
rest to the next one.
Usernames in Profiles add each creator's newest public videos, five by default.
Comments are deduplicated as the pages are read, so nothing is returned or billed twice. A video with comments turned off, or one that would not answer, gets a row saying so and the run moves on.
📋 What data you get from each TikTok comment
| What you get | Field |
|---|---|
| Comment id, and the video it sits under | id, videoId |
| The comment as written, emoji included | text |
| Likes on the comment, and how many replies are under it | likeCount, replyCount |
| When it was posted | createTime |
| Sticker or image replies, as links | images |
| Who wrote it: id, handle, display name, avatar, verified badge, profile link | user.id, user.uniqueId, user.nickname, user.avatar, user.verified, user.profileUrl |
| A link to the video, and the link, id or username you typed | videoUrl, sourceInput |
| The @handles written in the comment | mentions |
| When the row was read | scrapedAt |
| With Add replies: whether it is a reply, the comment it sits under, and the comment or reply it answers | isReply, parentCommentId, replyToCommentId |
| With Extra comment details: the creator liked it, the comment's language, a link to it, labels such as Creator | likedByAuthor, language, commentUrl, labels |
| With Add the video's caption | videoCaption |
▶️ How to scrape TikTok comments
- Open TikTok Comments Scraper and click Try for free.
- Paste links into Video URLs, one per line, ids into Video IDs, or usernames into Profiles.
- Set Max comments. It is the total for the run, so start at 100 while you look at the output.
- Switch on Add replies or the extra fields if you want them, then click Start.
- Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.
Start it with every input box empty and you get one labelled sample row that is not charged.
💰 How much does it cost to scrape TikTok comments?
$0.25 per 1,000 comments on the Free plan. Paid plans pay a little less: $0.248 on Starter, $0.246 on Scale and $0.244 on Business. On the free plan, the $5 Apify gives you each month covers about 20,000 comments.
You pay for comments delivered, and a reply is a comment. The sample row, diagnostic rows, duplicates
caught inside a run and videos a profile setting skipped are not charged. The extra fields and the caption
cost nothing more. maxComments is the ceiling on both the rows and the spend.
📥 What you give it
{"videoUrls": ["https://www.tiktok.com/@tiktok/video/7654341587425692942"],"maxComments": 500,"maxCommentsPerVideo": 200,"includeReplies": true,"maxRepliesPerComment": 5}
| Field | Default | What it is |
|---|---|---|
videoUrls | none | Video or photo links, or share links from the app. The form opens with one filled in as an example, which is a starting point rather than a default. |
videoIds | none | Or the bare numeric ids, if you already have them. Mix freely with videoUrls. |
profiles | none | Usernames or profile links. Each adds that creator's newest public videos. |
videosPerProfile | 5 | How many of each profile's newest videos to read, 1 to 10. |
videosPostedAfter, videosPostedBefore | none | Profiles only. Keep videos posted inside these days, in UTC, written like 2026-10-01. |
skipPinnedVideos | false | Profiles only. Skips the videos a creator pinned to the top of their profile. |
maxComments | 100 | Comments for the whole run, replies included, 1 to 20,000. This is also your spend cap. |
maxCommentsPerVideo | none | A limit for each video instead of an even share of maxComments. |
includeReplies | false | Adds the replies under each comment as rows right after it. |
maxRepliesPerComment | 10 | With replies on, how many to take under each comment. 0 means none. |
commentDetails | false | Adds likedByAuthor, language, commentUrl and labels. |
includeVideoCaption | false | Adds the video's caption to each of its rows. |
sessionCookies | none | Optional: your own session, used only for your run. You are responsible for using it within the site's terms. The field is stored encrypted. |
proxyConfiguration | off | Leave it off. It is there for people sending traffic through their own servers. |
notionConnector, notionParentId | none | Optional. Write each comment into a Notion database as well as the dataset. |
A date that cannot be read stops the run before anything is fetched, with one free BAD_INPUT row.
📤 What you get back
A real row from a real run, with the commenter's name, handle, id and avatar link cut short:
{"ok": true,"type": "comment","id": "7654354166756786974","videoId": "7654341587425692942","text": "can you guys stop with this…? it’s genuinely so annoying.","likeCount": 802,"replyCount": 50,"createTime": "2026-06-22T22:43:50.000Z","images": ["https://p19-common-sign.tiktokcdn-us.com/tos-useast8-i-bwwwqb46tv-tx2/..."],"user": {"id": "...","uniqueId": "...","nickname": "...","avatar": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/...","verified": false,"profileUrl": "https://www.tiktok.com/@..."},"videoUrl": "https://www.tiktok.com/@tiktok/video/7654341587425692942","sourceInput": "https://www.tiktok.com/@tiktok/video/7654341587425692942","mentions": [],"scrapedAt": "2026-10-24T17:20:05.933Z"}
| Field | How to read it |
|---|---|
id | Unique per comment. Use it as your dedupe key across runs. |
videoId | The numeric id of the video it came from. |
videoUrl | The video's link. From a bare id or a share link it can read https://www.tiktok.com/@/video/<id>, which opens the same video. |
replyCount | How many replies sit under the comment, whether or not you asked for them. |
mentions | The @handles as written in the text. A name typed with a space in it comes back cut at the space. |
replyToCommentId | On a reply, the reply it answers, or the comment itself. Empty when TikTok did not say. |
likedByAuthor, language, commentUrl, labels | Empty for a video TikTok did not give them for this run; its comments still came back. |
user.avatar | Signed, and it stops working after a while. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| A comment or a reply | ok: true and type: "comment"; a reply also has isReply: true | yes |
| The sample row | _sample: true, only when the input named nothing | no |
| A diagnostic | ok: false and an errorCode | no |
Filter on type == "comment" and you have your data, replies included; add isReply == false for the
top-level comments alone. The sample row only appears when the input named nothing.
| Code | What it means |
|---|---|
NOT_FOUND | TikTok could not find a video behind that link, which is what a dead share link gives, or there is no account under that username. Check the link. |
NO_RESULTS | The video has no comments to read, which usually means they are turned off, or none of a profile's newest videos matched your settings. |
RATE_LIMITED | That video would not answer this run. Re-running usually clears it. |
NOT_SERVED | This comment was not served this run. Re-run it later. Runs before 13 October 2026 wrote BLOCKED here. |
BAD_INPUT | A setting could not be used, or a profile entry is not a username. The row names it. |
TIME_LIMIT | The run neared its time limit and stopped, keeping every comment it had delivered. If none had come back by then, the run still ends as succeeded, with an amber status message. |
UNEXPECTED_ERROR | The run stopped early on an unexpected error. The results before this row are kept. |
Rows about a profile carry a profile field with the username. One quirk of the Overview table: it shows
four columns, so the commenter's handle and the timestamp are not in it, and a diagnostic row reads as a
nearly blank line. Open the row itself or download the JSON and everything is present.
💡 What people use it for
- Reading what an audience actually said under a launch video instead of guessing from the like count.
- Tracking sentiment on a campaign across the videos that carried it, split by
language. - Finding the questions that keep coming up under a how-to video, and the creator's own answers in the replies.
From a campaign tag to what people said under it, in two runs:
- Run TikTok Hashtag Scraper on the
campaign tag and copy the
webVideoUrlcolumn. - Paste those links into Video URLs here and read the
textcolumn.
🚧 What it does not do
- Replies only when you ask. With Add replies off,
replyCounttells you what you are not getting. - Public videos only. A private or removed video returns a diagnostic row, not comments.
- A profile gives its newest posts only. TikTok shows 9 to 11 on that list, so
videosPerProfilestops at 10 and the date settings look only at those. - The allowance is not redistributed. A quiet video does not pass its leftover share to a busy one.
- Not the whole comment section on a huge video. The run stops at 20,000 comments, and a paging guard stops a video at its own limit, so a video with a million comments will not come back complete.
- The order is TikTok's own, roughly how it ranks them, not strictly newest first.
- No pinned-comment flag. TikTok does not set one we can rely on, so it is left out rather than guessed.
- It is not an official TikTok tool. Dami's Studio is independent and is not affiliated with or endorsed by TikTok, or by any other company named on this page.
🧭 Which TikTok scraper do you need?
| If you want | Use |
|---|---|
| Comments under a video | This one |
| A profile plus its newest videos, or a keyword search | TikTok Scraper |
| Videos posted under a hashtag | TikTok Hashtag Scraper |
| Follower and like counts for a list of handles | TikTok Profile Scraper |
| The spoken words of a video, as text, SRT and VTT | TikTok Transcript Scraper |
| The hashtags ranking in a country right now | TikTok Trending Hashtags |
| Comments under a YouTube video | YouTube Comments Scraper |
| Comments under an Instagram post or reel | Instagram Comments Scraper |
❓ Questions people ask
Do I need a TikTok account to scrape comments?
No. The cookie field is optional.
Can I get the replies under a comment?
Yes. Switch on Add replies. Each reply lands right after its comment with isReply: true, and
Max replies per comment keeps one busy thread from using up the run.
Is maxComments per video or per run?
Per run, split across the videos you passed. Set Max comments per video if you want a fixed number from each.
Why are there fewer comments than the count on the video?
TikTok's count includes replies, which come back only with Add replies on. On a very large video the paging guard and your own limit also stop it before the end.
Why did a video return nothing?
Usually comments are turned off, or the video is private or gone. You will see an uncharged row with
an errorCode saying which.
Can I call it from code or connect it to an AI assistant?
The API tab has code for Python, JavaScript and
the CLI. MCP clients like Claude and ChatGPT use
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/tiktok-comments-scraper; coding assistants can load
our skill file. All three
bill your Apify account at the same price.
Is scraping TikTok comments legal?
This reads comments on public videos only, never private accounts or messages. Results contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Include the video links you used and the run ID, and the log is usually enough for us to see what happened.