TikTok Comments Scraper by Profile / Account avatar

TikTok Comments Scraper by Profile / Account

Pricing

from $0.35 / 1,000 comment scrapeds

Go to Apify Store
TikTok Comments Scraper by Profile / Account

TikTok Comments Scraper by Profile / Account

Extract comments from TikTok profiles or videos. Enter a @username to automatically discover all videos and scrape comments, or provide direct video URLs. Includes reply threads, engagement metrics, and commenter metadata.

Pricing

from $0.35 / 1,000 comment scrapeds

Rating

0.0

(0)

Developer

Thodor

Thodor

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

4

Monthly active users

6 days ago

Last modified

Share

TikTok Comments Scraper by Profile

Provide a TikTok username and get every comment across all their videos.

  1. You input a profile (or direct video URLs)
  2. All videos are discovered automatically
  3. Every comment and reply is extracted — no cap

What makes this different

Most TikTok comment scrapers only accept video URLs as input, meaning you need to find each video URL yourself. This actor accepts a profile username and handles the rest — it discovers all videos from the profile and scrapes comments across all of them in one run.

FeatureThis actorTypical alternatives
Input a profile usernameYesNo (video URLs only)
Auto-discover all videosYesManual
Comment limitNoneOften capped at 5,000
Reply threadsFull depthVaries
Image commentsExtractedOften skipped

Input

FieldTypeDefaultDescription
profileUrlsstring[][]TikTok profile URLs or usernames (e.g. @kingconnah or https://www.tiktok.com/@kingconnah)
videoUrlsstring[][]Direct video URLs — combined with any videos discovered from profiles
maxCommentsPerVideointeger0 (all)Maximum comments per video. 0 = no limit
includeRepliesbooleanfalseFetch reply threads for each comment

Scrape all comments from a profile

{
"profileUrls": ["kingconnah"],
"includeReplies": true
}

Scrape specific videos

{
"videoUrls": [
"https://www.tiktok.com/@username/video/7622233769231142165"
],
"maxCommentsPerVideo": 1000,
"includeReplies": true
}

Both — profile + extra videos

{
"profileUrls": ["kingconnah"],
"videoUrls": [
"https://www.tiktok.com/@other/video/7622233769231142165"
]
}

Output

Each comment is one flat row in the dataset. Replies are separate rows linked to their parent via parent_comment_id.

Output fields

FieldTypeDescription
video_urlstringThe video this comment belongs to
comment_idstringUnique comment ID
parent_comment_idstringParent comment ID (empty for top-level)
reply_to_reply_idstringID of the specific reply being responded to within a thread
depthinteger0 = top-level, 1 = reply
commentstringComment text (empty for image-only comments)
comment_image_urlstringImage URL for image-only comments
likesintegerLike count
reply_countintegerNumber of replies
created_atstringISO 8601 timestamp (UTC)
author_usernamestringCommenter's @username
author_display_namestringCommenter's display name
author_idstringTikTok numeric user ID
reply_to_usernamestringUsername being replied to
liked_by_video_creatorbooleanCreator liked this comment
pinnedbooleanCreator pinned this comment
purchase_intentbooleanTikTok's flag for buying intent (e.g. "Where can I buy this?")
comment_languagestringLanguage code ("un" = undetermined)
share_urlstringDirect share link

Example output

Top-level comment:

{
"video_url": "https://www.tiktok.com/@txmfitt/video/7613032455011945748",
"comment_id": "7616086972566078230",
"parent_comment_id": "",
"reply_to_reply_id": "",
"depth": 0,
"comment": "how many did you do in an hour? I once did 500",
"comment_image_url": "",
"likes": 62,
"reply_count": 3,
"created_at": "2026-03-11T19:47:22+00:00",
"author_username": "alanas698",
"author_display_name": "2027",
"author_id": "6765931488842613766",
"reply_to_username": "",
"liked_by_video_creator": true,
"pinned": false,
"purchase_intent": false,
"comment_language": "en",
"share_url": "https://m.tiktok.com/v/7613032455011945748.html?..."
}

Reply:

{
"video_url": "https://www.tiktok.com/@txmfitt/video/7613032455011945748",
"comment_id": "7617031854978024193",
"parent_comment_id": "7616086972566078230",
"reply_to_reply_id": "",
"depth": 1,
"comment": "i did 1,017",
"comment_image_url": "",
"likes": 45,
"reply_count": 0,
"created_at": "2026-03-14T08:54:01+00:00",
"author_username": "txmfitt",
"author_display_name": "Toby",
"author_id": "7193948041925403654",
"reply_to_username": "",
"liked_by_video_creator": false,
"pinned": false,
"purchase_intent": false,
"comment_language": "en",
"share_url": ""
}

Image-only comment:

{
"video_url": "https://www.tiktok.com/@txmfitt/video/7613032455011945748",
"comment_id": "7615909607940588310",
"parent_comment_id": "7614996613496390408",
"reply_to_reply_id": "",
"depth": 1,
"comment": "",
"comment_image_url": "https://p16-comment-sign-no.tiktokcdn-eu.com/tos-no1a-i-jj85edgx6n-no/b5efb28ad8934663aa1831ef422142d7~tplv-jj85edgx6n-image-origin.image?...",
"likes": 4,
"reply_count": 0,
"created_at": "2026-03-11T08:19:24+00:00",
"author_username": "unicukornis",
"author_display_name": "Unicukornis",
"author_id": "6845319934780654598",
"reply_to_username": "",
"liked_by_video_creator": false,
"pinned": false,
"purchase_intent": false,
"comment_language": "un",
"share_url": "https://m.tiktok.com/v/7613032455011945748.html?..."
}

Understanding threading

For most use cases, parent_comment_id + depth is all you need:

  • Top-level comments: depth == 0
  • Find replies: filter by parent_comment_id
  • Full threads: group by parent_comment_id, sort by created_at

The reply_to_reply_id field shows which specific reply within a thread someone responded to — useful for conversation analysis.

FAQ

How does the comment limit work with replies enabled?

When includeReplies is on, both comments and replies count toward maxCommentsPerVideo. The actor processes comments page by page — for each page, it first extracts the top-level comments, then fetches their replies before moving to the next page. This means the final output is a mix of comments and replies. If you need all top-level comments first, run once without replies, then run again with replies enabled.

What happens if a proxy gets blocked?

The actor automatically retries with a fresh proxy. You'll see a "rotating proxy" warning in the logs but scraping continues from where it left off. No data is lost.

Are there duplicate comments in the output?

No. Every comment and reply is deduplicated by ID before being added to the dataset. You only pay for unique results.