TikTok Scraper — Profiles, Videos, Comments & Search avatar

TikTok Scraper — Profiles, Videos, Comments & Search

Pricing

from $1.50 / 1,000 profile scrapeds

Go to Apify Store
TikTok Scraper — Profiles, Videos, Comments & Search

TikTok Scraper — Profiles, Videos, Comments & Search

Stop paying $3.70/1K for TikTok data. 7 modes in 1 actor: profiles, videos, hashtags, comments, search & more. 29 fields, Clockworks-compatible. 30-68% cheaper than Clockworks. HTTP-only, no proxy needed. MCP-ready for AI agents. Integrates w n8n, Make, Zapier, Sheets.

Pricing

from $1.50 / 1,000 profile scrapeds

Rating

0.0

(0)

Developer

Japi Cricket

Japi Cricket

Maintained by Community

Actor stats

0

Bookmarked

36

Total users

10

Monthly active users

2 days ago

Last modified

Share

TikTok Scraper

What does All-in-One TikTok Scraper do?

Scrape TikTok profiles, videos, comments, user search, hashtags, trending topics, live streams & music — no proxy needed for most modes, no login required. 12–40% cheaper than Clockworks with the same output fields — drop-in replacement. 10 modes, pay-per-result from $0.40/1K. Works with AI agents (Claude, GPT, Cursor) via MCP.

Unlike Clockworks which splits TikTok scraping into 13 separate actors, this scraper combines 10 modes in one actor — one integration to maintain, one API to learn, one pricing page to check.

Why choose this over 5 separate TikTok scrapers?

  • No proxy needed — all modes work on standard Apify infrastructure (competitors require residential proxies)
  • 10 modes in one actor — profiles, videos, hashtags, comments, user search, all-in-one, data extractor
  • 12–40% cheaper than Clockworks across all mainline modes (benchmarked 2026-04-24)
  • Clockworks-compatible output — same field names, same structure — drop-in replacement
  • HTTP-only, 128 MB — no bloated browser, minimal compute costs
  • AI-ready — works with Claude, GPT, and Cursor via MCP protocol

Getting Started

  1. Click "Try for free" at the top of this page
  2. Choose a scraping mode (Profiles, Videos, Comments, User Search, All-in-One, or Data Extractor)
  3. Paste TikTok usernames, video URLs, or search queries
  4. Click Start — results appear in the Dataset tab within seconds
  5. Download as JSON, CSV, or Excel — or connect via API, n8n, Make, or Zapier

No proxy needed. No login required. Just paste and scrape.

Easiest Way to Start: Paste a Username or URL

Just paste any TikTok username or URL and hit Start. The scraper auto-detects what you want:

InputAuto-Detected
charlidamelioProfile scraping
@khaby.lameProfile scraping (@ stripped automatically)
https://www.tiktok.com/@mrbeastProfile scraping (URL parsed)
https://www.tiktok.com/@user/video/7625055547116522765Video scraping

10 Scraping Modes

Production (6) — validated at ≥95% field-level correctness against live Chrome ground truth:

ModeDescriptionInput FieldBest For
Profile ScraperScrape TikTok user profiles with full statsprofilesInfluencer research, lead generation
Video ScraperScrape specific videos with full engagement data (+ optional transcripts)postURLsContent analysis, trend tracking
User SearchLook up TikTok users by usernamesearchQueriesCreator discovery, competitor research
Comments ScraperScrape video comments + threaded replies up to depth 3postURLsSentiment analysis, audience insights
All-in-OneDiscover + scrape videos from profilesprofilesComprehensive data collection
Data ExtractorLightweight version of All-in-OneprofilesQuick data extraction, cost-sensitive

Activating 2026-05-05 (3) — code complete, billing locked until pay-per-event activates:

ModeDescriptionInput FieldBest For
Hashtag ScraperScrape hashtag metadata + videos with sort/time filtershashtags or hashtagNicheTrend analysis, hashtag research
Trending HashtagsDiscover what's currently trending globally or per-regiontrendingRegionDaily trend reports, regional insight
Live StreamsSnapshot live-room viewer count + host inforoomIdsLive-event monitoring, creator watchlists

Experimental (2) — produce real data with narrower output than core modes; shape may evolve based on customer feedback:

ModeDescriptionInput FieldBest For
Music / Sound (experimental)Identity metadata for a TikTok sound (title, author, embed) via oEmbedmusicIdsSound attribution, embed generation
Dynamic Bundle (experimental)Discover related hashtags from seed tags via cooccurrencehashtags (1-3 seeds)Niche discovery, content strategy

Which Mode Should I Use?

Your GoalUse This ModeWhy
"I need creator profiles for outreach"Profile Scraper + User SearchGet follower stats, bio, verified status for 100+ creators in one run
"I'm analyzing a viral video's engagement"Video ScraperFull stats (likes, views, shares, saves, reposts) + music metadata + author info in 29 fields
"I want to find a creator but don't know their exact handle"User SearchFuzzy matching finds @gordonramsayofficial from just "gordonramsay" — tries 21 variations
"I need comment sentiment for a brand"Comments ScraperFull comment text, likes, threaded replies (up to 50/comment), author info, language detection
"I'm building a TikTok analytics dashboard"All-in-OneProfiles + videos in one run — feed directly into Google Sheets, Airtable, or your data warehouse
"I want to research a trending hashtag"Hashtag ScraperGet video count, view count, and trending videos for any hashtag
"I just need quick data, keep it simple"Data ExtractorSame as All-in-One but at a lower price point — ideal for high-volume, cost-sensitive workloads

Pricing — Pay Per Result, No Monthly Fee

ModePrice per 1,000Clockworks PriceYou Save
Comments Scraperfrom $0.40$0.50/1K20%
Data Extractorfrom $1.38$2.00/1K31%
Profile Scraperfrom $1.50$2.50/1K40%
All-in-Onefrom $1.50$1.70/1K12%
User Searchfrom $2.00$3.23/1K38%
Video Scraperfrom $3.10$5.00/1K38%

Prices benchmarked against public Apify Store listings on 2026-04-24. Clockworks repriced several modes since Q1; we'll re-benchmark quarterly.

"From" prices are for Business/Gold tier. Free tier prices are higher (e.g. Profile $2.40/1K). See the Pricing tab for exact tier pricing. No proxy needed for Modes 1-4, 6-7. Modes 5, 8, 9, 11 require a residential proxy (bring your own — not billed by us).

Cost examples:

  • 100 profiles: $0.15 (Business) / $0.24 (Free)
  • 1,000 video comments: $0.40 (Business) / $0.65 (Free)
  • 500 videos with engagement: $1.55 (Business) / $2.50 (Free)
  • 10,000 comments: $4.00 (Business) — cheapest entry point

Apify Subscription Discounts: Higher Apify plans get automatic discounts. Scale (5% off), Business (10% off), Enterprise (15% off).

Save even more with useCache: true (Day-4 feature) — when re-running the same profiles/videos within 24 hours, cached records are returned instantly. You choose whether to bill on cache hits or skip them.

Why This TikTok Scraper?

FeatureThis ScraperClockworksApi DojoScraptik
Profiles / 1K$1.50$4.00$0.30~$2.00
Videos / 1K$3.10$5.00$0.30~$2.00
Comments / 1K$0.40$1.25~$2.00
Proxy requiredNoInternal onlyNoManaged
Hashtag scrapingYesYes ($5/1K)NoNo
Modes in one actor713 separate11
Memory128 MB4096 MB
Clockworks-compatibleYesNoNo
Comment threadingYes (50 replies/comment)Yes
MCP for AI agentsYesYesNoNo

Key advantages:

  • One actor, 10 modes — Clockworks splits into 13 separate actors, each requiring its own integration
  • No proxy needed — all modes work on Apify's standard infrastructure
  • 128 MB HTTP-only — 32× less memory than Clockworks (4096 MB), lower compute costs
  • Clockworks drop-in replacement — identical field names and structure

Mode 1: Profile Scraper (tiktok-profile-scraper)

Scrape TikTok user profiles with full stats — followers, following, hearts, video count, bio, avatar, verified status.

Input Parameters

ParameterTypeRequiredDescription
scrapeModestringYesSet to "tiktok-profile-scraper"
profilesarrayYesTikTok usernames, @handles, or full profile URLs. Duplicates removed automatically.
resultsPerPageintegerNoMax results (default: 100)
proxyConfigurationobjectNoNot needed — all modes work without proxy

Input Example

{
"scrapeMode": "tiktok-profile-scraper",
"profiles": ["charlidamelio", "khaby.lame", "mrbeast", "zachking", "addisonre"]
}

Output Fields — 24 fields

FieldTypeDescription
idstringTikTok user ID
namestringUsername (uniqueId)
nickNamestringDisplay name
verifiedbooleanVerified account
signaturestringBio text
avatarstringAvatar thumbnail URL
avatarMediumstringMedium-size avatar URL
originalAvatarUrlstringFull-size avatar URL (highest resolution)
bioLinkstringLink in bio (null if not set)
privateAccountbooleanPrivate account
ttSellerbooleanTikTok Shop seller
commerceUserInfoobjectTikTok Shop / commerce profile info, e.g. { "commerceUser": false }. commerceUser=true indicates the account is a registered TikTok Shop seller (often paired with ttSeller=true). Useful for B2B / influencer-marketing buyer segmentation.
roomIdstringLive room ID (empty if not live)
createTimeintegerUnix timestamp the account was created (e.g. 1447505838 for an account created 2015-11-14)
fansintegerFollower count
followingintegerFollowing count
friendsintegerFriends count
heartintegerTotal likes received (full precision, including billions)
videointegerVideo count
diggintegerLiked videos count (always 0 — TikTok removed this)
secUidstringSecure user ID (needed for API calls)
profileUrlstringFull profile URL
regionstringRegion code (usually null)
inputstringInput that produced this result

Output Example

{
"id": "127905465618821121",
"name": "khaby.lame",
"nickName": "Khabane lame",
"verified": true,
"signature": "Se vuoi ridere sei nel posto giusto",
"avatar": "https://p16-common-sign.tiktokcdn-us.com/...",
"avatarMedium": "https://p19-common-sign.tiktokcdn-us.com/...",
"originalAvatarUrl": "https://p16-common-sign.tiktokcdn-us.com/...",
"bioLink": null,
"privateAccount": false,
"ttSeller": false,
"roomId": "",
"fans": 160600000,
"following": 86,
"friends": 76,
"heart": 2579326267,
"video": 1314,
"digg": 0,
"secUid": "MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA",
"profileUrl": "https://www.tiktok.com/@khaby.lame",
"region": null,
"input": "khaby.lame"
}

Real test result from Build 0.1.105, April 2026.

Use Cases

  • Influencer research — compare follower counts, engagement rates, and verified status across creators
  • Lead generation — build lists of TikTok creators with their profile data for outreach
  • Competitor monitoring — track follower growth and video count over time
  • Brand safety — check verified status and bio content before partnerships
  • Academic research — collect structured profile data for social media studies

How to Run

Apify Console: Select "Profile Scraper" mode, paste usernames, click Start.

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("get-leads/all-in-one-tiktok-scraper").call(run_input={
"scrapeMode": "tiktok-profile-scraper",
"profiles": ["charlidamelio", "khaby.lame", "mrbeast"],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"@{item['name']}: {item['fans']:,} followers, {item['heart']:,} likes")

Mode 2: Video Scraper (tiktok-video-scraper)

Scrape specific TikTok videos by URL with full engagement data — likes, views, shares, comments, saves, reposts, plus author info, music metadata, and video technical data.

Input Parameters

ParameterTypeRequiredDescription
scrapeModestringYesSet to "tiktok-video-scraper"
postURLsarrayYesTikTok video URLs or video IDs. Duplicates removed automatically.
proxyConfigurationobjectNoNot needed

Input Example

{
"scrapeMode": "tiktok-video-scraper",
"postURLs": [
"https://www.tiktok.com/@charlidamelio/video/7625055547116522765",
"https://www.tiktok.com/@khaby.lame/video/7505030969712217366"
]
}

Output Fields — 29 fields (with 22-key authorMeta nested object)

CategoryFields
Coreid, text, createTime, createTimeISO, webVideoUrl, mediaUrls[], textLanguage
EngagementdiggCount, shareCount, playCount, collectCount, commentCount, repostCount
FlagsisAd, isMuted, isPinned, isSlideshow, isSponsored, locationCreated
AuthorauthorMeta.id, .secUid, .name, .profileUrl, .nickName, .verified, .signature, .bioLink, .avatar, .avatarMedium, .originalAvatarUrl, .privateAccount, .ttSeller, .roomId, .commerceUserInfo.commerceUser, .createTime, .following, .friends, .fans, .heart, .video, .digg
MusicmusicMeta.musicName, .musicAuthor, .musicOriginal, .musicAlbum, .playUrl, .coverMediumUrl, .musicId, .originalCoverMediumUrl
VideovideoMeta.height, .width, .duration, .coverUrl, .definition, .format, .transcriptionLink, .originalCoverUrl
Socialhashtags[], mentions[], detailedMentions[], effectStickers[] (with .stickerStats.useCount), slideshowImageLinks[]

Output Example

{
"id": "7625055547116522765",
"text": "new youtube video out now!!! dc @Brett Sewell",
"createTime": 1775346609,
"createTimeISO": "2026-04-04T23:50:09.000Z",
"diggCount": 41400,
"playCount": 334800,
"shareCount": 482,
"commentCount": 599,
"collectCount": 1446,
"repostCount": 0,
"webVideoUrl": "https://www.tiktok.com/@charlidamelio/video/7625055547116522765",
"isAd": false,
"isPinned": false,
"isSlideshow": false,
"locationCreated": "US",
"textLanguage": "en",
"authorMeta": {
"id": "5831967",
"name": "charlidamelio",
"nickName": "charli d'amelio",
"verified": true,
"createTime": 1447505838,
"fans": 156800000,
"heart": 12000000000
},
"musicMeta": {
"musicName": "son original",
"musicAuthor": "Daniel Ralph",
"musicOriginal": true,
"originalCoverMediumUrl": "https://p16-common-sign.tiktokcdn-us.com/..."
},
"videoMeta": {
"height": 1280,
"width": 720,
"duration": 13,
"definition": "720p",
"format": "mp4",
"transcriptionLink": null
},
"mentions": ["@Brett Sewell"],
"detailedMentions": [{"id": "6995320156201812997", "name": "brett.sewell", "nickName": "Brett Sewell"}],
"effectStickers": [],
"hashtags": [],
"submittedVideoUrl": "https://www.tiktok.com/@charlidamelio/video/7625055547116522765",
"input": "https://www.tiktok.com/@charlidamelio/video/7625055547116522765"
}

Real test result from Build 0.1.105, April 2026.

Use Cases

  • Trend tracking — monitor viral videos with play counts, likes, shares, and saves over time
  • Content analysis — analyze video performance by format (duration, definition), music, hashtags
  • Campaign measurement — track engagement metrics on sponsored or branded content
  • Competitive intelligence — compare engagement rates across competing creators' videos
  • Music trend analysis — identify trending sounds and original vs. reused audio

How to Run

Apify Console: Select "Video Scraper" mode, paste video URLs, click Start.

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("get-leads/all-in-one-tiktok-scraper").call(run_input={
"scrapeMode": "tiktok-video-scraper",
"postURLs": [
"https://www.tiktok.com/@charlidamelio/video/7625055547116522765",
"https://www.tiktok.com/@khaby.lame/video/7505030969712217366",
],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"Video {item['id']}: {item['playCount']:,} views, {item['diggCount']:,} likes")

Mode 3: User Search (tiktok-user-search-scraper)

Search for TikTok users by username or keyword. Uses fuzzy matching — searching "gordonramsay" finds @gordonramsayofficial automatically (tries 21 username variations).

Input Parameters

ParameterTypeRequiredDescription
scrapeModestringYesSet to "tiktok-user-search-scraper"
searchQueriesarrayYesUsernames or keywords to search. Duplicates removed automatically.
maxProfilesPerQueryintegerNoMax profiles per query (default: 10, max: 100)
proxyConfigurationobjectNoNot needed

Input Example

{
"scrapeMode": "tiktok-user-search-scraper",
"searchQueries": ["gordonramsay", "addisonre", "zachking"],
"maxProfilesPerQuery": 3
}

Output Fields — 23 fields

Same output as Profile Scraper (Mode 1) — including the createTime (account-creation Unix timestamp) field. See Mode 1 output fields table.

Output Example

{
"id": "6840164168579728389",
"name": "dance",
"nickName": "Phoenix Dance Studio",
"verified": false,
"signature": "The Official @dance on TikTok",
"fans": 33300,
"following": 6,
"friends": 4,
"heart": 2043,
"video": 0,
"secUid": "MS4wLjABAAAAkV6s6lQu-8pXYcs8A84O5Anoj-8i2PVUO9WWgsM-LfYC2_lNP8swHcp9vUh160XU",
"profileUrl": "https://www.tiktok.com/@dance",
"input": "dance"
}

Use Cases

  • Creator discovery — find creators by topic or niche when you don't know their exact handle
  • Competitor research — find related accounts in your industry
  • Influencer mapping — build lists of creators around specific keywords
  • Handle verification — confirm which account belongs to a person or brand

How to Run

Apify Console: Select "User Search" mode, enter search queries, click Start.

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("get-leads/all-in-one-tiktok-scraper").call(run_input={
"scrapeMode": "tiktok-user-search-scraper",
"searchQueries": ["gordonramsay", "addisonre"],
"maxProfilesPerQuery": 3,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"@{item['name']}: {item['fans']:,} followers")

Mode 4: Comments Scraper (tiktok-comments-scraper)

Scrape video comments with likes, reply threading, author info, and language detection. Clockworks-compatible flat field structure — drop-in replacement for clockworks/tiktok-comments-scraper.

Input Parameters

ParameterTypeRequiredDescription
scrapeModestringYesSet to "tiktok-comments-scraper"
postURLsarrayYes*TikTok video URLs. Comments are scraped from each video. *Either postURLs OR profiles must be supplied (or both).
profilesarrayYes*0.1.165: TikTok usernames or @handles. The scraper discovers each creator's recent videos via the embed page (capped by maxVideosPerProfile) and scrapes comments from each. Lets you bulk-extract comments from a creator's full catalog without listing every video URL. *Either postURLs OR profiles must be supplied (or both — they're merged).
maxVideosPerProfileintegerNo0.1.165: When profiles is supplied, max videos to discover per creator (1-50, default 10). Each video then yields up to resultsPerPage comments. Use this to cap revenue-spike risk on heavyweight creators.
resultsPerPageintegerNoMax comments per video (default: 100, max: 1000)
commentReplyDepthintegerNoReply nesting depth: 1=top-level only, 2=top + direct replies (default), 3=top + direct replies + reply-of-reply. Each depth level adds fetches only for comments that actually have nested threads.
proxyConfigurationobjectNoNot needed

Input Examples

// Classic: explicit video URLs
{
"scrapeMode": "tiktok-comments-scraper",
"postURLs": ["https://www.tiktok.com/@charlidamelio/video/7625055547116522765"],
"resultsPerPage": 100
}
// 0.1.165 — Profile orchestrator: scrape comments across a creator's recent videos
{
"scrapeMode": "tiktok-comments-scraper",
"profiles": ["charlidamelio"],
"maxVideosPerProfile": 10,
"resultsPerPage": 50,
"commentReplyDepth": 2
}
// Result: ~10 videos × ~50 comments = ~500 comment records in one call

Output Fields — 19 fields (Clockworks-compatible)

FieldTypeDescription
cidstringComment ID
textstringComment text
createTimeintegerUnix timestamp
createTimeISOstringISO timestamp
diggCountintegerComment likes
replyCommentTotalintegerNumber of replies
likedByAuthorbooleanLiked by video author
pinnedByAuthorbooleanPinned by video author
uidstringCommenter user ID
uniqueIdstringCommenter username
avatarThumbnailstringCommenter avatar URL
textLanguagestring/nullTikTok's detected language for the comment text (ISO 639-1, e.g. "en"). Null when TikTok hasn't classified the text (short messages, emoji-only, etc.)
mentionsarrayMentioned usernames (e.g. ["@user1"])
detailedMentionsarrayMention details ([{id, name, nickName, profileUrl}])
repliesToIdstring/nullParent comment ID (null for top-level comments)
submittedVideoUrlstringInput video URL
videoWebUrlstringParent video URL
inputstringInput that produced this result
replies[]arrayThreaded replies (up to 50 per comment, same fields)

Output Example

{
"cid": "7625056288929645325",
"text": "Well ate",
"createTime": 1775346788,
"createTimeISO": "2026-04-04T23:53:08.000Z",
"diggCount": 343,
"replyCommentTotal": 8,
"likedByAuthor": false,
"pinnedByAuthor": false,
"uid": "7476947021740459054",
"uniqueId": "thesky.miller",
"avatarThumbnail": "https://p16-common-sign.tiktokcdn-us.com/...",
"mentions": [],
"detailedMentions": [],
"repliesToId": null,
"submittedVideoUrl": "https://www.tiktok.com/@charlidamelio/video/7625055547116522765",
"videoWebUrl": "https://www.tiktok.com/@charlidamelio/video/7625055547116522765",
"input": "https://www.tiktok.com/@charlidamelio/video/7625055547116522765",
"replies": [
{
"cid": "7625064705137492767",
"text": "hi sky mi like you",
"createTime": 1775348740,
"createTimeISO": "2026-04-05T00:25:40.000Z",
"diggCount": 2,
"replyCommentTotal": 0,
"repliesToId": "7625056288929645325"
}
]
}

Real test result from Build 0.1.105, April 2026.

Use Cases

  • Sentiment analysis — analyze comment text and language for brand perception
  • Audience insights — understand who's engaging with content (verified users, top commenters)
  • Community management — monitor comments for questions, complaints, or mentions
  • Content strategy — identify which videos generate the most discussion
  • Research — collect public discourse data for academic or market studies

How to Run

Apify Console: Select "Comments Scraper" mode, paste video URLs, click Start.

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("get-leads/all-in-one-tiktok-scraper").call(run_input={
"scrapeMode": "tiktok-comments-scraper",
"postURLs": ["https://www.tiktok.com/@charlidamelio/video/7625055547116522765"],
"resultsPerPage": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"@{item['uniqueId']}: {item['text'][:50]}... ({item['diggCount']} likes)")

Mode 5: Hashtag Scraper (tiktok-hashtag-scraper)

Scrape TikTok hashtag metadata (video count, view count, description, cover) and a list of videos that carry the hashtag. Each hashtag produces one metadata record plus one record per discovered video, all billed under the hashtag rate.

⏳ Activation notice: 2026-05-05

Hashtag Scraper is temporarily gated until 2026-05-05 while the hashtag-result pay-per-event price completes its Apify pricing-lock window. During this period the mode returns one _type: "scrape_error" record per input with error: "PRICING_PENDING" — no scraping happens, no infrastructure is used, and you are not billed. The gate lifts automatically at 2026-05-05T00:00:00Z; no actor update is required on your end.

If you want to use the mode before 2026-05-05 and accept that you will not be billed (the event is rejected server-side), set the actor environment variable ALLOW_HASHTAG_PREBILL=1.

Input Parameters

ParameterTypeRequiredDescription
scrapeModestringYesSet to "tiktok-hashtag-scraper"
hashtagsarrayYes*Hashtag names (without #). E.g. ["fyp", "dance", "cooking"]
hashtagNichestringYes*Alternative to hashtags: one of cooking, fitness, beauty, fashion, tech, travel, finance, education, comedy, gaming, music, pets, diy, business, parenting. Expands to a curated list of 15 related hashtags. You can also use both — the lists are merged.
hashtagSortBystringNoHow to order videos within each hashtag's result set: relevance (default, discovery order), most_viewed, most_recent, or most_liked. Applied post-hydration.
hashtagPostedAfterstringNoISO 8601 lower bound on video publish time (e.g. "2026-04-01"). Videos older than this are filtered out.
hashtagPostedBeforestringNoISO 8601 upper bound on video publish time.
resultsPerPageintegerNoMax videos per hashtag (default: 100). The scraper over-fetches internally and then applies sort/time filters before capping to this value.
proxyConfigurationobjectNoNot required — the scraper uses its own residential path

* Provide either hashtags, hashtagNiche, or both.

Environment variables (Apify Console → Settings → Environment Variables)

VariableDefaultEffect
RESIDENTIAL_PROXY_URLRequired for Modes 5 & 8. Your residential proxy URL in http://user:pass@host:port format. Any residential proxy that works with TikTok will do; note that Apify's own Residential Proxy is not supported (TikTok rate-limits it).
ALLOW_HASHTAG_PREBILL=1unsetBypasses the 2026-05-05 pre-billing gate (runs at zero revenue — use only for testing).
HASHTAG_CACHE_TTL_SECS3600Override the challenge-detail KV cache TTL (in seconds). Cap 86400.
HASHTAG_CACHE_DISABLED=1unsetDisable the KV cache entirely.

Input Example

{
"scrapeMode": "tiktok-hashtag-scraper",
"hashtags": ["fyp", "dance", "cooking"],
"resultsPerPage": 30
}

Output — Metadata record

FieldTypeDescription
typestringAlways "hashtag"
hashtagstringHashtag name (without #)
challengeIdstringTikTok's internal hashtag ID
descriptionstring / nullHashtag description (null when TikTok doesn't expose it for this tag)
coverUrlstring / nullHashtag cover image URL (null when absent)
videoCountintegerTotal videos using this hashtag (TikTok-reported)
viewCountintegerTotal views for this hashtag (TikTok-reported)
videosSkippedintegerHow many video seeds the scraper attempted but couldn't parse. Broken down further in discoveryTelemetry.failuresByReason below.
relatedHashtagsarrayTikTok-reported related/sub-hashtags (e.g. [{name:"fitness", id:"9261"}]). Empty array when TikTok doesn't expose any. New in 0.1.149.
metadataSourcestringWhere the metadata came from this run: "cache" (re-used a response from the last hour) or "evomi" (fresh fetch). Lets you confirm when caching saved a fetch. New in 0.1.149.
discoveryTelemetryobjectPer-hashtag attrition counters: {seedsDiscovered, seedsFromSERP, seedsFromChainWalk, hydrationAttempts, hydrationSucceeded, failuresByReason: {DELETED, BOT_BLOCKED, PARSE_ERROR, NETWORK}, relevanceFiltered, timeWindowFiltered, aborted}. Makes yield drops diagnosable without reading logs. New in 0.1.149.
evomiHealthybooleanWhether the pre-run residential proxy health probe passed. false means the run aborted early with PROXY_FLAGGED. New in 0.1.149.
sortBystringThe hashtagSortBy value applied (echoed for observability).
postedAfter / postedBeforestring / nullThe time-window filters applied (ISO timestamps).
elapsedMsintegerWall-clock time scraping this hashtag.
videosarrayEmpty — individual videos are emitted as separate records (see below)
inputstringInput that produced this result

Output — Video records (per hashtag)

Each video is emitted as its own dataset item with the same 29 fields as Video Scraper (Mode 2) plus:

FieldTypeDescription
fromProfileSectionstringAlways "hashtag" for hashtag-discovered videos
inputstring"#<hashtag>" — the hashtag that produced this video

All videos are relevance-filtered to carry the target hashtag in their hashtags[], caption, or tag-page references.

Output Example

// Record 1: hashtag metadata
{
"type": "hashtag",
"hashtag": "fitness",
"challengeId": "9261",
"description": "Whether you're working on a new circuit, or just getting some fresh air, we're here for you",
"coverUrl": "https://p16-common-sign.tiktokcdn.com/...",
"videoCount": 61733497,
"viewCount": 749504806534,
"videos": [],
"input": "fitness"
}
// Record 2+: individual videos tagged with #fitness
{
"id": "7568886286639959318",
"text": "Quick morning routine #fitness #homeworkout",
"playCount": 698700,
"diggCount": 45200,
"shareCount": 380,
"commentCount": 312,
"collectCount": 2145,
"repostCount": 0,
"webVideoUrl": "https://www.tiktok.com/@mr.stephane1/video/7568886286639959318",
"hashtags": [
{"name": "Fitness"},
{"name": "homeworkout"},
{"name": "fitnesstips"}
],
"authorMeta": {
"name": "mr.stephane1",
"nickName": "Stephane",
"verified": false,
"fans": 12400
},
"fromProfileSection": "hashtag",
"input": "#fitness"
}

How it works: the scraper combines TikTok's public challenge-detail endpoint (for metadata) with multi-engine search-engine discovery (for video URLs), then hydrates each video via TikTok's public video page. All discovery + hydration happen inside Apify — no customer-side proxy or cookies needed.

Yield: 2–15 videos per hashtag for most tags, higher for viral tags (fyp, fitness). Videos are selected for strict relevance to the target hashtag — TikTok doesn't surface a full hashtag feed to any non-browser client, so the scraper recovers the most indexed videos rather than the newest.

Use Cases

  • Trend research — identify trending hashtags by video and view count
  • Campaign planning — check hashtag popularity before launching a branded hashtag
  • Competitive analysis — compare hashtag performance across industries
  • Content strategy — find high-engagement hashtags to use in your videos

How to Run

Apify Console: Select "Hashtag Scraper" mode, enter hashtags (without #), click Start.

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("get-leads/all-in-one-tiktok-scraper").call(run_input={
"scrapeMode": "tiktok-hashtag-scraper",
"hashtags": ["fyp", "dance", "cooking"],
"resultsPerPage": 20,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("type") == "hashtag":
print(f"#{item['hashtag']}: {item['videoCount']:,} videos, {item['viewCount']:,} views")

Discover the currently-trending hashtags globally or per-region. Returns one metadata record per trending hashtag (no videos — use Mode 5 with a specific hashtag for videos).

⏳ Same activation notice as Mode 5 — gated until 2026-05-05 because it shares the hashtag-result pay-per-event.

Input Parameters

ParameterTypeRequiredDescription
scrapeModestringYesSet to "tiktok-trending-hashtags"
trendingRegionstringNoISO 3166-1 alpha-2 country code (e.g. "US", "GB", "JP"). Default "US".
trendingLimitintegerNoMax trending hashtags to return, 1-50. Default 20.

Input Example

{
"scrapeMode": "tiktok-trending-hashtags",
"trendingRegion": "US",
"trendingLimit": 15
}
FieldTypeDescription
typestringAlways "hashtag_trending"
hashtagstringHashtag name (without #)
challengeIdstring / nullTikTok's internal hashtag ID (null if metadata unavailable)
descriptionstring / nullHashtag description (null when TikTok doesn't expose it)
coverUrlstring / nullHashtag cover image URL (null when absent)
videoCountintegerTotal videos using this hashtag
viewCountintegerTotal views for this hashtag
trendingRankinteger1-indexed position in the trending list
rankintegerAlias of trendingRank (1-indexed) — included for parity with comparable trending APIs.
rankDiffinteger / nullRank change vs. the previous run for this same region. Positive = climbing (e.g. +3 means moved from rank 5 to rank 2), negative = falling. null on first-ever run for the region or when the hashtag wasn't seen in the previous run. Computed via a per-region KV cache that persists between runs.
markedAsNewbooleantrue when this hashtag was NOT present in the previous run for the same region — useful for marketers tracking emerging trends. true for every record on the first-ever run for a region.
countryCodestringISO 3166-1 alpha-2 echo of the input trendingRegion — handy when consuming records from multiple regions in a single dataset.
industryNamestring / nullTikTok industry classification (e.g. "Music", "Beauty", "Apparel & Accessories", "Health & Wellness"). Sourced from the live Creative Center response when available, with a static fallback map covering the curated set's industry-specific tags (music/dance/comedy/gaming/beauty/fashion/fitness/food/diy/pets/travel). Generic discovery tags (fyp, foryou, viral, trending, etc.) emit null. Useful for marketing-segmentation buyers.
trendingSourcestring"creative_center" when the live TikTok Creative Center list succeeded; "fallback_curated" when the scraper fell back to its internal curated list.
inputstring"trending:<region>" — the region that produced this batch

How it works

The scraper first tries TikTok's public Creative Center trending hashtag list (no login required) and falls back to a curated list of always-popular global hashtags if Creative Center is blocked. Metadata (video count, view count, description) is then fetched via the same residential path as Mode 5, and the KV cache from Mode 5 is shared — so running Mode 8 immediately after Mode 5 hits mostly cache.

Use Cases

  • Daily trend report — schedule the actor to run once per day and pipe the output into Slack/email.
  • Regional discovery — run with trendingRegion="JP" to see what's trending in Japan without setting up proxies per country.
  • Hashtag discovery for Mode 5 — take the top-10 output and feed those hashtag names into Mode 5 for full video scraping.

Mode 9: Live Streams (tiktok-live-scraper)

Snapshot a TikTok live room — viewer count, like count, host info, status (LIVE / ENDED / NOT_FOUND). One record per room ID. For polling, schedule the actor to run on an interval.

⏳ Same activation notice as Mode 5 — gated until 2026-05-05 (shared hashtag-result pay-per-event).

Input Parameters

ParameterTypeRequiredDescription
scrapeModestringYesSet to "tiktok-live-scraper"
roomIdsarrayYesTikTok live-room numeric IDs (the roomId field on a creator's profile when they're live)

Input Example

{
"scrapeMode": "tiktok-live-scraper",
"roomIds": ["7350000000000000000", "7360000000000000000"]
}

Output — one record per room

FieldTypeDescription
typestringAlways "live_room"
roomIdstringThe room ID you supplied
statusstring"LIVE", "ENDED", "INVALID_INPUT", "HTTP_ERROR", "FETCH_ERROR", or "UNKNOWN"
hoststring / nullDisplay name of the host
hostUniqueIdstring / nullTikTok @ handle of the host
hostVerifiedboolean / nullVerified-badge status
titlestring / nullStream title set by the host
coverUrlstring / nullStream cover image URL
viewerCountinteger / nullConcurrent viewers at scrape time
likeCountinteger / nullCumulative likes during the stream
startedAtISOstring / nullWhen the stream went live
durationSecsinteger / nullStream length (only populated when status="ENDED")

Use Cases

  • Live-event monitoring — watch a creator's room during a launch / drop / Q&A and capture viewer counts every N minutes.
  • Influencer-watchlist — poll a list of creators' live rooms throughout the day to surface who's currently broadcasting.

Mode 11: Music / Sound (experimental) (tiktok-music-scraper)

Identity metadata for a TikTok sound — title, author, official embed HTML — by music ID. Returns one record per ID.

Why "experimental"? TikTok stripped music data from server-side rehydration in April 2026 and the API endpoint that lists videos using a sound now requires authenticated request signing. Under our no-login policy, we surface what's reachable via the public oEmbed endpoint: stable identity (title, artist, embed). Aggregate stats (videoCount, playCount) and the video list are NOT available — use Mode 2 (video scraper) on specific video IDs you've discovered elsewhere if you need full per-video data. Output shape may evolve as TikTok's APIs change.

⏳ Same activation notice as Mode 5 — gated until 2026-05-05.

Input Parameters

ParameterTypeRequiredDescription
scrapeModestringYesSet to "tiktok-music-scraper"
musicIdsarrayYesTikTok sound IDs (the music.id value from any video's musicMeta)

Input Example

{
"scrapeMode": "tiktok-music-scraper",
"musicIds": ["7631252318008249119", "7627154724780821279"]
}

Output — one record per sound

FieldTypeDescription
typestringAlways "music"
musicIdstringThe numeric sound ID
titlestring / nullFull oEmbed title (e.g. "♬ original-sound - Khabane lame")
titleSlugstring / nullParsed song slug (the part between and the artist)
authorNamestring / nullArtist display name
embedHtmlstring / nullOfficial TikTok <blockquote> embed snippet for use on a website
playUrlnullAlways null — requires authenticated signing
coverUrlnullAlways null — same
videoCountnullAlways null — same
playCountnullAlways null — same
videosarrayAlways empty — same
_dataSourcestringAlways "oembed" — flags the data source for debugging

Use Cases

  • Sound attribution — given a music ID extracted from a video, get the canonical title and artist.
  • Embed generation — drop the embedHtml directly into a webpage to render a TikTok sound widget.

Dynamic Hashtag Bundle (experimental) (tiktok-dynamic-bundle)

Discover related hashtags from 1-3 seed tags by sampling top videos under each seed and counting which other hashtags appear most frequently alongside them. Useful when a niche isn't in the static hashtagNiche curated list.

Why "experimental"? Output shape ({seeds, related:[{name, cooccurrences}], videosSampled}) is new and may evolve based on customer feedback. Validated live in production: seed=cooking → related=[food, foodie, cookingwithkya, chineserecipes, ...].

⏳ Same activation notice as Mode 5 — gated until 2026-05-05.

Input Parameters

ParameterTypeRequiredDescription
scrapeModestringYesSet to "tiktok-dynamic-bundle"
hashtagsarrayYes1-3 seed hashtag names (without #). Extra entries beyond 3 are ignored.

Input Example

{
"scrapeMode": "tiktok-dynamic-bundle",
"hashtags": ["cooking"]
}

Output — one record per run

FieldTypeDescription
typestringAlways "hashtag_bundle_dynamic"
seedsarrayThe seed tags actually used (after deduplication and 3-tag cap)
relatedarrayUp to 20 related hashtags, each {name, cooccurrences}, sorted by frequency descending
videosSampledintegerHow many videos the discovery pass hydrated across all seeds

Use Cases

  • Long-tail niche discovery — when the static hashtagNiche doesn't cover your industry (e.g. aquariums, miniature painting, vintage CRT TVs), seed the bundle with 1-3 known tags and let TikTok's actual cooccurrence data surface the niche's vocabulary.
  • Content-strategy research — feed the related tags into Mode 5 to scrape full video data per related hashtag.

Mode 6: All-in-One (tiktok-scraper)

Discover and scrape recent videos from TikTok in one run. 0.1.165: accepts ANY combination of profiles, postURLs, searchQueries, AND hashtags in a single run — true superset of Modes 1, 2, 4, and 5. Returns the same 29-field video output as Mode 2.

Input Parameters

ParameterTypeRequiredDescription
scrapeModestringYesSet to "tiktok-scraper"
profilesarrayYes*TikTok usernames, @handles, or profile URLs. Each profile's recent videos are discovered via the embed page.
postURLsarrayYes*TikTok video URLs to scrape directly.
searchQueriesarrayYes*Keywords to search TikTok user accounts. Combined with maxProfilesPerQuery.
hashtagsarrayYes*0.1.165: Hashtag names (without #). Each hashtag's recent videos are discovered (same logic as Mode 5). All-in-one mode bills these as scraper-result (not hashtag-result) for consistent per-result pricing across the run. *At least one of profiles, postURLs, searchQueries, or hashtags is required. Any combination is supported.
resultsPerPageintegerNoMax videos per profile / hashtag (default: 100). Limited to ~10 via embed-page discovery for profiles.
excludePinnedPostsbooleanNoSkip pinned posts (default: false)
hashtagSortBy / hashtagPostedAfter / hashtagPostedBeforemixedNoSame hashtag filters as Mode 5 — applied to discovered videos when hashtags is supplied.
proxyConfigurationobjectNoProfiles + postURLs + searchQueries work without proxy. Hashtags require RESIDENTIAL_PROXY_URL env var (residential proxy).

Input Examples

// Classic profile-only
{
"scrapeMode": "tiktok-scraper",
"profiles": ["charlidamelio", "khaby.lame", "mrbeast"],
"resultsPerPage": 10
}
// 0.1.165: true all-in-one — every input type in one run
{
"scrapeMode": "tiktok-scraper",
"profiles": ["charlidamelio"],
"hashtags": ["cooking", "fitness"],
"postURLs": ["https://www.tiktok.com/@khaby.lame/video/7631252274160962846"],
"searchQueries": ["food blogger"],
"resultsPerPage": 5,
"maxProfilesPerQuery": 3
}
// Result: ~5 charli videos + ~10 hashtag videos + 1 explicit video + 3 search profiles, all billed scraper-result

Output Fields — 29 fields

Same output as Video Scraper (Mode 2). See Mode 2 output fields table. Each result includes full video data with authorMeta containing the profile's stats.

Output Example

{
"id": "7625055547116522765",
"text": "new youtube video out now!!! dc @Brett Sewell",
"createTime": 1775346609,
"createTimeISO": "2026-04-04T23:50:09.000Z",
"diggCount": 41200,
"playCount": 331800,
"shareCount": 482,
"commentCount": 594,
"collectCount": 1436,
"repostCount": 0,
"webVideoUrl": "https://www.tiktok.com/@charlidamelio/video/7625055547116522765",
"authorMeta": {
"id": "5831967",
"name": "charlidamelio",
"nickName": "charli d'amelio",
"verified": true,
"createTime": 1447505838,
"fans": 156800000,
"heart": 12000000000
},
"musicMeta": {
"musicName": "son original",
"musicAuthor": "Daniel Ralph",
"musicOriginal": true
},
"videoMeta": {
"height": 1280,
"width": 720,
"duration": 13,
"definition": "720p"
},
"hashtags": [],
"mentions": ["@Brett Sewell"],
"input": "charlidamelio"
}

Real test result from Build 0.1.105, April 2026.

Use Cases

  • TikTok analytics dashboard — feed profile + video data into Google Sheets, Airtable, or Looker
  • Content calendar analysis — analyze posting frequency, timing, and engagement patterns
  • Influencer vetting — check recent content quality and engagement before partnerships
  • Trend detection — spot trending sounds, hashtags, and formats across multiple creators
  • Automated reporting — schedule weekly scrapes to track creator performance over time

How to Run

Apify Console: Select "All-in-One" mode, paste usernames, set results per page, click Start.

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("get-leads/all-in-one-tiktok-scraper").call(run_input={
"scrapeMode": "tiktok-scraper",
"profiles": ["charlidamelio", "khaby.lame"],
"resultsPerPage": 10,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
author = item.get("authorMeta", {}).get("name", "?")
print(f"@{author}: {item['text'][:40]}... | {item['playCount']:,} views")

Mode 7: Data Extractor (tiktok-data-extractor)

Lightweight version of All-in-One mode. Same video output, lower pricing tier. Ideal for high-volume, cost-sensitive workloads.

Input Parameters

ParameterTypeRequiredDescription
scrapeModestringYesSet to "tiktok-data-extractor"
profilesarrayYes*TikTok usernames, @handles, or profile URLs
postURLsarrayYes*0.1.165: TikTok video URLs (same as M2).
searchQueriesarrayYes*0.1.165: Keywords to search user accounts (same as M4).
hashtagsarrayYes*0.1.165: Hashtag names without # (same as M5). All-in-one mode bills these as extractor-result for consistent per-result pricing. *At least one input field is required; any combination is supported.
resultsPerPageintegerNoMax videos per profile / hashtag (default: 100)
proxyConfigurationobjectNoProfile/postURLs/search work without proxy. Hashtags require RESIDENTIAL_PROXY_URL.

Input Example

{
"scrapeMode": "tiktok-data-extractor",
"profiles": ["charlidamelio"],
"resultsPerPage": 5
}

Output Fields — 29 fields

Same output as Video Scraper (Mode 2) and All-in-One (Mode 5). See Mode 2 output fields table.

Output Example

Same structure as Mode 5 All-in-One output. See Mode 5 output example.

Use Cases

  • Bulk data collection — scrape thousands of videos at the lowest per-result cost
  • Data warehousing — populate data lakes with TikTok content metadata
  • Machine learning — collect training data for content analysis models
  • Market research — large-scale analysis of content trends and creator behavior

How to Run

Apify Console: Select "Data Extractor" mode, paste usernames, click Start.

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("get-leads/all-in-one-tiktok-scraper").call(run_input={
"scrapeMode": "tiktok-data-extractor",
"profiles": ["charlidamelio", "khaby.lame", "mrbeast", "zachking", "addisonre"],
"resultsPerPage": 20,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(f"Scraped {len(items)} videos from 5 profiles")

Download Your Data

After every run, download your data in any format:

  • JSON — for developers and API integrations
  • CSV — for spreadsheets and data analysis
  • Excel (XLSX) — for business users
  • XML — for data pipelines

Google Sheets: Use =IMPORTDATA() with the CSV download link for instant import.

All 7 Apify export formats available: JSON, JSONL, CSV, XLSX, XML, HTML Table, RSS.

MCP Integration for AI Agents

This scraper works with AI agents via the Model Context Protocol (MCP). Connect it to Claude Desktop, Cursor, GPT, or any MCP-compatible client.

Setup:

  1. Go to mcp.apify.com
  2. Add "All-in-One TikTok Scraper" to your MCP server
  3. Ask your AI: "Scrape the TikTok profile for charlidamelio and get follower stats"

Example prompts for your AI agent:

  • "Scrape the TikTok profile of charlidamelio"
  • "Get engagement stats for this TikTok video: [URL]"
  • "Search TikTok for fitness trainers"
  • "Get the latest comments on this viral TikTok"

Works with Claude Desktop, Cursor, GPT via MCP, and any other MCP-compatible AI client.

Integrations

n8n

  1. Add the Apify node in your n8n workflow
  2. Select "All-in-One TikTok Scraper" as the actor
  3. Configure the mode and input parameters
  4. Connect the output to your CRM, Google Sheets, or database

Make.com (Integromat)

  1. Add the Apify module to your scenario
  2. Select "Run Actor" and choose this scraper
  3. Map the JSON output fields to your downstream modules
  4. Use for automated trend monitoring, influencer tracking, or CRM syncing

Zapier

  1. Create a new Zap with Apify as the trigger or action
  2. Select "Run Actor" and configure with this scraper's actor ID
  3. Map output fields to Google Sheets, HubSpot, Salesforce, or Slack
  4. Trigger on schedule or from a webhook

REST API & SDKs

Use the Apify API, JavaScript SDK, or Python SDK for programmatic access:

curl "https://api.apify.com/v2/acts/get-leads~all-in-one-tiktok-scraper/runs?token=YOUR_TOKEN" \
-X POST \
-H "Content-Type: application/json" \
-d '{
"scrapeMode": "tiktok-profile-scraper",
"profiles": ["charlidamelio"],
"resultsPerPage": 20
}'

Scheduled runs: Set up daily, weekly, or hourly scrapes directly in the Apify Console — no cron jobs or servers needed.

Key Features

  • 7 scraping modes including hashtag scraping with real video discovery
  • 29 data fields per video — full Clockworks compatibility
  • No proxy needed — all modes work on standard infrastructure
  • Pay per result — no monthly fee, no minimum
  • 12–40% cheaper than Clockworks across all mainline modes (benchmarked 2026-04-24)
  • MCP-compatible for AI agents (Claude, GPT, Cursor)
  • Clockworks drop-in replacement — same output field names
  • Clockworks-compatible comments — flat field structure (cid, diggCount, uniqueId, pinnedByAuthor, repliesToId) matches Clockworks output exactly
  • Smart input parsing — paste URLs, @handles, or usernames — auto-detected
  • Automatic deduplication — duplicate inputs are removed before scraping
  • Parallel scraping — up to 3 concurrent requests for faster results
  • Memory-aware — automatically reduces concurrency if memory is high
  • Self-throttling — automatically reduces concurrency and adds cool-down when rate-limit / format-change errors are detected, keeping the scraper below TikTok's bot-detection thresholds
  • Proxy-aware retry — if you supply a residential proxy that gets flagged mid-run, the scraper automatically falls back to a direct connection for Modes 1-6 instead of failing
  • Error records in the dataset — every failed input produces a lightweight record (_type: "scrape_error") with the input, error category, and message, so your dataset row-count matches your input count and you can see exactly which inputs were skipped (free — not billed as a result)
  • Absence-tolerant quality reporting — fields that TikTok legitimately leaves empty for some accounts (bio, caption, region, bio link) no longer trigger false "low quality" warnings in the run log
  • Per-run billing summary — the final log line of every run shows events charged, gross revenue, and your creator net at the tier reference rate — full pricing transparency
  • Run summary — every run saves a summary.json to the key-value store with stats, duration, and success rate
  • Comment reply threading — automatically fetches replies for each comment (up to 50 replies per comment)
  • Error categorization — classifies failures as DELETED, RATE_LIMITED, FORMAT_CHANGE, NETWORK, or BLOCKED for easy debugging
  • Fuzzy username search — searching "gordonramsay" finds @gordonramsayofficial automatically (tries suffixes like official, real, tiktok + dot/underscore variations)

Dataset Error Records

Whenever an input fails (deleted account, blocked IP, format change, etc.), a lightweight error record is pushed to the dataset. These records are not billed — they're free observability so you can see which inputs were skipped.

{
"_type": "scrape_error",
"mode": "tiktok-profile-scraper",
"input": "walauweycrew",
"error": "DELETED",
"errorMessage": "Account not found: @walauweycrew",
"retryable": false,
"scraped_at": "2026-04-22T11:51:35.000Z"
}

Error categories

CategoryMeaningRetryable
DELETEDProfile/video removed from TikTokNo
RATE_LIMITEDTikTok temporarily throttled the requestYes
FORMAT_CHANGETikTok returned an unexpected response shapeNo (report as bug)
NETWORKTransient network/socket failureYes
BLOCKEDRequest blocked by TikTok (bot detection)Sometimes
INVALID_INPUTThe input string could not be parsed (bad URL, bad handle)No
PRICING_PENDINGMode 5 / 8 / 9 / 11 / Dynamic Bundle before their 2026-05-05 activationNo (lifts automatically)
PROXY_FLAGGEDPre-run residential-proxy health check found the sticky IP rate-limited by TikTokYes (rotate the sticky session on your proxy provider's dashboard)
PROXY_UNAVAILABLEResidential-proxy credentials or network failureYes (check RESIDENTIAL_PROXY_URL)
UNKNOWNUnclassified errorVaries

To filter error records from successful results in your pipeline: item._type !== "scrape_error".

Cross-Cutting Options (apply to multiple modes)

These optional inputs work across several modes:

OptionModesDefaultWhat it does
includeTranscripts (boolean)M2 Video, M5 All-in-One, M6 Data ExtractorfalseWhen true, every video record with auto-captions gets a flattened plain-text transcript at videoMeta.transcriptText. Adds one extra HTTP fetch per video that has captions; videos without captions emit transcriptText: null. Capped at 20 KB per transcript.
commentReplyDepth (integer 1-3)M3 Comments2How deep to walk reply threads. 1=top-level only, 2=top + direct replies, 3=adds reply-of-reply. Extra fetches fire only for comments that actually have nested threads.
useCache (boolean)M1 Profile, M2 VideofalseWhen true, profile and video records scraped within the last 24 hours are returned from the actor's KV-store cache instead of being re-fetched. Cached records are stamped with _fromCache: true. Useful for re-running the same input list intra-day without paying for fresh scrapes. TTL is configurable via the HASHTAG_CACHE_TTL_SECS env var (clamped 60-86400).

Output Schema Versioning

Every dataset record (success or _type: "scrape_error") carries a _schemaVersion field, calendar-versioned "YYYY.MM.DD". Use it to gate features in your pipeline:

# Python — process only records produced by the current schema
for item in dataset.iterate_items():
if item.get("_schemaVersion", "0") < "2026.04.24":
continue # older shape; skip or run a backfill job
process(item)

Convention:

  • Additive change (new optional field) → bump the version date; existing consumers unaffected.
  • Breaking change (removed or renamed field) → bump the version date AND add a Changelog entry.

FAQ

How much does it cost to use All-in-One TikTok Scraper? Pay-per-result pricing from $0.40/1K (comments) to $3.10/1K (videos) at Business tier. Free tier starts at $0.65/1K. 12–40% cheaper than Clockworks across all mainline modes (benchmarked 2026-04-24). See the Pricing tab for exact costs.

Is there a monthly subscription? No. Pay only for what you scrape. No minimum, no commitment.

Do I need a proxy? No. All modes work without proxy on Apify's standard infrastructure.

What data do I get from video scraping? Full engagement data: likes (diggCount), views (playCount), shares, comments, saves (collectCount), reposts (repostCount), plus author info (with account creation date), music metadata (with original cover URL), video duration, hashtags, mentions, and cover images. 29 fields total per video.

Can I scrape comments? Yes. The comments scraper returns 18 Clockworks-compatible fields: comment text, likes (diggCount), reply count, pinned status, author info (uid, uniqueId, avatarThumbnail), mentions, and threading (repliesToId). Supports pagination up to the full comment count.

How does this compare to Clockworks TikTok scrapers? Same output fields, same data quality, 12–40% cheaper (benchmarked 2026-04-24). Clockworks-compatible output format means you can switch without changing your data pipeline. We combine 10 modes in one actor — Clockworks splits into 13 separate actors.

Can I scrape thousands of profiles? Yes. Provide a list of usernames and the scraper processes them in parallel (3 concurrent) with built-in retry logic and error recovery.

How do I use this with AI agents? Connect via MCP at mcp.apify.com. Add this actor to your MCP server, then ask your AI to scrape TikTok.

How fast is it? Parallel scraping: 3 profiles/videos at once, 2 search queries at once. ~15 seconds per 20 profiles (with parallel). Comments: ~5 seconds per 100 comments. Video scraping: ~1-2 seconds per video. No proxy overhead.

What happens with private or deleted profiles? Private profiles return limited data (username, verified status, private flag). Deleted or non-existent profiles are skipped with a warning in the run log. The scraper continues with the remaining inputs.

What happens if a video is deleted or unavailable? The scraper logs a warning and moves to the next video. You're only charged for successfully scraped results.

Can I use integrations with this scraper? Yes — Make, Zapier, Slack, Airbyte, Google Sheets, Google Drive, webhooks, REST API, and more.

What input formats are accepted? Profiles: usernames (charlidamelio), @handles (@charlidamelio), or full URLs (https://www.tiktok.com/@charlidamelio). Videos: full URLs or just the video ID (19+ digits). All formats are auto-detected. Duplicates are removed automatically.

What if I don't know the exact TikTok username? The user search mode has fuzzy matching — searching "gordonramsay" will automatically find @gordonramsayofficial. It tries common TikTok username suffixes (official, real, tiktok) and dot/underscore variations.

How much does it cost to get started? Apify gives you $5 free usage credits every month on the Free plan. That's enough for ~7,700 comments, ~2,000 profiles, or ~1,000 videos. For regular scraping, the $49/month Scale plan gives you the best value with volume discounts.

How can I use TikTok Scraper with the Apify API? The Apify API gives you full programmatic access — start runs, fetch results, manage schedules, and more. Use the apify-client NPM package for Node.js or the apify-client PyPI package for Python. See the Apify API reference for full details, or click the API tab above for code examples.

Is it legal to scrape TikTok? This scraper only extracts publicly available data. It does not extract private user data such as email addresses, gender, or location. Personal data is protected by GDPR and other regulations — ensure you have a legitimate reason for processing any personal data you collect. Read more about the legality of web scraping and ethical scraping on the Apify blog.

More Scrapers by get-leads

Need data from other platforms? Check out our other scrapers:

ScraperWhat it doesPrice
All-in-One Amazon ScraperProducts, reviews, sellers, bestsellers, deals — 15 marketplacesfrom $0.75/1K
All-in-One LinkedIn ScraperProfiles, companies, jobs, posts, searchfrom $1.00/1K
Real Estate Agent ScraperAgents from Google Maps with email, phone, licensefrom $3.00/1K
Google Maps ScraperAny business from Google Maps — 35+ fields per placefrom $1.00/1K

All scrapers: no proxy needed, MCP-ready, Clockworks-compatible where applicable.

Changelog

0.1.165 (2026-04-26) — Mode 3 profile-orchestrator + Modes 5/6 hashtag input (audit follow-up part 2/2)

Mode 3 (Comments Scraper) — new profiles[] input + maxVideosPerProfile cap:

  • Mode 3 previously required explicit video URLs in postURLs[]. Now also accepts profiles[] — for each creator, the scraper discovers up to maxVideosPerProfile recent videos via the embed page (reusing the same logic as Mode 5/6) and scrapes comments from each. Lets you run "scrape comments across charlidamelio's 10 most-recent videos" in one call instead of feeding 10 separate URLs.
  • New input maxVideosPerProfile (1-50, default 10). Combined with resultsPerPage, total comments per run = profiles × maxVideosPerProfile × resultsPerPage.
  • postURLs and profiles can be combined; discovered URLs are deduped against any explicit URLs you also pass.
  • Revenue impact: a single profile input typically yields 10-30× more comment-result events than a single video URL — customers segmenting by creator now have a cleaner workflow at proportional revenue.

Modes 5 / 6 (All-in-One / Data Extractor) — new hashtags[] input:

  • Modes 5 and 6 previously routed profiles + postURLs + searchQueries through the all-in-one orchestrator. 0.1.165 completes the input matrix by also accepting hashtags[]. Discovered hashtag videos are billed as scraper-result (M5) / extractor-result (M6) for consistent per-result pricing across the whole run — not as hashtag-result.
  • Same hashtagSortBy / hashtagPostedAfter / hashtagPostedBefore filters apply.
  • The hashtag-meta record (Mode 5's challenge-detail summary) is suppressed in all-in-one mode to keep the output schema homogeneous; only the discovered videos are emitted.
  • Existing pure Mode 5 (tiktok-hashtag-scraper) behavior is unchanged — still emits the hashtag-meta record + videos as hashtag-result.

Verification:

  • Mode 3 profiles: live verified — {profiles:["charlidamelio"], maxVideosPerProfile:3, resultsPerPage:5} returned 3 video discoveries × 5 comments = 15 comment records, 100% Quality Report, $0.0078 creator net at 98% margin.
  • Modes 5/6 hashtags: live verified routing + billing-event switch (log line billing event: scraper-result confirms the all-in-one mode swaps the event type correctly). The hashtag fetch itself blocked by an unrelated Evomi sticky-IP flag at audit time.

0.1.164 (2026-04-26) — Mode 8 industryName (audit follow-up part 1/2)

Mode 8 (Trending Hashtags) — new industryName output field:

  • Each trending record now carries an industryName string — TikTok's industry classification (e.g. "Music", "Beauty", "Apparel & Accessories", "Health & Wellness"). Closes the largest remaining M8 competitive gap (post-0.1.162 the field count went from 7 → 11; this brings it to 12 of Clockworks' 13).
  • Two source paths:
    1. Live Creative Center: when the regional trending list call succeeds, each row's industry-like field (industry_name, industry, category_name, category, industry_id) is parsed and attached to the corresponding tag.
    2. Static fallback map: when Creative Center is unreachable and the curated FALLBACK_TRENDING list is used, a per-tag map covers the industry-specific tags (music, dance, comedy, gaming, beauty, fashion, fitness, food, diy, pets, travel) and emits null for generic discovery tags (fyp, foryou, viral, trending, etc.).
  • Diagnostic log line — first row's keys are now logged from the Creative Center response so any future TikTok schema changes are immediately visible.
  • Local mock test (test/test-m8-trending.local.mjs) extended with 8 new assertions; full suite is 22/22 passing including back-compat (no industryMap argument → all industryName=null).

0.1.162 (2026-04-25) — Output-field expansion (Modes 1, 4, 8) from competitive audit

Mode 1 (Profile Scraper) and Mode 4 (User Search) — new output field:

  • commerceUserInfo — TikTok Shop / commerce profile object surfaced at the top level of flat profile records, e.g. { "commerceUser": false }. Mirrors the authorMeta.commerceUserInfo already emitted on video records (Modes 2/5/6) so flat profile output is now consistent with nested author metadata. Useful for B2B / influencer-marketing buyer segmentation when a quick "is this a TikTok Shop seller?" filter is needed.

Mode 8 (Trending Hashtags) — four new output fields:

  • rank — alias of trendingRank (1-indexed position). Provided alongside trendingRank for parity with comparable trending APIs; downstream consumers can use whichever name they prefer.
  • rankDiff — rank change vs. the previous run for the same trendingRegion. Positive = climbing, negative = falling, null on the first-ever run for the region or when a hashtag wasn't seen previously. Computed automatically from a per-region KV cache that the scraper persists between runs — no input changes required.
  • markedAsNew — boolean, true when this hashtag was NOT in the previous run for the same region. Marketers can filter on markedAsNew=true && rankDiff===null to surface emerging trends. (Note: every record on the first-ever run for a region will be markedAsNew=true by definition; flag stabilises from the second run onward.)
  • countryCode — ISO 3166-1 alpha-2 echo of the input trendingRegion. Handy when consuming records from multiple regions in a single dataset.

Implementation notes:

  • Mode 8 uses a new named KV store tiktok-trending-prior (auto-created on first run) keyed by region:<CC> to remember the prior run's tag→rank map. Persists across runs of the same actor without any schedule wiring on your side.
  • All five new fields are non-breaking additions. Existing consumers see no change unless they read the new field names.

0.1.151 (2026-04-24) — Day 4: new modes, transcripts, deeper threading, dedup cache, CI/CD + tests

New modes (3 of them, all share the 2026-05-05 activation gate with Mode 5):

  • Mode 9 — Live Streams (tiktok-live-scraper). Input: roomIds[]. Output: one {type:"live_room"} record per room with viewerCount, likeCount, host info, status (LIVE / ENDED).
  • Mode 11 — Music / Sound (tiktok-music-scraper). Input: musicIds[]. Output: one metadata record per sound (title, author, playUrl, coverUrl, videoCount, playCount) + up to resultsPerPage videos using that sound.
  • Dynamic Bundle (tiktok-dynamic-bundle). Input: 1-3 seed hashtags. Output: 20 most-frequently co-occurring hashtags across sampled videos. Great for niche discovery.

Enhancements to existing modes:

  • Video transcripts (Modes 2/5/6/11). Set includeTranscripts: true — the scraper fetches the WebVTT subtitle file for every video with auto-captions and emits flattened plain text at videoMeta.transcriptText. Opt-in, so default cost is unchanged.
  • Comment reply depth 3 (Mode 3). New input commentReplyDepth accepts 1 (top only), 2 (top + replies, default), or 3 (adds reply-of-reply). Each reply carries a replyDepth field. Extra API calls fire only for comments that actually have nested threads.
  • Cross-run dedup cache (all profile / video modes). New useCache: true input — profile and video records scraped within the last 24 hours are served from cache on subsequent runs. Cached records carry _fromCache: true. Configurable TTL via DEDUP_CACHE_TTL_SECS env var.

Output schema versioning:

  • Every dataset record now carries _schemaVersion (calendar-versioned, e.g. "2026.04.24"). Lets downstream pipelines gate on feature availability.

Infrastructure:

  • GitHub Actions CI at .github/workflows/ci.yml — on every push: syntax-check all JS, validate all JSON, run parser unit tests.
  • Parser unit tests at test/parsers/*.test.js — 20 tests covering profile parsing (including mega-account heart overflow), comment parsing (mentions, nested replies, Clockworks output shape), and transcript flattening (cue stripping, HTML-tag removal, 20 KB cap). Run locally with npm test or node --test test/parsers/*.test.js.
  • Weekly Chrome-GT regression — scheduled to run every Monday at 07:00 local, firing profile/video/comments/hashtag runs against canonical inputs in docs/regression-inputs.json, diffing against the GT samples, alerting on correctness < 85 % or yield drop > 40 % week-over-week.

Competitive refresh:

  • Pricing-comparison table rebenchmarked against public Clockworks listings on 2026-04-24. Clockworks dropped prices on several modes since Q1; current delta is 12-40% cheaper (was 30-68%). Data fresh; will re-benchmark quarterly.

0.1.157 (2026-04-24)

New modes (3, all activate 2026-05-05):

  • Live Streams (tiktok-live-scraper) — snapshot a TikTok live room: viewer count, host info, status. See "Mode 9: Live Streams" above.
  • Music / Sound (tiktok-music-scraper, experimental) — identity metadata for a TikTok sound via the public oEmbed endpoint: title, artist, embed HTML. Aggregate stats and the video list are not available without authenticated access — use Mode 2 or Mode 5 if you need those. See "Mode 11: Music / Sound" above.
  • Dynamic Hashtag Bundle (tiktok-dynamic-bundle, experimental) — discover related hashtags from 1-3 seed tags by sampling top videos. See "Dynamic Hashtag Bundle" above.

New cross-cutting options:

  • includeTranscripts: true (Modes 2/5/6) — fetch the WebVTT auto-caption file for every video that has one and emit flattened plain text at videoMeta.transcriptText. Capped 20 KB. Opt-in so default cost is unchanged.
  • commentReplyDepth: 1|2|3 (Mode 3) — control how deep the reply walker goes. Default 2 (top + direct replies); 3 adds reply-of-reply. Each reply now carries a replyDepth field.
  • useCache: true (Modes 1, 2) — return profile / video records from the 24-hour KV-store cache when re-running the same input. Cached records carry _fromCache: true. Useful for re-runs without paying for fresh scrapes.

Output schema versioning:

  • Every dataset record (success and error) now carries a _schemaVersion field, calendar-versioned "YYYY.MM.DD". Lets pipelines gate on feature availability.

Removed (1):

  • Ad Library (tiktok-ads-scraper) has been retired. TikTok's underlying Ad Library API does not allow unauthenticated access — confirmed by direct reverse-engineering of the endpoint. The Apify input enum no longer includes the value, and any saved tasks using it will need to switch modes.

Other improvements:

  • New error categories PROXY_FLAGGED and PROXY_UNAVAILABLE for cleaner diagnostics on residential-proxy issues.
  • Pre-run residential-proxy health probe (Modes 5, 8, 9, 11): a single cheap probe at the start of a run catches a flagged sticky IP and emits one error record per input instead of burning bandwidth on guaranteed-fail fetches.
  • Fix: the proxy-ban guard previously false-positive-rejected any proxy URL whose hostname or credentials contained the word "residential". Now matches only Apify's banned RESIDENTIAL proxy group specifically. Bring-your-own residential proxies work without false rejection.
  • Quality infrastructure: weekly automated Chrome-GT regression run (every Monday) diffs the production modes against ground-truth samples and alerts on regressions. Runs continuously in the background — you don't need to do anything.
  • Parser unit tests under test/parsers/*.test.js (run with npm test or node --test).
  • Continuous-integration GitHub Action (.github/workflows/ci.yml) — every commit syntax-checks all JS, validates all JSON schemas, runs the parser tests.

Mode 5 (Hashtag Scraper) hardening:

  • Pre-run residential-proxy health probe — before scraping any hashtag, one cheap probe checks whether the residential sticky IP is flagged. If it is, the whole batch aborts with a new PROXY_FLAGGED error category (zero bandwidth cost) instead of burning infrastructure on guaranteed-fail runs. New categories: PROXY_FLAGGED (residential IP rate-limited — rotate the sticky session on your proxy provider's dashboard) and PROXY_UNAVAILABLE (residential-proxy credentials/network failure — check RESIDENTIAL_PROXY_URL).
  • Challenge-detail KV cache — responses are cached for 1 hour (configurable via HASHTAG_CACHE_TTL_SECS; disable with HASHTAG_CACHE_DISABLED=1). Re-running the same hashtag inside the TTL skips the residential warm-up + challenge-detail fetch entirely. Cache only stores TikTok's public metadata response; no cookies or credentials.
  • relatedHashtags field on every hashtag metadata record — surfaces TikTok-reported related/sub-challenges. Empty when TikTok doesn't expose any.
  • Full discovery telemetry in every hashtag metadata record: discoveryTelemetry.{seedsDiscovered, seedsFromSERP, seedsFromChainWalk, hydrationAttempts, hydrationSucceeded, failuresByReason: {DELETED, BOT_BLOCKED, PARSE_ERROR, NETWORK}, relevanceFiltered, timeWindowFiltered, aborted}. Makes yield drops diagnosable without reading logs.
  • Per-hashtag cost/path log line — every hashtag logs a one-liner showing metadata source, seeds discovered, hydration success rate, skip reasons, and elapsed time.
  • New optional inputs for Mode 5:
    • hashtagSortBy: relevance (default) / most_viewed / most_recent / most_liked.
    • hashtagPostedAfter / hashtagPostedBefore: ISO date strings for time-window filtering (applied post-hydration).
    • hashtagNiche: one of cooking, fitness, beauty, fashion, tech, travel, finance, education, comedy, gaming, music, pets, diy, business, parenting. Expands to 15 curated hashtags; merges with any hashtags you list explicitly.

Mode 8 — Trending Hashtags (experimental): new tiktok-trending-hashtags mode. Returns the currently-trending hashtags globally or per-region (via TikTok Creative Center, with curated fallback). One metadata record per tag, shares the same hashtag-result pay-per-event as Mode 5 (therefore also date-gated until 2026-05-05). See "Mode 8" section above for inputs and output fields.

New error categories in the errorsByCategory run stat + dataset error field: PROXY_FLAGGED, PROXY_UNAVAILABLE.

0.1.147 (2026-04-24)

  • Mode 5 Hashtag Scraper — date-gate until 2026-05-05 — the hashtag-result pay-per-event is registered but effective 2026-05-05 (Apify pricing-lock window). Running the mode before that date would incur infrastructure cost with zero revenue, so Mode 5 now returns a single _type: "scrape_error" record per input with error: "PRICING_PENDING" and does not scrape. Gate auto-lifts at 2026-05-05T00:00:00Z. Override with actor env var ALLOW_HASHTAG_PREBILL=1 if you specifically want to run at a loss during the lock-in window. See the Mode 5 activation notice for full details.
  • Default memory reduced: 256 MB → 128 MB — peak RSS observed across every mode (profile through comments) fits under ~70 MB. Halving the default memory halves the compute-unit cost of every run; the runtime-throttle fallback (+concurrency reduction when memory spikes) remains active.
  • New error category PRICING_PENDING — surfaced in the errorsByCategory stats and in the dataset error field. Emitted only when Mode 5's date-gate trips.
  • Ground-truth validation at scale — internal Chrome-GT regression harness now runs against 8 profiles + 7 videos + 3 hashtags + 20 comments per release. All six billable modes verified at ≥ 95 % field-level correctness under realistic counter-drift tolerances (fans/heart 5 %, playCount 8 %, comment digg 5 %). No scraper bugs found in this release.
  • Harness realism (internal tool) — per-field drift tolerance, CDN-edge URL equivalence via image content hash, subset-object comparison for authorMeta / musicMeta / videoMeta, and explicit "auth-gated" handling for fields TikTok populates only for logged-in clients (e.g. comment textLanguage). These changes fix false-positive MISMATCH noise that obscured the real regression signal in earlier runs.

0.1.141 (2026-04-22)

  • Richer authorMeta on every video record — added secUid (enables direct Voyager-API lookups) and avatarMedium (720×720 avatar variant). Modes 2 / 5 / 6 / 7 all benefit. Total 22 fields per authorMeta.
  • Profile createTime — every profile record (Modes 1 and 3) now includes the user's account-creation Unix timestamp, useful for lead qualification and account-age analytics.
  • Comment textLanguage — every comment record (Mode 4) now includes TikTok's detected language (ISO 639-1) when available, null otherwise. Enables per-language sentiment pipelines.
  • Hashtag relevance filter relaxed — Mode 5 now also accepts videos where the target hashtag appears as a substring inside another tag (e.g. #cooking accepts #cookinghack, #easycooking, #bakingandcooking). Increased yield for most hashtags without loss of precision.
  • Hashtag videosSkipped counter — metadata record now reports how many SERP seeds we hydrated but couldn't parse (deleted videos, bot-block pages). Transparency on the attrition rate.

0.1.139 (2026-04-22)

  • Hashtag videos[] populated — Mode 5 now emits 2–15 videos per hashtag (more for viral tags) in addition to the metadata record. 100% of emitted videos verified to carry the target hashtag in their hashtags[], caption, or tag-page references. Works without any customer-side proxy — the scraper handles discovery internally.

0.1.133 (2026-04-22)

  • Self-throttling — consecutive RATE_LIMITED / FORMAT_CHANGE / BLOCKED errors now automatically drop concurrency to 1 and add a human-like 6 s cool-down between tasks for the rest of the run
  • Absence-tolerant Quality Reportsignature, text, bioLink, region no longer trigger false "low quality" warnings when a batch happens to contain accounts that legitimately leave those fields empty (the report shows [data-absent-allowed] instead)
  • Per-run billing summary — every run's final log line now shows events charged, gross revenue, Apify margin, and creator net at the FREE tier reference rate

0.1.129 (2026-04-22)

  • Auto-retry without proxy (Modes 1-6) — when a customer-supplied proxy gets flagged by TikTok mid-run, the scraper automatically falls back to a direct connection for Modes 1-6 (they don't need a proxy). Mode 7 still uses the configured proxy path.
  • Error records in dataset — every failed input is emitted as a {_type: "scrape_error", mode, input, error, errorMessage, retryable, scraped_at} record. Not billed. Dataset row-count now equals input count so downstream pipelines always see which inputs were skipped.

0.1.126 (2026-04-22)

  • Profile heart correctness fix for mega-accounts — accounts with > 4.29 billion total likes (charlidamelio, addisonre, etc.) now return the exact full-precision value via TikTok's stats.heart field. Previous builds read the int32-capped stats.heartCount, producing a value stuck near 3–4 billion for mega-accounts. Full Chrome-ground-truth verification: charlidamelio 12,100,000,000 (matches), addisonre 5,300,000,000 (matches).

0.1.124 (2026-04-22)

  • Video engagement playCount int32-overflow fix — videos with > 2.1 billion plays (e.g. Zach King's Hogwarts clip at 2.4 B) now return the correct positive integer instead of a negative wrap-around. Reads from TikTok's string-valued statsV2.* when present.
  • authorMeta.* stats now populated on Video Scraper / All-in-One / Data Extractor — previously authorMeta.fans, .heart, .video, .following, .friends always returned 0 because the parser read the wrong JSON path. Now reads itemStruct.authorStats (the sibling key TikTok actually ships) and emits the full author-stats block for every video.
  • collectCount type fix — now always an integer (was sometimes a string). All video engagement counts are guaranteed Number values across Modes 2 / 6 / 7.

0.1.108 (2026-04-11)

  • Hashtag Scraper mode — new Mode 5: scrape hashtag metadata (video count, view count, description) + discover trending videos. Works best with external proxy.
  • fromProfileSection field — videos from All-in-One/Data Extractor now include source section ("videos", "pinned", "hashtag")
  • signature field fix — empty bios now return "" instead of null (distinguishes "no bio" from "couldn't scrape")
  • Removed cheerio dependency — regex-based HTML parsing saves ~2 MB container size and reduces memory by 45%
  • Memory optimization — peak RSS reduced from 157 MB to 86 MB via regex extraction, lightweight quality counters, and lower default concurrency

0.1.105 (2026-04-05)

  • README restructured — LinkedIn-style per-mode sections with Input Parameters, Input Example, Output Fields, Output Example, Use Cases, and How to Run (Python)
  • Updated dataset schema — new views with Clockworks-compatible comment field names
  • "Why This TikTok Scraper?" section — competitive comparison table vs Clockworks, Api Dojo, Scraptik

0.1.104 (2026-04-05)

  • Clockworks-compatible comments — complete output restructure: flat fields (cid, diggCount, replyCommentTotal, likedByAuthor, pinnedByAuthor, uid, uniqueId, avatarThumbnail, mentions, detailedMentions, repliesToId, submittedVideoUrl, videoWebUrl) — drop-in replacement for Clockworks comments scraper
  • Video: repostCount — new engagement metric from stats.repostCount
  • Video: authorMeta.createTime — account creation timestamp now included
  • Video: musicMeta.originalCoverMediumUrl — original music cover image URL
  • Video: effectStickers[].stickerStats — sticker usage stats with useCount
  • Video: videoMeta.transcriptionLink — subtitle/caption link when available
  • Video: simplified videoMeta — 8 fields matching Clockworks structure

0.1.97 (2026-03-22)

  • "Which Mode Should I Use?" decision matrix — helps users self-serve the right mode for their use case

0.1.96 (2026-03-22)

  • Cross-linking — README links to all get-leads scrapers
  • Free credits FAQ — mentions $5/month free Apify credits

0.1.92 (2026-03-22)

  • Fuzzy username search — searching "gordonramsay" finds @gordonramsayofficial automatically

0.1.88 (2026-03-22)

  • Error categorization — DELETED, RATE_LIMITED, FORMAT_CHANGE, NETWORK, BLOCKED
  • High-res profile avatarsavatarMedium + originalAvatarUrl

0.1.87 (2026-03-22)

  • Related video discovery — follows related links beyond ~10 embed page limit
  • Comment reply threading — up to 50 replies per comment

0.1.86 (2026-03-22)

  • Smart input parsing — paste URLs, @handles, or usernames
  • Automatic deduplication — duplicates removed before scraping
  • Run summarysummary.json saved to key-value store
  • Memory-aware concurrency — auto-reduces if memory high

0.1.84 (2026-03-22)

  • Parallel scraping — 3x faster for large batches
  • Retry logic — automatic retry with exponential backoff

0.1.73 (2026-03-21)

  • Published to Apify Store — all 7 modes live
  • Pay-per-event billing — 6 pricing tiers
  • Comment scraping — full pagination via TikTok API

0.1.18 (2026-03-19)

  • Initial HTTP-only profile scraper

Your feedback

We're always working on improving performance. If you have technical feedback or found a bug, please create an issue in the Issues tab or leave a review.

Built by get-leads — the team behind Real Estate Agent Scraper, Amazon Product Scraper, LinkedIn Scraper, and Google Maps Scraper.

Follow us on LinkedIn for updates, tips, and new scraper releases.