TikTok Profile Scraper & Video Comments avatar

TikTok Profile Scraper & Video Comments

Pricing

Pay per usage

Go to Apify Store
TikTok Profile Scraper & Video Comments

TikTok Profile Scraper & Video Comments

Extract detailed TikTok profile data with the TikTok Profile Scraper. Retrieve usernames, display names, follower counts, following counts, total likes, bio info, and profile stats. Ideal for influencer research, audience analysis, and social media insights. Fast, accurate, and scalable.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

35

Total users

5

Monthly active users

3 days ago

Last modified

Share

TikTok Comments Scraper — Videos, Replies and Media-Comment Flags

TikTok Profile Scraper & Video Comments opens any public creator's profile, walks their video feed, and pulls the comment thread underneath every video — top-level comments and their reply threads, returned as linked rows in one JSON dataset. Every comment and reply also carries isImageComment and isStickerComment flags that explain why a share of comments arrive with blank text, a distinction most comment exports leave unexplained. Output is typed JSON, ready to pass directly to an LLM, load into a spreadsheet, or feed a monitoring pipeline. Point it at one creator or a whole list, and the video budget and comment budget are tracked separately so a busy comment section never eats your video count.


What is TikTok Profile Scraper & Video Comments?

This Actor queries TikTok's own creator-feed and comment-pagination endpoints for a list of usernames or profile URLs and returns three linked result types: video rows, comment rows, and reply rows, each tied to its parent through parentVideoId and repliesToCid. What sets it apart is the comment layer: every comment and reply is classified as a plain-text comment, an uploaded-image comment, or a sticker comment, so an empty text field reads as a documented case rather than a missing value. No TikTok account, password, or session cookie is required anywhere in the input schema — the Actor reads the same logged-out pages and endpoints any visitor's browser reaches, escalating through Apify Proxy automatically only if TikTok challenges the request.

  • Opens each creator's profile and reads their video feed — captions, stats, hashtags, mentions, music, and video technical metadata
  • Fetches top-level comments per video, with keyword and minimum-likes filters applied before a row is ever pushed
  • Expands reply threads under any comment that reports replies, and places each reply immediately after its parent
  • Classifies media comments (isImageComment, isStickerComment, isMediaComment, mediaCommentType) so blank-text rows are explained, not just present
  • Filters videos by publish date window and by engagement (leastDiggs / mostDiggs)
  • Mirrors every comment and reply into a second, uncharged per-run dataset so the comment thread can be consumed on its own

What data can you get with TikTok Profile Scraper & Video Comments?

Every run returns up to four row types in one dataset, told apart by type, isChild and isReply: video, comment, reply, and an unbilled error row for a profile that could not be read.

Result TypeExtracted FieldsPrimary Use Case
Videoid, text, createTimeISO, diggCount, playCount, shareCount, commentCount, collectCount, repostCount, authorMeta{}, musicMeta{}, videoMeta{}, locationMeta{}, hashtags[], mentions[], effectStickers[], commentsScraped, repliesScraped, commentTotalReported, commentsDatasetUrlFeed and engagement tracking
Commentcid, text, diggCount, commentLanguage, commenterUniqueId, commenterNickname, commenterAvatarUrl, isImageComment, isStickerComment, imageUrls[], createTimeISOSentiment and audience research
ReplySame fields as Comment, plus repliesToCid and isReply: trueFull conversation-thread analysis
ErrorerrorReason, inputRun diagnostics — never billed

Media-comment flags

TikTok ships media comments in two different shapes, and the Actor labels both rather than leaving them as unexplained blanks. An uploaded-image comment sets isImageComment and usually still carries text; a sticker comment sets isStickerComment and, measured on live runs, never carries text. Both roll up into isMediaComment and a single mediaCommentType value ("image", "sticker", or null), and any media URLs found land in imageUrls. None of the three ranked competitor scrapers for this Actor document a distinction between image and sticker comments — their output tables list a flat comment_text or text field and stop there, so a blank comment reads as a data gap rather than a known TikTok behavior.

{
"isImageComment": false,
"isStickerComment": true,
"isMediaComment": true,
"mediaCommentType": "sticker",
"imageUrls": ["https://p16-va.tiktokcdn.com/sticker/high_resolution_url~tplv.image"],
"text": null
}

Reply threads

Replies are not a separate call the reader has to stitch together — each reply row carries repliesToCid pointing at the exact comment it answers, parentVideoId pointing at the video, and is written immediately after that parent comment so the dataset already reads top-to-bottom as a thread. replyCommentTotal is TikTok's own reported count on the parent comment; repliesScraped on the video row is how many reply rows this run actually captured, so any gap between the two (deleted or restricted replies) stays visible instead of silently disappearing.


What is the difference between a TikTok profile scraper and a TikTok comment scraper?

A TikTok profile scraper answers "what did this creator post" — it returns video rows: captions, stats, hashtags, and technical metadata about each upload. A TikTok comment scraper answers a different question, "what are people saying about it" — it returns the conversation attached to a video, not the video itself. The two are usually shipped as separate Actors because they hit different endpoints: the creator feed for the first, and per-video comment pagination for the second.

That split forces an extra step for anyone who actually wants both — first pull a creator's video IDs, then feed each one into a second, comment-only scraper, and stitch the two datasets back together by hand. It matters more now than a plain video list used to, because engagement analysis and moderation workflows increasingly need the thread, not just the post: a video with a high diggCount and a comment section full of complaints reads very differently from one with genuine praise.

TikTok Profile Scraper & Video Comments returns both in the same run, already linked: video rows carry commentsScraped and repliesScraped counts, and every comment/reply row carries parentVideoId pointing back at the exact video object it belongs to — so a single dataset gives you the post and the conversation underneath it without a join step.


Why not build this yourself?

TikTok does not publish a developer API that lets a third party pull an arbitrary creator's video list and comment threads the way this Actor does — a self-built scraper means reverse-engineering the same private endpoints and keeping up with how they change. That surface is more brittle than it looks:

  • TikTok WAF-challenges standard desktop TLS fingerprints with an HTTP 200 page rather than an error status; only a mobile-browser TLS profile gets through cleanly, so the Actor impersonates chrome99_android first and falls back through four more mobile/desktop profiles if that one stops working.
  • A "signed-endpoint refusal" also comes back as HTTP 200, but with a zero-byte body — the status code alone cannot tell you whether a request worked, so every response is classified by WAF marker and body length, not by status code.
  • /api/comment/list/ only accepts the bare four query parameters it was reverse-engineered with (aid, aweme_id, count, cursor); adding the standard browser/device parameter block that other TikTok endpoints expect makes it return a zero-byte body instead, and passing item_id in place of aweme_id on that endpoint returns status_code: 5.
  • The creator video-feed endpoint hard-caps at 10 items per request regardless of what you ask for, so a 200-video pull means dozens of sequential paginated calls, each of which can hit a fresh block.

Building and maintaining that yourself means owning proxy rotation, TLS-fingerprint fallbacks, and a WAF-detection layer before you ever get to the comment data. This Actor already does that escalation for every run.


How to scrape TikTok video comments with TikTok Profile Scraper & Video Comments?

  1. Open the Actor's page on the Apify Store and click Try for free (or Start, if you've already added it).
  2. Fill in creatorProfiles with the TikTok usernames or profile URLs you want, one per line.
  3. Set videosPerCreator, maxCommentsPerVideo and maxRepliesPerComment to the sizes you need, and add any date or engagement filters (oldestPostDateUnified, leastDiggs, commentKeywords, minCommentDiggs) you want applied.
  4. Click Start and watch the run log — each creator logs its video count, comment count, and reply count as it finishes.
  5. Open the Dataset tab when the run completes and export as JSON, CSV, or Excel, or pull it programmatically with the Apify API/client.

How to run multiple creators in one job

creatorProfiles takes one entry per line through Apify's list editor, and every creator supplied is scraped in the same run and written to the same dataset. Creators are processed one at a time in the order given, not concurrently — the log line for one creator's totals (videos=… comments=… replies=…) always completes before the next creator starts, which keeps proxy escalation and retry state clean per target.


⬇️ Input

ParameterRequiredTypeConstraintsDefaultDescription
creatorProfilesNoarraystringListTikTok usernames or full profile URLs, one per line. Every video found for each creator becomes a parent row, and its comment thread is attached beneath it.
videosPerCreatorNointegermin 1, max 5005How many videos to open per creator. TikTok's creator feed returns 10 videos per request, so a large number means many sequential requests.
maxItemsNointegermin 00Hard stop on parent video rows across all creators. Comments and replies are not counted against it — they are additional child rows. 0 means no limit.
videoOrderNostring (enum)latest, popular, oldestlatestClient-side ordering of the videos that were fetched. TikTok's creator feed always serves newest-first and ignores its own sort parameter, so this reorders the fetched window rather than changing which videos you get.
includeVideoCommentsNobooleantrueTurn off to run the Actor as a plain profile/video scraper with no comment child rows.
maxCommentsPerVideoNointegermin 0, max 50020Top-level comments to collect per video. Comments are fetched 50 per request. 0 disables comment capture.
includeCommentRepliesNobooleantrueAlso open the reply thread under every comment that reports replies.
maxRepliesPerCommentNointegermin 0, max 1005Replies to pull under each parent comment. Only comments that actually report replies trigger a request.
commentKeywordsNoarraystringListCase-insensitive substrings. A comment is kept only if its text contains at least one of them. Image/sticker comments with no text are filtered out when this is set.
minCommentDiggsNointegermin 00Keep only comments with at least this many likes. 0 keeps everything.
oldestPostDateUnifiedNostringdatepicker, absolute or relativeEarliest publish date for a video to qualify. Absolute (YYYY-MM-DD) or relative (7 = seven days ago).
newestPostDateNostringdatepicker, absolute or relativeLatest publish date for a video to qualify. Absolute (YYYY-MM-DD) or relative (0 = today).
leastDiggsNointegermin 1Keep only videos with at least this many hearts.
mostDiggsNointegermin 1Keep only videos with fewer than this many hearts.
proxyConfigurationNoobjectproxy editor{"useApifyProxy": false}TikTok soft-blocks with an HTTP 200 challenge page rather than an error status. When that happens the Actor escalates through datacenter and residential proxies automatically, always before the first row of a creator is pushed.
profilesNoarraystringList — legacy keyBackward-compatible alias for creatorProfiles. If both are supplied, this one wins.
resultsPerPageNointegermin 1, max 500 — legacy keyBackward-compatible alias for videosPerCreator. If both are supplied, this one wins.
profileSortingNostring (enum)latest, popular, oldest — legacy keyBackward-compatible alias for videoOrder. If both are supplied, this one wins.
profileScrapeSectionsNoarrayitems enum videos, reposts — legacy keyAccepted for backward compatibility. Only original videos are collected; the reposts feed is not read, so every video row reports fromProfileSection: "videos".
excludePinnedPostsNobooleanlegacy keyfalseAccepted for backward compatibility. TikTok's creator feed does not mark pinned posts, so this filter almost never removes anything.

No parameter in this schema is marked as a secret — proxyConfiguration is Apify's standard proxy picker, and no TikTok credential, cookie, or API key field exists anywhere in the input.

An input JSON written for the original base TikTok profile scraper still runs unchanged: profiles, resultsPerPage, profileSorting, profileScrapeSections and excludePinnedPosts are read alongside the new field names, with the legacy key winning whenever both are supplied.

Two more filters exist in the run logic but are not exposed as schema fields in the Input tab: maxFollowersPerProfile and maxFollowingPerProfile drop a video row when the author's follower count, or following count, is at or above the number given. They only take effect if you add them directly to the input JSON — there is no UI control for either.

Input example

{
"creatorProfiles": ["mrbeast"],
"videosPerCreator": 3,
"maxItems": 3,
"videoOrder": "latest",
"includeVideoComments": true,
"maxCommentsPerVideo": 20,
"includeCommentReplies": true,
"maxRepliesPerComment": 5,
"minCommentDiggs": 0,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Common pitfall: leastDiggs and mostDiggs both require a minimum of 1 — you cannot set either to 0 to mean "no filter." Leave the field empty instead. Likewise, proxyConfiguration defaults to useApifyProxy: false (a direct connection); the Actor's own proxy escalation still runs on a block, but starting a large run on Apify Proxy from the first request reduces how often that escalation has to trigger.


⬆️ Output

Results write to the Actor's default dataset as they're scraped and can be downloaded as JSON, CSV, Excel, or accessed live through the Apify API — the same as any Apify dataset. The dataset's default view surfaces 28 columns for on-screen scanning, but that view is a subset: video rows carry 37 top-level fields, comment and reply rows carry 30, and error rows carry 8.

Scraped results

[
{
"type": "video",
"isChild": false,
"isReply": false,
"id": "7526112233445566778",
"text": "day 47 of giving away everything I own #challenge",
"textLanguage": "en",
"createTime": 1751328000,
"createTimeISO": "2025-07-01T00:00:00.000Z",
"isAd": false,
"authorMeta": {
"id": "6784123900000000000",
"name": "mrbeast",
"profileUrl": "https://www.tiktok.com/@mrbeast",
"nickName": "MrBeast",
"verified": true,
"signature": "SUBSCRIBE FOR A COOKIE",
"bioLink": null,
"originalAvatarUrl": "https://p16-sign.tiktokcdn-us.com/avatar-large.jpeg",
"avatar": "https://p16-sign.tiktokcdn-us.com/avatar-medium.jpeg",
"commerceUserInfo": { "commerceUser": false },
"privateAccount": false,
"roomId": "",
"ttSeller": false,
"followDatasetUrl": null,
"following": 240,
"friends": 12,
"fans": 112000000,
"heart": 20500000000,
"video": 950,
"digg": 8100
},
"musicMeta": {
"musicName": "original sound",
"musicAuthor": "MrBeast",
"musicOriginal": true,
"playUrl": "https://sf-va.tiktokcdn.com/obj/musically-maliva-obj/original-sound.mp3",
"coverMediumUrl": "https://p16-sign.tiktokcdn-us.com/music-cover.jpeg",
"originalCoverMediumUrl": "https://p16-sign.tiktokcdn-us.com/music-cover.jpeg",
"musicId": "7526112233445500000"
},
"locationMeta": {},
"webVideoUrl": "https://www.tiktok.com/@mrbeast/video/7526112233445566778",
"mediaUrls": [],
"commentsDatasetUrl": "https://api.apify.com/v2/datasets/abcXYZ123/items?clean=true&format=json",
"videoMeta": {
"height": 1024,
"width": 576,
"duration": 58,
"coverUrl": "https://p16-sign.tiktokcdn-us.com/video-cover.jpeg",
"originalCoverUrl": "https://p16-sign.tiktokcdn-us.com/video-origin-cover.jpeg",
"definition": "540p",
"format": "mp4",
"subtitleLinks": []
},
"diggCount": 3900000,
"shareCount": 22100,
"playCount": 41200000,
"collectCount": 210000,
"commentCount": 51200,
"repostCount": 8900,
"mentions": [],
"detailedMentions": [],
"hashtags": [{ "name": "challenge" }],
"effectStickers": [],
"isSlideshow": false,
"isPinned": false,
"isSponsored": false,
"input": "mrbeast",
"fromProfileSection": "videos",
"parentVideoId": null,
"repliesToCid": null,
"commentsScraped": 20,
"repliesScraped": 11,
"commentTotalReported": 51244,
"scrapedAt": "2026-07-18T12:00:00.000Z"
},
{
"type": "comment",
"isChild": true,
"isReply": false,
"id": "7527000011112222333",
"cid": "7527000011112222333",
"parentVideoId": "7526112233445566778",
"repliesToCid": null,
"commentIndex": 1,
"text": "this is unreal",
"commentLanguage": "en",
"diggCount": 812,
"replyCommentTotal": 4,
"isImageComment": false,
"isStickerComment": false,
"isMediaComment": false,
"mediaCommentType": null,
"imageUrls": [],
"createTime": 1751331600,
"createTimeISO": "2025-07-01T01:00:00.000Z",
"commenterUniqueId": "someviewer",
"commenterNickname": "Some Viewer",
"commenterUid": "6789000011112222",
"commenterSecUid": "MS4wLjABAAAA_someviewer_sec_uid",
"commenterAvatarUrl": "https://p16-sign.tiktokcdn-us.com/commenter-avatar.jpeg",
"commenterProfileUrl": "https://www.tiktok.com/@someviewer",
"videoWebUrl": "https://www.tiktok.com/@mrbeast/video/7526112233445566778",
"videoText": "day 47 of giving away everything I own #challenge",
"authorMeta": { "name": "mrbeast" },
"input": "mrbeast",
"scrapedAt": "2026-07-18T12:00:01.000Z"
},
{
"type": "reply",
"isChild": true,
"isReply": true,
"id": "7527000099998888777",
"cid": "7527000099998888777",
"parentVideoId": "7526112233445566778",
"repliesToCid": "7527000011112222333",
"commentIndex": 1,
"text": "fr fr",
"commentLanguage": "en",
"diggCount": 40,
"replyCommentTotal": 0,
"isImageComment": false,
"isStickerComment": false,
"isMediaComment": false,
"mediaCommentType": null,
"imageUrls": [],
"createTime": 1751332000,
"createTimeISO": "2025-07-01T01:06:40.000Z",
"commenterUniqueId": "anotherfan",
"commenterNickname": "Another Fan",
"commenterUid": "6789000099998888",
"commenterSecUid": "MS4wLjABAAAA_anotherfan_sec_uid",
"commenterAvatarUrl": "https://p16-sign.tiktokcdn-us.com/reply-avatar.jpeg",
"commenterProfileUrl": "https://www.tiktok.com/@anotherfan",
"videoWebUrl": "https://www.tiktok.com/@mrbeast/video/7526112233445566778",
"videoText": "day 47 of giving away everything I own #challenge",
"authorMeta": { "name": "mrbeast" },
"input": "mrbeast",
"scrapedAt": "2026-07-18T12:00:02.000Z"
},
{
"type": "comment",
"isChild": true,
"isReply": false,
"id": "7527000055556666444",
"cid": "7527000055556666444",
"parentVideoId": "7526112233445566778",
"repliesToCid": null,
"commentIndex": 2,
"text": null,
"commentLanguage": null,
"diggCount": 6,
"replyCommentTotal": 0,
"isImageComment": false,
"isStickerComment": true,
"isMediaComment": true,
"mediaCommentType": "sticker",
"imageUrls": ["https://p16-va.tiktokcdn.com/sticker/high_resolution_url~tplv.image"],
"createTime": 1751333000,
"createTimeISO": "2025-07-01T01:23:20.000Z",
"commenterUniqueId": "stickerfan",
"commenterNickname": "Sticker Fan",
"commenterUid": "6789000055556666",
"commenterSecUid": "MS4wLjABAAAA_stickerfan_sec_uid",
"commenterAvatarUrl": "https://p16-sign.tiktokcdn-us.com/sticker-fan-avatar.jpeg",
"commenterProfileUrl": "https://www.tiktok.com/@stickerfan",
"videoWebUrl": "https://www.tiktok.com/@mrbeast/video/7526112233445566778",
"videoText": "day 47 of giving away everything I own #challenge",
"authorMeta": { "name": "mrbeast" },
"input": "mrbeast",
"scrapedAt": "2026-07-18T12:00:03.000Z"
}
]

An error row, pushed when a creator's profile cannot be read, looks like this and is never a billable event:

{
"type": "error",
"isChild": false,
"isReply": false,
"id": null,
"input": "someprivateaccount",
"authorMeta": { "name": "someprivateaccount" },
"errorReason": "profile_private",
"scrapedAt": "2026-07-18T12:05:00.000Z"
}

A deliberate omission, not a gap: comment and reply rows do not include is_author_digged ("liked by the video author") or author_pin ("pinned by the video author"). TikTok returns both as false for every comment when no session is attached, so shipping them would mean a column that is permanently false for every logged-out run — the Actor drops them rather than ship a column with no signal. label_list, text_extra, and a non-zero reply_id on comments are omitted for the same reason.


How can I use the data extracted with TikTok Profile Scraper & Video Comments?

  • Social media and community managers: run commentKeywords against your own creator's videos to surface complaints or questions in real time, and use minCommentDiggs to skip low-signal one-word replies.
  • AI engineers and LLM developers: feed the structured comment/reply rows straight into a grounded agent — the agent issues a creatorProfiles query, receives typed JSON back, and reasons over text, diggCount, and commenterNickname without a separate scraping step.
  • Market researchers: track playCount, diggCount, shareCount and commentCount across a creator's video window to measure content cadence and engagement trend over time.
  • Brand safety and moderation teams: use isMediaComment and mediaCommentType to separate genuine text feedback from sticker/image noise before running sentiment analysis on the rest.

📈 How do you monitor comment activity over time?

Comment monitoring means running the same creatorProfiles list on a schedule and diffing the numbers between runs rather than reading one snapshot. Because comments and replies are child rows with a stable cid, you can join today's dataset against yesterday's on cid and watch diggCount climb, or watch commentsScraped and repliesScraped grow on the video row as a thread keeps getting replies. The commentTotalReported field — TikTok's own count on the video — is worth tracking alongside commentsScraped: a widening gap between the two tells you the thread is growing faster than your maxCommentsPerVideo budget is capturing it.

A practical loop: schedule a run across a fixed creator list, keep maxItems and maxCommentsPerVideo consistent between runs so the comparison is apples-to-apples, then diff each video's diggCount and commentCount and each comment's diggCount against the previous run's dataset, and alert when a specific video or comment crosses a threshold you define. Apify's own Schedules feature (Console → Schedules) runs this Actor on a cron interval without any code, and each run's dataset is addressable through the Apify API for the diff step.


Integrate TikTok Profile Scraper & Video Comments and automate your workflow

TikTok Profile Scraper & Video Comments works with any language or tool that can call the Apify API — there's no TikTok-specific SDK or auth flow to install.

REST API with Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("<YOUR_USERNAME>/tiktok-profile-scraper-video-comments").call(
run_input={
"creatorProfiles": ["mrbeast"],
"videosPerCreator": 3,
"maxCommentsPerVideo": 20,
"includeCommentReplies": True,
}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["type"], row.get("text"))

Scheduled monitoring and delivery

The Actor has no built-in webhook delivery of its own, but Apify's platform-level features cover the gap: attach a webhook to the run (Console → Actor → Integrations) to fire on run completion, or set up a Schedule to run it on a cron interval and read the resulting dataset with apify_client afterward — either pattern turns a one-off run into a monitoring pipeline.


Yes — scraping publicly accessible data is generally lawful, and this Actor returns only what any logged-out visitor to a public TikTok profile or video page can already see; it requests no login, password, or session cookie. In hiQ Labs v. LinkedIn (9th Cir. 2019), the court held that scraping publicly available web data does not violate the U.S. Computer Fraud and Abuse Act. Because output rows include commenter usernames, nicknames, and avatar URLs — personal data under GDPR and CCPA — you are responsible for how you store, process, and retain that data once it leaves the Actor, and for TikTok's own Terms of Service. Scraping for internal monitoring and scraping to train an AI model carry different risk profiles; consult your legal team for commercial use cases involving bulk data storage.


❓ Frequently asked questions

Do I need a TikTok account or login to use this Actor?

No. The input schema has no cookie, password, or API-key field — the Actor reads the same logged-out profile pages and comment endpoints any visitor's browser reaches, and escalates through Apify Proxy automatically if TikTok challenges a request.

Can I scrape multiple creators in one run?

Yes. creatorProfiles accepts one username or profile URL per line, and every creator is scraped into the same dataset. Creators are processed one at a time, in the order supplied.

How does this Actor handle TikTok's anti-bot measures?

It classifies every response by WAF marker and body length rather than trusting the HTTP status code, since a soft block and a signed-endpoint refusal both come back as HTTP 200. On a block it escalates proxy type (none → datacenter → residential, with up to three residential re-rolls) and, if that's exhausted, switches TLS-impersonation profile — always before the first row for that creator is pushed, so a retry can never duplicate rows.

Does this Actor extract sticker and image comments?

Yes. isImageComment and isStickerComment flag each comment or reply's media type, mediaCommentType gives a single readable value ("image", "sticker", or null), and imageUrls carries any media URL found. Sticker comments carry no text; image comments usually still do.

How many comments and replies does this Actor return per video?

Up to maxCommentsPerVideo (default 20, max 500) top-level comments per video, and up to maxRepliesPerComment (default 5, max 100) replies per comment that actually reports replies. TikTok's own comment endpoint serves 50 comments per request and its reply endpoint serves 20 replies per request internally, regardless of the totals you configure.

Does maxItems limit comments too?

No. maxItems caps parent video rows only; comments and replies are additional child rows bounded solely by maxCommentsPerVideo and maxRepliesPerComment. A run with maxItems: 3 and maxCommentsPerVideo: 20 can still produce up to 60 comment rows.

How do I monitor a creator's comment activity over time?

Run the same creator list on a schedule, keep the comment and reply caps consistent, and diff each comment's diggCount and each video's commentsScraped/commentTotalReported gap against the previous run's dataset. See "How do you monitor comment activity over time?" above for the full loop.

Does this Actor work with Claude, ChatGPT, and AI agent frameworks?

It's callable as a standard Apify Actor run through apify_client or a raw HTTP request from any agent framework — an agent can trigger a run, poll for completion, and read the dataset back as grounding context before answering.

How does this Actor compare to other TikTok comment scrapers?

As observed on their Apify Store listings in July 2026: openclawai/tiktok-douyin-bilibili-scraper covers TikTok, Douyin and Bilibili in one Actor but documents that its TikTok comments mode needs a pasted browser cookie to return results ("TikTok's comment API requires a logged-in session"). get-leads/all-in-one-tiktok-scraper supports comment reply threading up to depth 3 without a cookie. Neither README documents a distinction between plain-text, image, and sticker comments the way this Actor's isImageComment/isStickerComment fields do, and this Actor requires no cookie for any of its comment or reply requests.

Can I use this Actor without managing proxies or platform credentials?

Yes. There is no TikTok credential of any kind in the input. Apify Proxy is optional and off by default (useApifyProxy: false); turning it on is a checkbox, and the Actor's own datacenter-then-residential escalation runs automatically underneath it when TikTok challenges a request.


💬 Your feedback

Found a bug, a field that's coming back empty when it shouldn't, or a TikTok response shape that changed? Open an issue on this Actor's Issues tab in Apify Console, or message Scrapier support directly from the Actor's page — reports with the exact input JSON and the creator you ran it against are the fastest to reproduce and fix.