TikTok Comments Scraper - Comments
Pricing
from $0.24 / 1,000 comments
TikTok Comments Scraper - Comments
Scrape comments from 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
40
Total users
18
Monthly active users
6 days ago
Last modified
Categories
Share
Scrape the comments under a public TikTok video: paste video links or bare numeric ids and get one row per comment with the text, like count, reply count, the commenter's handle and avatar, the timestamp, and any image attached to the comment. Nothing to log into.
One thing to be clear about up front: this returns the top-level comments only. It does not walk
into the reply threads under them. Every row carries replyCount, so you can see how many replies
exist, but those replies are not rows and this is not the actor that fetches them.
| Input | TikTok video links, or bare numeric video ids |
| Output | One row per top-level comment: text, likes, reply count, timestamp, attached images, and the commenter's id, handle, name and avatar |
| Ceiling | 5,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 or a bare id both work, and you can mix the two lists in one run.
maxComments is the total for the run and it is split evenly across the videos you passed. Ten
videos with maxComments: 500 is roughly 50 from each, not 500 from each. A video that has fewer
comments than its share does not hand the remainder to the next one, so if you want one video
emptied out, run it on its own.
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 | user.id, user.uniqueId, user.nickname, user.avatar |
▶️ How to scrape TikTok comments
- Open TikTok Comments Scraper and click Try for free.
- Paste links into Video URLs, one per line, or ids into Video IDs.
- Set Max comments. It is the total for the run, so start at 100 while you look at the output.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.
Start it with both boxes 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. The sample row, diagnostic rows and duplicates caught inside a run
are not charged. 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}
| Field | Default | What it is |
|---|---|---|
videoUrls | none | Full /video/ links. 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. |
maxComments | 100 | Comments for the whole run, 1 to 5,000, split across your videos. This is also your spend cap. |
sessionCookies | none | Optional. Your own TikTok sessionid. 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. |
Use the full link from the address bar, or the id. A shortened share link is passed on as it is:
it may not resolve, and when it does, videoId holds the link instead of the number.
📤 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": "7655213632855294751","videoId": "7654341587425692942","text": "malcolm todd always brings the energy, love it","likeCount": 5,"replyCount": 2,"createTime": "2026-06-25T06:19:23.000Z","images": [],"user": {"id": "...","uniqueId": "...","nickname": "...","avatar": "https://p16-common-sign.tiktokcdn-us.com/musically-maliva-obj/..."}}
| 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, or the link itself if you passed a short link. |
replyCount | How many replies sit under the comment. The replies themselves are not returned. |
createTime | When it was posted, as an ISO timestamp. |
images | An empty array on most comments. |
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 | ok: true and type: "comment" | yes |
| The sample row | _sample: true, only when the input named no video | no |
| A diagnostic | ok: false and an errorCode | no |
Filter on type == "comment" and you have your data. The sample row carries the same type, but it
only appears when the input named no video, so a normal run never contains one.
| Code | What it means |
|---|---|
NOT_FOUND | TikTok could not find a video behind that link, which is what a dead short link gives. Check the link. |
NO_RESULTS | The video has no comments to read, which usually means they are turned off. |
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. Until 12 October 2026 this code was called BLOCKED. |
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 ends as failed. |
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.
- Finding the questions that keep coming up under a how-to video, then answering them in the next one.
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
- No reply threads. Top-level comments only.
replyCounttells you what you are not getting. - Public videos only. A private or removed video returns a diagnostic row, not comments.
- The allowance is shared and not redistributed. A quiet video does not pass its leftover share to a busy one.
- Not the whole comment section on a huge video. There is a paging guard as well as your 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.
- A shortened share link is not expanded. Use the full
/video/link or the numeric id. - 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?
Not from here. This returns the top-level comments, each with its replyCount.
Is maxComments per video or per run?
Per run, split across the videos you passed. Run one video at a time if you want its comment section emptied.
Why are there fewer comments than the count on the video?
TikTok's count includes replies, and this returns top-level comments only. 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?
Yes. The API tab has ready-made
code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/tiktok-comments-scraper. Either way
the run happens on 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.