TikTok Profile Scraper - Followers, Likes & Bio avatar

TikTok Profile Scraper - Followers, Likes & Bio

Pricing

from $0.34 / 1,000 profiles

Go to Apify Store
TikTok Profile Scraper - Followers, Likes & Bio

TikTok Profile Scraper - Followers, Likes & Bio

TikTok profile scraper for a list of handles or links. Each row has followers, following, lifetime likes, video count, bio, verified flag, avatar and the secUid that survives a rename. A handle listed twice is billed once. $0.35 per 1,000 profiles.

Pricing

from $0.34 / 1,000 profiles

Rating

5.0

(2)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

70

Total users

32

Monthly active users

19 hours ago

Last modified

Categories

Security

Limited permissions

Share

TikTok profile scraper for a list of handles, user ids or keywords: one flat row per account with followers, following, lifetime likes, video count, bio, link in bio, the date the account was made, verified flag, avatar and the profile link. Nothing to log into.

The part worth knowing first: followingCount and diggCount come back as 0 when they are hidden, not only when the figure is really zero. Videos, comments and a saved copy of the profile picture are optional add-ons from 9 November 2026. Before that day, asking for one writes a free row saying so and fetches nothing.

InputUsernames, numeric user ids, tiktok.com/@handle links, or keywords that find accounts
OutputOne row per profile: followers, following, lifetime likes, video count, bio, link in bio, account date, private flag, verified flag, avatar, profile link and both TikTok ids
CeilingNo cap on handles. A long list stops at the run's time limit, an hour by default, and keeps every profile it delivered
SpeedRoughly 40 to 50 profiles a minute on measured runs, and slower when TikTok is slow to answer
Account neededNone
Price$0.35 per 1,000 profiles on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 14,000
Using an AI agent?
Actordami_studio/tiktok-user-scraper
Set one fieldprofiles, labelled "Usernames" in the Console
Cap the billmaxTotalChargeUsd on the run, for example 0.10: it never charges past that
MCP, one linkhttps://mcp.apify.com/?tools=fetch-actor-details,dami_studio/tiktok-user-scraper
How oftenWeekly, to track follower counts

🔍 What TikTok Profile Scraper does

You hand it handles, it hands back the profile record behind each one. Handles are taken with or without the @, and a profile link works just as well since the handle is read straight out of it. A long numeric user id works too. Don't have handles yet? Give it a keyword and it finds the accounts first, then returns the same row for each.

Everything is deduplicated before the rows land, so the same account listed twice in one run comes back once and is billed once.

The field names are TikTok's own. heartCount is the lifetime likes figure people usually mean by "total likes".

📋 What data you get from each TikTok profile

What you getField
Handle, display name and the numeric user iduniqueId, nickname, id
TikTok's long id, which survives a handle changesecUid
Biosignature
Followers and followingfollowerCount, followingCount
Lifetime likes across everything the account has postedheartCount
Videos on the account right nowvideoCount
Likes the account has given outdiggCount
The blue tickverified
Profile picture and the profile linkavatar, url
Which of your inputs found the rowsourceInput, sourceType
Private account, and whether its liked videos are hiddenprivateAccount, likedVideosHidden
When the account was madecreateTime
The link in bio, as the profile shows itbioLink
Country code of the accountregion
TikTok Shop seller, business account and mutual follows (optional, More account details)ttSeller, commerceUser, friendCount
Optional add-on: a copy of the profile picture in the run's own storageprofilePictureKey, profilePictureUrl
Optional add-on rows, type: "video": an account's newest videos, videos under hashtags or for keywords, videos from linksid, webVideoUrl, text, createTime, hashtags, region, playCount, diggCount, commentCount, shareCount, collectCount, duration, cover, music, author
Optional add-on on video rows: the subtitles TikTok publishes, as textsubtitles, subtitlesLanguage
On video rows: accounts tagged in the caption, and where the video was postedmentions, region
Optional add-on rows, type: "comment": comments and replies under video rowsid, videoId, parentId, text, likeCount, replyCount, createTime, user

▶️ How to scrape TikTok profiles

  1. Open TikTok Profile Scraper and click Try for free.
  2. Type handles or user ids into Usernames, one per line, paste links into Profile URLs, or type a topic into Find accounts by keyword.
  3. Click Start.
  4. Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.

Start it with both boxes empty and you get one labelled sample row that is not charged.

💰 How much does it cost to scrape TikTok profiles?

$0.35 per 1,000 profiles on the Free plan. Paid plans pay a little less: $0.345 on Starter, $0.34 on Scale and $0.335 on Business. On the free plan, the $5 Apify gives you each month covers about 14,000 profiles.

You pay for rows that carry a profile, and an account found by keyword is one of those. The sample row, diagnostic rows and the second copy of an account you asked for twice are not charged. More account details costs nothing extra.

The optional add-ons start on 9 November 2026. On the Free plan they cost $0.25 per 1,000 videos, $0.40 per 1,000 comments, $0.35 per 1,000 saved profile pictures, and $0.05 per 1,000 videos the likes filters check and leave out; paid plans pay a little less. Before that day a run that asks for one gets a free OPTION_STARTS_SOON row instead.

📥 What you give it

{
"profiles": ["tiktok", "nba", "khaby.lame"]
}
FieldDefaultWhat it is
profilesnoneUsernames, with or without @. The form opens with tiktok and nba filled in as an example, which is a starting point rather than a default. A numeric user id of 15 digits or more works too: it is tried as a username first, then as an id.
startUrlsnoneOr paste profile links like https://www.tiktok.com/@tiktok. Mix them with profiles freely. A link that is not a profile link is skipped.
searchQueriesnoneKeywords. Each one runs TikTok's account search and returns a profile row for every account it finds, in TikTok's order. On a run where account search gives no accounts, they come from the videos matching the keyword instead, and a free ACCOUNTS_FROM_VIDEOS row says so.
maxProfilesPerSearch10How many accounts each keyword may return, 1 to 100.
moreDetailsfalseAdds ttSeller, commerceUser, friendCount and region to each row. Each profile takes longer. A value not shown on that run stays null.
videosPerProfile0Optional add-on: up to this many of each account's newest videos, 0 to 10, right after its profile row. TikTok shows about 10 at most.
videosPostedAfter, videosPostedBeforenoneOptional: keep only latest videos posted in this range, dates like 2026-10-01 in UTC. Anything that is not a date stops the run before it starts, with a BAD_INPUT row.
minVideoLikes, maxVideoLikesnoneOptional add-on: keep only latest videos inside this like range. A video whose like count could not be read is left out.
excludePinnedVideosfalseOptional: leave out the videos pinned to the top of the profile, told apart by their place in the feed.
hashtagsnoneOptional add-on: video rows under each hashtag.
videoSearchQueriesnoneOptional add-on: video rows for each keyword. searchQueries finds accounts; this finds videos.
videoUrlsnoneOptional add-on: one row per video link.
videosPerInput10How many videos each hashtag or keyword may return, 1 to 100.
includeSubtitlesfalseOptional add-on: the subtitles TikTok publishes for each video, as text.
commentsPerVideo0Optional add-on: up to this many comments under each video row, 0 to 50.
repliesPerComment0Optional add-on: up to this many replies under each comment, 0 to 10.
saveProfilePicturefalseOptional add-on: keeps a copy of each profile picture in the run's own storage, which expires like the run's other data.
sessionCookiesnoneOptional: your own session, used only for your run. You are responsible for using it within the site's terms. The field is stored encrypted.
proxyConfigurationoffLeave it off. Your own servers are used exactly as given.
notionConnector, notionParentIdnoneOptional. Write each profile into a Notion database as well as the dataset.

📤 What you get back

Real run output

A real row from a real run, with the avatar link cut short:

{
"ok": true,
"type": "profile",
"id": "107955",
"uniqueId": "tiktok",
"secUid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM",
"nickname": "TikTok",
"signature": "Your next discovery is waiting on TikTok.",
"verified": true,
"avatar": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/...",
"followerCount": 95824985,
"followingCount": 1,
"heartCount": 464140394,
"videoCount": 1591,
"diggCount": 0,
"url": "https://www.tiktok.com/@tiktok",
"sourceInput": "tiktok",
"sourceType": "profile",
"privateAccount": false,
"likedVideosHidden": true,
"createTime": "2015-02-28T17:22:29.000Z",
"bioLink": "tiktok.com/discovermore",
"region": null
}
FieldHow to read it
followingCount, diggCount0 can mean the figure is hidden, not that it is zero.
heartCountLifetime likes received. This is the "total likes" number.
videoCountHow many videos are on the account at the time of the run, not how many it ever posted.
secUidStays the same when the creator renames the account, so track it rather than uniqueId.
avatarSigned, and it stops working after a while. Download the image if you need to keep it.
sourceInput, sourceTypeWhat you typed that found the row, and whether it was a profile (handle or link), a userId or a search. An account found twice comes once, under the first.
likedVideosHiddentrue means the account keeps its liked videos private, so a diggCount of 0 there means "not shown".
createTimeWhen the account was made, in UTC.
bioLinkThe link exactly as the profile shows it, often without https://. null when there is none.
regionA two-letter country code, on accounts found by keyword and with More account details on. null otherwise.
friendCountMutual follows: accounts that follow each other.
The newer columnsprivateAccount to friendCount stay null on accounts of people under 18.
Video and comment rowsOnly from accounts TikTok marks as adults. A video row links to the video's page; it never carries the video or sound file.
mentionsTagged accounts as { "uniqueId", "id" }, only those TikTok marks as adults. null when the video's own page was not read, as on hashtag and keyword rows. Up to 5 new tagged accounts are checked per video; any past that are left out, so no unchecked account appears.

🧾 Reading the output

These kinds of row can land in your dataset.

RowHow to spot itBilled
A profileok: true and type: "profile"yes
A video or comment from an add-ontype: "video" or type: "comment"not while the add-on is off
The sample row_sample: trueno
A diagnosticok: false and an errorCodeno

Filter on type == "profile" and you have your data. The sample row only turns up when the input was empty.

CodeWhat it means
NOT_FOUNDNo profile came back for that handle. Treat them the same way: check the spelling, then try it again later.
NOT_SERVEDThis profile or search was not served this run. Re-run it later. A keyword gets this when the search itself gave nothing that run, not when it looked and found nobody. Runs before 13 October 2026 wrote BLOCKED here.
ACCOUNTS_FROM_VIDEOSThis keyword's accounts come from videos matching it. Some won't have the word in their name. They are billed as profiles; this row is free.
TIME_LIMITThe run neared its time limit and stopped, keeping every profile it had delivered. If no profile had come back by then, the run still ends as succeeded, with an amber status message.
NO_RESULTSNothing at all came back for the whole run.
OPTION_STARTS_SOONAn add-on you set was not on for this run (the add-ons start on 9 November 2026). Nothing was fetched or charged for it.
OPTION_OFFAn add-on needs another one, such as comments without any videos.
BAD_INPUTA value could not be used, such as a link that is not a video link.
UNEXPECTED_ERRORThe run stopped early on an unexpected error. The results before this row are kept.

A handle that fails gets its own row and the run carries on to the next one. A keyword that finds no account gets a free NO_RESULTS row naming the search.

One quirk of the Overview table: it shows six columns, so a diagnostic row reads as a nearly blank line there, and followingCount, verified, secUid and the newer columns are not in it at all. Open the row itself or download the JSON and everything is present.

💡 What people use it for

  • Refreshing follower and likes counts across a creator list every week, then comparing week to week.
  • Checking a shortlist of creators before you commit to one, so no budget goes to a dead handle.
  • Turning a column of handles from a spreadsheet into a table with real numbers next to it.
  • Grabbing secUid for each account, the id that survives a handle change.
  • Starting from a topic, not a list: a keyword like street food gives you the accounts and their numbers in one run.

From a hashtag to a creator shortlist, in three runs:

  1. Run TikTok Hashtag Scraper on a tag in your niche and copy the author.uniqueId column.
  2. Paste those handles into Usernames here and sort on followerCount.
  3. Put the handles worth a closer look into the Profiles box of TikTok Scraper to see their newest videos and how they perform.

🚧 What it does not do

  • No follower lists and no downloads. Videos and comments come as rows through the add-ons from 9 November 2026, never as files.
  • followingCount and diggCount can be 0 when hidden. Read a 0 there as "not shown", not as "none".
  • A private account returns only what TikTok shows the public, which is the name, the bio and the counts it chooses to display.
  • Counts are a snapshot at the moment the row was read, not a history.
  • Find accounts by keyword returns accounts, up to 100 per keyword, in the order TikTok's own account search gives them.
  • It is not an official TikTok tool. Dami's Studio is independent and is not affiliated with or endorsed by TikTok, or by any other company named on this page.

🧭 Which TikTok scraper do you need?

If you wantUse
Follower and like counts for a list of handles, or the accounts behind a keywordThis one
A profile plus its newest videos, or the videos for a keywordTikTok Scraper
Videos posted under a hashtagTikTok Hashtag Scraper
Comments under a videoTikTok Comments Scraper
The hashtags ranking in a country right nowTikTok Trending Hashtags
The same kind of row for Instagram accountsInstagram Profile Scraper

❓ Questions people ask

Do I need a TikTok account to scrape TikTok profiles?

No. The cookie field is optional.

Why does a big account show 0 following?

Because the number is hidden for that account. The same goes for diggCount, the likes an account has given.

Can I get the account's videos too?

Yes, from 9 November 2026. Set Latest videos per account and each account's newest videos come as rows right after its profile row, at $0.25 per 1,000 videos on the Free plan. TikTok shows about 10 per account. Before that day, use TikTok Scraper, which returns the profile row plus the newest videos on the grid.

Can I find TikTok accounts without knowing their handles?

Yes. Type a keyword into Find accounts by keyword and every account TikTok's search turns up comes back as a full row, up to 100 per keyword. A numeric user id in Usernames works as well.

Why do the numbers differ from what I see in the app?

Counts move all the time, so two reads an hour apart disagree slightly on a big account and neither is wrong. If a field looks off, open the profile in a private browser window.

Can I call it from code or connect it to an AI assistant?

The API tab has code for Python, JavaScript and the CLI. MCP clients like Claude and ChatGPT use https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/tiktok-user-scraper; coding assistants can load our skill file. All three bill your Apify account at the same price.

# pip install apify-client
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("dami_studio/tiktok-user-scraper").call(
run_input={
"profiles": ["tiktok"],
},
max_total_charge_usd=0.10, # the most this run may spend
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row.get("ok") is False: # free note rows, not results
continue
print(row.get("uniqueId"), row.get("followerCount"))

This reads public profiles only, never private accounts or messages. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Include the handles you used and the run ID, and the log is usually enough for us to see what happened.