TikTokAnswer

TikTok user info API: any profile's followers and likes

TikTok's user info endpoint returns only the user who signed in to your app. Our API returns any public profile's exact followers, likes and videos.

5 min read

Short answer

  • TikTok's Get User Info endpoint takes only a fields list and the token of a user who authorized your app, so it can't look up anyone else.
  • A profile response carries two copies of the counts: stats is rounded and can overflow, statsV2 is exact. Khaby Lame's stats.heartCount read -1,602,510,426.
  • Our TikTok API returns any public profile by handle with exact followers, following, likes and video count, at 2 credits a call.
On this page

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.

bash
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:

json
{
  "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.

python
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.

Get this data from your own code

The TikTok API returns it as JSON with one x-api-key header. 100 free credits monthly.