Tiktok Profile Scraper avatar

Tiktok Profile Scraper

Pricing

from $1.60 / 1,000 profile results

Go to Apify Store
Tiktok Profile Scraper

Tiktok Profile Scraper

TikTok Profile Scraper extracts public TikTok profile data including bio, followers, following, likes, verification, profile URL, and recent videos. Use it for creator research, influencer discovery, competitor monitoring, lead generation, and analytics.

Pricing

from $1.60 / 1,000 profile results

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

38

Total users

12

Monthly active users

a day ago

Last modified

Share

TikTok Profile Scraper — Creator Finder & Lead Enrichment

Profiles, not posts. Priced per creator.

Most TikTok "profile" scrapers are really post scrapers — you hand them a creator and they bill you for a hundred videos you didn't ask for. This one returns one clean row per creator, and charges you for that row.

TikTok Profile Scraper

What does TikTok Profile Scraper do?

Give it profile URLs or usernames — or skip the URLs entirely and give it a keyword like fitness coach, and it will find the creators for you. Every result is one spreadsheet-ready row:

  • Identity — username, display name, user ID, avatar, verification status
  • Engagement stats — followers, following, likes, video count
  • Business signals — bio links, email from bio, Instagram/YouTube handles, business category
  • Contact hints — boolean flags summarizing available contact signals
  • Provenance — which keyword discovered the profile, timestamps, success/error status

What this does — and what it doesn't

It does: return profile-level data for creators you name, or creators it finds by keyword. One row per creator, one charge per creator.

It doesn't: return a creator's full video catalogue. An optional recent-video snapshot (default off, billed separately) returns their latest posts with engagement counters — see Recent video snapshot. For every video behind a hashtag or keyword, use TikTok Video Scraper.

Need video data? Use TikTok Video Scraper instead — that's what it's built for.

It complements the TikTok scraper suite:

  • TikTok Video Scraper — deep video-level data
  • TikTok Comment Scraper — comment extraction
  • TikTok Trend & Discovery Scraper — trending content discovery

Together they support: discover trends → inspect videos → inspect comments → inspect creators

Why use TikTok Profile Scraper?

  • Find creators by keyword — discover TikTok profiles in any niche without needing URLs upfront. No other TikTok profile Actor does this.
  • Public email and contact extractionbioEmail, bioPhone, WhatsApp/Telegram/booking links, Instagram/YouTube handles, and a classified, tracking-stripped bio link telling you whether a creator is selling, reachable, or just cross-posting — extracted for you rather than left in a bio string
  • One row per creator — drops straight into Sheets, Excel, or a CRM. No deduplicating a hundred video rows to find the author.
  • Priced per profile, not per post — see Pricing
  • You are never charged for a profile that fails — error rows are returned so you can see what broke, and they cost nothing
  • Traceable and normalized data — input echo, source keyword, timestamps, and consistent field naming

Input

ParameterTypeDefaultDescription
profilesstring[][]TikTok profile URLs or usernames
searchKeywordsstring[][]Keywords to search for TikTok user profiles
resultsPerKeywordinteger10Max profiles to scrape per search keyword (1–100)
maxTotalProfilesinteger100Safety cap on total profiles per run, across all inputs (1–1000)
strictKeywordMatchbooleantrueDrop creators with no trace of your keyword in username, display name, or bio
minFollowerCountinteger0Only keep creators with at least this many followers (0 = no minimum)
maxFollowerCountinteger0Only keep creators with at most this many followers (0 = no maximum)
onlyBusinessAccountsbooleanfalseOnly return business-like creators (email / link / business category)
includeRecentVideosbooleanfalseRecent video snapshot per creator — billed as a separate event
maxRecentVideosinteger12Recent videos to inspect per profile (1–20)

Business links, contact hints, and pinned-video detection are always on and have no setting — they read data the run has already fetched, so they cost nothing extra and there is nothing to trade off.

No proxy configuration needed — see Proxy.

You can use profiles and searchKeywords together or separately.

If you run the Actor with no input at all, it scrapes one well-known public profile (@tiktok) so you can see the output format straight away. Provide either input and that demo profile is never included.

Finding creators by size

minFollowerCount and maxFollowerCount answer the query this Actor exists for — "fitness coaches with 50,000–500,000 followers":

{
"searchKeywords": ["fitness coach"],
"minFollowerCount": 50000,
"maxFollowerCount": 500000,
"resultsPerKeyword": 25
}

For keyword-discovered creators the follower filter is applied before the profile is fetched, so creators outside your range cost you nothing and do not consume maxTotalProfiles. The Actor automatically searches deeper to still return the number you asked for.

Profiles you name directly in profiles are always fetched — there is no follower count to filter on until we have them — but a direct profile that fails your filter is not returned and not charged.

onlyBusinessAccounts can only be judged from the finished profile, so unlike the follower filters it does not reduce your bill.

Controlling how much a run costs

maxTotalProfiles (default 100) is a hard ceiling on profiles scraped in one run, counted across direct input and every keyword combined. Without it, 5 keywords × resultsPerKeyword: 100 could scrape 500 profiles.

  • Directly supplied profiles are always scraped first — keyword discovery uses whatever budget is left.
  • Profiles that fail count against the cap, because the work was still done. They are not billed.
  • A creator found by two different keywords is scraped once, not twice.

Accepted profile formats

  • Full URL: https://www.tiktok.com/@examplecreator
  • With @: @examplecreator
  • Username only: examplecreator

Duplicates are automatically removed before processing.

Sample input: Scrape profiles directly

{
"profiles": [
"https://www.tiktok.com/@tesla.flex",
"@jeremyjudkins2",
"teslatheband"
]
}

Sample input: Discover profiles by keyword

{
"searchKeywords": ["tesla", "fitness coach"],
"resultsPerKeyword": 20,
"maxTotalProfiles": 40,
"includeRecentVideos": true,
"maxRecentVideos": 5
}

Each discovered profile carries the sourceKeyword that found it, so a multi-keyword run stays attributable.

Output

Each output item represents one TikTok profile. Results are available in JSON, CSV, Excel, and through three dataset views in the Apify console.

TikTok Profile Scraper — Profiles table view

Output tab: Profiles

The Profiles view shows identity, stats, and verification status at a glance.

{
"username": "nike",
"nickname": "Nike",
"profileUrl": "https://www.tiktok.com/@nike",
"verified": true,
"privateAccount": false,
"creatorScore": 41,
"followerCount": 8900000,
"followingCount": 6,
"likesCount": 122900000,
"videoCount": 1082,
"engagementRate": 13.809,
"signature": "Just Do It.",
"bioLinkNormalized": "http://empli.fi/niketiktok",
"bioLinkType": "other",
"isBusinessLike": true,
"sourceKeyword": null,
"searchRank": null,
"scrapedAt": "2026-07-17T11:08:29.284Z",
"success": true
}

Output tab: Contact & Business

The Contact & Business view leads with the contact columns and is ordered for CRM import — export it as CSV and the columns land where you'd expect, no post-processing.

{
"bioEmail": "bodyby.b95@gmail.com",
"bioPhone": null,
"contactChannel": null,
"nickname": "Bianca | Fitness Coach",
"username": "bodyby_bianca",
"profileUrl": "https://www.tiktok.com/@bodyby_bianca",
"bioLinkNormalized": "https://stan.store/bodyby_bianca",
"bioLinkType": "shop",
"creatorScore": 18,
"isBusinessLike": true,
"followerCount": 194800,
"sourceKeyword": "fitness coach",
"searchRank": 4,
"secUid": "MS4wLjABAAAA...",
"contactHints": {
"hasEmailInBio": true,
"hasExternalLink": true,
"hasInstagram": false,
"hasYouTube": false,
"hasPhoneInBio": false,
"hasDirectContactLink": false,
"hasShopLink": true,
"linkIsHub": false
}
}

Output tab: Creator Scoring

The Creator Scoring view ranks creators by campaign value and shows the full calculation — populated when includeRecentVideos is on.

{
"username": "claude",
"creatorScore": 56,
"scoreBasis": "recent_videos",
"scoreFactors": { "reach": 73, "engagement": 9, "consistency": 100, "trust": 100 },
"videoMetrics": {
"videosSampled": 10,
"avgViews": 837900,
"avgEngagementRate": 0.0092,
"postingCadenceDays": 0.9,
"viewsPerFollower": 3.613
},
"followerCount": 231900,
"verified": true
}

Read it left to right: huge reach (73), thin engagement (9 — under 1% of viewers react), posts daily (consistency 100), verified (trust 100). The score is 56 and you can see exactly where it came from. Disagree with our weighting? Sort on videoMetrics instead.

Sending leads to your CRM

The output is shaped for this: one row per creator, with the contact fields already parsed out of the bio. Everything below is configured by you, on your own runs — nothing here needs a change to the Actor.

The one thing that trips everyone up: the webhook does not contain your data. Apify POSTs the run, not the results. You get resource.defaultDatasetId and eventData.actorRunId, then fetch the rows yourself:

GET https://api.apify.com/v2/datasets/<defaultDatasetId>/items?format=json

Field mapping. This is the part that's specific to this Actor:

This ActorTypical CRM fieldNotes
bioEmailEmailThe natural dedupe key — most CRMs match on it
bioPhonePhoneInternational format, or absent
nicknameNameDisplay name; username is the handle
bioLinkNormalizedWebsiteCleaned — no tracking params to pollute matching
profileUrlSocial profile / lead URL
creatorScoreLead scoreMaps directly onto CRM lead-scoring fields
followerCount, videoMetrics.avgViewsCustom propertiesAvg views is the honest reach number
isBusinessLike, bioLinkTypeQualification / lifecycle stageshop and contact are buying signals
sourceKeyword, searchRankLead source / campaignWhich keyword found them, and at what rank
secUidExternal IDUse this, not username — handles change, secUid never does

Three ways to wire it up:

1. Webhook — most direct, works anywhere. In the Console, add an integration on your run/task for ACTOR.RUN.SUCCEEDED. Apify retries non-2XX responses 11 times with backoff from ~1 minute out to ~32 hours, so a brief outage at your end won't lose a run. Custom payloads are supported with {{variable}} templates if your endpoint wants a specific shape.

2. Zapier / Make / n8n — no code. Zapier's "Finished Actor run" trigger plus its "Fetch dataset items" search hands the rows to Salesforce, Google Sheets, Slack, or anything else in the catalogue, where you map the columns above onto their fields.

3. Manual export — the Console exports CSV/JSON/Excel directly. The Contact & Business dataset view is already trimmed to the lead columns, so exporting it gives you an import-ready file with no post-processing.

Notes we'd rather you hear from us:

  • Apify's HubSpot app won't help here. It's an official integration, but it's built around Apify's Contact Details Scraper and writes that Actor's output into HubSpot. It isn't a generic any-Actor pipe. Use the webhook or Zapier route instead.
  • Scheduled runs re-scrape and re-bill. There's no built-in diffing against a previous run — pointing this at a schedule gives you a fresh full pull each time, billed each time. Dedupe on your side (bioEmail or secUid) and it works fine as a recurring lead feed.
  • These recipes describe the platform's behaviour, not tests we ran. Verifying a HubSpot or Salesforce mapping end-to-end needs an account on those systems, and we'd rather point you at Apify's own integration docs than publish steps we haven't executed.

Creator scoring — and why follower count lies

creatorScore (0–100) ranks creators by what a sponsored post would actually be worth. It needs includeRecentVideos enabled; without it the field is null and scoreBasis says no_video_data. That's deliberate — see below.

The problem it solves. TikTok's feed is interest-based, not follow-based, so follower count is a poor predictor of reach. Real output from this Actor:

CreatorFollowersAvg views/postViews per followerScore
@claude231,900837,900361%56
@nike8,900,00090,1561%41
@tesla.u.s106,7009790.9%0

@claude has 38× fewer followers than @nike and gets 9× more views per post. Nike's 8.9M followers see roughly 1% of its posts; a campaign priced on that number is priced on the wrong number. And @tesla.u.s has 107k followers who don't watch at all.

Sorting by followers gets all three wrong. That is what creatorScore is for.

How the score works — the whole formula:

creatorScore = reach × (0.5 + 0.5 × quality)
quality = 50% engagement + 30% consistency + 20% verified

Reach is a ceiling, not an ingredient. A creator nobody sees can't be rescued by good engagement, so quality only moves a score ±50% from raw reach. Every part is exposed in scoreFactors so you can check our arithmetic — or ignore our weighting and sort on videoMetrics yourself.

FactorBuilt from
reachAverage views per post, log-scaled. 1,000 views → 0, 10M → 100
engagement(likes + comments + shares) ÷ views, shrunk toward the average for low-view creators — a 27% rate on 106 views is noise, not excellence
consistencyMedian days between posts. Daily → 100, monthly-or-worse → 0
trustVerified badge

A score of 100 means ~10M average views — a global megastar. In practice strong creators land in the 40–70 range; the scale is absolute, so a 55 means the same thing in every run.

Why there's no score without video data. We tried it. Falling back to follower-based signals didn't merely weaken the ranking, it inverted it: @the_golden_tesla scored 72 on profile data alone versus 22 with real video evidence, and the genuinely strongest creator was under-rated. A profile-only score can only rank by followers — the exact number this feature exists to replace. Rather than hand you a confident, wrong number, we return null.

What we deliberately don't score. No "audience quality" — we can't see the audience, and views-per-follower mostly reflects TikTok's algorithm rather than audience composition. It's reported as a raw metric in videoMetrics.viewsPerFollower for you to interpret. No growth or velocity metrics either: those need historical follower counts across runs, which a single scrape cannot know.

A bio link is the single most useful field on a creator's profile, and it arrives messy — sometimes without https://, often carrying ?fbclid=… tracking junk. This Actor cleans it and says what it is, so you can triage a list instead of opening 200 tabs.

bioLinkTypeMeansTypical
contactA direct line — you can message or book them nowwa.me/…, t.me/…, calendly.com/…
shopThey're selling: storefront, checkout, or a booking funnelstan.store/…, *.myshopify.com, theirsite.com/shop
socialA cross-platform profileinstagram.com/…, youtube.com/…
link_hubA link-in-bio page — the real destination is one hop furtherlinktr.ee/…, beacons.ai/…
own_siteA domain that matches their handle — they run itfitwithnicolecoaching.com for @fitwithnicole._
otherA domain we can't attribute — often an affiliate linka retailer they promote

Measured on ten live "fitness coach" creators: 3 shop, 3 link hub, 2 social, 1 direct contact, 1 other — and 5 of 10 were directly reachable by email, phone, or a contact link.

Two limits worth knowing, because we'd rather say so than have you find out:

We don't follow link hubs. When bioLinkType is link_hub, the creator's real shop or booking page is one click past a Linktree, and we return the Linktree. Expanding it would mean fetching third-party pages — which we measured: linktr.ee responds, but beacons.ai and affiliate shorteners return 403 to a datacenter IP. Doing it properly needs a residential proxy whose cost would land in your bill, to expand roughly a quarter of profiles, about half of which would fail anyway. linkIsHub flags the rows where the link under-describes the creator.

bioPhone is deliberately strict. International format only (+1 415 555 0132). TikTok bios are full of numbers that aren't phone numbers — PBs, discount codes, dates, "24/7" — and on a lead list a wrong number gets dialled. We'd rather return null than a plausible mistake, so a bare 4155550132 is skipped.

A note on follower counts

TikTok publishes rounded display values, and this Actor returns them as-is. A creator shown as 3000000 has roughly 3 million followers, not exactly 3,000,000. The same applies to likesCount, followingCount, and videoCount. This is a TikTok limitation, not a scraping one — no Actor can return an exact count TikTok doesn't publish. Treat these as magnitudes, and be careful building precise analytics or growth deltas on them.

Recent video snapshot

Default: off. Enable includeRecentVideos to get each creator's most recent posts alongside their profile. maxRecentVideos sets an upper limit — you may get fewer, because TikTok serves one page and decides its size (measured at 10 on 2026-07-17, and it has moved during a single day). We fetch one page only: a second would double the API cost per profile without finding you more creators.

FieldMeaning
videoIdTikTok's video ID
descriptionCaption, including hashtags
createTimePost date, ISO 8601
urlDirect link to the video
viewCount · likeCount · commentCount · shareCountPublic engagement counters
durationLength in seconds
isPinnedWhether the creator pinned it

This is a separately billed recent-videos event, charged once per profile, and only when videos are actually returned. A creator with no public posts costs you nothing extra. Every row reports what happened via recentVideosStatus:

recentVideosStatusMeaning
not_requestedincludeRecentVideos was off (the default)
successVideos were returned in recentVideos — the normal result
emptyThe creator has no public posts, or the account is private — not billed
failedThe video lookup errored. The profile record is still returned intact — not billed

Profile data, stats, and contact signals are never affected by this setting: if the video lookup fails, you still get the full profile row.

This gives you a creator's recent performance, not their full catalogue. To scrape video-level data at scale — every video for a hashtag, keyword, or creator — use TikTok Video Scraper.

Full output example (all 41 fields)

Real output from this Actor — @claude, scraped with includeRecentVideos enabled. Note avgViews of 837,900 against 231,900 followers: 3.6× more views than followers, which is why reach scores 73 while the follower count alone would undersell it.

{
"input": "claude",
"username": "claude",
"profileUrl": "https://www.tiktok.com/@claude",
"userId": "7494309106984469547",
"secUid": "MS4wLjABAAAA8KoABczEOWYU5H49...",
"nickname": "Claude",
"signature": "The AI for problem solvers. Built by Anthropic to be safe, accurate, and secure.",
"avatarUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-use...",
"verified": true,
"privateAccount": false,
"language": "en",
"followerCount": 231900,
"followingCount": 0,
"likesCount": 528800,
"videoCount": 62,
"friendCount": null,
"engagementRate": 2.2803,
"bioLink": "Claude.ai",
"bioLinkNormalized": "https://claude.ai",
"bioLinkDomain": "claude.ai",
"bioLinkType": "own_site",
"bioEmail": null,
"bioPhone": null,
"contactChannel": null,
"instagramHandle": null,
"youtubeChannel": null,
"businessCategory": "Software & Apps",
"isBusinessLike": true,
"contactHints": {
"hasEmailInBio": false,
"hasExternalLink": true,
"hasInstagram": false,
"hasYouTube": false,
"hasPhoneInBio": false,
"hasDirectContactLink": false,
"hasShopLink": false,
"linkIsHub": false
},
"creatorScore": 56,
"scoreBasis": "recent_videos",
"scoreFactors": { "reach": 73, "engagement": 9, "consistency": 100, "trust": 100 },
"videoMetrics": {
"videosSampled": 10,
"avgViews": 837900,
"avgEngagementRate": 0.0092,
"postingCadenceDays": 0.9,
"viewsPerFollower": 3.613
},
"recentVideos": [
{
"videoId": "7662434285000953119",
"description": "Reflecting reveals the choices you didn't know you were making.",
"createTime": "2026-07-14T17:18:47.000Z",
"url": "https://www.tiktok.com/@claude/video/7662434285000953119",
"viewCount": 14115,
"likeCount": 684,
"commentCount": 32,
"shareCount": 24,
"duration": 40,
"isPinned": false
}
],
"recentVideosStatus": "success",
"accountCreatedAt": "2025-04-17T15:50:46.000Z",
"scrapedAt": "2026-07-17T11:08:29.284Z",
"sourceType": "username",
"sourceKeyword": null,
"searchRank": null,
"success": true
}

bioLink arrives as TikTok published it — "Claude.ai", no scheme. bioLinkNormalized is the CRM-ready form.

Error output example

When a profile cannot be found or extracted, the actor returns a structured error record:

{
"input": "@nonexistentprofile",
"success": false,
"error": "Profile not found",
"errorCode": "NOT_FOUND",
"sourceType": "username",
"scrapedAt": "2026-07-17T11:08:29.284Z"
}

Error rows are never charged. You see what broke and don't pay for it.

errorCode is a stable machine-readable reason, so you can tell your problem from ours: NOT_FOUND (the handle doesn't exist) · EXTRACTION_FAILED · UPSTREAM_ERROR · REQUEST_FAILED · AUTH_ERROR / BILLING_ERROR (ours, not yours). The free-text error stays alongside it, so existing consumers keep working.

Output fields reference

Identity and profile

FieldTypeDescription
inputstringThe original input (URL, username, or @handle)
usernamestringTikTok unique username
profileUrlstringCanonical profile URL
userIdstringNumeric TikTok user ID
secUidstringTikTok security user ID
nicknamestringDisplay name
signaturestringBio text
avatarUrlstringProfile image URL
verifiedbooleanBlue check verification status
privateAccountbooleanWhether the account is private
languagestringProfile language code

Public counters

FieldTypeDescription
followerCountnumberNumber of followers
followingCountnumberNumber of accounts following
likesCountnumberTotal likes received across all videos
videoCountnumberNumber of videos posted
friendCountnumberMutual follower count (when available)

Business and contact signals

FieldTypeDescription
engagementRatenumberlikesCount ÷ followerCount, to 4 dp. A lifetime popularity ratio — not a per-post engagement rate, since TikTok no longer exposes per-video data on profile pages. Both inputs are rounded display values, so treat it as a comparison aid, not a precise metric.
bioLinkstringExternal website URL, exactly as TikTok publishes it
bioLinkNormalizedstringThe same link, cleaned: scheme added, utm_*/fbclid/igsh tracking stripped. Use this one — it's stable and CRM-ready
bioLinkTypestringWhat the link is for: shop · contact · social · link_hub · own_site · other
bioLinkDomainstringHost, minus www. — useful for grouping
bioEmailstringEmail address extracted from bio text
bioPhonestringPhone from bio, international format only (see below)
contactChannelstringDirect channel the link opens: whatsapp · telegram · messenger · booking
instagramHandlestringInstagram handle from linked accounts or bio
youtubeChannelstringYouTube channel from linked accounts or bio
businessCategorystringTikTok business category (e.g., "Automotive & Transportation")
isBusinessLikebooleanReal commercial intent: a TikTok commerce account, a published email/phone, a shop/contact/own-domain link, or a business phrase in the bio. A Linktree or a cross-posted Instagram does not count on its own
contactHintsobjectSummary flags: hasEmailInBio, hasExternalLink, hasInstagram, hasYouTube, hasPhoneInBio, hasDirectContactLink, hasShopLink, linkIsHub
creatorScorenumber0–100 campaign value. null unless includeRecentVideos is on — see above
scoreBasisstringrecent_videos when scored, no_video_data when not
scoreFactorsobjectThe score's full breakdown: reach, engagement, consistency, trust (0–100 each)
videoMetricsobjectRaw numbers behind the score: videosSampled, avgViews, avgEngagementRate, postingCadenceDays, viewsPerFollower

Content and metadata

FieldTypeDescription
accountCreatedAtstringAccount creation date (ISO 8601, when available)
recentVideosarrayRecent video objects — [] unless includeRecentVideos is on (see above)
recentVideosStatusstringWhy recentVideos looks the way it does: not_requested | success | empty | failed
scrapedAtstringExtraction timestamp (ISO 8601)
sourceTypestringHow the profile was provided: "url", "username", or "search"
sourceKeywordstringWhich keyword discovered this profile (null for directly supplied profiles)
searchRanknumberTikTok's own relevance position for that keyword, 1-based (null for directly supplied profiles). Preserved through filtering — a gap in the ranks means a creator was filtered out, not mis-numbered.
successbooleanWhether extraction succeeded
errorstringHuman-readable error message (only present on failed items)
errorCodestringStable code for automation (only on failed items) — see below

Error codes

Branch on errorCode rather than string-matching error, whose wording may change.

errorCodeMeaning
NOT_FOUNDThe handle does not exist
EXTRACTION_FAILEDResponded, but carried no usable profile
UPSTREAM_ERRORUpstream/network failure — usually worth retrying
BILLING_ERROROur data provider's balance is exhausted — please report this
AUTH_ERROROur data provider rejected the request — please report this
REQUEST_FAILEDRequest failed after all retries

How keyword search works

When you provide searchKeywords, the Actor queries TikTok's own creator search and then fetches the full profile for each creator it finds.

Because the results come from TikTok itself rather than from a web index:

  • searchRank is a real relevance rank — TikTok's own ordering for that keyword, not "whatever a search engine listed first". Rank is preserved even when filters remove creators above you in the list, so rank 7 always means TikTok ranked that creator 7th.
  • sourceKeyword tells you which keyword found each creator, so a multi-keyword run stays attributable.
  • Results reflect what TikTok users would actually see, not what happens to be indexed publicly.

Each keyword can return up to resultsPerKeyword profiles (default 10, max 100).

Why you might see unrelated creators — and how it's handled

TikTok's search returns genuine matches while it has them, then pads deeper pages with unrelated popular accounts. Searching tesla for 100 results, the first ~20 are all real Tesla creators; past roughly rank 50 TikTok starts returning big accounts with no Tesla connection at all.

strictKeywordMatch (default true) removes them. A creator is kept when your keyword appears in their username, display name, or bio. Matching is per word, so fitness coach still keeps a creator matching only coach — requiring the whole phrase would throw away real leads.

Filtered creators are dropped before their profile is fetched, so they cost you nothing.

It is a heuristic, so it can occasionally drop a relevant creator who never names the topic in their profile text. Set strictKeywordMatch: false to see everything TikTok returns, and use searchRank to judge for yourself — relevance is reliably high at low ranks.

Practical tip: narrow keywords run out of genuine matches quickly. Asking for 100 results for a niche term mostly buys padding, so a smaller resultsPerKeyword is often better and cheaper.

Use cases

  • Influencer discovery — find creators in any niche by keyword, extract profiles for campaign research
  • Competitor monitoring — track competing brand or creator accounts over time
  • Lead generation — collect bios, external links, emails, and business contact clues at scale
  • Creator database building — build structured datasets for outreach, analytics, or CRM import
  • Trend follow-up — after discovering trending content, inspect the creators behind it
  • AI enrichment — feed creator data into classification, scoring, or summarization pipelines

Tips and best practices

  • Start small — test with 2–3 profiles or a single keyword first to verify output format
  • Mix input modes — use URLs, @handles, and keywords in the same run
  • Use with other actors — discover trending creators with TikTok Trend & Discovery Scraper, then feed their usernames here for full profile data
  • Schedule for monitoring — run on a schedule to track creator growth over time
  • Enable contact hints — the contactHints object provides quick boolean flags useful for filtering leads

Proxy

None needed. There is no proxy setting, and nothing to configure.

Profile data comes from an API rather than by loading TikTok's website, so the Actor never requests a TikTok page — which means there is no IP for TikTok to block and no proxy to buy. That is why runs are reliable without one.

Practically, for you this means: no proxy setup, no proxy bill, no residential-vs-datacenter decision, and no 403s to debug.

The scraper works without proxies for small batches and keyword search, but may encounter rate limiting on larger runs.

Integrations

Connect TikTok Profile Scraper to your existing tools and workflows:

  • Google Sheets — export profile data directly to spreadsheets
  • Slack / Email — get notifications when scraping runs complete
  • Webhooks — trigger downstream workflows automatically
  • Apify API — access results programmatically for custom integrations
  • Other actors — combine with TikTok Video Scraper, Comment Scraper, and Trend & Discovery Scraper for full-funnel creator intelligence

FAQ

How many profiles can I scrape in one run? maxTotalProfiles caps it — 100 by default, up to 1000.

Am I charged for profiles that fail? No. Failed profiles return a row with success: false and a description of what went wrong, so you can see exactly what happened, but they are never billed. They do count against maxTotalProfiles, since the work was still performed.

Is one result one profile, or one video? One profile. That is the core difference between this Actor and most alternatives, which return one result per post and bill accordingly.

How does keyword search find profiles? It queries TikTok's own creator search, then fetches each discovered creator's full profile. That is why searchRank is a genuine relevance position rather than a web-index artefact.

Why is recentVideos empty? Most likely because it is off by default — turn on includeRecentVideos. If it is already on, recentVideosStatus tells you why: empty means the creator has no public posts or the account is private, and failed means the lookup errored. You are not billed for either. This Actor is built for profile data; for video-level data at scale use TikTok Video Scraper.

Why are some fields null? Fields like businessCategory, friendCount, bioEmail, and instagramHandle depend on what the creator has configured and what TikTok includes in its page data. They are extracted on a best-effort basis.

What if a profile is not found? The actor returns a record with success: false and a descriptive error message. Other profiles in the batch continue processing normally. Profiles discovered via keyword search that return 404 are silently skipped.

Does this work for private accounts? Private accounts return limited data (username, nickname, verification status). Most counters and content fields will not be available.

Can I use this without proxies? Yes — always, and there is no proxy option to turn on. The Actor never loads a TikTok page, so there is no block to work around. See Proxy.