TikTok Comments Scraper - Comments and Replies, No Login avatar

TikTok Comments Scraper - Comments and Replies, No Login

Pricing

from $0.25 / 1,000 comment returneds

Go to Apify Store
TikTok Comments Scraper - Comments and Replies, No Login

TikTok Comments Scraper - Comments and Replies, No Login

Scrape comments from any public TikTok video. Each row has the text, like count, reply count, handle, timestamp and any attached images. Replies under a comment are not returned, only the top-level comments. No login needed from you. $0.25 per 1,000 comments.

Pricing

from $0.25 / 1,000 comment returneds

Rating

5.0

(1)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

20

Total users

8

Monthly active users

a day ago

Last modified

Share

TikTok Comments Scraper: the comment section of any public video, as flat rows

Paste TikTok video links, or the bare numeric ids, and you get the comments back one per row: 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.

InputTikTok video links, or bare numeric video ids
OutputOne row per top-level comment
Ceiling5,000 comments per run
Account neededNone from you
Price$0.25 per 1,000 comments, flat on every plan

๐Ÿ” 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 you give it

{
"videoUrls": ["https://www.tiktok.com/@tiktok/video/7654341587425692942"],
"maxComments": 500
}
FieldDefaultWhat it is
videoUrlsnoneFull /video/ links. 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.
maxComments100Comments for the whole run, 1 to 5,000, split across your videos. This is also your spend cap.
sessionCookiesnoneOptional. Your own TikTok sessionid, used only for videos that came back empty. Use a throwaway account: the value sits in the run input, which anyone who can open the run can read.
proxyConfigurationoffLeave it off. It exists for people routing through their own servers at high volume.
notionConnector, notionParentIdnoneOptional. 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 kept as it is and usually will not resolve.

๐Ÿ“ค What you get back

A real row from a real run, with the 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": "7620428780482397197",
"uniqueId": "steward.franco1",
"nickname": "Steward Franco",
"avatar": "https://p16-common-sign.tiktokcdn-us.com/musically-maliva-obj/..."
}
}
FieldWhat it is
id, videoIdUnique per comment, and the video it sits under. Use id as your dedupe key across runs.
textThe comment as written, emoji included.
likeCount, replyCountHow many likes it got, and how many replies are under it. The replies themselves are not returned.
createTimeWhen it was posted, as an ISO timestamp.
imagesSticker or image replies, as links. An empty array on most comments.
userWho wrote it: id, handle, display name and avatar.

๐Ÿงพ Reading the output

Two kinds of row land in your dataset.

RowHow to spot itBilled
A commentok: true and type: "comment"yes
A diagnosticok: false and an errorCodeno

Filter on ok == true and you have your data. NO_RESULTS means the video has no comments to read, which usually means they are turned off. RATE_LIMITED and BLOCKED mean that video would not answer this run, and re-running usually clears it. None of them is charged.

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.

โ–ถ๏ธ How to run it

  1. Open TikTok Comments Scraper and click Try for free.
  2. Paste links into Video URLs, one per line, or ids into Video IDs.
  3. Set Max comments. It is the total for the run, so start at 100 while you look at the output shape.
  4. Click Start.
  5. Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.

๐Ÿ’ฐ How much does it cost?

$0.25 per 1,000 comments. Flat on every Apify plan, no volume tiers.

You pay for comments delivered. Diagnostic rows and duplicates caught inside a run are not charged. maxComments is the ceiling on both the rows and the spend.

๐Ÿ’ก What people use it for

  • Reading what an audience actually said under a launch video instead of guessing from the like count.
  • Pulling the handles of people commenting on a niche creator, as a starting list for outreach.
  • 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.

๐Ÿšง What it does not do

  • No reply threads. Top-level comments only. replyCount tells 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 resolved. Use the full /video/ link or the numeric id.
  • An empty input fails the run instead of returning a sample. Give it at least one video.

๐Ÿงญ Which TikTok scraper do you need?

If you wantUse
Comments under videos you already have links forThis one
A profile plus its videos, or a keyword searchTikTok Scraper
Videos under a hashtagTikTok Hashtag Scraper
Follower and likes counts for a list of handlesTikTok Profile Scraper
Which hashtags are climbing right nowTikTok Trending Hashtags

โ“ Questions people ask

Do I need a TikTok account? No. The cookie field is optional and only comes into play for videos that came back empty without it.

Can I get the replies under a comment? Not from here. This returns the top-level comments.

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 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.

Is scraping TikTok 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.

Can I run it on a schedule? Yes. Use Apify's scheduler, or start it from the API and read the dataset when it finishes.

๐Ÿ†˜ 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.