TikTok Comments Scraper: Top Comments By Language
Pricing
from $3.99 / 1,000 results
TikTok Comments Scraper: Top Comments By Language
TikTok Comments Scraper — Scrape TikTok video comments and filter top comments by language. Extract comment text, authors, likes, replies, timestamps, and language data to analyze audience sentiment, engagement, trends, and multilingual communities.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
TikTok Comments Scraper — Comments, Replies & Language Breakdown
TikTok Comments Scraper: Top Comments By Language pulls comments and replies from any public TikTok video and tags every single row with commentLanguage and a readable languageName — TikTok's own classification, not a guess. Keep or drop languages with a filter, and get a per-language rollup: share of comments, distinct commenters, total likes and the top-liked comment in each language. Unlike scrapers that hand back one undifferentiated pile of text, this one returns typed JSON rows ready for a database, a dashboard, or an LLM context window without any parsing. No TikTok account, login or cookie is required to run it. This guide covers every input and output field plus how teams deploy it for localization, sentiment work and creator vetting.
What Does TikTok Comments Scraper Do?
TikTok Comments Scraper reads a public TikTok video's comment section through TikTok's own comment API and returns three kinds of row: top-level comments, their replies, and a per-language summary computed from what was collected. No TikTok account, login, cookie or API key is needed for any of it — the video URL is enough. An optional API key from an external AI provider (Anthropic, OpenAI, Google, xAI, DeepSeek, Perplexity or Mistral) unlocks translation and sentiment enrichment, but the Actor works fully without one.
- Reads comments and replies from a full video URL, a
vm.tiktok.com/vt.tiktok.comshort link, or a bare numeric video ID - Attaches TikTok's own language code and name to every comment and reply
- Filters the comment set to keep or exclude specific languages, including a free-text field for codes not in the preset list
- Builds a per-language rollup — share of comments, distinct commenters, total likes, total replies and the top comment — per video, for the whole run, or both
- Paginates reply threads to the number you ask for, instead of stopping at the platform's default page
- Resolves a creator username to their recent videos when you would rather supply a profile than a list of URLs
- Deduplicates comments by comment ID before a row is ever written, so a repeated page never produces a repeated (or billed) row
Features & Capabilities
TikTok Comments Scraper's feature set splits into three groups: what it extracts, how it compares to the established TikTok comment scrapers, and where it sits inside the rest of the Scrapio TikTok lineup.
Core features
- Per-comment language tagging — every comment and reply carries
commentLanguage(TikTok's own code, e.g.en,es,ar,un) andlanguageName(a readable name resolved from that code) - Include/exclude language filtering —
languagespluslanguageFilterModekeep only the languages you want, or drop them, across 33 preset codes plus any code typed intoextraLanguageCodes - Per-language breakdown rows —
type: "language_summary"rows carryingsharePercent,distinctCommenters,totalLikes,totalRepliesand the top-liked comment (topCommentText,topCommentLikes,topCommentUniqueId,topCommentLink) per language, scoped per video, per run, or both - Real reply pagination —
maxRepliesPerCommentis honored by paging a reply thread (20 replies per page) until your number is reached or the thread runs out, not by slicing the first page - Creator-profile video discovery — supply
creatorProfilesusernames instead of URLs and the Actor finds their recent videos first - Optional AI enrichment —
aiTextEnglish,aiSentimentandaiTopicadded per comment whenaiEnhancementis on, across 14 selectable models from 7 providers - Legacy input compatibility — every input key from the original TikTok Comments Scraper (
postURLs,commentsPerPost,profiles,resultsPerPage,profileScrapeSections,profileSorting,oldestPostDateUnified,newestPostDate,excludePinnedPosts) is still accepted and takes priority over its renamed counterpart, so an existing integration's input JSON keeps working unchanged
How TikTok Comments Scraper compares to other TikTok comment scrapers
Checked on the Apify Store on 26 July 2026.
| Feature | TikTok Comments Scraper (this Actor) | clockworks/tiktok-comments-scraper | apidojo/tiktok-comments-scraper |
|---|---|---|---|
| Per-comment language code | commentLanguage + languageName on every row | Not documented in their listing | commentLanguage shown in their sample output |
| Keep/drop comments by language | Yes — languages + languageFilterMode, include or exclude | Not documented | Not documented |
| Per-language rollup (share, top comment, likes) | Yes — dedicated language_summary rows | Not documented | Not documented |
| Reply pagination | Paged to your requested count | maxRepliesPerComment accepted; paging depth not documented | Boolean includeReplies only — their own FAQ notes replies "may not always come through as expected" |
| AI translation / sentiment enrichment | Optional, 14 models across 7 providers | Not documented | Not documented |
| Legacy input key compatibility | Original key names still accepted | — | — |
If your use case is feeding structured data to an LLM, the language-tagging row is the decision-maker — a scraper that hands back untagged text forces you to run your own language detection before you can even route the comment, which is a reliability failure mode inside an agent loop, not a missing nice-to-have.
When another tool might suit you better
itayekk1/tiktok-comments-scraper-lite is the better fit when you only need a small, free sample of top-level comments from known video URLs and don't need replies, language data, or a per-language rollup at all — its listing states plainly that it does not collect replies in its current version and has no language handling. For that narrow job, a lite free Actor is less setup than a fuller one.
TikTok Comments Scraper within the Scrapio data stack
TikTok Comments Scraper covers comments, replies and language breakdowns for videos you already have or creators you name. For hashtag and sound analytics on a creator's own catalogue, use TikTok Profile Scraper With Hashtag & Sound Analytics. For trending-hashtag discovery and the videos driving each one, use Tiktok Trending Hashtags Analytics Scraper & Top Videos or the narrower TikTok Trending Hashtags Scraper. For subtitle and transcript extraction from the videos themselves, use Tiktok Video Scraper With Subtitles & Transcript.
Why do developers and data teams scrape TikTok comments?
🏢 Localization and international marketing teams
A brand running one video across multiple markets needs to know which languages actually showed up in the reaction before deciding where to route moderation or ad spend. Feed videoUrls in, leave languages empty to see everything, and read languageName and sharePercent per language straight off the breakdown row — no manual sorting of a mixed-language comment thread by eye. A community team can then set languages: ["es"] with languageFilterMode: "include" to pull only the Spanish comments and hand that filtered set to a Spanish-speaking moderator.
📊 AI training data and RAG indexing
text paired with languageName and commentLanguage is the field combination that makes this data usable for multilingual NLP without a separate classification pass. For RAG enrichment, index text alongside languageName so retrieval can be scoped to a language before ranking. For training data, commentLanguage, diggCount and isUndeterminedLanguage are the most structurally consistent fields across every row, letting you build a labeled multilingual sentiment or topic-classification set without running your own language ID model first.
📱 Competitive and market intelligence
Track how a competitor's comment section shifts in language mix after a campaign change by re-running the same videoUrls and diffing sharePercent per commentLanguage between runs. A jump in a language's share, or a change in which comment sits at topCommentText, is a concrete signal that a new audience segment is engaging — trackable without reading the raw comment stream manually.
🔬 Research and academic use
Multilingual comment corpora with an honest language tag (including the un undetermined bucket, rather than folding it into an "other" catch-all) suit sentiment, linguistics or platform-behavior research built entirely on publicly visible data. Set a wide maxCommentsScanned when the research question needs a specific under-represented language.
🎥 Product and SaaS development
Building a moderation queue, a localization-routing tool, or a creator-analytics dashboard on top of TikTok data can use commentLanguage as the routing key directly, instead of shipping a language-detection dependency inside your own product.
🍚 Input Parameters
All 30 input keys, in schema order. The first 20 are this Actor's own schema; the remaining 10 are legacy aliases kept for input compatibility with the original TikTok Comments Scraper — see the note below the table.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
videoUrls | No | array | Video URLs to read comments from. Full URLs, vm./vt. short links and bare video IDs all work. | ["https://www.tiktok.com/@mrbeast/video/7578547467189374239"] |
maxCommentsPerVideo | No | integer | How many comment rows to keep per video, after the language filter. Minimum 1, default 10. | 50 |
maxRepliesPerComment | No | integer | Replies per comment, attached in the replies array. A real, paginated limit, not a fixed page cap. Minimum 0, default 3. Set 0 to skip replies. | 10 |
deepReplyPaging | No | boolean | On: pages a reply thread (20/page) until the reply limit is met. Off: reads only the first page, capping every thread at 20. Default true. | true |
languages | No | array | Language codes to keep — leave empty to keep every language. Select list of 33 codes including un (Undetermined). | ["es", "ar", "un"] |
extraLanguageCodes | No | array | Any code not in the preset list, e.g. ceb, ht, zh-hant. Matched exactly against TikTok's own value, lower-cased. | ["ceb", "ht"] |
languageFilterMode | No | string | include (keep only the selected languages) or exclude (drop them). Ignored when no language is selected. Default include. | "include" |
maxCommentsScanned | No | integer | Comments that may be read while searching for matches. Minimum 0, default 0 (auto = 20× the keep limit, minimum 500). | 1000 |
languageBreakdownOutput | No | string | Where breakdown rows go: both (main + separate dataset), main, separate, or off. Default "both". | "both" |
languageBreakdownScope | No | string | perVideo, perRun, or both. Default "perVideo". | "perVideo" |
creatorProfiles | No | array | TikTok usernames, without the @. Leave empty when supplying videoUrls. | ["mrbeast"] |
videosPerCreator | No | integer | Videos to pull comments from, per username. Minimum 1, maximum 1000000, default 10. | 20 |
creatorSections | No | array | Profile tabs to read: videos, reposts. Minimum 1 item, default ["videos"]. | ["videos"] |
creatorVideoOrder | No | string | latest (newest first), oldest, or popular (most liked). Date filters apply to newest/oldest only. Default "latest". | "latest" |
videosPublishedAfter | No | string | Absolute (2026-01-31) or relative (3 months, 2 weeks) date. | "3 months" |
videosPublishedBefore | No | string | Absolute (2026-06-30) or relative (7 days, 1 month) date. | "7 days" |
skipPinnedVideos | No | boolean | Skip pinned videos, which sit at the top of a profile and are often old. Default false. | false |
aiEnhancement | No | boolean | Adds aiTextEnglish, aiSentiment, aiTopic and aiStatus to each comment row. Requires a provider API key. Default false. | false |
aiModel | No | string | Model/provider — auto-detected from the name prefix. 14 options across Anthropic, OpenAI, Google, xAI, DeepSeek, Perplexity and Mistral. Default "claude-haiku-4-5". | "claude-haiku-4-5" |
aiApiKey | No | string (secret) | API key for the detected provider. Masked in the Apify Console. Falls back to the matching environment variable (ANTHROPIC_API_KEY, OPENAI_API_KEY, GOOGLE_API_KEY, XAI_API_KEY, DEEPSEEK_API_KEY, PERPLEXITY_API_KEY, MISTRAL_API_KEY) if left empty. | (not shown — secret field) |
postURLs | No | array | Legacy alias for videoUrls. Takes priority when present. | [] |
commentsPerPost | No | integer | Legacy alias for maxCommentsPerVideo. Minimum 1, no schema default. | — |
profiles | No | array | Legacy alias for creatorProfiles. | [] |
resultsPerPage | No | integer | Legacy alias for videosPerCreator. Minimum 1, maximum 1000000, no schema default. | — |
profileScrapeSections | No | array | Legacy alias for creatorSections. | ["videos"] |
profileSorting | No | string | Legacy alias for creatorVideoOrder. Enum latest/popular/oldest. | — |
oldestPostDateUnified | No | string | Legacy alias for videosPublishedAfter. | — |
newestPostDate | No | string | Legacy alias for videosPublishedBefore. | — |
excludePinnedPosts | No | boolean | Legacy alias for skipPinnedVideos. | — |
proxyConfiguration | No | object | Apify Proxy settings. Starts with no proxy; escalates automatically if TikTok blocks a request. | {"useApifyProxy": false} |
No parameter is required — an empty input still needs either videoUrls (or its alias postURLs) or creatorProfiles (or profiles) to have something to scrape; the Actor logs an error and exits cleanly if neither is supplied.
Example input
{"videoUrls": ["https://www.tiktok.com/@mrbeast/video/7578547467189374239"],"maxCommentsPerVideo": 100,"maxRepliesPerComment": 5,"deepReplyPaging": true,"languages": ["en", "es", "ar", "un"],"languageFilterMode": "include","maxCommentsScanned": 2000,"languageBreakdownOutput": "both","languageBreakdownScope": "perVideo","skipPinnedVideos": false,"aiEnhancement": false,"proxyConfiguration": { "useApifyProxy": false }}
Supported URL types and input formats
- Full video URL —
https://www.tiktok.com/@mrbeast/video/7578547467189374239 - Short link —
https://vm.tiktok.com/ZMxxxxxx/orhttps://vt.tiktok.com/ZSxxxxxx/, resolved by following the redirect before extracting the video ID - Bare video ID — a 6-to-25-digit numeric string on its own, e.g.
7578547467189374239 - Creator username — under
creatorProfiles/profiles, without the@, e.g.mrbeast— the Actor resolves this to a list of that creator's recent video URLs before scraping comments
videoUrls/postURLs always wins when both a video list and a creator profile are supplied in the same run.
📦 Output Format
Every run produces typed, normalized JSON — the same field names on every run, told apart by the type column. Comment and reply rows are billed per the row_result charged event; language-summary rows are never charged, because they are computed from comments already collected rather than fetched separately. Duplicate comments (the same cid seen again across pages) are discarded before a row is ever built, so a re-fetched page is never billed twice. Export as JSON, CSV, Excel, XML or HTML from the Apify Console, or read the dataset through the Apify API.
Output for a comment
{"videoWebUrl": "https://www.tiktok.com/@mrbeast/video/7578547467189374239","submittedVideoUrl": "https://www.tiktok.com/@mrbeast/video/7578547467189374239","input": "https://www.tiktok.com/@mrbeast/video/7578547467189374239","cid": "7399984975553086214","createTime": 1723027276,"createTimeISO": "2024-08-07T09:21:16.000Z","text": "this is wild, sending to my whole group chat","diggCount": 246,"likedByAuthor": false,"pinnedByAuthor": false,"repliesToId": null,"replyCommentTotal": 3,"uid": "6904063862041396225","uniqueId": "rizqirxq","avatarThumbnail": "https://p77-sign-va.tiktokcdn.com/tos-maliva-avt-0068/5e2902b2db8018cbbde7a1aed077a35a~c5_100x100.jpg","mentions": [],"commentLanguage": "en","languageName": "English","isUndeterminedLanguage": false,"type": "comment","isReply": false,"isChild": false,"parentCid": null,"commentLink": "https://www.tiktok.com/@mrbeast/video/7578547467189374239/comment/7399984975553086214","videoId": "7578547467189374239","secUid": "MS4wLjABAAAA...","commenterProfileUrl": "https://www.tiktok.com/@rizqirxq","videoTotalComments": 41230,"isHighPurchaseIntentFlag": false,"scrapedAt": "2026-07-25T14:03:11.000Z","replies": [{"videoWebUrl": "https://www.tiktok.com/@mrbeast/video/7578547467189374239","submittedVideoUrl": "https://www.tiktok.com/@mrbeast/video/7578547467189374239","input": "https://www.tiktok.com/@mrbeast/video/7578547467189374239","cid": "7399985112233086214","createTime": 1723027400,"createTimeISO": "2024-08-07T09:23:20.000Z","text": "same lol","diggCount": 12,"likedByAuthor": false,"pinnedByAuthor": false,"repliesToId": "7399984975553086214","replyCommentTotal": 0,"uid": "7012345678901234567","uniqueId": "another_user","avatarThumbnail": "https://p16-sign-va.tiktokcdn.com/tos-maliva-avt-0068/example~c5_100x100.jpg","mentions": [],"commentLanguage": "en","languageName": "English","isUndeterminedLanguage": false,"type": "reply","isReply": true,"isChild": true,"parentCid": "7399984975553086214","commentLink": null,"videoId": "7578547467189374239","secUid": "MS4wLjABAAAA...","commenterProfileUrl": "https://www.tiktok.com/@another_user","videoTotalComments": 41230,"isHighPurchaseIntentFlag": false,"scrapedAt": "2026-07-25T14:03:11.000Z"}]}
aiTextEnglish, aiSentiment, aiTopic and aiStatus are added to this same row only when aiEnhancement is true; with it off, none of the four keys is present at all. Reply rows carry every field above except replies itself — a reply cannot nest further replies.
Output for a language breakdown
{"type": "language_summary","isChild": true,"isReply": false,"scope": "video","commentLanguage": "es","languageName": "Spanish","isUndeterminedLanguage": false,"commentCount": 34,"sharePercent": 16.27,"distinctCommenters": 31,"totalLikes": 1904,"totalReplies": 12,"topCommentText": "esto es una locura jajaja","topCommentLikes": 340,"topCommentUniqueId": "usuario_es","topCommentLink": "https://www.tiktok.com/@mrbeast/video/7578547467189374239/comment/7399985998877086214","topCommentCid": "7399985998877086214","languageRank": 2,"analysedComments": 209,"videoWebUrl": "https://www.tiktok.com/@mrbeast/video/7578547467189374239","videoId": "7578547467189374239","scrapedAt": "2026-07-25T14:03:12.000Z"}
A run-scoped breakdown row is identical except scope is "run" and videoWebUrl/videoId are null, since it summarizes every video in the run together rather than one.
Schema stability and export options
Field names stay stable across runs and across a TikTok front-end redesign, because the Actor reads TikTok's comment API response directly rather than parsing rendered HTML. The aiTextEnglish/aiSentiment/aiTopic/aiStatus keys are the one schema variation, and they appear only when aiEnhancement is on. Every dataset supports JSON, CSV, Excel (XLSX), XML and HTML export from the Apify Console, plus programmatic access through the Apify API and apify-client. The language-breakdown dataset (when languageBreakdownOutput includes separate) and a language-breakdown.json key-value store entry are additional, non-billed copies of the same summary rows.
💡 TikTok Comments Scraper Strategy Guide
🎯 Strategy 1: Real-time enrichment pipeline
Trigger a run whenever a new video needs monitoring — a webhook, a Make/Zapier scenario, or a manual kick-off. Pass the video's videoUrls and set languages to your target markets. As soon as the run finishes, read commentLanguage, languageName and (if aiEnhancement is on) aiSentiment per row, then write them into your CRM or support queue so a Spanish-language complaint routes to a Spanish-speaking agent without a human reading the whole thread first.
🎯 Strategy 2: Scheduled monitoring and alerting
Set an Apify schedule (a cron expression on the Actor) to re-run the same creatorProfiles or videoUrls weekly. Diff sharePercent per commentLanguage between the current and previous language_summary rows — a language's share moving more than a few points signals a real audience shift, not noise. Alert on that delta rather than on raw comment volume, since volume alone doesn't tell you which market moved.
🎯 Strategy 3: Bulk dataset build
For a research or training corpus, pass a large videoUrls array in a single run. The Actor processes up to 10 videos concurrently within that run, so a hundred-video list completes as ten waves of ten rather than one at a time. Aggregate the resulting comment and reply rows across every video, then export the whole dataset to CSV or pull it via the Apify API into your own database.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | Routing incoming comments to the right team | On-demand run per new video | Dataset row, read immediately after run finishes |
| Scheduled monitoring | Detecting a language-mix or sentiment shift over time | Apify schedule, recurring | language_summary rows diffed run-over-run |
| Bulk dataset build | Research or training corpora across many videos | One run, large videoUrls list, concurrent processing | Full dataset exported to CSV/JSON |
🌴 Related TikTok Scrapers & Tools
| Scraper Name | What it extracts |
|---|---|
| TikTok Profile Scraper With Hashtag & Sound Analytics | Creator videos with hashtag, mention and sound entities ranked by engagement |
| Tiktok Trending Hashtags Analytics Scraper & Top Videos | Trending hashtag rank, views and the top videos driving each one |
| TikTok Trending Hashtags Scraper | Trending hashtags for 72 countries with rank, category, post and view figures |
| Tiktok Video Scraper With Subtitles & Transcript | Video metadata plus subtitle and transcript text |
| Instagram Comment Sentiment Scraper | Same entity type — comments — on Instagram, with built-in sentiment |
How to integrate TikTok Comments Scraper with your stack
TikTok Comments Scraper works with any language or tool that can make an HTTP request, through the Apify API.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<YOUR_USERNAME>/tiktok-comments-scraper-top-comments-by-language").call(run_input={"videoUrls": ["https://www.tiktok.com/@mrbeast/video/7578547467189374239"],"maxCommentsPerVideo": 100,"languages": ["en", "es"],"languageFilterMode": "include",})rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())comments = [r for r in rows if r.get("type") == "comment"]with open("tiktok_comments.csv", "w", newline="", encoding="utf-8") as f:writer = csv.writer(f)writer.writerow(["languageName", "uniqueId", "text", "diggCount"])for c in comments:writer.writerow([c["languageName"], c["uniqueId"], c["text"], c["diggCount"]])print(f"Saved {len(comments)} comments across {len({c['commentLanguage'] for c in comments})} languages")
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('<YOUR_USERNAME>/tiktok-comments-scraper-top-comments-by-language').call({videoUrls: ['https://www.tiktok.com/@mrbeast/video/7578547467189374239'],maxCommentsPerVideo: 100,languages: ['en', 'es'],languageFilterMode: 'include',});const { items } = await client.dataset(run.defaultDatasetId).listItems();const breakdown = items.filter((r) => r.type === 'language_summary');for (const row of breakdown) {console.log(`${row.languageName}: ${row.sharePercent}% (${row.commentCount} comments)`);}
Async and scheduled pipelines
For fire-and-forget large jobs, start the run through the API without waiting on .call(), poll client.run(runId).get() for status, then read the dataset once it reports SUCCEEDED. For recurring jobs, set an Apify schedule directly on the Actor with a cron expression — no separate scheduler needed. Apify webhooks can also fire on ACTOR.RUN.SUCCEEDED to notify your own endpoint the moment a run's data is ready, instead of polling.
Who Needs TikTok Comments Scraper? (Use Cases & Industries)
🏢 Localization and community management teams
Filter languages to a single market and route only that language's comments to the moderator who speaks it, instead of a bilingual moderator scanning a mixed thread by eye for the comments that are actually theirs to answer.
📊 Data science and BI teams
Export commentLanguage, diggCount and sharePercent straight into a BI tool or a sentiment model — every field arrives as a typed primitive, so no cleaning pass is needed before the data hits a pipeline or a dashboard.
📱 Marketing and campaign strategists
Compare sharePercent across languages before and after a campaign push to see which market segment actually engaged, rather than assuming engagement is evenly distributed across a video's audience.
🔬 Researchers
Multilingual comment datasets with an honest un (undetermined) bucket, rather than a folded-in "other" catch-all, suit sentiment and linguistics research built on public data only.
🎥 Influencer vetting and talent teams
Check whether a creator's comment section is genuinely reaching your target-language audience — sharePercent for the wrong language dominating a video is a concrete red flag before a sponsorship commitment, not a guess based on follower count alone.
Is it legal to scrape TikTok comments?
Scraping publicly accessible web data is broadly permissible in the United States — hiQ Labs v. LinkedIn (9th Circuit, 2019) held that accessing data with no login wall does not violate the Computer Fraud and Abuse Act. TikTok Comments Scraper reads only comments and profile fields already visible to any logged-out visitor on the video page; no login, cookie or private content is accessed.
Violating TikTok's Terms of Service through automated collection is a contractual matter between the account holder and TikTok, not a criminal one — the risk is account or access restriction, not prosecution.
Comment text is paired with a public username, avatar and profile link, which is personal data under GDPR and CCPA even though it was voluntarily posted in public. TikTok Comments Scraper does not collect private data, email addresses, phone numbers, or anything gated behind a login — only what TikTok already shows an anonymous visitor. TikTok Comments 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 Comments Scraper work without a TikTok account?
Yes. No account, login, cookie or API key is required for comments, replies or the language breakdown. The only credential this Actor ever needs is your Apify token to run it, plus — only if you switch on aiEnhancement — an API key from one of seven external AI providers.
How does TikTok Comments Scraper handle TikTok's anti-scraping measures?
Requests start with no proxy. If TikTok blocks a request, the Actor escalates to a datacenter proxy, then to a residential proxy across up to three attempts, keeping a successful session sticky and reusing it until it stops working. Responses are inspected by size as well as status code — a 200 response with a 0-byte body is treated as a signed-endpoint refusal, and a 200 with an unparseable body is treated as a challenge page — so a soft block is caught rather than silently parsed into an empty result. Failed requests retry with exponential backoff.
Can I run TikTok Comments Scraper at scale without getting blocked?
Videos are processed up to 10 at a time concurrently within a single run, and reply threads up to 10 at a time per video, both fixed Actor behaviors rather than user-configurable limits. Beyond that, scaling relies on the proxy escalation described above rather than a documented uptime or success-rate figure — none is published for this Actor.
How fresh is the data TikTok Comments Scraper returns?
Live. Every run fetches comments directly from TikTok's comment API at run time; nothing is served from a cache.
Am I charged for duplicate or breakdown rows?
No. Comments are deduplicated by comment ID before a row is ever built, so a comment seen again on a re-fetched page is silently skipped and never billed. Language-breakdown rows (type: "language_summary") are computed from comments already collected and pushed without the row_result charged event, so they cost nothing beyond the comment rows they summarize.
Which TikTok comment fields work best for AI training and RAG indexing?
For RAG: index text alongside languageName so retrieval can be scoped by language before ranking. For training data: commentLanguage, diggCount, replyCommentTotal and isUndeterminedLanguage are the most structurally consistent fields across every row. All fields return as typed primitives — strings, integers, booleans — with no normalization pass required.
Is comment language detected locally, or is it TikTok's own value?
It's TikTok's own value, read straight from the comment_language field TikTok's comment API already returns on each comment — nothing is inferred or classified locally by this Actor. un is TikTok's own bucket for comments it could not classify itself (emoji-only text, very short strings), not an error state, and it gets its own row in the breakdown rather than being folded into an "other" catch-all. When TikTok sends no value at all, the field is returned as null rather than a guessed code.
Does TikTok Comments Scraper work with Claude, ChatGPT and other AI agent tools?
Yes. It is callable as a standard HTTP endpoint through the Apify API, so any agent framework that can make a request — LangChain, CrewAI, a custom tool definition — can invoke it and receive typed JSON directly, with no HTML parsing step before it reaches an LLM's context window.
How does TikTok Comments Scraper compare to other TikTok comment scrapers?
Checked on the Apify Store on 26 July 2026. clockworks/tiktok-comments-scraper is the largest and most established option and supports both video-URL and username input, but its listing does not document per-comment language tagging, language filtering, or a per-language rollup. apidojo/tiktok-comments-scraper does surface a commentLanguage field in its sample output, but does not document language filtering or a rollup either, and its own FAQ notes that replies "may not always come through as expected." TikTok Comments Scraper's difference is the language layer end to end — tagging, filtering and a computed per-language breakdown — plus reply pagination that pages to your requested count rather than a fixed page.
Disclaimer
TikTok Comments Scraper 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.