Blog/Social data
12 min read

TikTok Profile Viewer and Account Finder: What an API Returns

One profile call returned two different follower counts in one response. One keyword returned twenty accounts, ten of them regional handles of one brand.

TikTok Profile Viewer and Account Finder: What an API Returns

Copy this line to your agent to find TikTok accounts matching a keyword.

set up https://monid.ai/SKILL.md and use tikhub /api/v1/tiktok/app/v3/fetch_user_search_result

On 2026-09-14 we searched TikTok for one keyword and got twenty accounts back, ten of them official regional handles of the same brand, from eighteen million followers down to twenty-four thousand. Four days later we read one profile and got two different follower counts inside a single response. Finding an account and reading an account are two calls, and each has a surprise in it. This guide runs through Monid, the OpenRouter for agent tools.

What does a TikTok profile viewer return?

Forty fields about one account, and two contradictory follower counts.

The call

tikhub/api/v1/tiktok/web/fetch_user_profile with uniqueId, on 2026-09-18, 4.2 seconds:

{ "user": {
    "uniqueId": "patagonia", "nickname": "Patagonia",
    "signature": "We're in business to save our home planet.",
    "verified": true, "privateAccount": false,
    "createTime": 1588105789, "language": "en",
    "commentSetting": 0, "followingVisibility": 1,
    "secUid": "MS4wLjABAAAAr_YRT5mEy…" },
  "stats":   { "followerCount": 242800,   "heartCount": 1900000  },
  "statsV2": { "followerCount": "242767", "heartCount": "1877605" } }

Forty fields on the user object. The profile picture comes in three sizes, createTime is a Unix timestamp giving the account's creation date, and secUid is the opaque identifier other TikTok endpoints want instead of the handle.

The two stats objects

stats says 242,800 followers and 1,900,000 hearts. statsV2 says 242,767 and 1,877,605. Same call, same second, thirty-three followers and 22,395 hearts apart.

The pattern is clear once you look at the types. stats holds integers and they are rounded to a significant-figure boundary. statsV2 holds strings and they are exact. Two fields agree exactly on both, videoCount at 797 and followingCount at 77, because those numbers are small enough that rounding does not bite.

Read statsV2 and cast it yourself. The trap is that stats is the obvious name and holds numbers, so it is what most code reaches for, and it silently quantises every large figure. A follower chart built on it moves in steps of a hundred and looks like a platform that only gains round numbers.

This is the same shape as the two follower counts measured inside one Facebook response in the Facebook profile guide, where a parsed integer and a scraped string differed by one. Social platforms serve more than one version of their own counters, and a faithful API returns the disagreement rather than hiding it.

What a private account returns

privateAccount came back false here. When it is true, that is the answer: the profile exists, the field says it is private, and the posts are not there. No endpoint in any catalog returns a private TikTok account's content, and the tools that advertise it are selling a survey wall. The useful thing the field gives you is the ability to skip those handles in a batch rather than retrying them.

What does a TikTok user search actually return?

A page of twenty account records with a cursor, and the record is much wider than the handful of fields a finder tool shows you.

The response shape

tikhub/api/v1/tiktok/app/v3/fetch_user_search_result for duolingo on 2026-09-14:

{
  "user_list": [ { "user_info": { "..." : "..." }, "position": null, "uniqid_position": null }, "..." ],
  "has_more": 1,
  "cursor": 20,
  "input_keyword": "duolingo",
  "feedback_type": "user"
}

Twenty entries, each wrapping a user_info object. has_more: 1 and cursor: 20 are the pagination pair: pass the cursor back to get the next twenty.

The account record

user_info carries well over forty fields. The ones a finder actually needs:

FieldOn the top rowWhat it is
unique_idduolingoThe handle. The join key.
nicknameDuolingoDisplay name, free text, may contain emoji
follower_count18,008,499Followers
aweme_count1,111Published videos
custom_verifyverified accountVerification, as a string
sec_uid, uidopaque idsStable identifiers for later calls

Alongside those: signature (the bio), four avatar sizes, following_count, commerce_user_level, account_labels, and a long tail of client-side flags that matter to the app and not to you.

Two identifiers, and only one of them is stable

unique_id is the handle, and an account owner can change it. sec_uid and uid are TikTok's internal identifiers, and they do not change when the handle does. On our twenty rows every account carried all three.

Store the handle for display and the sec_uid for everything else. The video endpoints take sec_uid, not the handle, so a finder that keeps only unique_id has to do a second lookup before it can read a single post. And a brand that renames its regional account, which happens, silently breaks any join keyed on the old handle while the sec_uid join keeps working. The same argument for keying on the stable identifier rather than the visible one runs through the Telegram channel guide, where message ids play the same role.

The row that carries the point

Row nine: duolingoenglishtest, "Duolingo English Test", 24,763 followers, 156 videos, custom_verify empty. An official sub-brand of the same company, unverified. Verification is a strong signal that an account is official and it is not the definition of one. Filter on it and you drop real brand accounts.

📖 See also TikTok Scraper: Which Endpoint for Which Question?

Why did the same search fail on one route and work on another?

Because one route reads TikTok's web surface, which increasingly wants a session, and the other reads the app surface, which does not.

What happened

We called tikhub/api/v1/tiktok/web/fetch_search_user with keyword: duolingo and an extra count parameter. HTTP 400, "Request failed. Please retry." We removed the extra parameter and called again with keyword alone. HTTP 400, the same message.

Then we called tikhub/api/v1/tiktok/app/v3/fetch_user_search_result with keyword: duolingo and nothing else. HTTP 200, twenty rows.

Same provider, same price shape, same keyword, same minute.

What the schema was telling us

The web route's input schema lists an optional cookie parameter, described as "User cookie (if needed)". That parenthesis is the whole story. TikTok's web search has moved toward requiring an authenticated session, so an unauthenticated web-route call is now a coin flip that landed wrong twice. The app route emulates the mobile client, which searches without one.

We were not charged for the failed calls. The provider returns the 400 inside a Monid run whose own status reads COMPLETED, so check providerResponse.httpStatus rather than the run status, the same wrinkle noted in the Reddit scraper comparison.

The rule

For TikTok search, prefer the app/v3 routes and treat the web routes as needing a cookie. This matches a note already in our own operating notes from an earlier TikTok run, and it is the kind of thing that costs an afternoon if you learn it from a retry loop instead of from a paragraph.

How do you find every account behind a brand?

Search the brand name, page until has_more is 0, then filter on the handle pattern rather than the display name, and do not filter on verification.

For agents

Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:

set up https://monid.ai/SKILL.md

It learns the whole discover, inspect, run workflow itself. More in the agent quickstart.

For humans

npm install -g @monid-ai/cli
monid keys add -k <your-api-key> -l main

Step 1. Search the keyword

What it does. Returns the first page of accounts TikTok's search ranks for the term.

The endpoints. tikhub/api/v1/tiktok/app/v3/fetch_user_search_result, billed per call, requires keyword.

The call.

monid run -p tikhub -e /api/v1/tiktok/app/v3/fetch_user_search_result \
  --query '{"keyword": "duolingo"}'

What comes back. Twenty user_info records, has_more, cursor.

What it costs. A fraction of a cent per call, flat, whether the page is full or not. Current figures at monid.ai/tools.

Step 2. Page with the cursor

What it does. Gets the next twenty.

The call.

monid run -p tikhub -e /api/v1/tiktok/app/v3/fetch_user_search_result \
  --query '{"keyword": "duolingo", "cursor": 20}'

Stop when has_more is 0. The cursor is an opaque offset from the previous response, not a number you compute.

Step 3. Filter on the handle, keep the unverified

What it does. Turns a search page into a brand's account list.

brand = "duolingo"
official = [u["user_info"] for u in pages
            if u["user_info"]["unique_id"].lower().startswith(brand)]
# 10 of 20 on our run. duolingoenglishtest survives; it is unverified and real.

Matching on unique_id rather than nickname matters: the display name for the Vietnam account is "Duolingo Vietnam 🇻🇳", and the emoji, the space and the capitalisation all vary by account. The handle is the field the brand chose deliberately.

What comes back. Ten accounts on our run, from 18 million followers to 24 thousand, and one of them unverified.

Give this to your agent

$Set up https://monid.ai/SKILL.md, and then use Monid to search TikTok for my brand name, page until there are no more results, keep the accounts whose handle starts with the brand, and give me follower count and verification for each.

📖 See also Apify vs TikHub for TikTok Scraping, Priced Honestly

What is the best API for TikTok data?

There is no single one, because TikTok data is at least three different jobs, and user search is the one that comes first.

The three jobs

Finding accounts you do not have handles for. That is this article, and it is a search operation with a cursor.

Reading an account you already have. Profile, follower count, recent videos. Per-handle lookups, covered in pulling TikTok profiles at scale.

Reading videos. Comments, stats, transcripts. Per-video lookups, covered in automating TikTok comment collection.

The endpoint that is best at the first is not the one that is best at the third, and an article that names one winner has quietly picked one of the three jobs without saying which.

Where this search sits

User search is the cheapest step and the one everything else depends on: you cannot read a profile without a handle. It bills per call rather than per result, so a brand audit across many keywords costs the same whether each keyword returns two accounts or two hundred. Compare that to per-result profile reads, where the bill tracks what you fetch.

The honest comparison

For the search job specifically, the app route measured above is the one that worked keyword-only. The web route on the same provider did not. Other providers in the catalog offer TikTok search too, priced per call at a higher magnitude; we have not measured them on the same keyword in the same minute, so this article does not rank them. The TikTok endpoint comparison covers the read side.

Which endpoint should I use for which job?

EndpointWhat it doesInputOutputBest forBilling
tikhub/api/v1/tiktok/app/v3/fetch_user_search_resultFind accounts by keywordkeyword, cursor20 user_info rows per pageThe finder stepPer call
tikhub/api/v1/tiktok/web/fetch_search_userSame search, web surfacekeyword, cookie400 without a cookie on 2026-09-14Only with a sessionPer call
tikhub/api/v1/tiktok/web/fetch_user_profileRead one accountuniqueId40 fields, privateAccount, and two stats objects that disagreeThe viewer step, after you have the handlePer call
tikhub/api/v1/tiktok/app/v3/fetch_user_post_videosAn account's videossec_uidVideo recordsReading what they postPer call
apify/clockworks/tiktok-scraperProfiles and videos in bulkHandles or URLsFlat rowsOne large read with bodiesPer result

Every row was verified with monid inspect on 2026-09-14. The table gives billing shape rather than figures, because shape drives design and current numbers live on monid.ai/tools.

The second row is in the table so the failure is on record. It may work with a cookie and it may work tomorrow without one; on the day of writing it did not, twice.

When is a user search the wrong tool?

Four cases.

You already have the handle. Search is the step for when you do not. Go straight to the profile read; searching for a handle you know is a call that returns what you typed.

You need private accounts. Search returns what TikTok surfaces publicly. A private account's follower count and videos are not readable through any of these routes, and any tool claiming otherwise is describing an account-based method with its own risks.

You need completeness. Search is a ranking. Twenty per page, ordered by TikTok's relevance, and a small account with an unusual handle may never surface for the brand keyword. Paging to has_more: 0 gives you what search will show, not every account that exists. That is the same census-versus-sample distinction measured in the Reddit scraper comparison.

You want the official API. TikTok's Research API exists for approved academic and non-commercial use, with an application process and quotas. If you qualify, it is the authoritative route and you should use it. These endpoints exist for the case where you do not.

And the disclosure: this is Monid's blog and we sell per-call access to these endpoints. The most useful thing in this article is which route to avoid, which costs us calls rather than earning them.

Conclusion

A TikTok user finder is a search endpoint with a cursor, and the two things that decide whether it works are the route you pick and the field you filter on. The app route returned twenty accounts keyword-only; the web route returned two 400s and a hint about cookies. Match on unique_id, because display names carry emoji and inconsistent casing, and do not filter on verification, because an official sub-brand with 24,763 followers was unverified.

The finding that generalises: a brand is not one account. One keyword surfaced ten official regional handles spanning three orders of magnitude in followers. A finder that stops at the top result has found the flagship and missed the rest of the presence, and the rest is where the regional story lives.

Free next step: run monid inspect -p tikhub -e /api/v1/tiktok/app/v3/fetch_user_search_result to read the schema, then search one brand you know and count how many official handles come back. Start at monid.ai.

FAQ

What is the difference between a TikTok handle and a display name?

The handle is unique_id, the stable string in the profile URL that the account owner chose and that TikTok enforces as unique. The display name is nickname, free text that can be changed at will, can contain emoji and spaces, and is not unique. Search matches against the display name and the bio, which is why it finds "Duolingo Vietnam 🇻🇳", but every join, dedupe and follow-up lookup should key on the handle. Storing only the display name is how two rows for one account end up in a table.

Can the user finder see private accounts?

It can surface that a private account exists, with its handle, display name and follower count, because TikTok shows those publicly. It cannot read the account's videos or following list, and no route in this article can. If a downstream step needs video data, check the profile's privacy flag first and route private accounts out of the batch rather than discovering the gap inside a loop.

How much does it cost to page through all results?

Each page is one per-call charge at a fraction of a cent, and a brand keyword typically exhausts in a handful of pages, so a full sweep costs less than a single per-result profile read on most other endpoints. Because billing is per call rather than per row, a page with two results costs the same as a page with twenty, so the cost of a sweep is set by how many keywords you search, not by how many accounts exist. Current figures are on monid.ai/tools.

Should I use the official TikTok API instead?

If you qualify, yes. TikTok's Research API is the authoritative source, with documented fields and stable behaviour, and it is available to approved researchers at non-commercial institutions with an application and a quota. Most commercial and agency use does not qualify, and the display-surface routes here exist for that case. If you do qualify, the official route is better data on every axis except availability.

Last updated September 2026.

tiktok profile viewertiktok account viewertiktok account findertiktok user searchtiktok apitikhub