TikTok Profile Scraper - Followers and Likes, No Login
Pricing
from $0.35 / 1,000 profile returneds
TikTok Profile Scraper - Followers and Likes, No Login
Scrape TikTok profiles with no login. Each row has follower count, following count, video count, lifetime likes, bio, verified flag and avatar. Likes given out are hidden on most accounts, so a 0 there means hidden, not none. $0.35 per 1,000 profiles.
Pricing
from $0.35 / 1,000 profile returneds
Rating
5.0
(2)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
28
Total users
11
Monthly active users
2 days ago
Last modified
Categories
Share
TikTok Profile Scraper: follower counts, likes and bio for any public handle
Give it a list of TikTok usernames and you get one flat row per account: followers, following, lifetime likes, video count, bio, verified flag, avatar and the profile link. Nothing to log into.
The part worth knowing first: TikTok hides two of those numbers on most accounts. followingCount
and diggCount come back as 0 on plenty of large, active profiles because the account keeps them
private, not because the figure is really zero. And this returns the profile only. The videos on it
are a different actor, linked further down.
| Input | Usernames, or tiktok.com/@handle links |
| Output | One row per profile |
| Ceiling | No cap. One row per unique handle you send |
| Account needed | None from you |
| Price | $0.35 per 1,000 profiles, flat on every plan |
๐ 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.
Everything is deduplicated before the rows land, so the same account listed twice in one run comes back once and is billed once. Handles are fetched one at a time rather than in a burst, which is why a long list takes a while.
The field names are TikTok's own rather than the labels you see in the app, because those are the names you will need if you feed the rows into anything else:
| Field | What it is |
|---|---|
signature | The bio text. |
heartCount | Lifetime likes across everything the account has posted. |
diggCount | Likes the account has given out. Usually 0, because it is usually hidden. |
secUid | TikTok's stable internal id for the account. |
id | The numeric user id. |
A handle that does not exist, or that comes back empty, gets a row saying so and the run carries on to the next one.
๐ฅ 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. |
startUrls | none | Or paste profile links like https://www.tiktok.com/@tiktok. Mix them with profiles freely. |
sessionCookies | none | Optional. Your own TikTok sessionid, used only for handles that came back empty. Use a throwaway account: the value sits in the run input, which anyone who can open the run can read. |
proxyConfiguration | off | Leave it off. It exists for people routing through their own servers at high volume. |
notionConnector, notionParentId | none | Optional. Write each profile into a Notion database as well as the dataset. |
Run it with nothing at all and you get one labelled sample row, free, so you can see the shape before you spend anything.
๐ค 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"}
| Field | What it is |
|---|---|
uniqueId, nickname | The handle, and the display name shown above it. |
followerCount, videoCount | Audience size and how many videos are on the account right now. |
heartCount | Lifetime likes. This is the number people usually mean by "total likes". |
verified | The blue tick, as a boolean. |
avatar, url | Direct link to the profile picture, and the canonical profile link. |
id, secUid | Both ids TikTok uses. uniqueId is the readable one, secUid survives a rename. |
๐งพ Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| A profile | ok: true and type: "profile" | yes |
| The sample row | _sample: true | no |
| A diagnostic | ok: false and an errorCode | no |
Filter on ok == true and you have your data. NOT_FOUND and BLOCKED both mean no profile came
back for that handle, and you can treat them the same way: check the spelling, then try it again
later. NO_RESULTS is the single row you get when nothing at all came back for the whole run.
One quirk of the Overview table: it shows six columns, so a diagnostic row reads as a nearly blank
line there, and followingCount, verified and secUid are not in it at all. Open the row itself
or download the JSON and everything is present.
โถ๏ธ How to run it
- Open TikTok Profile Scraper and click Try for free.
- Type handles into Usernames, one per line, or paste links into Profile URLs.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.
๐ฐ How much does it cost?
$0.35 per 1,000 profiles. Flat on every Apify plan, no volume tiers.
You pay for rows that carry a profile. The sample row, diagnostic rows and the second copy of a handle you listed twice are not charged.
๐ก What people use it for
- Refreshing follower and likes counts across a creator list on a schedule, then diffing week to week.
- Vetting a shortlist of accounts before an outreach round, so nobody pitches a dead handle.
- Turning a column of handles from a spreadsheet into a table with real numbers next to it.
- Grabbing
secUidfor accounts, which is the id that survives a handle change.
๐ง What it does not do
- No videos, comments or follower lists. This is the profile record. Three siblings below cover the rest.
followingCountanddiggCountare often0because TikTok hides them. 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.
- The avatar link is signed and expires. Download the image if you need to keep it.
- No search. You need the handle already. It will not find accounts by topic or keyword.
๐งญ Which TikTok scraper do you need?
| If you want | Use |
|---|---|
| Follower and likes counts for handles you already have | This one |
| A profile plus the videos on it, or a keyword search | TikTok Scraper |
| Videos under a hashtag | TikTok Hashtag Scraper |
| Comments under a video | TikTok Comments Scraper |
| Which hashtags are climbing right now | TikTok Trending Hashtags |
โ Questions people ask
Do I need a TikTok account? No. The cookie field is optional and only comes into play for handles that came back empty without it.
Can I get the account's videos too? Not from here. TikTok Scraper returns the profile row plus the videos on the grid.
Why does a big account show followingCount: 0? Because TikTok is not publishing that number
for the account. The same goes for diggCount.
What happens to a handle that does not exist? You get an uncharged row marked ok: false, and
the run moves on to the next handle instead of stopping.
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.
Can I run it on a schedule? Yes. Use Apify's scheduler, or start it from the API and read the dataset when it finishes.
๐ 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.