Before paying a creator, most teams look at the follower count on the profile and maybe scroll a few posts. Both TikTok and Threads make that misleading in different ways. This post covers the numbers worth computing, how to compute them, and where they lie. Disclosure: SpellzCode, the brand behind this account, sells the two scrapers used in the code (links at the end); the formulas work with any data source.
Trap 1: rounded counts
TikTok shows "27.4M followers" on the profile. Fine for a glance, useless for tracking: a creator can gain 49,999 followers and the number does not move. If you track growth week over week, you need the exact count. TikTok's own page data carries it (27,483,982 in that example), so any tool you use should return that, not the rounded label.
Trap 2: lifetime likes
TikTok's "Likes" is a lifetime total across all videos. A creator with one viral video three years ago looks strong forever. Divide by the number of videos to get average likes per video, and compare it with followers:
const avgLikesPerVideo = likes / videos; const likesPerFollower = likes / followers; Some real numbers from public profiles (November 2026):
| Account | Followers | Videos | Avg likes / video |
|---|---|---|---|
| @nasa | 2,183,007 | 66 | 177,239 |
| @nba | 27,483,982 | 25,105 | 47,141 |
NASA has less than a tenth of the NBA's followers but gets nearly four times the likes per video, because it posts rarely and each post lands. For a sponsored video, the per-video number is what you are buying.
Trap 3: engagement on Threads
Threads shows followers and the latest posts, each with likes, replies, reposts and quotes. The usual engagement rate is:
// posts: the account's recent posts const avg = (k) => posts.reduce((s, p) => s + (p[k] ?? 0), 0) / posts.length; const engagementRatePercent = ((avg('likes') + avg('replies') + avg('reposts')) / followers) * 100; Real examples, computed from each account's latest public posts:
| Account | Followers | Avg likes | Engagement rate |
|---|---|---|---|
| @mosseri | 1,058,672 | 942 | 0.136% |
| @zuck | 5,777,936 | 2,157 | 0.047% |
| @nasa | 12,797,207 | 1,822 | 0.016% |
| @nytimes | 4,782,467 | 22 | 0.001% |
The account with the fewest followers has by far the highest rate. Big brand accounts that post links all day sit near zero. Two cautions: a handful of recent posts is a small sample, and one viral post skews the average. Look at the median too if you have enough posts.
Trap 4: inactive accounts
A big follower count on an account that last posted months ago is worth little. Always check the date of the newest post.
Doing it for a list of handles
The two Apify actors below return these fields directly, one row per account. TikTok gives exact counts, avgLikesPerVideo, likesPerFollower, plus business-account and TikTok Shop seller flags. Threads gives recent posts with likes, replies, reposts and quotes, plus engagementRatePercent and lastPostedAt.
// npm i apify-client import { ApifyClient } from 'apify-client'; const client = new ApifyClient({ token: process.env.APIFY_TOKEN }); const handles = ['nasa', 'nba', 'duolingo']; const tt = await client.actor('spellzcode/tiktok-profile-data').call({ usernames: handles }); const th = await client.actor('spellzcode/threads-profile-data').call({ usernames: handles }); const tiktok = (await client.dataset(tt.defaultDatasetId).listItems()).items; const threads = (await client.dataset(th.defaultDatasetId).listItems()).items; for (const h of handles) { const a = tiktok.find((x) => x.username === h); const b = threads.find((x) => x.username === h); console.log(h, { tiktokFollowers: a?.followers, tiktokAvgLikes: a?.avgLikesPerVideo, threadsFollowers: b?.followers, threadsEngagement: b?.engagementRatePercent, threadsLastPost: b?.lastPostedAt, }); } Both cost $2 per 1,000 profiles; missing accounts are free, and Apify's free $5 monthly credit covers about 2,500 profiles. They read public pages as a logged-out visitor, without logins or proxies, so they return account-level data and the recent posts the public profile shows, not full video or post histories.