TikTok Comments Scraper With Commenter Profile & Contacts avatar

TikTok Comments Scraper With Commenter Profile & Contacts

Pricing

Pay per usage

Go to Apify Store
TikTok Comments Scraper With Commenter Profile & Contacts

TikTok Comments Scraper With Commenter Profile & Contacts

TikTok Comments Scraper helps you extract structured comment data from public videos. Retrieve comment text, usernames, likes, and replies efficiently. Designed for social listening, research, and large-scale data extraction.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

1

Monthly active users

3 days ago

Last modified

Share

TikTok Comments Scraper — Commenter Profiles & Contacts

TikTok Comments Scraper collects comments and replies from any public TikTok video, then fetches every unique commenter's profile — followers, following, video count, verified status, bio and account age — and parses that bio for emails, phone numbers and links. Every response is typed, normalized JSON: no HTML, no selectors, nothing to parse before it reaches your pipeline. Give it video links or creator usernames, filter by minimum followers, and get comment rows enriched with commenter contact details ready to export or feed straight into an outreach or research workflow.

What is TikTok Comments Scraper With Commenter Profile & Contacts?

TikTok Comments Scraper With Commenter Profile & Contacts is an Apify Actor that turns a TikTok video's comment section into a structured dataset of commenters — not just what they said, but who they are and how to reach them. It reads comments and replies from TikTok's own comment API, then visits each unique commenter's public profile page exactly once and extracts their stats, bio and any contact information written into that bio.

No TikTok account or login is required. Everything returned — comment text, follower counts, bio, extracted contacts — is already visible to any anonymous visitor who opens the video and clicks through to a commenter's profile.

  • Scrape comments and threaded replies from one or many TikTok videos
  • Discover videos automatically from a creator's uploads or reposts tab, then scrape their comments
  • Enrich every unique commenter with follower/following/video counts, verified status, bio and account age
  • Parse emails, phone numbers and links out of each commenter's bio, deduplicated per person
  • Filter the result set by minimum follower count or by "has a contact detail"
  • Export as JSON, CSV, Excel or query the dataset through the Apify API — no proxy management, no parsing

What data does TikTok Comments Scraper collect?

The Actor returns one data type per dataset row (a comment or reply), but every row carries three distinct groups of information: the comment itself, the commenter's TikTok profile, and any contact details recovered from that profile's bio.

Data TypeKey FieldsJSON Field Names
Comments & repliescomment text, likes, reply count, timestamp, thread positiontext, diggCount, replyCommentTotal, createTimeISO, isReply, repliesToId
Commenter profilesfollowers, following, videos, verified, bio, account agefollowerCount, followingCount, videoCount, authorVerified, authorBio, authorAccountAgeDays
Extracted contactsemails, phone numbers, links parsed out of the bioauthorEmail, authorEmails, authorPhone, authorPhones, authorLinks, hasContactInfo

Need more TikTok data?

If you need the creator's own contact details rather than their commenters', TikTok Profile Scraper With Bio Link & Contact Leads does the same bio-parsing on a list of profile URLs directly. For trend and hashtag research alongside comment data, TikTok Trending Hashtags Scraper and TikTok Video Scraper cover the discovery side without the per-commenter enrichment this Actor adds.

Why not build this yourself?

TikTok does not publish a general-purpose API that hands an outside developer arbitrary public comments, commenter profiles or bio contact data on request — its official developer platform is scoped to content a connected creator authorizes for their own account, and TikTok's Research API is restricted to vetted academic applicants, not general commercial use. A DIY scraper is the realistic alternative, and it carries three separate maintenance costs this Actor already absorbs.

First, TikTok's comment endpoint (/api/comment/list/) is picky about its exact parameter set — an extra or missing query parameter returns an HTTP 200 with a zero-byte body, which looks identical to "no comments" unless you specifically check response size rather than status code. Second, the reply endpoint genuinely paginates past its default 20-item page (with a real has_more/cursor contract), so a naive single-page fetch silently caps every thread at 20 replies. Third, commenter enrichment means one profile-page fetch per unique commenter, judged by response byte size (TikTok's challenge interstitial and its real profile page are both HTTP 200), with a proxy escalation ladder for when a plain request gets refused.

Building and maintaining that stack — response-size classification, correct cursor pagination, retry and proxy fallback logic, and a bio-parsing layer that doesn't produce false-positive contact data — is the ongoing engineering cost this Actor replaces with one Apify Console run.

Why do developers and teams scrape TikTok comments?

For growth and lead-generation teams

A commenter who leaves an email or a link in their bio has effectively self-identified as reachable. Pulling authorEmail, authorLinks and followerCount off every commenter on a competitor's or a category-relevant video turns a comment section into a filtered outreach list — set minFollowers to skip casual viewers and onlyCommentersWithContacts to keep only rows worth a follow-up message.

For marketers and brand teams

Comment sections under branded or competitor content reveal who is actually engaging, not just who is watching. Cross-referencing authorVerified, followerCount and authorBio across commenters on several videos surfaces micro-creators and repeat engagers worth a partnership outreach, without manually opening each profile.

For AI engineers and agent builders

Typed comment and profile rows — text, engagement counts, bio, structured contacts — drop straight into a RAG index or an agent tool call with no HTML-parsing step. A lead-qualification agent can call this Actor, filter the returned JSON on hasContactInfo and followerCount, and hand a shortlist to a downstream outreach tool in the same run.

For researchers and analysts

Comment threads under viral or niche content are a public-opinion dataset: sentiment, engagement distribution, and who participates. Because enrichment reads only what TikTok's own profile page already shows an anonymous visitor, the dataset stays within publicly observable behavior rather than requiring platform-side access.

How to scrape TikTok comments (step by step)

  1. Open TikTok Comments Scraper With Commenter Profile & Contacts on the Apify Store and click Try for free
  2. Paste one or more TikTok video URLs into videoLinks — or leave that empty and put TikTok handles into creatorUsernames to have the Actor discover their videos first
  3. Set maxCommentsPerVideo and repliesPerComment for how deep to go per video, and minFollowers or onlyCommentersWithContacts if you only want a filtered subset of commenters
  4. Click Start — the Actor scrapes comments, then fetches each unique commenter's profile and parses their bio
  5. Download the dataset as JSON, CSV or Excel, or read it through the Apify API once the run finishes

What to do when TikTok changes its structure

TikTok's comment API, profile page payload and anti-bot posture are all subject to change without notice. The Actor is maintained against that, and the output schema — the same field names and types on every row — stays stable on your end when an internal fix ships. No specific turnaround time is promised for any given break.

⬇️ Input

All parameters are optional — the Actor requires either videoLinks or creatorUsernames to be non-empty, or it logs an error and finishes with zero rows.

ParameterRequiredTypeDescriptionExample Value
videoLinksNoarrayFull TikTok video URLs, or short vm.tiktok.com / vt.tiktok.com links. Wins over creatorUsernames when both are supplied.["https://www.tiktok.com/@mrbeast/video/7578547467189374239"]
maxCommentsPerVideoNointegerTop-level comments to collect per video. Minimum 1. Default 20. TikTok returns roughly 47 per page regardless of the requested count, so the real total can land slightly under a round request. Rows are deduplicated by comment ID, so you're never billed twice for the same comment.20
repliesPerCommentNointegerReplies to collect per comment. Minimum 0. Default 0. Replies paginate properly here, so values above 20 genuinely work. Reply authors get the same profile enrichment as top-level commenters. Set 0 to skip replies.10
enrichCommenterProfilesNobooleanFetch each unique commenter's profile and attach followerCount, followingCount, videoCount, heartCount, authorVerified, authorPrivateAccount, authorBio and account-age fields. Default true.true
extractContactDetailsNobooleanParse the commenter's bio into authorEmail, authorPhones, authorLinks and hasContactInfo. Requires enrichCommenterProfiles to be on — has no effect otherwise. Default true.true
profileFetchConcurrencyNointegerParallel commenter profile lookups. Minimum 1, maximum 16. Default 6. Lower it if the log shows blocked profile fetches.6
minFollowersNointegerKeep only commenters with at least this many followers. Minimum 0. Default 0 (keep everyone). A commenter whose profile could not be retrieved is filtered out, not guessed at.1000
onlyCommentersWithContactsNobooleanDrop every row whose bio contained no email, phone or link. Only applies when profile lookup and contact extraction are both on. Default false.false
creatorUsernamesNoarrayTikTok handles, with or without @. Used only when videoLinks is empty — the Actor discovers this creator's videos first, then scrapes their comments.["mrbeast"]
videosPerCreatorNointegerVideos to take from each creator before comment scraping starts. Minimum 1, maximum 1000000. Default 10.10
creatorTabsNoarray (select, minItems: 1)Which creator tab to pull videos from: videos (own uploads) or reposts (reshared videos, when public). Default ["videos"].["videos"]
videoOrderNostring (enum)Sort creator videos by latest (newest first), popular (most liked) or oldest (oldest first). Default "latest". Date filters apply to latest/oldest, not popular. Sorting is applied only to the videos tab — the reposts tab is always read in TikTok's own scroll order."latest"
videosPostedAfterNostring (datepicker)Absolute date (2026-01-31) or relative (5 days, 2 weeks, 1 month). Only videos posted after this."2 weeks"
videosPostedBeforeNostring (datepicker)Absolute date (2026-01-31) or relative (5 days, 2 weeks, 1 month). Only videos posted before this."2026-07-01"
skipPinnedVideosNobooleanSkip a creator's pinned videos — they sit at the top of the grid and are often old. Default false.false
proxyConfigurationNoobject (proxy editor)Apify Proxy settings. The run starts with no proxy by default (useApifyProxy: false); if TikTok pushes back it escalates to a datacenter proxy, then residential with 3 retries, automatically.{"useApifyProxy": false}

Common pitfall: videoLinks and creatorUsernames are not merged. If videoLinks contains anything at all, creatorUsernames and every creator-only parameter (videosPerCreator, creatorTabs, videoOrder, the date filters, skipPinnedVideos) are silently ignored for that run — clear videoLinks if you actually want creator-driven discovery.

Example input

{
"videoLinks": [
"https://www.tiktok.com/@mrbeast/video/7578547467189374239"
],
"creatorUsernames": [],
"maxCommentsPerVideo": 50,
"repliesPerComment": 10,
"enrichCommenterProfiles": true,
"extractContactDetails": true,
"profileFetchConcurrency": 6,
"minFollowers": 500,
"onlyCommentersWithContacts": false,
"videosPerCreator": 10,
"creatorTabs": ["videos"],
"videoOrder": "latest",
"skipPinnedVideos": false,
"proxyConfiguration": { "useApifyProxy": false }
}

⬆️ Output

Every comment and every reply the Actor collects is pushed as one dataset row, in the same shape, with the same field names on every run. Replies are not pushed as separate rows — they're nested inside their parent comment's replies array, already enriched with their own profile and contact fields. Export as JSON, CSV or Excel, or read the dataset through the Apify API.

Scraped 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": "7578551234567890123",
"createTime": 1753142400,
"createTimeISO": "2026-07-21T20:00:00.000Z",
"text": "this is insane omg 😭 @friendofmine check this out",
"diggCount": 4213,
"likedByAuthor": true,
"pinnedByAuthor": false,
"repliesToId": null,
"replyCommentTotal": 12,
"uid": "6812345678901234567",
"uniqueId": "growthempireagency",
"avatarThumbnail": "https://p16-sign-va.tiktokcdn.com/tos-maliva-avt-0068/abc123~c5_100x100.jpeg",
"mentions": ["friendofmine"],
"type": "comment",
"isReply": false,
"secUid": "MS4wLjABAAAAxyz...",
"profileUrl": "https://www.tiktok.com/@growthempireagency",
"enrichmentStatus": "ok",
"authorNickname": "Growth Empire Agency",
"authorVerified": false,
"authorPrivateAccount": false,
"followerCount": 18420,
"followingCount": 312,
"videoCount": 87,
"heartCount": 402100,
"authorBio": "Marketing agency | DM or growthempireagency@gmail.com | linktr.ee/growthempire",
"authorBioLink": "linktr.ee/growthempire",
"authorAccountCreatedAt": "2021-03-14T09:12:00.000Z",
"authorAccountAgeDays": 1960,
"authorEmails": ["growthempireagency@gmail.com"],
"authorEmail": "growthempireagency@gmail.com",
"authorPhones": [],
"authorPhone": null,
"authorLinks": ["https://linktr.ee/growthempire"],
"hasContactInfo": true,
"replies": [
{
"videoWebUrl": "https://www.tiktok.com/@mrbeast/video/7578547467189374239",
"cid": "7578551234567890999",
"text": "right?? insane",
"diggCount": 12,
"repliesToId": "7578551234567890123",
"uniqueId": "another_commenter",
"type": "reply",
"isReply": true,
"enrichmentStatus": "blocked",
"followerCount": null,
"hasContactInfo": null,
"scrapedAt": "2026-07-25T00:00:00.000Z"
}
],
"scrapedAt": "2026-07-25T00:00:00.000Z"
}

Nested reply object

Objects inside a parent comment's replies array carry the same field set as a top-level comment row — including their own profile-enrichment and contact fields — minus the replies key itself (replies are not threaded more than one level deep). repliesToId on a reply object holds the parent comment's cid.

What the enrichmentStatus values mean

ok — profile fetched and parsed normally. private — profile fetched successfully; TikTok's own profile page still exposes stats and bio publicly for private accounts, only their video list is hidden. blocked — the fetch hit a challenge page or a zero-byte refusal; every profile field on that row is null, meaning not retrieved, never "no contacts found." not_found — the profile page loaded but no user-detail payload was present (deleted or suspended account). skippedenrichCommenterProfiles was off, so enrichment was never attempted.

Full field reference

Every key below is present on every pushed row (top-level comment or nested reply), typed and defaulting to null or an empty collection rather than being omitted.

FieldTypeDescription
typestring"comment" or "reply". Only "comment" rows are ever pushed at the top level — a "reply" row only exists nested inside its parent's replies array.
isReplybooleanfalse on every pushed top-level row; true on every object inside a replies array.
cidstringTikTok's comment ID. Rows are deduplicated on this, both within a video and across videos in the same run.
textstringThe comment or reply text as posted.
diggCountintegerLikes on the comment.
likedByAuthorbooleanWhether the video's creator liked this comment.
pinnedByAuthorbooleanWhether the video's creator pinned this comment.
repliesToIdstring or nullThe parent comment's cid, present only on reply objects; null on top-level comments.
replyCommentTotalintegerHow many replies TikTok reports for this comment — used internally to decide whether to fetch replies at all.
repliesarrayPresent only on top-level comment rows. Holds fully enriched reply objects (same field set, minus replies itself) up to repliesPerComment. Empty array if repliesPerComment is 0 or the comment has no replies.
uidstringCommenter's numeric TikTok user ID.
uniqueIdstringCommenter's @handle.
secUidstringTikTok's internal secondary user ID — the stable join key across comments and profile lookups.
profileUrlstring or nullhttps://www.tiktok.com/@<uniqueId>, or null if uniqueId is empty.
avatarThumbnailstringAvatar image URL as returned in the comment payload.
mentionsarray of strings@usernames extracted from the comment text with a regex (@([a-zA-Z0-9_.]+)) — not TikTok's own mention-entity data, since that field is empty on live comment responses.
videoWebUrlstringCanonical video URL, with short vm.tiktok.com/vt.tiktok.com links already resolved.
submittedVideoUrlstringSame value as videoWebUrl; kept as a separate key for compatibility with pipelines built against the underlying base scraper.
inputstringThe exact URL you supplied for this video, before short-link resolution.
createTimeintegerUnix seconds timestamp of the comment, as returned by TikTok.
createTimeISOstringcreateTime converted to ISO 8601 UTC.
enrichmentStatusstring"ok" | "private" | "blocked" | "not_found" | "skipped". See above.
authorNicknamestring or nullCommenter's display name. null unless enrichmentStatus is "ok" or "private".
authorVerifiedboolean or nullVerified badge. null for unretrieved profiles.
authorPrivateAccountboolean or nullWhether the account is set to private.
followerCountinteger or nullFollower count.
followingCountinteger or nullFollowing count.
videoCountinteger or nullNumber of videos posted.
heartCountinteger or nullTotal likes received across the account.
authorBiostring or nullProfile bio text (TikTok's signature field) — the source text for contact extraction.
authorBioLinkstring or nullThe clickable link set in the profile header, if any.
authorAccountCreatedAtstring or nullAccount signup time, ISO 8601 UTC, read from the profile page's createTime.
authorAccountAgeDaysinteger or nullDays between account creation and the moment the profile was fetched.
authorEmailsarray of stringsEvery email address found in the bio or bio link, lowercased and deduplicated. [] when contact extraction found none, ran with it off, or the profile wasn't retrieved.
authorEmailstring or nullFirst entry of authorEmails, or null.
authorPhonesarray of stringsEvery phone number that passed validation, deduplicated.
authorPhonestring or nullFirst entry of authorPhones, or null.
authorLinksarray of stringsBio link plus any URLs found in the bio text (normalized to https://), deduplicated.
hasContactInfoboolean or nulltrue/false when contact extraction actually ran against a retrieved profile; null when it didn't run at all (extraction off, enrichment off, or the profile was blocked/not found/skipped) — never a false negative disguised as a real result.
scrapedAtstringISO 8601 UTC timestamp of when this row was written, applied to both the parent comment and every nested reply.

🔍 How contact details are extracted from bios

Contact extraction runs against the commenter's TikTok bio (signature) and their profile's bio-link field, and only against those two surfaces — a contact detail dropped inside an individual comment rather than the bio is never picked up.

Emails — matched with ([A-Za-z0-9._%+-]+)\s*@\s*([A-Za-z0-9.-]+\.[A-Za-z]{2,}), case-insensitive, against both the bio text and the bio link. Creators routinely put an email directly in the link slot instead of a URL, so both fields are scanned before anything is classified as a link.

Links — the bio link field is kept as a link only if it isn't itself an email. The bio text is then scanned (with any matched emails scrubbed out first, so an email's domain is never double-counted as a separate link) for explicit http(s):// / www. URLs, or a bare domain ending in a fixed whitelist of TLDs (.com, .net, .org, .io, .co, .me, .shop, .store, .link, .bio, .app, .xyz and roughly two dozen more, including several country-code TLDs). A bare domain outside that whitelist — .video, .agency, .studio, for example — is only picked up if it's written with an explicit http/www prefix.

Phone numbers — a loose candidate pattern (\+?[\d][\d\s().\-]{7,20}\d) first grabs any digit run of plausible phone shape from the bio, after emails and links have already been removed from the text. Each candidate then has to pass validation: 9–15 digits total, and either an explicit + international prefix or at least 10 digits with no prefix. Candidates with two or fewer distinct digits (0000000000, 1111111111) are rejected as noise.

Known false-positive modes:

  • A long non-phone number sequence with 3 or more distinct digits and the right length — a partial follower count, a pasted order ID, a birthdate concatenated with other digits — can still pass validation. The filter only catches repeated-digit and out-of-range noise, not all numeric junk.
  • A legitimate personal link on a TLD outside the whitelist is missed unless written with http/www.
  • Contact details posted in a comment or a reply, rather than the commenter's bio, are never captured — hasContactInfo reflects the bio only.
  • hasContactInfo is null, not false, whenever the profile fetch itself was blocked, not found, or skipped — a null means the bio was never read, not that it was read and found empty.

How does TikTok Comments Scraper compare to other TikTok scrapers?

FeatureTikTok Comments ScraperGeneric alternative
Output formatTyped JSON, stable field names every runVaries; several store listings mix raw and normalized fields in one payload
Commenter enrichmentOne profile fetch per unique commenter, deduplicated across the whole runUsually not offered, or requires a separate Actor per commenter list
Bio contact parsingBuilt in — email, phone and link extraction with validated outputNot documented on the three closest-ranked TikTok Actors on the Apify Store as of 2026-07-25
Reply paginationCursor-paginated past TikTok's 20-per-page defaultget-leads/all-in-one-tiktok-scraper's comment mode does not document a reply depth beyond the requested count
Blocked vs. empty distinctionenrichmentStatus/hasContactInfo separate "not retrieved" from "genuinely empty"Not documented on the competitor listings reviewed

If you're building an AI agent or RAG pipeline, the output-format row is the decision-maker — parsing HTML inside an agent loop is a reliability failure mode, not a feature. openclawai/tiktok-douyin-bilibili-scraper advertises pay-per-event pricing "from $0.002 per item" on its Apify Store listing (checked 2026-07-25, not verified here), and covers three platforms in one Actor rather than TikTok-only commenter enrichment.

📊 How many results can you scrape with this Actor?

There's no single result cap in the schema. Total rows are the product of how many video links or discovered creator videos you supply, times maxCommentsPerVideo per video, plus repliesPerComment per comment that has replies. maxCommentsPerVideo has no maximum — only a minimum of 1 — and repliesPerComment has no maximum either, only a minimum of 0.

Pagination is real: comments are fetched using TikTok's own cursor, page by page, until your requested count is reached or TikTok stops returning has_more. Replies for a single comment paginate the same way in batches of 20, so requesting more than 20 replies per comment genuinely fetches additional pages rather than truncating. videosPerCreator caps creator-driven video discovery at up to 1,000,000, though how many videos a creator's tab actually holds is the real ceiling in practice. profileFetchConcurrency (1–16) controls how many commenter profiles are fetched in parallel, not how many total commenters get enriched — every unique commenter in your comment set is fetched exactly once regardless of that setting.

Integrate TikTok Comments Scraper and automate your workflow

TikTok Comments Scraper works with any language or tool that can send an HTTP request — it runs on Apify, so the standard Apify API and client libraries are the integration surface.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<YOUR_USERNAME>/tiktok-comments-scraper-commenter-profile-contacts").call(run_input={
"videoLinks": ["https://www.tiktok.com/@mrbeast/video/7578547467189374239"],
"maxCommentsPerVideo": 50,
"minFollowers": 500,
"onlyCommentersWithContacts": True,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["uniqueId"], row["followerCount"], row.get("authorEmail"))

Works in Python, Node.js, Go, Ruby, cURL — any language that can make an HTTP request.

Automation platforms (n8n, Make, LangChain)

In n8n, the Apify node (or an HTTP Request node against the Apify run endpoint with your token) starts the Actor and can poll or wait for the run to finish before passing the dataset downstream. In Make, the Apify module runs the Actor and maps dataset rows straight into a Google Sheets or Airtable step — useful for turning a weekly comment sweep into a standing lead list without writing code. In LangChain or a custom agent framework, wrap the apify_client call above as a tool function; the typed JSON rows need no parsing step before they're passed into an LLM prompt or a downstream filter.

Scraping publicly accessible TikTok data is generally permitted; TikTok Comments Scraper returns only what an anonymous visitor already sees — comment text, and profile fields TikTok itself displays on a public profile page.

Because the output includes personal data — usernames, bios, follower counts, and contact details like emails and phone numbers extracted from those bios — GDPR and CCPA are the relevant regimes if you store or process data on EU or California residents. You need a lawful basis for collecting and retaining that data, and using extracted contact details for unsolicited outreach carries its own regulatory exposure (e.g., CAN-SPAM, TCPA) independent of the scraping itself.

Consult legal counsel for commercial use cases involving bulk personal data, particularly outreach or lead-generation use of the extracted contact fields.

❓ Frequently asked questions

Does TikTok Comments Scraper work without a TikTok account?

Yes. No TikTok login, cookie or API key is required as Actor input. Comments and profile pages are fetched from TikTok's own public endpoints. Creator video/repost discovery (used only when you supply creatorUsernames instead of videoLinks) runs through a headless browser and can optionally use an operator-configured session cookie server-side — that credential is not exposed as an Actor input field, and typical runs don't need it.

How often is the scraped data updated?

Every run fetches live — comments, profiles and bios are read from TikTok at the moment the Actor runs, not from a cache. Two runs on the same video minutes apart can return different diggCount or reply totals if the counts changed on TikTok in between.

What happens if a video has comments disabled or has been deleted?

The Actor logs a warning and returns zero rows for that video — it does not fail the run and does not emit a placeholder error row. If you're scraping a batch of URLs, check the log for "Could not extract video ID" or a zero-count entry to identify which specific URL produced nothing.

Can I scrape private commenters' videos or hidden content?

No. Only public comments are collected, and only the profile fields TikTok itself renders publicly are read. A private account's enrichmentStatus is reported as "private" — its follower count and bio are still returned because TikTok's own profile page shows them to anonymous visitors; only that account's video list stays inaccessible.

Is there a free trial or a minimum spend?

The Actor runs on Apify's standard pay-per-event billing — you're charged per row_result (each comment or reply row pushed). Check the Actor's Pricing tab on the Apify Store for current rates and any trial credit Apify is offering new accounts.

Does TikTok Comments Scraper work for AI agent workflows and LLM pipelines?

Yes. It's callable as a standard HTTP endpoint through the Apify API — any agent framework that can make a request (LangChain, CrewAI, a custom tool definition, n8n) can invoke it and receive typed JSON directly, with no HTML or selector parsing needed before passing rows to an LLM.

How does TikTok Comments Scraper handle TikTok's anti-bot system?

Comment and reply requests are judged by response body size, not just HTTP status — a 200 with a zero-byte body (a signed-endpoint refusal) and a 200 with a small unparseable body (a challenge page) are both treated as blocked and retried with exponential backoff, up to 3 attempts. If comment fetching keeps getting blocked, the run automatically escalates from no proxy to an Apify datacenter proxy, then to residential proxies with 3 rotated attempts. Profile fetches use curl_cffi with Chrome/Android TLS impersonation and the same size-based blocked classification (any response at or under roughly 20 KB is treated as a challenge, since a real profile page runs to about 197 KB). Creator video/repost discovery uses a headless Chromium browser with automation flags suppressed.

How does TikTok Comments Scraper compare to other TikTok scrapers?

Checked on the Apify Store on 2026-07-25: openclawai/tiktok-douyin-bilibili-scraper covers TikTok, Douyin and Bilibili in one Actor with 7 scraping modes and advertises pricing "from $0.002 per item" on its listing, but its comment mode does not document commenter profile enrichment or bio contact parsing. get-leads/all-in-one-tiktok-scraper documents 10 scraping modes including profiles and comments separately, with 24 output fields on its profile mode, but does not document joining comment authorship to profile enrichment in a single run. magicfingers/tiktok-scraper documents video, profile and comment modes with a simpler field set and recommends residential proxies for reliability. None of the three document bio-based contact extraction (email/phone/link parsing) as a feature.

Does TikTok Comments Scraper return data in a format LLMs can use directly?

Yes. Every response is typed, normalized JSON with stable field names across runs. Pass a row directly into an LLM context window, index it into a vector store, or route it through an agent tool — no transformation step required.

Can I use TikTok Comments Scraper without managing proxies?

Yes. By default the run starts with no proxy at all, and only switches to an Apify datacenter proxy, then residential, if TikTok actually blocks a request. You can also set proxyConfiguration to Apify Residential upfront if you expect a high-volume run to hit blocks early.

What happens when TikTok changes its structure or blocks the scraper?

The Actor is maintained, and the output schema stays stable on your end — field names and types don't change when an internal fix ships for a TikTok-side change. No specific fix turnaround time is promised for any given break.

💬 Your feedback

Found a bug, or a bio field TikTok exposes that isn't in the output yet? We want to know. Open an issue on the Actor's Issues tab on Apify with a sample video or profile URL — that's the fastest path to a fix, since it lets the issue be reproduced directly.