TikTok Profile Scraper & Video Comments
Pricing
Pay per usage
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
Maintained by CommunityActor stats
0
Bookmarked
35
Total users
5
Monthly active users
3 days ago
Last modified
Categories
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 Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Video | id, text, createTimeISO, diggCount, playCount, shareCount, commentCount, collectCount, repostCount, authorMeta{}, musicMeta{}, videoMeta{}, locationMeta{}, hashtags[], mentions[], effectStickers[], commentsScraped, repliesScraped, commentTotalReported, commentsDatasetUrl | Feed and engagement tracking |
| Comment | cid, text, diggCount, commentLanguage, commenterUniqueId, commenterNickname, commenterAvatarUrl, isImageComment, isStickerComment, imageUrls[], createTimeISO | Sentiment and audience research |
| Reply | Same fields as Comment, plus repliesToCid and isReply: true | Full conversation-thread analysis |
| Error | errorReason, input | Run 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_androidfirst 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 passingitem_idin place ofaweme_idon that endpoint returnsstatus_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?
- Open the Actor's page on the Apify Store and click Try for free (or Start, if you've already added it).
- Fill in
creatorProfileswith the TikTok usernames or profile URLs you want, one per line. - Set
videosPerCreator,maxCommentsPerVideoandmaxRepliesPerCommentto the sizes you need, and add any date or engagement filters (oldestPostDateUnified,leastDiggs,commentKeywords,minCommentDiggs) you want applied. - Click Start and watch the run log — each creator logs its video count, comment count, and reply count as it finishes.
- 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
| Parameter | Required | Type | Constraints | Default | Description |
|---|---|---|---|---|---|
creatorProfiles | No | array | stringList | — | TikTok 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. |
videosPerCreator | No | integer | min 1, max 500 | 5 | How many videos to open per creator. TikTok's creator feed returns 10 videos per request, so a large number means many sequential requests. |
maxItems | No | integer | min 0 | 0 | Hard 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. |
videoOrder | No | string (enum) | latest, popular, oldest | latest | Client-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. |
includeVideoComments | No | boolean | — | true | Turn off to run the Actor as a plain profile/video scraper with no comment child rows. |
maxCommentsPerVideo | No | integer | min 0, max 500 | 20 | Top-level comments to collect per video. Comments are fetched 50 per request. 0 disables comment capture. |
includeCommentReplies | No | boolean | — | true | Also open the reply thread under every comment that reports replies. |
maxRepliesPerComment | No | integer | min 0, max 100 | 5 | Replies to pull under each parent comment. Only comments that actually report replies trigger a request. |
commentKeywords | No | array | stringList | — | Case-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. |
minCommentDiggs | No | integer | min 0 | 0 | Keep only comments with at least this many likes. 0 keeps everything. |
oldestPostDateUnified | No | string | datepicker, absolute or relative | — | Earliest publish date for a video to qualify. Absolute (YYYY-MM-DD) or relative (7 = seven days ago). |
newestPostDate | No | string | datepicker, absolute or relative | — | Latest publish date for a video to qualify. Absolute (YYYY-MM-DD) or relative (0 = today). |
leastDiggs | No | integer | min 1 | — | Keep only videos with at least this many hearts. |
mostDiggs | No | integer | min 1 | — | Keep only videos with fewer than this many hearts. |
proxyConfiguration | No | object | proxy 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. |
profiles | No | array | stringList — legacy key | — | Backward-compatible alias for creatorProfiles. If both are supplied, this one wins. |
resultsPerPage | No | integer | min 1, max 500 — legacy key | — | Backward-compatible alias for videosPerCreator. If both are supplied, this one wins. |
profileSorting | No | string (enum) | latest, popular, oldest — legacy key | — | Backward-compatible alias for videoOrder. If both are supplied, this one wins. |
profileScrapeSections | No | array | items enum videos, reposts — legacy key | — | Accepted for backward compatibility. Only original videos are collected; the reposts feed is not read, so every video row reports fromProfileSection: "videos". |
excludePinnedPosts | No | boolean | legacy key | false | Accepted 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
commentKeywordsagainst your own creator's videos to surface complaints or questions in real time, and useminCommentDiggsto skip low-signal one-word replies. - AI engineers and LLM developers: feed the structured
comment/replyrows straight into a grounded agent — the agent issues acreatorProfilesquery, receives typed JSON back, and reasons overtext,diggCount, andcommenterNicknamewithout a separate scraping step. - Market researchers: track
playCount,diggCount,shareCountandcommentCountacross a creator's video window to measure content cadence and engagement trend over time. - Brand safety and moderation teams: use
isMediaCommentandmediaCommentTypeto 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 ApifyClientclient = 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.
Is it legal to scrape TikTok video comments and profiles?
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.