TikTok Profile Scraper — Followers, Bio & Stats
Pricing
from $1.00 / 1,000 successful lookups
TikTok Profile Scraper — Followers, Bio & Stats
TikTok profile scraper: paste TikTok handles or profile URLs and get one row per profile: display name, bio, verified badge, follower/following/like/video counts, avatar, and bio link. Reads the profile page's own server-rendered data, no login, no cookies. Charged only for a profile actually found.
Pricing
from $1.00 / 1,000 successful lookups
Rating
0.0
(0)
Developer
Adrian Voss
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
TikTok Profile Lookup: tiktok profile scraper from $2/1k
You give this actor a list of TikTok handles or profile URLs and for each one it returns display name, bio, verified badge, follower/following/like/video counts, avatar image, bio link, and whether the account is private. Every field is read straight from the profile page's own server-rendered data at request time, no login, no cookies, and no third-party database sits between you and the answer.
Who it's for
Anyone qualifying, monitoring, or reporting on TikTok creators without opening the app or a browser tab per profile: agencies vetting creators for an influencer campaign, marketers tracking a competitor brand's TikTok growth, and analysts who need follower counts in a spreadsheet or a Clay/n8n workflow instead of a TikTok tab. Pricing is pay-per-event and per-profile: a few tenths of a cent for a profile that was actually found, and nothing for a miss, so a list with a typo'd handle or a deleted account costs you nothing extra. No seat license, no monthly minimum, no credit system to decode.
Why this one
- Reads the profile's own live page, not a stale database snapshot. Every run fetches
tiktok.com/@<handle>fresh, so a creator who gained a million followers an hour ago shows the new number, not a cached one. - No login, no cookies, no headless browser. TikTok's profile page embeds the whole profile (user info and stats) as JSON in the page's own HTML, so a plain HTTP fetch is enough; no session token or account of your own is ever needed.
- Never charged for a miss. A handle that's banned, suspended, or never existed still gets a row explaining why, and costs nothing. See "Price" below for the found-row rate.
- Exact follower/like/following/video counts, not TikTok's rounded display figure. The page carries both an abbreviated count ("95.6M") and the exact number behind it; this actor returns the exact one.
- Private accounts still resolve. A private account's profile-level stats (follower count, bio,
verified badge) are still public on the page itself;
isPrivate: truetells you the account is locked without failing the lookup.
What you get
Every row starts with the same five fields, then the profile fields.
| Field | Type | Description |
|---|---|---|
query | text | The handle or URL you submitted, echoed back |
found | boolean | true if the profile was found |
status | text | OK on a match; NOT_FOUND, BLOCKED, BAD_FORMAT, or REQUEST_FAILED on a miss |
message | text | Plain-English reason for a miss, only present when found is false |
scrapedAt | ISO 8601 datetime | When the page was fetched |
handle | text | The account's TikTok handle (without the @) |
userId | text | The account's stable numeric TikTok user ID |
nickname | text | The account's display name |
bio | text | The account's bio/signature text |
verified | boolean | Whether TikTok shows a verified badge on the account |
followerCount | number | Exact follower count |
followingCount | number | Exact following count |
heartCount | number | Total likes across all of the account's videos |
videoCount | number | Total videos posted |
avatarUrl | link | The account's avatar image, largest size available |
bioLink | link | The external link in the account's bio, if it has one |
isPrivate | boolean | Whether the account is set to private |
Deselect any field in the Input tab's column picker to drop it from every row: query, found,
status, message, and scrapedAt always stay.
Price
Pay-per-event. A flat per-run fee covers session/proxy warmup; you're billed
per item only when data is actually found and returned — see
.actor/pay_per_event.json for exact prices. A miss is never charged.
1,000 profiles through this actor: ~$2 if every one is found, less if some aren't and less again on a paid Apify plan. A banned, suspended, or nonexistent handle is never billed; you only pay for a profile you actually got data back for.
How to use
- In the Apify Console. Open the actor page and click Start — the
profilesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~tiktok-profile-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"profiles":["tiktok","khaby.lame"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
- Open the Input tab and paste your list into "TikTok handles or profile URLs to look up": one
per line, as a bare handle (
tiktok), an@handle, or a full profile URL. - Leave "Try it first" on for your first run; it caps the run at 5 profiles so you can see the output shape before spending on the full list.
- Optionally narrow the "Which columns do you want?" list if you only need a subset of fields, or set "Only keep rows containing" / "Skip rows containing" to filter by keyword.
- Turn "Try it first" off and press Start to run the full list.
Typical uses: vetting a shortlist of creators before an influencer campaign, tracking a competitor brand's TikTok follower growth with a scheduled run, or pulling follower/like counts for a list of handles into a spreadsheet for outreach prioritization.
Input
{"profiles": ["tiktok","khaby.lame"]}
One TikTok handle or profile URL per line. Accepted formats: tiktok, @tiktok, https://www.tiktok.com/@tiktok.
Sample output
| query | found | status | handle | userId | nickname | bio | verified | followerCount | followingCount | heartCount | videoCount | avatarUrl | bioLink | isPrivate | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| tiktok | true | OK | <likes (all videos)> | 1970-01-01T00:00:00.000Z |
A handle that's banned, suspended, or never existed gets a row with found: false and a status/
message explaining why, and is never charged.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~tiktok-profile-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"profiles":["tiktok","khaby.lame"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~tiktok-profile-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"profiles":["tiktok","khaby.lame"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~tiktok-profile-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"profiles":["{{profile}}"]}, mapping the row's profile into the profiles array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "TikTok Profile Scraper | Apify" — the agent will find and run this actor.
Tips
- Run "Try it first" on a handful of accounts you already know the follower count for, to sanity-check the numbers before running a full list.
- A
NOT_FOUNDstatus with a "user banned" message means the handle exists in TikTok's records but the account is banned or suspended; a handle that never existed reports the same way, since TikTok's page doesn't distinguish the two. followerCount,followingCount,heartCount, andvideoCountare exact counts, not TikTok's rounded on-page display figure (e.g. "95.6M").bioLinkisnullfor the many accounts that don't set one; it's not a sign of a broken lookup.- Keep "Max concurrency" conservative on a large list. This target has no browser fallback, so a burst of blocked requests costs more in wasted retries than a slower, steadier crawl.
vs. alternatives
| What it costs | What you get | Trade-off | |
|---|---|---|---|
This actor (tiktok-profile-lookup) | $2 per 1,000 found profiles (FREE tier, less on paid tiers), nothing for a miss | One row per profile: display name, bio, verified badge, exact follower/following/like/video counts, avatar, and bio link, read live from the profile's own page | No video-level data in this version — it's profile stats only, not a list of the account's videos. |
| clockworks/tiktok-profile-scraper | $3 per 1,000 results | Profile stats plus per-video data and deeper history controls | Broader per-video coverage; this actor trades that for a simpler, faster single-request design when you only need profile-level numbers. |
| Doing it yourself | Your time plus parsing TikTok's internal page JSON, handling banned/suspended accounts, and re-testing as TikTok's markup changes | The same data | This actor's parsing, the banned-vs-not-found distinction, and the exact-vs-rounded count handling are the maintenance burden it absorbs. |
Prices for third-party tools are their published figures as of September 2026 and are not tracked here; check the vendor before relying on the comparison.
FAQ
Why is a row empty, or why does found say false?
Either the account is banned, suspended, or never existed (status: NOT_FOUND), the request got
blocked (status: BLOCKED, usually HTTP 403/429/503), or the request failed after retries
(status: REQUEST_FAILED). Check the message column for the specific reason. None of these are
billed.
Am I charged for a miss?
No. Actor.charge() only fires when the profile actually resolves and its data is returned. A
banned account or a blocked request produces a row (unless you turn on "Hide rows with no result")
and costs nothing.
Is this a live check or a stored database? Live. Every run fetches the profile's current page; there's no cached snapshot behind it. Run it on a schedule if you want to track a creator's growth over time.
Do I need to configure proxies? No. The actor uses Apify's default proxy configuration out of the box; there's nothing to set up unless you want to supply your own proxy group.
Is this GDPR-relevant? The data returned is an account's own public, self-published profile information (bio, follower count, avatar) that the account holder chose to make public, not private personal data.
Why is bioLink sometimes empty?
Most accounts don't set an external link in their bio. It comes back null in that case; every
other field is unaffected.
Does this work on private accounts?
Yes, for the profile-level fields. TikTok still serves display name, bio, verified badge, and
follower/following/like/video counts for a private account's public profile page; isPrivate: true
flags it. What a private account doesn't expose either way is video content, which this actor
doesn't return for any account.
Can I schedule this to track a creator's growth over time? Yes. Set up an Apify Task with a schedule (daily, weekly, whatever cadence fits) and point it at this actor with a saved input. Each run is a fresh fetch, so a scheduled task combined with your own storage is how you'd build a follower-growth chart.
Can an AI agent call this directly? Yes. It's registered on the Apify MCP server; an agent in Claude, Cursor, or another MCP client can find and run it by name ("TikTok Profile Scraper | Apify"), or you can call the REST endpoint shown above from any script or workflow tool.
Related actors
- YouTube Channel Lookup: the same profile-stats pattern, for YouTube channels instead of TikTok accounts.
- Telegram Channel Lookup: subscriber counts and recent posts for a public Telegram channel.
- Google News Lookup: once you've qualified a creator or brand, check what news coverage they're getting.