TikTok Comments Scraper: Top Comments By Language avatar

TikTok Comments Scraper: Top Comments By Language

Pricing

from $3.99 / 1,000 results

Go to Apify Store
TikTok Comments Scraper: Top Comments By Language

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

Scrapio

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

0

Monthly active users

a day ago

Last modified

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.com short 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) and languageName (a readable name resolved from that code)
  • Include/exclude language filteringlanguages plus languageFilterMode keep only the languages you want, or drop them, across 33 preset codes plus any code typed into extraLanguageCodes
  • Per-language breakdown rowstype: "language_summary" rows carrying sharePercent, distinctCommenters, totalLikes, totalReplies and the top-liked comment (topCommentText, topCommentLikes, topCommentUniqueId, topCommentLink) per language, scoped per video, per run, or both
  • Real reply paginationmaxRepliesPerComment is 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 creatorProfiles usernames instead of URLs and the Actor finds their recent videos first
  • Optional AI enrichmentaiTextEnglish, aiSentiment and aiTopic added per comment when aiEnhancement is 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.

FeatureTikTok Comments Scraper (this Actor)clockworks/tiktok-comments-scraperapidojo/tiktok-comments-scraper
Per-comment language codecommentLanguage + languageName on every rowNot documented in their listingcommentLanguage shown in their sample output
Keep/drop comments by languageYes — languages + languageFilterMode, include or excludeNot documentedNot documented
Per-language rollup (share, top comment, likes)Yes — dedicated language_summary rowsNot documentedNot documented
Reply paginationPaged to your requested countmaxRepliesPerComment accepted; paging depth not documentedBoolean includeReplies only — their own FAQ notes replies "may not always come through as expected"
AI translation / sentiment enrichmentOptional, 14 models across 7 providersNot documentedNot documented
Legacy input key compatibilityOriginal 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.

ParameterRequiredTypeDescriptionExample Value
videoUrlsNoarrayVideo URLs to read comments from. Full URLs, vm./vt. short links and bare video IDs all work.["https://www.tiktok.com/@mrbeast/video/7578547467189374239"]
maxCommentsPerVideoNointegerHow many comment rows to keep per video, after the language filter. Minimum 1, default 10.50
maxRepliesPerCommentNointegerReplies 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
deepReplyPagingNobooleanOn: 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
languagesNoarrayLanguage codes to keep — leave empty to keep every language. Select list of 33 codes including un (Undetermined).["es", "ar", "un"]
extraLanguageCodesNoarrayAny code not in the preset list, e.g. ceb, ht, zh-hant. Matched exactly against TikTok's own value, lower-cased.["ceb", "ht"]
languageFilterModeNostringinclude (keep only the selected languages) or exclude (drop them). Ignored when no language is selected. Default include."include"
maxCommentsScannedNointegerComments that may be read while searching for matches. Minimum 0, default 0 (auto = 20× the keep limit, minimum 500).1000
languageBreakdownOutputNostringWhere breakdown rows go: both (main + separate dataset), main, separate, or off. Default "both"."both"
languageBreakdownScopeNostringperVideo, perRun, or both. Default "perVideo"."perVideo"
creatorProfilesNoarrayTikTok usernames, without the @. Leave empty when supplying videoUrls.["mrbeast"]
videosPerCreatorNointegerVideos to pull comments from, per username. Minimum 1, maximum 1000000, default 10.20
creatorSectionsNoarrayProfile tabs to read: videos, reposts. Minimum 1 item, default ["videos"].["videos"]
creatorVideoOrderNostringlatest (newest first), oldest, or popular (most liked). Date filters apply to newest/oldest only. Default "latest"."latest"
videosPublishedAfterNostringAbsolute (2026-01-31) or relative (3 months, 2 weeks) date."3 months"
videosPublishedBeforeNostringAbsolute (2026-06-30) or relative (7 days, 1 month) date."7 days"
skipPinnedVideosNobooleanSkip pinned videos, which sit at the top of a profile and are often old. Default false.false
aiEnhancementNobooleanAdds aiTextEnglish, aiSentiment, aiTopic and aiStatus to each comment row. Requires a provider API key. Default false.false
aiModelNostringModel/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"
aiApiKeyNostring (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)
postURLsNoarrayLegacy alias for videoUrls. Takes priority when present.[]
commentsPerPostNointegerLegacy alias for maxCommentsPerVideo. Minimum 1, no schema default.
profilesNoarrayLegacy alias for creatorProfiles.[]
resultsPerPageNointegerLegacy alias for videosPerCreator. Minimum 1, maximum 1000000, no schema default.
profileScrapeSectionsNoarrayLegacy alias for creatorSections.["videos"]
profileSortingNostringLegacy alias for creatorVideoOrder. Enum latest/popular/oldest.
oldestPostDateUnifiedNostringLegacy alias for videosPublishedAfter.
newestPostDateNostringLegacy alias for videosPublishedBefore.
excludePinnedPostsNobooleanLegacy alias for skipPinnedVideos.
proxyConfigurationNoobjectApify 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 URLhttps://www.tiktok.com/@mrbeast/video/7578547467189374239
  • Short linkhttps://vm.tiktok.com/ZMxxxxxx/ or https://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

StrategyBest forRun patternOutput format
Real-time enrichmentRouting incoming comments to the right teamOn-demand run per new videoDataset row, read immediately after run finishes
Scheduled monitoringDetecting a language-mix or sentiment shift over timeApify schedule, recurringlanguage_summary rows diffed run-over-run
Bulk dataset buildResearch or training corpora across many videosOne run, large videoUrls list, concurrent processingFull dataset exported to CSV/JSON
Scraper NameWhat it extracts
TikTok Profile Scraper With Hashtag & Sound AnalyticsCreator videos with hashtag, mention and sound entities ranked by engagement
Tiktok Trending Hashtags Analytics Scraper & Top VideosTrending hashtag rank, views and the top videos driving each one
TikTok Trending Hashtags ScraperTrending hashtags for 72 countries with rank, category, post and view figures
Tiktok Video Scraper With Subtitles & TranscriptVideo metadata plus subtitle and transcript text
Instagram Comment Sentiment ScraperSame 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 ApifyClient
import csv
client = 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.

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.