TikTok Creator & Profile Scraper
Eimantas V · @amethyst
Scrape TikTok creator profiles in bulk: exact followers, likes and video counts, verified and business flags, Shop seller status, bio links and bio emails.

About
TikTok Creator & Profile Scraper
Give it a list of TikTok handles. Get back exact follower counts, engagement, business and TikTok Shop status, bio links and contact e-mails — one HTTP request per creator, no browser.
@gymshark 6,605,687 followers · mega · 315,606 avg likes/video
verified · business account · TikTok Shop seller
Sports, Fitness & Outdoors · gym.sh/shoptiktok
What you get per creator
| Group | Fields |
|---|---|
| Audience | Exact followers, following, likes, videos, friends, plus avgLikesPerVideo and a followerTier (nano → mega) |
| Status | verified, isPrivate, isOrganization |
| Commerce | isBusinessAccount, isTikTokShopSeller, businessCategory |
| Contact | bioLink, bioLinkDomain, bioEmails, and Instagram / YouTube / X / Snapchat handles named in the bio |
| Identity | handle, nickname, bio, avatarUrl, language, userId, secUid |
| Age | accountCreatedAt, accountAgeDays |
Pass video URLs in the same list and they resolve through TikTok's public oEmbed endpoint to title, author and thumbnail.
Why the counts are exact
TikTok's page state carries follower counts twice. The legacy stats object stores them as 32-bit integers and rounds them; statsV2 carries the same numbers as strings.
The difference is not cosmetic. Khaby Lame's 2.66 billion likes come back from the legacy field as −1,638,295,034 — an overflow in TikTok's own JSON that turns any derived average negative. This Actor reads statsV2:
| Legacy field | This Actor | |
|---|---|---|
@khaby.lame followers | 162,600,000 | 162,619,759 |
@khaby.lame likes | −1,638,295,034 | 2,656,672,262 |
Who this is for
- Influencer marketing — screen a creator list by tier, engagement and category, then pull the booking e-mail straight out of the bio.
withContactEmailOnly: trueturns a broad list into an outreach list in one pass. - Brand and competitor monitoring — track a set of creators or brand accounts weekly and diff follower counts and video output.
- E-commerce prospecting —
isTikTokShopSellerandbusinessCategoryidentify accounts actually selling on the platform. - Lead enrichment —
bioLinkDomaingives the creator's company domain, ready to join against firmographic data.
Input
{
"profiles": ["@gymshark", "duolingo", "https://www.tiktok.com/@nasa"],
"minFollowers": 10000,
"withContactEmailOnly": true
}
Handles with or without @, profile URLs, video URLs and vm.tiktok.com short links all work, and duplicates collapse.
| Option | Default | Notes |
|---|---|---|
minFollowers | 0 | Filtered creators are skipped, not written to the dataset |
businessAccountsOnly | false | Only accounts with a commerce category |
withContactEmailOnly | false | Only creators with a reachable e-mail in the bio |
maxConcurrency | 10 | TikTok is rate-sensitive; raise gradually and watch for 403s |
proxyConfiguration | residential | See below |
About proxies — read this first
TikTok blocks datacenter IP ranges aggressively. The Actor defaults to the platform's residential proxy because that is what reliably works. Residential bandwidth is the dominant cost of running this.
It is worth trying a small run without a proxy first: some ranges are served normally, and if yours is one of them the Actor runs far cheaper. If you see HTTP_403 or NO_STATE_BLOB in errorCode, that range is blocked — switch residential back on. The run log says so explicitly and counts how many targets were affected.
Output
{
"handle": "gymshark",
"nickname": "Gymshark",
"followers": 6605687, "likes": 138866619, "videos": 440,
"avgLikesPerVideo": 315606, "followerTier": "mega",
"verified": true, "isBusinessAccount": true, "isTikTokShopSeller": true,
"businessCategory": "Sports, Fitness & Outdoors",
"bioLink": "https://gym.sh/shoptiktok", "bioLinkDomain": "gym.sh",
"bioEmails": [], "bioHandles": { "instagram": null, "youtube": null },
"accountCreatedAt": "2018-03-23T09:23:00.000Z", "accountAgeDays": 3064,
"recordType": "creator"
}
Three ready-made dataset views ship with it — Creators, Outreach list and Commerce signals. Set flattenOutput: true for flat dot-notation columns with arrays joined by |, for spreadsheets.
Failed targets still produce a row with success: false and an errorCode, so your output stays aligned with your input.
Honest limits
- Blocking is the main risk, not parsing. With a residential proxy this is reliable; without one it depends entirely on your IP range.
- No video lists per creator. TikTok's profile page state contains the creator, not their posts — those load through a signed API this Actor deliberately does not touch. Pass video URLs explicitly if you need per-video data.
- No follower demographics or fake-follower scoring. Those require panel data no public endpoint exposes.
avgLikesPerVideois a reach proxy, not an audited engagement rate. bioEmailsfinds what creators publish. Many put nothing, or an address only shown in-app. Empty is a real answer, not a miss.- Private accounts return their profile fields with
isPrivate: true; counts may be withheld by TikTok.
Pricing
One flat monthly rental, shown on this page, with a free trial. There is no per-profile fee: scrape as many profiles as you need.
Runs use your credits for compute and proxy traffic, as every Actor does. TikTok profiles need the residential proxy (see About proxies above), about 100 KB per profile. Measured on Bytewells: 3 profiles in 15 seconds at 1 GB with 0.3 MB of residential traffic for $0.0025 of credits: under $1 per 1,000 profiles.
Tips
- Screen before you enrich.
minFollowers: 10000on a 50,000-handle list drops the unusable half. - Schedule weekly and diff on
handle. Follower deltas and new video counts are the growth signal; a creator'savgLikesPerVideofalling while followers rise is the classic fading-account pattern. - Chain
bioLinkDomaininto a company-data Actor to attach firmographics to each creator's business.
FAQ
- What does it return for each TikTok creator?
- Exact follower, following, like and video counts, verified and business-account flags, TikTok Shop seller status, category, bio, the bio link with its domain, contact e-mails found in the bio, and average likes per video. Private accounts return their profile fields with isPrivate set to true.
- Does it need a proxy?
- It uses the residential proxy by default, because TikTok blocks datacenter address ranges. You can try a small run without a proxy: if errorCode shows HTTP_403 or NO_STATE_BLOB, that range is blocked and residential should go back on. The run log says how many profiles were affected.
- How much does it cost?
- One flat monthly rental, shown on this page, with a free trial and no per-profile fee. Runs use your Bytewells credits for compute and residential traffic, about 100 KB per profile. Measured on Bytewells: 3 profiles in 15 seconds for $0.0025 of credits, under $1 per 1,000 profiles.
- Does it list each creator's videos?
- No. TikTok's profile page carries the creator, not their posts, so there is no video list per creator. Pass video URLs in the input when you need per-video data.
- Why is bioEmails empty for some creators?
- Many creators publish no e-mail address, or one that TikTok shows only in its app. An empty value is a real answer, not a miss.
- Can I get follower demographics or fake-follower scores?
- No. Those need panel data that no public TikTok page exposes. Average likes per video is a reach indicator, not an audited engagement rate.
- Can I use it through the API or from AI agents?
- Yes. Start runs through the Bytewells API (bytewells.com/docs/api), schedule them and read the dataset as JSON; webhooks work too. The API is Apify-compatible, so apify-client works with the Bytewells base URL. AI agents can run it as a tool through the Bytewells MCP server (bytewells.com/docs/mcp).
Input
Preview of the input form. Rent the Actor to fill it in and start runs from the console.
profilesTikTok handles ('@gymshark' or 'gymshark'), profile URLs, or video URLs — one per line. Video URLs are resolved through TikTok's public oEmbed endpoint and billed at the cheaper video rate.
startUrlsAlternative to Creators, for feeding the output of another Actor straight into this one.
sourceDatasetIdRead handles from an existing dataset instead of a pasted list.
sourceDatasetFieldWhich field on the source dataset holds the handle or profile URL.
Filters run before billing — you are only charged for creators you keep.
minFollowersDrop creators below this follower count. Filtered creators are not written to the dataset and are not charged, so this is the cheapest way to screen a large list. Leave at 0 to keep everyone.
businessAccountsOnlyKeep only accounts registered as business/commerce accounts. These are the ones with a category and, usually, a contactable brand behind them.
withContactEmailOnlyKeep only creators whose bio contains a reachable e-mail address. Turns a broad creator list into an outreach list in one pass.
maxConcurrencyProfiles fetched in parallel. TikTok is more rate-sensitive than an open API, so the default is deliberately modest; raise it gradually and watch for HTTP 403.
requestTimeoutSecsPer-request timeout.
maxRetriesRetries for connection resets and 5xx responses, on the same IP.
blockedRetriesHow many times to retry a profile on a fresh proxy IP after TikTok serves a block page. A residential pool contains both clean and flagged addresses, so rotating is what actually fixes a refusal — and a block page costs about 20 KB against a real profile's 357 KB, making retries cheap. Raise this if you still see NO_STATE_BLOB errors.
flattenOutputEmit flat dot-notation columns with arrays joined by ' | '. Use for spreadsheets; leave off for warehouses.
proxyConfigurationStrongly recommended: TikTok blocks datacenter IP ranges aggressively. If you see HTTP 403 or NO_STATE_BLOB errors, enable the Apify proxy with the RESIDENTIAL group. Running without a proxy is cheaper and works from some ranges, so it is worth trying first on a small list.
API
Bytewells speaks the Apify API. Existing integrations keep working: point apify-client at https://bytewells.com/api and use your Bytewells API token (Console → Settings → API access). The Actor ID is amethyst/tiktok-creator-scraper (or amethyst~tiktok-creator-scraper in URLs).
JavaScript · apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({
token: process.env.BYTEWELLS_TOKEN,
baseUrl: 'https://bytewells.com/api',
});
const input = {
"profiles": [
"@gymshark",
"@duolingo",
"@nasa"
],
"sourceDatasetField": "handle",
"minFollowers": 0,
"businessAccountsOnly": false,
"withContactEmailOnly": false,
"maxConcurrency": 10,
"requestTimeoutSecs": 30,
"maxRetries": 2,
"blockedRetries": 3,
"flattenOutput": false,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
}
};
const run = await client.actor('amethyst/tiktok-creator-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Python · apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["BYTEWELLS_TOKEN"], api_url="https://bytewells.com/api")
run_input = {
"profiles": [
"@gymshark",
"@duolingo",
"@nasa"
],
"sourceDatasetField": "handle",
"minFollowers": 0,
"businessAccountsOnly": False,
"withContactEmailOnly": False,
"maxConcurrency": 10,
"requestTimeoutSecs": 30,
"maxRetries": 2,
"blockedRetries": 3,
"flattenOutput": False,
"proxyConfiguration": {
"useApifyProxy": True,
"apifyProxyGroups": [
"RESIDENTIAL"
]
}
}
run = client.actor("amethyst/tiktok-creator-scraper").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)HTTP · curl
curl -X POST "https://bytewells.com/api/v2/acts/amethyst~tiktok-creator-scraper/runs" \
-H "Authorization: Bearer $BYTEWELLS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"profiles":["@gymshark","@duolingo","@nasa"],"sourceDatasetField":"handle","minFollowers":0,"businessAccountsOnly":false,"withContactEmailOnly":false,"maxConcurrency":10,"requestTimeoutSecs":30,"maxRetries":2,"blockedRetries":3,"flattenOutput":false,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}'Runs are billed as compute from your credit balance. Paid Actors need an active rental or trial; otherwise the API answers 402 rental-required.
Related
More Actors from the same publisher.

Facebook Pages Scraper - Emails, Phones & Followers
Eimantas V · @amethyst
Scrape Facebook Pages by link, username or ID: email, phone, website, address, exact followers, category, rating and social links. No login or cookies.
Lead generationSocial mediaMarketing$19/mo7-day free trial
Facebook Posts Scraper - Pages, Profiles & Reactions
Eimantas V · @amethyst
Scrape posts from public Facebook Pages and profiles: text, date, reactions by type, comments, shares, video views and media. Date filters and new-post alerts.
Social mediaMarketingLead generation$19/mo7-day free trial
Instagram Profile Scraper - Followers, Posts & Emails
Eimantas V · @amethyst
Scrape Instagram profiles by username or URL: exact followers, following and posts, bio, links, emails and phones from bios, engagement rate, latest posts.
Social mediaLead generationMarketing$19/mo7-day free trial
Instagram Search Scraper - Users, Hashtags, Places
Eimantas V · @amethyst
Search Instagram by keyword without logging in: profiles with exact followers, hashtags with post counts, places with addresses, and popular reels.
Social mediaMarketingLead generation$19/mo7-day free trial
Facebook Ads Library Scraper - Meta Ads, All Countries
Eimantas V · @amethyst
Scrape the Facebook Ads Library in any country: ad copy, images, videos, landing pages, CTAs, run dates and advertiser Pages. No login, no token needed.
MarketingSocial mediaBusiness$29/mo7-day free trial
Google Search Results Scraper - SERP API
Eimantas V · @amethyst
Scrape Google search results by keyword: organic results with ranks, places, top stories, knowledge panel, related searches, News and Videos. Any country.
SEO toolsMarketingLead generation$19/mo7-day free trial