TikTok Data Scraper: Comments, Replies & AI Sentiment avatar

TikTok Data Scraper: Comments, Replies & AI Sentiment

Pricing

from $3.99 / 1,000 results

Go to Apify Store
TikTok Data Scraper: Comments, Replies & AI Sentiment

TikTok Data Scraper: Comments, Replies & AI Sentiment

Scrape TikTok data including videos, profiles, captions, hashtags, comments, likes, shares, views, music, and engagement metrics. Perfect for influencer research, trend tracking, competitor analysis, content monitoring, and social media analytics.

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapio

Scrapio

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

TikTok Scraper — Extract Comments, Replies and AI Sentiment

TikTok Scraper: Comments, Replies & AI Sentiment turns TikTok's public comment sections into structured data. Every comment and reply comes with a commenter-audience snapshot (region, verified status, follower count), an optional top-comment ranking by likes, and — on request — AI-generated sentiment, topic, toxicity and language labels. The same run also collects TikTok profiles, videos, followers, following, hashtags, music and playlists. Unlike scraping frameworks that return raw HTML, it returns typed JSON — ready for your model, your database or your pipeline without any parsing. This guide covers every field the Actor writes and how teams deploy it for monitoring, enrichment and dataset building.


🧭 What Does TikTok Scraper Do?

TikTok Scraper: Comments, Replies & AI Sentiment is an Apify Actor that pulls public TikTok data through TikTok's own public-data mirror, with an automatic fallback straight to tiktok.com when that mirror is blocked. No TikTok account, login or cookie is required for any input type — the Actor never authenticates as a user. Its specialty is comment and reply intelligence: a promoted commenter-audience snapshot, a pre-AI spend-control filter, top-comment ranking, and optional multi-provider AI sentiment/topic/toxicity/language classification that is off by default and never fabricated.

  • 💬 Comments & replies — full comment threads per video, with nested replies linked to their parent comment
  • 🤖 AI sentiment/topic/toxicity/language — optional, per comment/reply, using your own API key for Anthropic, OpenAI, Google, xAI, DeepSeek, Perplexity or Mistral
  • 👤 Profiles — user info, videos, favourites, followers, following and in-profile search
  • #️⃣ Hashtag videos — top/recent videos for any hashtag, region-aware
  • 🎵 Music/sound videos — videos using a given track
  • ▶️ Playlist (mix) videos — every video inside a TikTok playlist
  • 📹 Single-video details — full detail record including the HD, no-watermark download link

⚡ Features & Capabilities

TikTok Scraper's capabilities split into comment/reply intelligence, broad platform coverage, and resilience against blocking.

Core features

  • Commenter-audience columns — every comment/reply carries user.region, user.verified, user.follower_count and user.signature as first-class fields, not buried in a nested blob you have to parse yourself
  • Pre-AI spend controlminCommentDiggCount and excludeCommentKeywords drop low-value comments before ranking or any AI call, so AI spend and output volume are controlled together
  • Top-comment rankingtopCommentsCount flags the top-N comments per video by digg_count with isTopComment and topCommentRank, applied after the pre-AI filters
  • Optional AI classificationsentiment, topic, toxicity and language per comment/reply; every AI field defaults to null and only fills in on a real, successful classification call — never guessed
  • Canonical deep links on every recordvideoUrl, profileUrl, and hashtagUrl/musicUrl where applicable, plus ISO-8601 publishedAt and scrapedAt
  • Six other TikTok data types in the same run — profiles, videos, favourites, followers/following, hashtags, music and playlists, so you don't need a second Actor for context around the comments you just scraped
  • Live dataset writes — every record is pushed to the dataset the moment it's collected, so a run that's stopped early still keeps whatever it already gathered

When another tool might suit you better

If what you actually need is TikTok Shop product listings, pricing or seller data, this Actor's comment and profile fields aren't a substitute — use a TikTok Shop–specific scraper instead. Likewise, if you only need your own account's private analytics (impressions, reach), TikTok's native Creator/Business tools already give you that without any scraping. This Actor is built specifically for public comment, reply and profile data at scale — it is not a commerce or private-analytics tool.

TikTok Scraper within the Scrapio data stack

TikTok Scraper: Comments, Replies & AI Sentiment covers comments, replies, profiles and general video/hashtag/music/playlist feeds. For TikTok Shop product and seller data, use TikTok Shop Data Scraper & Seller Profile Scraper. For a cross-market trending-creator sweep instead of a per-profile pull, use TikTok Trending Creator Insights Scraper Across Every Country.


Why do developers and data teams scrape TikTok?

🏢 Brand, marketing and social-listening teams

Marketing teams point videoUrlsComments at their own campaign videos or a competitor's viral post, set minCommentDiggCount to cut noise, and read back text, digg_count, isTopComment and — with AI sentiment on — sentiment/topic per comment. The result lands as a dataset export teams pipe into a dashboard or spreadsheet to see whether audience reaction to a launch, ad or challenge is positive, and which specific comments (topCommentRank) are driving engagement, without reading a single video's comment section by hand.

📊 AI training data and RAG indexing

The text field on every comment and reply, and content_desc/title on every video, are the high-information text fields worth indexing. For RAG enrichment, comment text plus the AI sentiment/topic labels (when enabled) give a retrieval index that already carries audience-reaction context, not just raw video metadata. For training data, digg_count, reply_total, isReply and the commenter-audience fields (user.follower_count, user.verified) give consistently-structured numeric and boolean features across every record. All fields return as typed primitives — no string-to-number parsing needed before they hit a model context window.

📱 Competitive and market intelligence

Track a competitor's or a whole hashtag's comment sentiment over time by re-running the Actor against the same videoUrlsComments or hashtags list on a schedule and diffing digg_count, comment_count and (with AI on) sentiment between runs. A sudden shift toward negative sentiment or a spike in toxicity on a competitor's launch video is a concrete, field-level signal, not a guess.

🔬 Research and academic use

hashtagRegion plus the commenter-audience fields (region, verified, follower_count) support region- and audience-segmented studies of public discourse on TikTok — useful for academic and social-research datasets built entirely from publicly accessible comments and profile data.

🎥 Product and SaaS development

Social-listening dashboards, brand-safety tools and creator-analytics products can build on this Actor's typed comment/reply/profile output directly — scheduling runs, storing dataset exports, and layering their own UI on top — instead of maintaining their own TikTok scraping and Cloudflare-challenge-handling code.


🍚 Input Parameters

All input types are read directly from .actor/input_schema.json. Every field is optional (no required parameters) — fill in only the section(s) you need and leave the rest empty.

ParameterRequiredTypeDefaultMin / MaxDescription
userUrlsNoarray (stringList)Profile URLs, @handles, usernames or numeric user IDs
categoriesNoarray (select, enum)["videos"]Which user data to collect: videos, favourite_videos, followers, following, search, user_info
maxUserResultsNointeger10min 1Max items per profile/section. Ignored when scrapeAllUserResults is on
scrapeAllUserResultsNobooleanfalseIgnore the limit above and collect everything available
videoUrlsCommentsNoarray (stringList)Video URLs or IDs to scrape comments from
commentsPerUrlNointeger10min 1Max comments per video. Ignored when scrapeAllComments is on
scrapeAllCommentsNobooleanfalseCollect every available comment per video
repliesPerCommentNointeger0min 0Max replies per comment. 0 skips replies entirely. Ignored when scrapeAllReplies is on
scrapeAllRepliesNobooleanfalseCollect every available reply for each comment
hashtagsNoarray (stringList)Hashtag names or URLs to scrape videos from
videosPerHashtagNointeger10min 1Max videos per hashtag. Ignored when scrapeAllHashtagVideos is on
scrapeAllHashtagVideosNobooleanfalseCollect every available video for each hashtag
hashtagRegionNostring"US"pattern ^[A-Za-z]{2}$Two-letter country code used for localization (e.g. US, GB, IN)
musicUrlsNoarray (stringList)Music URLs or IDs to scrape videos from
videosPerMusicNointeger10min 1Max videos per music track. Ignored when scrapeAllMusicVideos is on
scrapeAllMusicVideosNobooleanfalseCollect every available video for each music track
playlistIDsNoarray (stringList)Playlist (mix) IDs to scrape videos from
videosPerPlaylistNointeger10min 1Max videos per playlist. Ignored when scrapeAllPlaylistVideos is on
scrapeAllPlaylistVideosNobooleanfalseCollect every available video for each playlist
videoDetailsListNoarray (stringList)Video IDs or URLs to retrieve full details for
minCommentDiggCountNointeger0min 0Skip comments/replies with fewer likes than this, before ranking or AI analysis
excludeCommentKeywordsNoarray (stringList)Skip comments/replies whose text contains any of these words/phrases (case-insensitive)
topCommentsCountNointeger10min 0Flags the top-N surviving comments per video with isTopComment/topCommentRank. 0 disables ranking
aiSentimentEnabledNobooleanfalseTurn on AI sentiment/topic/toxicity/language classification. Comments/replies are collected either way
aiModelNostring (enum)"claude-haiku-4-5"AI model — provider auto-detected from the name prefix (see full list below)
aiApiKeyNostring (secret)Your own API key for the selected provider. Falls back to the matching env var if left empty
minRequestIntervalNonumber1.2min 0, max 10Seconds to wait between consecutive requests
maxRetriesNointeger3min 0, max 10How many times to retry a failed/blocked request
apiKeyNostring""Optional key that lifts the rate limit for faster collection
proxyConfigurationNoobject{"useApifyProxy": false}Proxy settings. By default the Actor runs with no proxy and escalates automatically if blocked

aiModel enum values (provider auto-detected from the prefix): claude-haiku-4-5, claude-sonnet-5, claude-opus-4-8, claude-fable-5 (Anthropic) · gpt-4o-mini, gpt-4o, gpt-4.1-mini, gpt-4.1, o3-mini, o1 (OpenAI) · gemini-2.0-flash-lite, gemini-2.0-flash, gemini-1.5-pro, gemini-2.5-flash, gemini-2.5-pro (Google) · grok-2-latest, grok-3-mini, grok-3, grok-beta (xAI) · deepseek-chat, deepseek-reasoner (DeepSeek) · sonar, sonar-pro, sonar-reasoning (Perplexity) · mistral-small-latest, mistral-large-latest (Mistral).

{
"userUrls": ["https://www.tiktok.com/@taylorswift"],
"categories": ["videos"],
"maxUserResults": 50,
"scrapeAllUserResults": false,
"videoUrlsComments": ["https://www.tiktok.com/@user/video/7300000000000000000"],
"commentsPerUrl": 100,
"scrapeAllComments": false,
"repliesPerComment": 10,
"scrapeAllReplies": false,
"hashtags": ["dance"],
"videosPerHashtag": 50,
"hashtagRegion": "US",
"musicUrls": [],
"playlistIDs": [],
"videoDetailsList": [],
"minCommentDiggCount": 5,
"excludeCommentKeywords": ["spam", "giveaway"],
"topCommentsCount": 10,
"aiSentimentEnabled": true,
"aiModel": "claude-haiku-4-5",
"aiApiKey": "",
"minRequestInterval": 1.2,
"maxRetries": 3,
"apiKey": "",
"proxyConfiguration": { "useApifyProxy": false }
}

Supported URL types and input formats

Every URL-style field accepts either a full TikTok URL or a bare identifier — the Actor normalizes both.

  • Profiles (userUrls)https://www.tiktok.com/@taylorswift, @taylorswift, taylorswift, or a numeric user ID like 107955. A pure numeric string is treated as a resolved user ID; anything else is treated as a username.
  • Videos (videoUrlsComments, videoDetailsList) — a full URL containing /video/<id> or /photo/<id>, or a bare numeric ID of 6+ digits found anywhere in the string.
  • Hashtags (hashtags)https://www.tiktok.com/hashtag/dance, #dance, or just dance.
  • Music (musicUrls) — a bare numeric music ID, or a URL like https://www.tiktok.com/music/name-123456789 (the numeric ID is extracted from the URL, or resolved via a lookup call if the URL carries no ID directly).
  • Playlists (playlistIDs) — a bare numeric playlist (mix) ID, or the first 6+ digit number found in a pasted URL.

📦 Output Format

Every record is written live to the dataset in one consistent envelope, regardless of which section produced it:

{
"section": "…",
"category": "…",
"input": "the exact string you provided",
"user": "resolved username / video id / hashtag / music id / playlist id",
"userType": "unique_id | user_id | video_id | hashtag | music_id | mix_id | keywords",
"data": { "…": "…" }
}

section/category/userType combinations actually produced by the source code:

sectioncategoryuserType
usersuser_info, videos, favourite_videos, following, followersunique_id or user_id
searchsearchkeywords
videoscomments, replies, video_detailvideo_id
hashtagsvideoshashtag
musicvideosmusic_id
playlistsvideosmix_id

Output for comments and replies

The Actor's flagship record. Every comment and reply gets this shape — sentiment/topic/toxicity/language stay null unless aiSentimentEnabled is on and a working API key resolved:

{
"section": "videos",
"category": "comments",
"input": "https://www.tiktok.com/@user/video/7300000000000000000",
"user": "7300000000000000000",
"userType": "video_id",
"data": {
"id": "7301111111111111111",
"type": "comment",
"isReply": false,
"text": "This is amazing, love the choreography!",
"digg_count": 482,
"reply_total": 3,
"isTopComment": true,
"topCommentRank": 1,
"publishedAt": "2026-01-14T09:22:11Z",
"user": {
"nickname": "Fan Account",
"unique_id": "fan_account",
"region": "US",
"verified": false,
"follower_count": 1204,
"signature": "dance lover"
},
"profileUrl": "https://www.tiktok.com/@fan_account",
"videoUrl": "https://www.tiktok.com/video/7300000000000000000",
"reply_to_comment_id": null,
"sentiment": "positive",
"topic": "praise",
"toxicity": "none",
"language": "en",
"scrapedAt": "2026-08-01T12:00:00Z"
}
}

A reply record is identical in shape, with type: "reply", isReply: true, and reply_to_comment_id set to the parent comment's id. Any extra field TikTok's comment endpoint returns beyond this documented set is preserved as-is on data — the Actor never drops an upstream key, only adds to it.

Output for videos

Videos, hashtag videos, music videos, playlist videos, favourites and single-video details all share this record shape (build_video_record in the source), in this exact field order:

{
"section": "hashtags",
"category": "videos",
"input": "dance",
"user": "dance",
"userType": "hashtag",
"data": {
"aweme_id": "7300000000000000000",
"video_id": "7300000000000000000",
"region": "US",
"title": "",
"content_desc": "learning this dance trend #dance #fyp",
"cover": "https://p16-sign.tiktokcdn.com/cover.jpeg",
"ai_dynamic_cover": "https://p16-sign.tiktokcdn.com/dynamic-cover.jpeg",
"origin_cover": "https://p16-sign.tiktokcdn.com/origin-cover.jpeg",
"duration": 23,
"play": "https://api.tikwm.com/video/play.mp4",
"wmplay": "https://api.tikwm.com/video/wmplay.mp4",
"hdplay": "https://api.tikwm.com/video/hdplay.mp4",
"size": 2831201,
"wm_size": 3021884,
"hd_size": 4210552,
"music": "https://api.tikwm.com/music/original.mp3",
"music_info": { "id": "700000000", "title": "original sound", "author": "creator_name" },
"play_count": 542000,
"digg_count": 61200,
"comment_count": 3140,
"share_count": 8900,
"download_count": 1200,
"collect_count": 15300,
"create_time": 1768383600,
"anchors": null,
"anchors_extras": null,
"is_ad": false,
"commerce_info": null,
"commercial_video_info": null,
"item_comment_settings": 0,
"mentioned_users": "",
"author": {
"id": "6800000000000000000",
"unique_id": "creator_name",
"nickname": "Creator Name",
"avatar": "https://p16-sign.tiktokcdn.com/avatar.jpeg"
},
"is_nff_or_nr": false,
"is_top": 0,
"publishedAt": "2026-01-14T08:00:00Z",
"videoUrl": "https://www.tiktok.com/@creator_name/video/7300000000000000000",
"profileUrl": "https://www.tiktok.com/@creator_name",
"hashtagUrl": "https://www.tiktok.com/tag/dance"
}
}

hashtagUrl is added only on hashtag-sourced videos, musicUrl only on music-sourced videos. Any raw field returned by the upstream API that isn't in the list above is still carried through unmodified.

Output for profiles

user_info records pass through the profile-info endpoint's response, with profileUrl filled in when missing and scrapedAt stamped by the Actor. The commonly present fields, as documented in the dataset's own Users view:

{
"section": "users",
"category": "user_info",
"input": "https://www.tiktok.com/@taylorswift",
"user": "taylorswift",
"userType": "unique_id",
"data": {
"id": "6800000000000000000",
"unique_id": "taylorswift",
"nickname": "Taylor Swift",
"avatar": "https://p16-sign.tiktokcdn.com/avatar.jpeg",
"signature": "",
"stats": {
"followerCount": 45000000,
"followingCount": 0,
"heartCount": 320000000,
"videoCount": 42
},
"bioLink": { "link": "taylorswift.com" },
"ins_id": "taylorswift",
"twitter_id": "taylorswift13",
"youtube_channel_id": "",
"profileUrl": "https://www.tiktok.com/@taylorswift",
"scrapedAt": "2026-08-01T12:00:00Z"
}
}

Followers and following list items, and search results, are passed through from the upstream endpoint largely as-is — the Actor does not remap their fields, only wraps them in the same envelope.

Schema stability and export options

The envelope (section/category/input/user/userType/data) and the field order inside data for comments and videos are fixed by the Actor's own code, so they stay stable across runs even as TikTok's front end changes — the Actor talks to a JSON API, not the rendered page. Fields TikTok's API adds that the Actor doesn't explicitly name are still carried through on data rather than dropped, so a schema change upstream shows up as a new key, not a missing one. Results are stored in the Apify dataset and can be exported from the Console or the API as JSON, CSV, Excel, XML, RSS or HTML — standard Apify dataset export formats, not a feature specific to this Actor.


💡 TikTok Scraper Strategy Guide

🎯 Strategy 1: Real-time comment enrichment pipeline

Trigger a run whenever a tracked video publishes or crosses an engagement threshold: pass its URL in videoUrlsComments with aiSentimentEnabled: true. As comments are pushed live to the dataset, each carries text, digg_count, and — once classified — sentiment/topic/toxicity. Poll the dataset via the API and write rows where toxicity != "none" to a moderation queue, or rows with isTopComment: true to a "top reactions" feed, without waiting for the whole run to finish.

🎯 Strategy 2: Scheduled monitoring and alerting

Use an Apify Schedule to re-run the Actor against the same videoUrlsComments or hashtags list on a cron interval. Diff consecutive runs' datasets on id (new comments), digg_count (rising reactions) and, with AI on, sentiment — alert when the share of negative comments on a tracked video jumps between runs, or when a previously-unranked comment's topCommentRank newly appears.

🎯 Strategy 3: Bulk comment dataset build

Feed a long list of video URLs into videoUrlsComments with scrapeAllComments/scrapeAllReplies for full coverage, and minCommentDiggCount/excludeCommentKeywords to keep the dataset relevant. The Actor's queued sources are processed one at a time within a single run (documented CONCURRENCY = 1 in the source) — for a very large list, split it across a handful of parallel Actor runs instead of one giant run, then aggregate every run's dataset export to CSV or a database.

Strategy comparison at a glance

StrategyBest forRun patternOutput format
Real-time enrichmentReacting to comments as they arriveSingle run, live dataset pollingJSON via API
Scheduled monitoringTracking sentiment/engagement drift over timeApify Schedule, recurring runsJSON/CSV diffed between runs
Bulk dataset buildLarge one-off research or training datasetsSeveral parallel runs, list splitCSV / database export

ScraperWhat it extracts
TikTok Shop Data Scraper & Seller Profile ScraperTikTok Shop products, pricing and seller profiles
TikTok Trending Creator Insights Scraper Across Every CountryTrending creators swept across multiple country markets
Threads Search Post Scraper With Engagement AnalyticsThreads posts and engagement analytics — the same audience-reaction use case on a different platform
Reddit Subreddit Members Scraper With User ProfilesActive subreddit participants with profile cards — cross-platform audience intelligence
YouTube Video Scraper by Hashtag with Full DescriptionsHashtag-based video discovery on YouTube — an adjacent use case to this Actor's hashtag-video collection

How to integrate TikTok Scraper with your stack

TikTok Scraper works with any language or tool that can make an HTTP request to the Apify API, or use the official Apify SDKs.

Python

from apify_client import ApifyClient
import csv
client = ApifyClient("<YOUR_APIFY_TOKEN>")
video_urls = [
"https://www.tiktok.com/@user/video/7300000000000000001",
"https://www.tiktok.com/@user/video/7300000000000000002",
]
run = client.actor("your-apify-username/tiktok-data-scraper-comments-replies-and-ai-sentiment").call(
run_input={
"videoUrlsComments": video_urls,
"commentsPerUrl": 100,
"minCommentDiggCount": 5,
"aiSentimentEnabled": True,
"aiModel": "claude-haiku-4-5",
"aiApiKey": "<YOUR_AI_PROVIDER_KEY>",
}
)
with open("comments.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["video", "text", "digg_count", "sentiment", "isTopComment"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("category") in ("comments", "replies"):
d = item["data"]
writer.writerow([item["user"], d.get("text"), d.get("digg_count"),
d.get("sentiment"), d.get("isTopComment")])

Node.js

import { ApifyClient } from 'apify-client';
import fs from 'fs';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('your-apify-username/tiktok-data-scraper-comments-replies-and-ai-sentiment').call({
videoUrlsComments: ['https://www.tiktok.com/@user/video/7300000000000000001'],
commentsPerUrl: 100,
topCommentsCount: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const rows = items
.filter((item) => item.category === 'comments' || item.category === 'replies')
.map((item) => `${item.user},${item.data.text},${item.data.digg_count},${item.data.isTopComment}`);
fs.writeFileSync('comments.csv', ['video,text,digg_count,isTopComment', ...rows].join('\n'));

Async and scheduled pipelines

For a fire-and-forget large job, start the run via the API without waiting on it (client.actor(...).start() instead of .call()) and poll the run or dataset later. For recurring collection, use an Apify Schedule to trigger the Actor on a cron interval with the same input, and read each run's dataset from your own service afterward.


🎯 Who Needs TikTok Scraper? (Use Cases & Industries)

🏢 Brand and marketing teams

A brand tracking a campaign hashtag or a paid creator's video pulls text, digg_count, sentiment and topic per comment to gauge real audience reaction, and pulls isTopComment/topCommentRank to surface the reactions worth responding to publicly, instead of scrolling a comment section by hand.

📊 Analysts and data teams

Analysts feed a list of competitor or category videos into videoUrlsComments, export the dataset to CSV or a warehouse, and track digg_count, comment_count and AI sentiment distributions over time as a lightweight engagement and reception benchmark across creators or campaigns.

📱 Competitive intelligence teams

Monitoring a competitor's hashtag or music-track usage (hashtags, musicUrls) alongside its comment sentiment shows not just how much reach a competitor's content is getting (play_count, share_count) but how their audience is actually reacting to it.

🔬 Researchers

Academic and market researchers use hashtagRegion and the commenter-audience fields (region, verified, follower_count) to build region-segmented studies of public TikTok discourse, working only from publicly accessible comment and profile data.

🎥 Product and SaaS builders

Social-listening dashboards and brand-safety tools schedule this Actor's runs and build their own UI on top of the typed comment/reply/sentiment dataset, instead of writing and maintaining their own TikTok request-signing, pagination and Cloudflare-challenge-handling code.


Scraping publicly accessible TikTok data is generally lawful in the United States; the specific legal risk with this kind of scraping is contractual (TikTok's Terms of Service), not criminal.

Scraping public data. In hiQ Labs, Inc. v. LinkedIn Corp., 938 F.3d 985 (9th Cir. 2019), the Ninth Circuit held that scraping data from a publicly accessible website does not, by itself, violate the U.S. Computer Fraud and Abuse Act's "unauthorized access" provision. That reasoning is specific to public data and to that circuit — it is not a blanket legal clearance for every jurisdiction or every use of scraped data.

Terms of Service. TikTok's Terms of Service restrict automated data collection. Violating a platform's Terms is a matter of civil contract law between the platform and the account involved, not a criminal offense, but it can still carry consequences (such as account or IP-level enforcement).

Data protection. This Actor's comment, reply and profile records include personal data about identifiable individuals — usernames, nicknames, bios and follower counts of ordinary commenters, not just aggregate content metrics. If you store or process this data, GDPR (EU), CCPA (California) or equivalent data-protection law in your jurisdiction may apply depending on who you are, where your users are, and what you do with the data.

TikTok Scraper returns only publicly accessible data. What you do with that data is your responsibility — consult legal counsel for commercial applications involving personal data.


❓ Frequently asked questions

Does TikTok Scraper work without a TikTok account?

Yes. The Actor never logs in or authenticates as a TikTok user for any input type — it queries TikTok's public-data mirror, and its fallback path for blocked profile-video requests only opens an anonymous, logged-out browser session. No TikTok account or cookie is ever required.

How does TikTok Scraper handle TikTok's anti-scraping measures?

It starts every run on a direct connection and automatically escalates to a datacenter, then a residential, proxy the moment a request is blocked or rate-limited, sticking with residential once it engages. Every request is paced by a configurable minimum interval (minRequestInterval, default 1.2s) and retried up to maxRetries times with backoff. For the one route that hits a persistent Cloudflare challenge (a user's own video feed), the Actor falls back to a slower, direct-to-tiktok.com headless-browser route instead of a plain retry.

Can I run TikTok Scraper at scale without getting blocked?

⚠️ The Actor processes its queued input sources (profiles, videos, hashtags, music, playlists) one at a time within a run — concurrency is fixed at 1 in the current build, and the default request pacing targets roughly one request per second against the public data source. For large lists, split your input across several parallel Actor runs rather than one very large run. There is no published uptime or success-rate guarantee for this Actor.

How fresh is the data TikTok Scraper returns?

Every run fetches live from TikTok's public data source at request time — there is no caching layer in the code. Each record is stamped with scrapedAt at the moment it was collected during that specific run.

Does scraping TikTok comments violate the Computer Fraud and Abuse Act?

Not for public data, per hiQ Labs, Inc. v. LinkedIn Corp., 938 F.3d 985 (9th Cir. 2019) — the Ninth Circuit held that accessing publicly available website data isn't "unauthorized access" under the CFAA. This does not clear Terms-of-Service risk or apply outside that circuit's reasoning.

Which TikTok fields work best for AI training and RAG indexing?

For RAG, index comment/reply text together with the AI sentiment/topic labels (when enabled) so retrieval carries audience-reaction context, not just raw text. For training data, digg_count, reply_total, isReply and the commenter-audience fields (follower_count, verified) are the most consistently structured numeric/boolean fields across every comment record. Every field returns as a typed primitive — no normalization needed before passing it into a model context window.

Does TikTok Scraper collect personal data, and who is responsible for it?

Yes — comment and profile records include personal data about identifiable TikTok users (usernames, nicknames, bios, follower counts). The Actor only returns data TikTok already makes publicly accessible; the lawful basis for storing, processing or otherwise using that data sits with you, the user of the Actor.

Does TikTok Scraper work with Claude, ChatGPT and other AI agent tools?

There is no dedicated MCP server for this Actor. It is callable as a standard HTTP endpoint by any agent framework via the Apify API or the apify_client/apify-client SDKs, and every response is already typed JSON — no HTML parsing step needed before an agent consumes it.

What happens if AI sentiment analysis fails or my API key is wrong?

The run keeps going and every comment/reply still saves normally. On any AI failure — missing key, network error, or a response the Actor can't parse — the affected sentiment/topic/toxicity/language fields are left null and a warning is logged. Nothing is ever guessed or fabricated in those fields.

How does this variant differ from a plain TikTok video/profile scraper?

A plain TikTok video or profile scraper stops at the raw video/profile record. This variant is built specifically for the comment layer: it promotes commenter-audience fields to first-class columns, ranks top comments, filters low-value comments before spending on AI, and optionally classifies sentiment/topic/toxicity/language — while still covering the same profile, video, hashtag, music and playlist categories as a general-purpose TikTok scraper.


ℹ️ Disclaimer

TikTok Scraper: Comments, Replies & AI Sentiment extracts only publicly available data from TikTok. This tool is intended for lawful use cases only. Users are responsible for complying with TikTok's Terms of Service and applicable data protection laws in their jurisdiction.