TikTok Profile Scraper avatar

TikTok Profile Scraper

Pricing

from $1.25 / 1,000 results

Go to Apify Store
TikTok Profile Scraper

TikTok Profile Scraper

Scrape public TikTok profiles by handle and get exact counts: followerCount reads 95200000 rather than the rounded 95.2M the page displays, alongside followingCount, likeCount, videoCount, nickname, biography, isVerified and the full-size avatar. Up to 500 handles per run, all read logged out.

Pricing

from $1.25 / 1,000 results

Rating

0.0

(0)

Developer

String

String

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

3

Monthly active users

14 days ago

Last modified

Share

What does the TikTok Profile Scraper do?

This Actor turns a list of TikTok handles into a table of public profiles. One row per handle, with the follower, following, like and video counts as exact integers, plus the display name, the bio, the verification flag and the full-size avatar.

Exact is the point. A TikTok profile page renders 95.2M followers, which is a number rounded to three significant figures and useless for measuring growth: an account can gain 40,000 followers in a week without the displayed figure moving at all. This Actor reads the __UNIVERSAL_DATA_FOR_REHYDRATION__ blob that the page itself hydrates from, and that blob carries followerCount as 95200000 — the integer TikTok computed before the UI rounded it. The same holds for likes, following and video count.

  • Exact integers for followerCount, followingCount, likeCount and videoCount
  • Up to 500 handles in one run, fetched in parallel
  • Bare handle, @handle and full profile URL all resolve to the same account and one fetch
  • No TikTok account, session cookie or msToken at any point in the run
  • A handle that does not resolve is reported as a failure, never as a row of zeros

What data does it extract?

FieldTypeDescription
handlestringThe handle as resolved from your input, without the @
usernamestringThe account's own uniqueId as TikTok stores it
nicknamestringDisplay name
biographystringBio text
followerCountnumberExact, e.g. 95200000 where the page shows "95.2M"
followingCountnumberAccounts this profile follows
likeCountnumberTotal hearts across the account
videoCountnumberVideos posted
isVerifiedbooleanWhether TikTok shows the blue check
profileImageUrlstringFull-size avatar
sourceUrlstringThe profile URL the row was read from
collectedAtstringISO timestamp of the fetch

handle and username are usually identical. They differ when your input spelled a handle in a different case from TikTok's own record, which makes username the one to join on.

Why scrape TikTok profiles?

  • Influencer vetting. Check an actual follower count against the one quoted in a media kit before a paid collaboration, and check the like-to-follower ratio while you are there.
  • Growth tracking. Exact integers are what make a weekly series meaningful. Rounded display figures flatten a month of real growth into one step change.
  • Shortlist ranking. Sort a candidate list by exact follower and like volume rather than by eyeballing rounded numbers that tie.
  • Competitive monitoring. Watch a set of brand accounts and see who is actually posting, via videoCount movement rather than impression.
  • Database enrichment. Attach current counts, bio text and verification status to a partner, talent or affiliate record you already hold.

How to use it

  1. Open the Actor and click Try for free, or add it to your Apify account.
  2. Paste handles into the Profiles field, one per line. tiktok, @khaby.lame and https://www.tiktok.com/@nba are all accepted, and mixing the three forms is fine.
  3. Raise Concurrency if you are working through hundreds of handles; the default of 5 keeps a large list moving without hammering anything.
  4. Set Maximum results if you want a hard ceiling on the dataset.
  5. Click Start, then export the rows from the Dataset tab as JSON, CSV or Excel.
  6. Read the run's SUMMARY record for any handle that failed and why.

For a growth series, save the input as a task and schedule it daily or weekly. Each row carries collectedAt, so the dataset accumulates into a time series without any extra work.

Input

FieldTypeDefaultDescription
profilesarray of stringsrequiredHandles, @handles or tiktok.com profile URLs. Between 1 and 500 entries. All spellings of one account collapse to a single fetch
maxItemsinteger1000Ceiling on dataset rows, 1 to 50000
concurrencyinteger5Profiles fetched in parallel, 1 to 10
{
"profiles": ["tiktok", "@khaby.lame", "https://www.tiktok.com/@nba"],
"maxItems": 1000,
"concurrency": 5
}

Output

One row per profile. The shape below is illustrative — it shows the fields and their types, not a captured run.

{
"handle": "khaby.lame",
"username": "khaby.lame",
"nickname": "Khabane lame",
"biography": "If you want to laugh you are in the right place",
"followerCount": 95200000,
"followingCount": 82,
"likeCount": 1300400000,
"videoCount": 1211,
"isVerified": true,
"profileImageUrl": "https://p16-sign-va.tiktokcdn.com/tos-maliva-avt-0068/7318c1a2b3d4e5f60718293a4b5c6d7e~c5_1080x1080.jpeg",
"sourceUrl": "https://www.tiktok.com/@khaby.lame",
"collectedAt": "2026-08-21T09:14:03.512Z"
}

Reliability

Measured across 30 well-known accounts in one run, all 30 were collected and every field in the schema came back populated with real values.

Everything is read from TikTok's own rehydration state rather than from rendered markup. That is partly for accuracy and partly out of necessity: the rendered profile page is far past the size a model-backed extractor will accept, and its counts are display strings. The blob is served as part of the logged-out page, which is why no account, cookie or token is involved.

A profile that returns no readable identity or counts is recorded under failures rather than emitted as an all-null row that would count as a success. The check is deliberate — the blob can parse while carrying nothing useful, for instance when an interstitial is served under the profile route, and a row of nulls in a dataset is worse than an honest failure. A run in which every handle failed exits with an error.

There are no retries. The String Unblocker behind this Actor owns proxy rotation, session reuse and anti-bot solver selection, so a retry loop out here would re-roll the same block.

Limitations

Profile-level data only. No videos, comments, hashtags, sounds, follower lists or keyword search, and no discovery of any kind: you supply the handles. A private account exposes only what TikTok publishes on the public profile. Only tiktok.com URLs are accepted, and there is no country or language input.

How much does it cost?

Pricing is per event: one charge for each profile row written to the dataset. A handle that fails produces no row and costs nothing. The current rate is in the pricing panel at the top of this page.

Runs started from an Apify free plan stop at 250 requests and 250 results, reported in the run's status message, so a free-plan run of a 500-handle list returns the first 250. Any paid plan runs the full input and whatever maxItems you set. The cap exists because this Actor fetches through String's own infrastructure, which Apify does not reimburse on free-plan runs, and it binds on requests as well as rows so a long handle list cannot spend those fetches on rows the run will not return.

Using it with the Apify API

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "<YOUR_APIFY_TOKEN>" });
const run = await client.actor("usestring/tiktok-profiles").call({
profiles: ["tiktok", "khaby.lame", "nba"],
concurrency: 5
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const profile of items) {
const engagement = profile.likeCount / profile.followerCount;
console.log(profile.username, profile.followerCount, engagement.toFixed(2));
}
const summary = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord("SUMMARY");
console.log(summary?.value);

This Actor reads the public profile page a logged-out visitor sees. No login, no session cookie, no paywall, and no attempt to reach anything a visitor could not. Access is the easy part: US and EU law does not treat reading an open page as unauthorised. Privacy is where the real obligations sit.

That said, a creator profile is personal data when the account belongs to an identifiable person, even though the person chose to publish it. If you are storing rows about EU or UK creators, you need a lawful basis under GDPR, and legitimate interest for commercial vetting is the usual one. Collect the fields your use actually needs, keep them no longer than you need them, and expect to honour a deletion request. Avatars and bio text belong to the creator. None of this is legal advice.

FAQ

How do I scrape TikTok profiles without logging in? Put the handles, @handles or profile URLs into the profiles input and run the Actor. It reads the public, logged-out profile page, so no TikTok account, cookie or session token is required.

Is the follower count exact or rounded? Exact. followerCount comes back as 95200000 where the page renders "95.2M", and likeCount, followingCount and videoCount are exact integers as well.

What identifier formats does the input take? Three, all treated as the same account: a bare handle (nba), an @handle (@khaby.lame), or a full profile URL (https://www.tiktok.com/@nba).

How many profiles can one run collect? Up to 500, which is the ceiling on the profiles input. Each profile is one request and one row.

Does it return videos, comments, hashtags or sounds? No. The row is the profile-level field set in the table above and nothing beyond it.

What happens with a handle that does not exist? It goes into the run's SUMMARY under failures and the rest of the batch still returns. Only a run where every handle failed exits with an error.

Can I search TikTok by keyword or hashtag? No. You supply the handles; this Actor does no discovery.

How current are the counts? They are whatever TikTok's own page data held at the moment of the fetch, stamped in collectedAt.

Feedback

If a handle fails or a count looks wrong, open an issue from the Issues tab on this Actor's Store page and include the handle that reproduces it.