TikTok Profile Scraper: Followers, Likes & Bio avatar

TikTok Profile Scraper: Followers, Likes & Bio

Pricing

from $0.25 / 1,000 profiles

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

TikTok Profile Scraper: Followers, Likes & Bio

Public TikTok profile stats with exact counts: followers, following, likes, video count, bio, bio link, verified flag, avatar and account creation time. No login, no browser. $0.25 per 1,000 profiles.

Pricing

from $0.25 / 1,000 profiles

Rating

0.0

(0)

Developer

subimpact

subimpact

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

3 days ago

Last modified

Share

Get clean stats rows for public TikTok profiles: followers, following, likes, video count, bio, bio link, verified flag, avatar and account creation time. The counts are exact (2,145,257 followers, not the rounded 2.1m that TikTok prints on the page). One row per profile, no login, no API key, no browser, no cookies.

Pay only for what you get: $0.25 per 1,000 profiles. A default run of two profiles costs $0.0005, plus Apify platform usage.

What you get

  • Exact numbers: followers, following, likes, videos, diggCount, friendCount as integers, read from TikTok's own exact counters rather than the rounded display values.
  • Profile facts: username, userId, secUid, nickname, bio, bioLink, verified, privateAccount, isOrganization, commerceUser, ttSeller, language, createdAt, avatarUrl, avatarThumbUrl, profileUrl.
  • Any input form: nasa, @nasa, https://www.tiktok.com/@nasa, or a video URL such as https://www.tiktok.com/@nasa/video/7123456789012345678. The handle is extracted, trimmed and deduplicated.
  • Free error rows: handles that do not exist or cannot be read still get a row saying so, with status not_found or error, and are never charged. Bad input entries are reported the same way, so one typo does not throw away the rest of your list.
  • A status message with the counts of delivered, not-found and failed profiles and how many events were charged.

Quick start

Input that works exactly as written:

{
"usernames": ["nasa", "natgeo"]
}

With links, handles and a video URL mixed in:

{
"usernames": [
"nasa",
"@natgeo",
"https://www.tiktok.com/@nasa",
"https://www.tiktok.com/@natgeo/video/7123456789012345678"
],
"maxItems": 50
}

Leave usernames empty (or send {} from the API) and the actor reads nasa, so a first run always returns a row.

Output example

A real row for @nasa (avatar URLs shortened here for readability):

{
"username": "nasa",
"userId": "7664638705177150477",
"secUid": "MS4wLjABAAAAU9BRVzC8oCaegVnia8IbqWhPb_-dbU7s00Y3wS1_Nx8g5RUaYvyXrpejgjdxTwd6",
"nickname": "NASA",
"bio": "Making the seemingly impossible, possible.✨",
"bioLink": "science.nasa.gov/feature/artemis-ii-preliminary-lunar-science-report",
"verified": true,
"privateAccount": false,
"isOrganization": true,
"commerceUser": false,
"ttSeller": false,
"language": "en",
"createdAt": "2026-07-20T15:55:49.000Z",
"followers": 2145257,
"following": 23,
"likes": 11429206,
"videos": 61,
"diggCount": 0,
"friendCount": 17,
"avatarUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/e5143212...jpeg",
"avatarThumbUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/e5143212...jpeg",
"profileUrl": "https://www.tiktok.com/@nasa",
"inputValue": "nasa",
"status": "success",
"error": null,
"scrapedAt": "2026-10-29T12:00:00.000Z"
}

The same run for @natgeo returned followers: 9687841, following: 62, likes: 55755965, videos: 1566, friendCount: 59, createdAt: "2020-01-10T16:08:37.000Z", bioLink: "spr.ly/natgeotiktok", and both a commerce account and a TikTok Shop seller flag.

A handle that does not exist comes back as a free row:

{
"username": "nosuchuser",
"followers": null,
"status": "not_found",
"error": "TikTok has no public profile @nosuchuser (statusCode 10221).",
"inputValue": "@nosuchuser"
}

Pricing

Pay per event, charged only after the row is in the dataset:

EventPriceCharged when
profile$0.00025 per profile ($0.25 per 1,000)a profile row was pushed
apify-actor-start$0.00005 per runthe run starts (platform event)

Buyer pays Apify platform usage separately.

Typical costs: 2 profiles = $0.0005. The maximum for one default run (maxItems 100) is $0.025. Not-found profiles, unreadable pages, failed requests and unreadable input entries cost nothing.

How this compares

Free-plan list prices on the Apify Store, checked 29 October 2026. Competitor prices are list prices for their own events; their Apify platform usage is charged on top by their listings (see each listing, prices change).

ActorPriceWhat the price buysUsers on the listing
tiktok-profile-scraper (this actor)$0.25 per 1,000 profilesprofile stats only, exact counts, no videosnew
clockworks/tiktok-profile-scraper$3.00 per 1,000 resultsvideo results, profile data comes with them9,527 in 30 days
apidojo/tiktok-profile-scraper$0.30 per 1,000 postsposts of a profile882

What is different here beyond the price:

  • Exact counts, not rounded ones. TikTok shows "2.1m followers" on the page but keeps 2145257 in its data block; this actor returns the exact number, so you can track small deltas between runs.
  • Profile only, so it is cheap. You pay for one row per profile, not for a page of videos you may not need.
  • Free rows for what did not work. A missing handle or a blocked page still appears in the dataset with a status and an error, and costs nothing.

Limits and honest notes

  • No video lists and no comments. The public profile page does not carry them, so this actor does not attempt them. It is a stats actor.
  • Public profiles only. Private accounts return their public flags but no hidden data; profiles that do not exist return status: "not_found".
  • Counts are a snapshot. followers, likes and the other counters are what TikTok reported at scrape time, and they change constantly. Run it again for a newer snapshot.
  • createdAt can be null. TikTok publishes the account creation time for most accounts, but not for all, and older or migrated accounts can report 0.
  • diggCount and friendCount are whatever TikTok publishes. Both come straight from the profile stats block and are null when it does not carry them.
  • Datacenter proxy by default. Apify proxy answered with full data when this actor was built, and direct requests from the Apify platform worked too. Do not switch to residential proxies: TikTok serves them a small page without any profile data, and runs will only produce error rows. A proxy failure fails the request; it never falls back to a direct one.
  • Three attempts per profile. Network errors, 5xx, 429 and a page without profile data are retried, each attempt with a fresh proxy session. A 404 or a "user does not exist" page is never retried.
  • maxItems caps the run. Entries beyond the cap are skipped and the status message says so.
  • CDN links expire. avatarUrl and avatarThumbUrl are the TikTok CDN URLs from the page. Nothing is downloaded.

Responsible use

This actor reads the same public profile page any browser sees. Only collect profiles you have a reason to collect. Profile data can include personal data: how you store, process and share it is your responsibility under the GDPR, PDPA and any other law that applies to you. Do not use it to build profiles of private individuals or to evade TikTok's rate limits.

Development

npm ci
npm test # node:test, parses the saved profile fixtures
npm run build

Fixtures in test/fixtures/ were saved from live www.tiktok.com profile pages on 29 October 2026 (signature and refresh-token query strings scrubbed).