TikTok Profile Scraper - Followers, Likes & Bio
Pricing
from $0.34 / 1,000 profiles
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
Maintained by CommunityActor stats
0
Bookmarked
70
Total users
32
Monthly active users
19 hours ago
Last modified
Categories
Security
Limited permissionsShare
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.
| Input | Usernames, numeric user ids, tiktok.com/@handle links, or keywords that find accounts |
| Output | One 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 |
| Ceiling | No cap on handles. A long list stops at the run's time limit, an hour by default, and keeps every profile it delivered |
| Speed | Roughly 40 to 50 profiles a minute on measured runs, and slower when TikTok is slow to answer |
| Account needed | None |
| 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? | |
|---|---|
| Actor | dami_studio/tiktok-user-scraper |
| Set one field | profiles, labelled "Usernames" in the Console |
| Cap the bill | maxTotalChargeUsd on the run, for example 0.10: it never charges past that |
| MCP, one link | https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/tiktok-user-scraper |
| How often | Weekly, 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 get | Field |
|---|---|
| Handle, display name and the numeric user id | uniqueId, nickname, id |
| TikTok's long id, which survives a handle change | secUid |
| Bio | signature |
| Followers and following | followerCount, followingCount |
| Lifetime likes across everything the account has posted | heartCount |
| Videos on the account right now | videoCount |
| Likes the account has given out | diggCount |
| The blue tick | verified |
| Profile picture and the profile link | avatar, url |
| Which of your inputs found the row | sourceInput, sourceType |
| Private account, and whether its liked videos are hidden | privateAccount, likedVideosHidden |
| When the account was made | createTime |
| The link in bio, as the profile shows it | bioLink |
| Country code of the account | region |
| 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 storage | profilePictureKey, profilePictureUrl |
Optional add-on rows, type: "video": an account's newest videos, videos under hashtags or for keywords, videos from links | id, 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 text | subtitles, subtitlesLanguage |
| On video rows: accounts tagged in the caption, and where the video was posted | mentions, region |
Optional add-on rows, type: "comment": comments and replies under video rows | id, videoId, parentId, text, likeCount, replyCount, createTime, user |
▶️ How to scrape TikTok profiles
- Open TikTok Profile Scraper and click Try for free.
- Type handles or user ids into Usernames, one per line, paste links into Profile URLs, or type a topic into Find accounts by keyword.
- Click Start.
- 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"]}
| Field | Default | What it is |
|---|---|---|
profiles | none | Usernames, 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. |
startUrls | none | Or paste profile links like https://www.tiktok.com/@tiktok. Mix them with profiles freely. A link that is not a profile link is skipped. |
searchQueries | none | Keywords. 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. |
maxProfilesPerSearch | 10 | How many accounts each keyword may return, 1 to 100. |
moreDetails | false | Adds ttSeller, commerceUser, friendCount and region to each row. Each profile takes longer. A value not shown on that run stays null. |
videosPerProfile | 0 | Optional 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, videosPostedBefore | none | Optional: 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, maxVideoLikes | none | Optional add-on: keep only latest videos inside this like range. A video whose like count could not be read is left out. |
excludePinnedVideos | false | Optional: leave out the videos pinned to the top of the profile, told apart by their place in the feed. |
hashtags | none | Optional add-on: video rows under each hashtag. |
videoSearchQueries | none | Optional add-on: video rows for each keyword. searchQueries finds accounts; this finds videos. |
videoUrls | none | Optional add-on: one row per video link. |
videosPerInput | 10 | How many videos each hashtag or keyword may return, 1 to 100. |
includeSubtitles | false | Optional add-on: the subtitles TikTok publishes for each video, as text. |
commentsPerVideo | 0 | Optional add-on: up to this many comments under each video row, 0 to 50. |
repliesPerComment | 0 | Optional add-on: up to this many replies under each comment, 0 to 10. |
saveProfilePicture | false | Optional add-on: keeps a copy of each profile picture in the run's own storage, which expires like the run's other data. |
sessionCookies | none | Optional: your own session, used only for your run. You are responsible for using it within the site's terms. The field is stored encrypted. |
proxyConfiguration | off | Leave it off. Your own servers are used exactly as given. |
notionConnector, notionParentId | none | Optional. Write each profile into a Notion database as well as the dataset. |
📤 What you get back

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}
| Field | How to read it |
|---|---|
followingCount, diggCount | 0 can mean the figure is hidden, not that it is zero. |
heartCount | Lifetime likes received. This is the "total likes" number. |
videoCount | How many videos are on the account at the time of the run, not how many it ever posted. |
secUid | Stays the same when the creator renames the account, so track it rather than uniqueId. |
avatar | Signed, and it stops working after a while. Download the image if you need to keep it. |
sourceInput, sourceType | What 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. |
likedVideosHidden | true means the account keeps its liked videos private, so a diggCount of 0 there means "not shown". |
createTime | When the account was made, in UTC. |
bioLink | The link exactly as the profile shows it, often without https://. null when there is none. |
region | A two-letter country code, on accounts found by keyword and with More account details on. null otherwise. |
friendCount | Mutual follows: accounts that follow each other. |
| The newer columns | privateAccount to friendCount stay null on accounts of people under 18. |
| Video and comment rows | Only from accounts TikTok marks as adults. A video row links to the video's page; it never carries the video or sound file. |
mentions | Tagged 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.
| Row | How to spot it | Billed |
|---|---|---|
| A profile | ok: true and type: "profile" | yes |
| A video or comment from an add-on | type: "video" or type: "comment" | not while the add-on is off |
| The sample row | _sample: true | no |
| A diagnostic | ok: false and an errorCode | no |
Filter on type == "profile" and you have your data. The sample row only turns up when the input
was empty.
| Code | What it means |
|---|---|
NOT_FOUND | No profile came back for that handle. Treat them the same way: check the spelling, then try it again later. |
NOT_SERVED | This 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_VIDEOS | This 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_LIMIT | The 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_RESULTS | Nothing at all came back for the whole run. |
OPTION_STARTS_SOON | An 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_OFF | An add-on needs another one, such as comments without any videos. |
BAD_INPUT | A value could not be used, such as a link that is not a video link. |
UNEXPECTED_ERROR | The 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
secUidfor each account, the id that survives a handle change. - Starting from a topic, not a list: a keyword like
street foodgives you the accounts and their numbers in one run.
From a hashtag to a creator shortlist, in three runs:
- Run TikTok Hashtag Scraper on a tag in
your niche and copy the
author.uniqueIdcolumn. - Paste those handles into Usernames here and sort on
followerCount. - 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.
followingCountanddiggCountcan be0when hidden. Read a0there 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 want | Use |
|---|---|
| Follower and like counts for a list of handles, or the accounts behind a keyword | This one |
| A profile plus its newest videos, or the videos for a keyword | TikTok Scraper |
| Videos posted under a hashtag | TikTok Hashtag Scraper |
| Comments under a video | TikTok Comments Scraper |
| The hashtags ranking in a country right now | TikTok Trending Hashtags |
| The same kind of row for Instagram accounts | Instagram 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-clientfrom apify_client import ApifyClientclient = 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 resultscontinueprint(row.get("uniqueId"), row.get("followerCount"))
Is scraping TikTok legal?
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.