TikTok Comments Scraper - Export Comments, Likes & Authors avatar

TikTok Comments Scraper - Export Comments, Likes & Authors

Pricing

from $0.24 / 1,000 comments

Go to Apify Store
TikTok Comments Scraper - Export Comments, Likes & Authors

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

61

Total users

28

Monthly active users

a day ago

Last modified

Categories

Security

Limited permissions

Share

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.

InputTikTok video or photo links, share links (vm.tiktok.com, vt.tiktok.com), bare numeric ids, or usernames
OutputOne row per comment: text, likes, reply count, timestamp, attached images, video link, and the commenter's id, handle, name, avatar and verified badge
Ceiling20,000 comments per run
Account neededNone
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 getField
Comment id, and the video it sits underid, videoId
The comment as written, emoji includedtext
Likes on the comment, and how many replies are under itlikeCount, replyCount
When it was postedcreateTime
Sticker or image replies, as linksimages
Who wrote it: id, handle, display name, avatar, verified badge, profile linkuser.id, user.uniqueId, user.nickname, user.avatar, user.verified, user.profileUrl
A link to the video, and the link, id or username you typedvideoUrl, sourceInput
The @handles written in the commentmentions
When the row was readscrapedAt
With Add replies: whether it is a reply, the comment it sits under, and the comment or reply it answersisReply, parentCommentId, replyToCommentId
With Extra comment details: the creator liked it, the comment's language, a link to it, labels such as CreatorlikedByAuthor, language, commentUrl, labels
With Add the video's captionvideoCaption

▶️ How to scrape TikTok comments

  1. Open TikTok Comments Scraper and click Try for free.
  2. Paste links into Video URLs, one per line, ids into Video IDs, or usernames into Profiles.
  3. Set Max comments. It is the total for the run, so start at 100 while you look at the output.
  4. Switch on Add replies or the extra fields if you want them, then click Start.
  5. 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
}
FieldDefaultWhat it is
videoUrlsnoneVideo 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.
videoIdsnoneOr the bare numeric ids, if you already have them. Mix freely with videoUrls.
profilesnoneUsernames or profile links. Each adds that creator's newest public videos.
videosPerProfile5How many of each profile's newest videos to read, 1 to 10.
videosPostedAfter, videosPostedBeforenoneProfiles only. Keep videos posted inside these days, in UTC, written like 2026-10-01.
skipPinnedVideosfalseProfiles only. Skips the videos a creator pinned to the top of their profile.
maxComments100Comments for the whole run, replies included, 1 to 20,000. This is also your spend cap.
maxCommentsPerVideononeA limit for each video instead of an even share of maxComments.
includeRepliesfalseAdds the replies under each comment as rows right after it.
maxRepliesPerComment10With replies on, how many to take under each comment. 0 means none.
commentDetailsfalseAdds likedByAuthor, language, commentUrl and labels.
includeVideoCaptionfalseAdds the video's caption to each of its rows.
sessionCookiesnoneOptional: your own session, used only for your run. You are responsible for using it within the site's terms. The field is stored encrypted.
proxyConfigurationoffLeave it off. It is there for people sending traffic through their own servers.
notionConnector, notionParentIdnoneOptional. 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"
}
FieldHow to read it
idUnique per comment. Use it as your dedupe key across runs.
videoIdThe numeric id of the video it came from.
videoUrlThe 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.
replyCountHow many replies sit under the comment, whether or not you asked for them.
mentionsThe @handles as written in the text. A name typed with a space in it comes back cut at the space.
replyToCommentIdOn a reply, the reply it answers, or the comment itself. Empty when TikTok did not say.
likedByAuthor, language, commentUrl, labelsEmpty for a video TikTok did not give them for this run; its comments still came back.
user.avatarSigned, and it stops working after a while.

🧾 Reading the output

Three kinds of row can land in your dataset.

RowHow to spot itBilled
A comment or a replyok: true and type: "comment"; a reply also has isReply: trueyes
The sample row_sample: true, only when the input named nothingno
A diagnosticok: false and an errorCodeno

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.

CodeWhat it means
NOT_FOUNDTikTok 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_RESULTSThe 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_LIMITEDThat video would not answer this run. Re-running usually clears it.
NOT_SERVEDThis comment was not served this run. Re-run it later. Runs before 13 October 2026 wrote BLOCKED here.
BAD_INPUTA setting could not be used, or a profile entry is not a username. The row names it.
TIME_LIMITThe 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_ERRORThe 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:

  1. Run TikTok Hashtag Scraper on the campaign tag and copy the webVideoUrl column.
  2. Paste those links into Video URLs here and read the text column.

🚧 What it does not do

  • Replies only when you ask. With Add replies off, replyCount tells 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 videosPerProfile stops 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 wantUse
Comments under a videoThis one
A profile plus its newest videos, or a keyword searchTikTok Scraper
Videos posted under a hashtagTikTok Hashtag Scraper
Follower and like counts for a list of handlesTikTok Profile Scraper
The spoken words of a video, as text, SRT and VTTTikTok Transcript Scraper
The hashtags ranking in a country right nowTikTok Trending Hashtags
Comments under a YouTube videoYouTube Comments Scraper
Comments under an Instagram post or reelInstagram 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.

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.