TikTok User Search Scraper: TikTok Creator & Influencer Search avatar

TikTok User Search Scraper: TikTok Creator & Influencer Search

Pricing

from $1.70 / 1,000 account found by a keywords

Go to Apify Store
TikTok User Search Scraper: TikTok Creator & Influencer Search

TikTok User Search Scraper: TikTok Creator & Influencer Search

TikTok user search scraper: find TikTok influencers and creators by keyword. One row per account TikTok's Users tab lists, in TikTok's order, with rank, handle, user id, secUid, bio, emails, verified badge and follower count; up to about 250 a keyword; only new creators on a schedule. No login.

Pricing

from $1.70 / 1,000 account found by a keywords

Rating

0.0

(0)

Developer

Hyperbach

Hyperbach

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

3

Monthly active users

3 days ago

Last modified

Share

Find TikTok creators by keyword: every account TikTok's own Users tab lists for a search term, logged out, in TikTok's order — up to about 250 accounts a keyword from Germany, the United Kingdom or France, about 60 to 70 from the United States — one row per account with its rank, handle, user id, secUid, bio, verified badge, follower count and live status. Give search terms or TikTok search URLs, choose the country the search is read from, cap per keyword or per run. Every keyword ends with a verdict that says whether the list ended at TikTok's login wall, at your cap or at its end — never a short dataset that looks whole. Add each account's own profile page for exact counts, bio link, created date and language (includeProfileDetails); run it on a schedule with onlyNew and get only the accounts new since the last run — 0 rows and $0 when none. No login, no cookies, proxies handled for you.

Why this scraper, not the other TikTok user search actors

  • TikTok's own ranking, read from TikTok's own page. The rows are the accounts TikTok's Users tab lists for the keyword, in TikTok's order, with the position on every row (rank): for notion, @notion first and @notionhq second on every read of the study, as on tiktok.com. No third-party API in between.
  • Deep where TikTok is deep, honest where it is not. Logged out, TikTok serves up to about 250 accounts a keyword from Germany, the United Kingdom and France (ten pages of 10, then larger answers until TikTok says the list has no more; 247 and 249 for two keywords walked to the end) and about 60 to 70 from the United States (seven pages of 10; 60 to 70 for six keywords). Every keyword row says where its list ended: COMPLETE at TikTok's own end, CAPPED at your cap, or SOURCE-LIMIT with the count reached when TikTok's page stopped serving earlier. Every depth figure here was measured against TikTok's own page in the same hour. Ready-made: All TikTok accounts the user search lists for a keyword.
  • The country is real and on every row. TikTok ranks accounts per country (German and US reads of notion share 6 of their top 10). readCountry picks the exit the search is read from — DE, GB, FR or US — and every row carries read_country. Ready-made: TikTok user search from the United States.
  • Exact counts, bio link and created date on request. TikTok's search carries the follower count rounded (117,100 for 117,126) and no bio link. includeProfileDetails reads each delivered account's own page: exact followers, following, likes and videos (counts_precision: exact), the private flag, the bio link, created date, language, TikTok Shop and business flags — charged per row as profile_detail, only when the page was served. Ready-made: TikTok creators by keyword with exact follower counts.
  • Exact caps, free misses, filters before the bill. 25 asked = 25 delivered and charged. A keyword TikTok lists no account for, a keyword stopped before it by your cap, an entry that is not a search: one typed keyword row each, free. Follower range, verified only, an e-mail in the bio, bio keywords: a row left out is not charged. An account found by two keywords of a run is delivered and charged once. Ready-made: TikTok influencers with 10,000+ followers and an e-mail in bio.
  • Only the new accounts since the last run. With onlyNew a scheduled run reads the lists as any run does and delivers only the accounts no earlier run of the same memory delivered, whichever keyword found them; none → 0 rows and nothing charged. The first run is the baseline and says so.
  • Contacts from the bio and TikTok's related searches, free. Every account row has the e-mails, phone numbers and links found in its bio and whether the account is live right now; every keyword row has TikTok's own search-box suggestions for the keyword from the read country (8 to 10 related searches).

Who it's for

  • Influencer marketing teams and agencies — find the creators TikTok itself ranks for a niche keyword in a market, with follower counts, verified badges and bio contacts, ready to shortlist.
  • Brands and growth teams — watch a set of keywords on a schedule and get only the accounts that newly rank for them, country by country.
  • Lead generation and outreach — accounts in a niche filtered to a follower range, verified only or an e-mail in the bio, with the contacts extracted and the profile page's bio link on request.
  • Researchers and data teams — TikTok's user-search ranking per keyword and country with stable ids (user id, secUid), the rank, the page and an honest end-of-list verdict, ready to join across runs.

Quick start

The accounts TikTok lists for a keyword (up to about 250 from Germany)

{
"keywords": [
"notion"
]
}

Several keywords from the United Kingdom, 50 accounts each

{
"keywords": [
"notion templates",
"productivity app",
"study planner"
],
"readCountry": "GB",
"maxUsersPerKeyword": 50
}

The US list for a keyword (about 60 to 70 accounts)

{
"keywords": [
"skincare routine"
],
"readCountry": "US"
}

Creators with 10,000+ followers, with their exact counts, bio link and created date

{
"keywords": [
"fitness coach"
],
"minFollowers": 10000,
"includeProfileDetails": true,
"maxUsersPerKeyword": 100
}

Only the accounts new since the last run (schedule it)

{
"keywords": [
"notion"
],
"onlyNew": true
}

Output

One row per account TikTok's Users tab lists for a keyword (row_type user), and one free row per keyword and read country with its status, verdict and TikTok's own suggestions (row_type keyword):

fieldmeaning
row_typeuser for an account TikTok's Users tab listed for a keyword; keyword for the free row per keyword and read country with its status, verdict and counts.
keywordThe search term TikTok was asked, as typed (a URL's q parameter read out).
inputThe keywords entry this row came from, verbatim (a term or a TikTok search URL).
read_countryThe country TikTok's answer was read from (readCountry: DE, GB, FR or US); TikTok ranks accounts per country. Null when your own proxy carried the browser.
rankThe account's position in TikTok's Users-tab order for the keyword and country, 1 = first (the stage-1 reference: @notion rank 1, @notionhq rank 2 for notion).
pageWhich answer of TikTok's list carried the account (1 = the first page of 10; the last answer carries the remaining rows at once).
search_idTikTok's own id of the search answer (log_pb.impr_id), the same for every page of one keyword's walk.
scraped_atWhen the row was read (UTC).
user_idTikTok's numeric account id, as a string (19 digits; stable across handle changes). Join and deduplicate on this.
sec_uidTikTok's secondary id of the account (MS4wLjABAAAA…), the key its list and video routes take.
usernameThe account's handle (uniqueId), without the @.
nicknameThe account's display name.
bioThe account's bio text (signature), as TikTok's search carries it.
bio_emailsE-mail addresses found in the bio text (extraction only; no contact finding).
bio_phonesPhone numbers found in the bio text (8–15 digits; dates left out).
bio_linksLinks and domains found in the bio text.
profile_urlhttps://www.tiktok.com/@<username>.
avatar_thumb_urlThe account's avatar at 100 px, as TikTok's search carries it (a signed CDN URL that expires).
avatar_urlThe account's avatar at 1080 px, from its profile page (includeProfileDetails); null otherwise.
verifiedtrue when TikTok's search marks the account verified (an enterprise or custom verification).
verify_reasonTikTok's verification text (verified account, or a custom one); null for an unverified account.
is_livetrue when the account was live at the read (a live room id on the search record).
followers_shownThe follower count as TikTok's search shows it, rounded (117,100 for 117,126). Every row has it.
likes_shownThe account's total likes as TikTok's search shows them (total_favorited). Every row has it.
followersThe exact follower count from the account's own profile page (statsV2; includeProfileDetails); null otherwise.
followingThe exact following count from the profile page (includeProfileDetails); null otherwise.
likesThe exact like count from the profile page (includeProfileDetails); null otherwise.
videosThe exact video count from the profile page (includeProfileDetails); null otherwise.
friendsThe mutual-follow count from the profile page (includeProfileDetails); null otherwise.
counts_precisionas_shown: the counts are the rounded ones TikTok's search shows; exact: the profile page's exact counts are on the row (includeProfileDetails).
private_accountWhether the account is private, from its profile page (includeProfileDetails); null otherwise (TikTok's search carries no private flag).
profile_detail_statusWith includeProfileDetails: ok (the page was read and the fields filled, charged as profile_detail), not_found, unavailable, region_restricted or failed (not charged); null when the add-on is off.
created_atWhen the account was created (UTC), from its profile page (includeProfileDetails).
languageThe account's language code from its profile page (includeProfileDetails). TikTok shows no region to a logged-out reader.
bio_linkThe link under the bio, from the profile page (includeProfileDetails).
business_categoryThe business account's category, from the profile page (includeProfileDetails); null for a personal account.
is_organizationWhether the account is an organization, from the profile page (includeProfileDetails).
tt_sellerWhether the account sells on TikTok Shop, from the profile page (includeProfileDetails).
first_seen_atWith onlyNew: the day an earlier run of the same memory first saw the account (the run's day for a new one); null otherwise.
run_tagYour runTag, copied onto every row.
statusKeyword rows: ok (accounts served), empty (TikTok lists no account for the keyword), failed (TikTok's page served no answer to the browser: the run is PARTIAL or FAILED and says so), not_read (maxItems or the charge limit was reached before it), invalid_input (the entry is not a search).
status_detailKeyword rows: the verdict in words — how many accounts TikTok serves from the read country and where the list ended, the cap, the filters' count, the baseline note.
coverageKeyword rows: SOURCE-LIMIT (TikTok stopped serving at its login wall; users_served is the count reached), COMPLETE (TikTok said the list ended, or lists no account), CAPPED (your cap or charge limit), NEW-ONLY (an onlyNew run after the baseline), PARTIAL (the walk ended early).
users_servedKeyword rows: unique accounts TikTok served for the keyword before caps, filters and dedupe.
users_deliveredKeyword rows: user rows delivered and charged for the keyword.
users_filteredKeyword rows: accounts the filters left out (not charged).
users_duplicateKeyword rows: accounts delivered under an earlier keyword of the same run (dedupeAcrossKeywords; not charged again).
users_knownKeyword rows: accounts an earlier run of the same memory delivered (onlyNew; skipped, not charged).
pagesKeyword rows: answers with accounts TikTok's page made for the keyword.
wallKeyword rows: what TikTok's page showed when it stopped — login-wall (the end of a served list: the Log in button), login-modal, server-error, slider; null while the list was still being served.
suggestionsKeyword rows: TikTok's own search-box suggestions for the keyword from the read country (8–10 related searches), free.
secondsKeyword rows: how long the keyword's read took.
only_newKeyword rows: whether the run was an onlyNew run.

Example record:

{
"row_type": "user",
"keyword": "notion",
"input": "notion",
"read_country": "DE",
"rank": 1,
"page": 1,
"search_id": "20261009015420802B00B3C5DE659B8715",
"scraped_at": "2026-10-09T01:54:27Z",
"user_id": "7038607187375490054",
"sec_uid": "MS4wLjABAAAAppNu6Z_NxLOj_Gug2559GgdCKAnKi_6ajwmKXcdhhewVLynkjgw7blJ9Feu5a9sM",
"username": "notion",
"nickname": "NOTION",
"bio": "You Heard It Here First\nPresenting the freshest faces in music & beyond\nLDN & LA",
"bio_emails": [],
"bio_phones": [],
"bio_links": [],
"profile_url": "https://www.tiktok.com/@notion",
"avatar_thumb_url": "https://p16-common-sign.tiktokcdn-eu.com/tos-useast2a-avt-0068-euttp/51a05d2551085bb758b2f6d6864a4a84~tplv-tiktokx-cropcenter:100:100.webp?biz_tag=tiktok_user.user_cover&dr=10399&idc=no1a&ps=13740610&refresh_token=d53537d1&shcp=c1333099&shp=30310797&t=4d5b0474&x-expires=1791594000&x-signature=Jd%2B%2FLSVlNjHGkNPoCe0g2v9%2BSKs%3D",
"avatar_url": null,
"verified": true,
"verify_reason": "verified account",
"is_live": false,
"followers_shown": 117100,
"likes_shown": 11725489,
"followers": null,
"following": null,
"likes": null,
"videos": null,
"friends": null,
"counts_precision": "as_shown",
"private_account": null,
"profile_detail_status": null,
"created_at": null,
"language": null,
"bio_link": null,
"business_category": null,
"is_organization": null,
"tt_seller": null,
"first_seen_at": null,
"run_tag": null,
"status": null,
"status_detail": null,
"coverage": null,
"users_served": null,
"users_delivered": null,
"users_filtered": null,
"users_duplicate": null,
"users_known": null,
"pages": null,
"wall": null,
"suggestions": null,
"seconds": null,
"only_new": null
}

Pricing

Pay only for the accounts a run delivers, with no start fee and no platform usage billed to you. Prices fall with your Apify plan.

per 1,000FreeStarterScaleBusiness
Account found by a keyword (user)$2.00$1.70$1.70$1.70
Profile details on that row (profile_detail)+$1.00+$0.85+$0.70+$0.50

An account row is $2.00 per 1,000 rows on the Free plan and $1.70 on Business: a keyword walked to the end of TikTok's list (up to about 250 accounts) is at most $0.50 on Free; 50 accounts are $0.10. The + fee is charged only on a row that carries the thing: with includeProfileDetails, a row that carries the account's own profile page ($1.00 per 1,000 such rows on the Free plan); a page TikTok did not serve is said on the row and not charged. Free: the keyword row of every search (its status, verdict and TikTok's suggestions), a keyword TikTok lists no account for, rows the filters leave out, an account already delivered under an earlier keyword of the run, a run with onlyNew that finds nothing new (0 rows, $0), and a run that failed before its first account. A run that stops early (a timeout, an abort) is charged for the accounts it delivered. maxItems and maxUsersPerKeyword are exact; before the first request the log says the most the run can cost at your plan's prices. Enterprise plans have their own rates — the Actor's Pricing tab shows the price for your plan.

Usage patterns

  • Creator discovery by keyword — Give the terms in keywords as you would type them into TikTok's search box (a #tag is searched as text; a TikTok search URL gives its term). Rows come in TikTok's order with rank, page and search_id; the keyword row says how many accounts TikTok served and where the list ended (coverage, status_detail). Several terms in one run give each account once, under the first keyword that found it (dedupeAcrossKeywords). Ready-made: TikTok creator search across several keywords, deduplicated.
  • Per country — readCountry is the country the search is read from: DE (default), GB and FR serve up to about 250 accounts a keyword, US about 60 to 70. Run the same keywords once per country to compare the views; every row carries read_country.
  • Filters that run before the bill — minFollowers / maxFollowers (on the count TikTok's search shows, rounded; the exact count is checked too with includeProfileDetails), verifiedOnly, withEmailOnly, bioKeywords (bio, display name or handle). Rows left out are not charged and do not count against the caps; the keyword row counts them (users_filtered). With verifiedOnly and one account a keyword, a list of brand names gives each brand's verified account. Ready-made: Find the official TikTok account of each brand.
  • Exact counts and the profile page — includeProfileDetails reads each delivered account's own profile page (one request per row): followers, following, likes, videos exact, private_account, bio_link, created_at, language, business_category, is_organization, tt_seller, the large avatar. Charged per row as profile_detail when the page was served (profile_detail_status: ok).
  • Monitoring: only new accounts — onlyNew with a stateStoreName keeps the account ids delivered under that name on the Actor's own memory. A later run with the same name delivers only the accounts not delivered before and says NEW-ONLY on the keyword row; nothing new → 0 rows, $0. The first run with the switch on is the baseline. With maxUsersPerKeyword the same top N is compared on every run. Ready-made: Monitor new TikTok creators for your keywords, daily.
  • The found accounts' videos and followers — Every row carries the account's username, user_id and sec_uid, the keys our other TikTok Actors take, with the same column names: give them to the TikTok Profile Scraper for each account's exact counts, its newest videos or its whole video history, and to the TikTok Followers Scraper for its followers and following lists. The rows join on user_id with no mapping.

Input configuration

fieldtypedefaultwhat it does
keywordsarray[]Search terms, one per line, as you would type them into TikTok's search box: a word or phrase (notion templates), a #tag (searched as text), or a TikTok search URL (https://www.tiktok.com/search/user?q=notion). Case does not matter; a term given twice is read once.
readCountryDE / GB / FR / US"DE"The country the search is read from. TikTok's Users tab ranks accounts per country and, logged out, serves up to about 250 accounts a keyword from Germany, the United Kingdom and France and about 60 to 70 from the United States; every row says which country read it (read_country).
maxUsersPerKeywordinteger0How many accounts to deliver per keyword, in TikTok's order; 0 = everything TikTok serves logged out (up to about 250 from DE, GB or FR, about 60 to 70 from US; the keyword row then says COMPLETE at TikTok's end of the list, or SOURCE-LIMIT with the count when TikTok's page stopped serving earlier). Exact: 25 asked = 25 delivered and charged. With onlyNew the cap is the depth read (the top 25 are compared with the memory on every run). A run that reads past 100 accounts a keyword gets 4,096 MB by default, others 2,048 MB.
minFollowersinteger0Deliver only accounts with at least this many followers; 0 = no filter.
maxFollowersinteger0Deliver only accounts with at most this many followers; 0 = no filter.
verifiedOnlybooleanfalseDeliver only accounts with TikTok's verified badge.
withEmailOnlybooleanfalseDeliver only accounts whose bio carries an e-mail address (bio_emails). Extraction from the bio text only; no contact finding.
bioKeywordsarray[]Deliver only accounts whose bio, display name or handle contains one of these words (case-insensitive). Empty = no filter.
dedupeAcrossKeywordsbooleantrueAn account found by a second keyword of the same run is delivered once (under the first keyword) and not charged again; the keyword row counts it (users_duplicate). Off: every keyword delivers its own full list.
includeProfileDetailsbooleanfalseRead each delivered account's own profile page too (one request per row) for its exact follower, following, like and video counts, bio link, created date, language, private flag and TikTok Shop and business flags. Charged per row as a profile_detail event, besides the row. TikTok shows no region to a logged-out reader, so none is given.
onlyNewbooleanfalseDeliver only the accounts no earlier run of the same memory delivered, whichever keyword found them, and nothing when none is new (0 rows, $0). The first run with this on delivers the lists as the baseline. The memory is kept under stateStoreName, or under one default memory of your Apify account. With maxUsersPerKeyword the same top N is compared on every run.
stateStoreNamestringThe name of the memory onlyNew uses between runs (the account ids delivered). Empty = one default memory for your Apify account; give a name to keep two tasks apart.
maxItemsinteger0Stop after this many charged account rows across all keywords; 0 = no limit. Free rows (the keyword rows) do not count. The run also stops inside your maximum charge and says so.
runTagstringA label copied onto every row (run_tag), to tell runs apart in a shared dataset.
proxyUrlstringEmpty (recommended): TikTok is read through the Actor's own residential exit in the country of readCountry, at no extra cost to you. Your own proxy URL (scheme://user:pass@host:port) carries the browser instead; the read country is then your proxy's. The word none runs without any proxy, from the Apify worker's own IP (for tests; TikTok may refuse a datacenter address).

Errors

A run does not fail because of your input. When an input cannot be used — a date that is not a date, an id in the wrong form, two settings that contradict each other — the run ends Succeeded, charges nothing, and says what to change:

  • the status message starts with INPUT REJECTED;
  • the dataset holds one row, {"error": true, "code": "…", "message": "…"}, and no results;
  • the key-value store record ERROR holds the same object.

From code, check error on the first row before reading results.

A keyword TikTok lists no account for is not an error: it gets one free keyword row that says so (status empty), and the run goes on with the others. A run that ends Failed is a fault on our side, never your input; it charges nothing, and we are alerted.

FAQ

Why does a keyword take a minute, when other search actors answer in seconds?

Because TikTok's search lists are signed by its own page and bound to the exit that loaded it: no plain request serves them. This Actor loads TikTok's own search page in a real browser through a residential exit of your country and reads the page's own answers while it scrolls; the first keyword of a run takes one to three minutes (the browser starts and loads TikTok's page twice), each further keyword about a minute for 50 accounts, and a walk to the end of a list (about 250 accounts) 6 to 10 minutes, because TikTok sends its last answers about half a minute apart. The other actors that answer in seconds either read TikTok's app API with a signer they do not publish, or rent a third-party API.

Why up to about 250 accounts a keyword, and fewer from the United States?

That is where TikTok's list ends for a logged-out reader: from Germany, the United Kingdom and France the Users tab pages by scroll, ten accounts a page and then larger answers, until TikTok answers that the list has no more (247 and 249 accounts for two keywords walked to the end); from the United States the list ends after about 60 to 70 accounts. When TikTok's page pauses before that, the Actor scrolls again and reloads the page rather than stopping at the first pause. The keyword row says where the list ended (coverage: COMPLETE, or SOURCE-LIMIT when the page stopped serving earlier; users_served). No login is used or asked for.

Why is the follower count rounded, and how do I get the exact one?

TikTok's search carries the counts as the app shows them (117,100 for 117,126): followers_shown and likes_shown on every row. includeProfileDetails reads each account's own profile page and fills followers, following, likes and videos exactly (counts_precision: exact), plus the bio link, created date and language.

Can it return the videos, top results or live rooms for a keyword?

Not in this version. Logged out, TikTok serves one page of 12 videos a keyword from a few countries and a login prompt after it, at a cost per row far above what video search actors charge; this Actor is the Users tab. For a creator's videos use the TikTok Profile Scraper with the username or sec_uid of a row; for its followers the TikTok Followers Scraper.

Do the rows differ by country?

Yes: TikTok ranks accounts per country. German and US reads of notion share 6 of their top 10; the top two were the same on every read. Choose readCountry for the market you care about and compare runs by read_country.

What does a failed keyword look like, and what am I charged?

A keyword TikTok's page did not serve to the browser (a server-error view, a login modal on an exit) is retried once in a fresh browser on a fresh exit; a keyword the server-error view kept from its first read is read once more after the other keywords. An exit TikTok places in another country than readCountry is replaced; when no exit in that country is found, the keyword row says whose view its list is. If a keyword is still not served, its keyword row says status: failed with the reason, the run ends PARTIAL (rows out) or FAILED (none) and says which keywords are missing. You pay for the account rows delivered and nothing else; a run that failed before its first account charges nothing.

Do I need a proxy or a TikTok account?

No. The Actor reads TikTok logged out through its own residential exit in the country of readCountry, included in the price. proxyUrl is there for buyers who must use their own proxy; the read country is then the proxy's.

Integration

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('hyperbach/tiktok-search-scraper').call({"keywords": ["notion"]});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('hyperbach/tiktok-search-scraper').call(run_input={'keywords': ['notion']})
items = client.dataset(run['defaultDatasetId']).list_items().items

CLI

$apify call hyperbach/tiktok-search-scraper --input '{"keywords": ["notion"]}'

REST

curl -X POST "https://api.apify.com/v2/acts/hyperbach~tiktok-search-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' -d '{"keywords": ["notion"]}'

Support

apify@hyperbach.com

This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.