TikTok's user info API only describes the user who signed in. Get User Info takes one parameter, the list of fields you want, and a token from that user's authorization, with no input for a username. Our TikTok API returns any public profile by handle: exact followers, likes, videos, verification and bio link.
What TikTok's user info endpoint is for
Get User Info is a GET to /v2/user/info/ whose Authorization header is "the token that bears the authorization of the TikTok user." The only query parameter is fields. Follower, following, like and video counts need the user.info.stats scope, which the user grants when they sign in to your app. A list of creators you want to vet has never signed in to your app, so the endpoint can't count them.
Profile data with ToolzerHub
We make ToolzerHub. Our TikTok API returns public TikTok profiles, videos, sounds and LIVE rooms as JSON with one API key. /v2/tiktok/web/user/profile takes unique_id, the handle without @, and costs 2 credits a call.
export TOOLZERHUB_API_KEY=your_key
curl -H "x-api-key: $TOOLZERHUB_API_KEY" \
"https://api.toolzerhub.com/v2/tiktok/web/user/profile?unique_id=khaby.lame"
The counts in data.userInfo, trimmed:
{
"user": {"uniqueId": "khaby.lame", "verified": true, "privateAccount": false, "createTime": 1470866554},
"stats": {"followerCount": 163000000, "heart": 2700000000, "heartCount": -1602510426, "videoCount": 1359},
"statsV2": {"followerCount": "162955933", "heart": "2692456870", "heartCount": "2692456870", "videoCount": "1359"}
}
Read statsV2. Its counts are exact and come as strings. stats rounds followers and likes to a few significant figures, and its heartCount is a 32-bit integer: 2,692,456,870 likes is more than it holds, so it wraps to a negative number. user also carries the bio as signature, the language, bioLink when one is set, and ttSeller for TikTok Shop sellers. A handle that doesn't exist returns no userInfo, and the script counts it as not found.
Save profiles to CSV
The script takes handles and writes one row per profile with exact followers, following, likes, videos, likes per video, private and seller flags, language, join date and bio link. It prints the median followers and how many accounts have under 10,000 or 1 million or more. Install requests (pip install requests) and save it as tiktok_profiles.py.
import csv
import os
import statistics
import sys
import time
from datetime import datetime, timezone
import requests
API = "https://api.toolzerhub.com/v2/tiktok/web/user/profile"
HEADERS = {"x-api-key": os.environ.get("TOOLZERHUB_API_KEY", "")}
FIELDS = ["handle", "nickname", "verified", "followers", "following", "likes", "videos", "likes_per_video",
"private", "seller", "language", "joined", "bio_link", "url"]
def get(handle, tries=3):
# Retry rate limits, server errors and dropped connections.
for attempt in range(tries):
last = attempt == tries - 1
try:
r = requests.get(API, headers=HEADERS, params={"unique_id": handle}, timeout=120)
except requests.RequestException:
if last:
raise
time.sleep(5 * (attempt + 1))
continue
if r.status_code in (429, 500, 502, 503, 504) and not last:
time.sleep(5 * (attempt + 1))
continue
r.raise_for_status()
return r.json()["data"].get("userInfo")
def main(handles, out="tiktok_profiles.csv"):
with open(out, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=FIELDS)
writer.writeheader()
followers, missing = [], 0
for handle in filter(None, (h.strip().lstrip("@") for h in handles.split(","))):
info = get(handle)
if not info:
missing += 1
continue
u = info["user"]
# statsV2 holds exact counts as strings; stats rounds them and can overflow on big accounts.
s = {k: int(v) for k, v in info["statsV2"].items()}
followers.append(s["followerCount"])
writer.writerow({
"handle": u["uniqueId"], "nickname": u.get("nickname"), "verified": u.get("verified"),
"followers": s["followerCount"], "following": s["followingCount"], "likes": s["heartCount"],
"videos": s["videoCount"], "likes_per_video": round(s["heartCount"] / max(s["videoCount"], 1)),
"private": u.get("privateAccount"), "seller": u.get("ttSeller"), "language": u.get("language"),
"joined": datetime.fromtimestamp(u["createTime"], timezone.utc).date() if u.get("createTime") else None,
"bio_link": (u.get("bioLink") or {}).get("link"), "url": f"https://www.tiktok.com/@{u['uniqueId']}",
})
print(f"{len(followers)} profiles, {missing} not found; median {statistics.median(followers or [0]):,.0f} "
f"followers, {sum(n < 10_000 for n in followers)} under 10,000, "
f"{sum(n >= 1_000_000 for n in followers)} at 1 million or more")
if __name__ == "__main__":
if len(sys.argv) < 2:
sys.exit('usage: python tiktok_profiles.py "khaby.lame,tatemcrae" [out.csv]')
if not HEADERS["x-api-key"]:
sys.exit("set TOOLZERHUB_API_KEY first")
main(*sys.argv[1:])
Who used a hit sound
The script read the first 30 creators on the sound page for Tate McRae's "Housewife", from our TikTok sound API post, in 30 calls and 31 seconds. We then matched each creator to the plays of their Housewife video.
| Followers | Creators | Median followers | Median plays on their Housewife video | More plays than followers | Verified |
|---|---|---|---|---|---|
| under 10,000 | 6 | 1,476.5 | 1,600,000 | 6 | 0 |
| 10,000 to 999,999 | 17 | 139,805 | 2,300,000 | 17 | 0 |
| 1 million or more | 7 | 2,429,047 | 1,300,000 | 3 | 3 |
These 30 made the sound page because their videos did well, so the small accounts here are the ones that broke out. Among them, follower count said little about plays. An account with 74 followers had 853,400 plays, and one with 4,402 had 8,600,000. Every creator under a million followers got more plays than they have followers, while 4 of the 7 largest got fewer; the biggest account, at 15,790,623 followers, had 1,500,000. Only 3 of the 30 were verified, Tate McRae among them.
What it costs
A profile is 2 credits, so the 30 above cost 60. The 100 free credits a month cover 50 profiles; $19 buys 10,000 credits that never expire, and plans for higher volume cover larger creator lists. Set your key and the first list is a CSV in under a minute.
For a creator's videos, see TikTok API get user videos. To check whether a creator is live, see the TikTok live API.
We are not affiliated with TikTok or ByteDance.