TikTok Profile API — Account Data & Follower Counts

Get a TikTok account profile

One public TikTok account’s profile: bio, avatar, verification, creation date, bio link and the exact follower, following, like and video counts. Name the account by username, userId or secUid.

POST /user-profile Accounts
https://api.fetchlayer.dev/tiktok/user-profile
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

username string optional

A username with or without the leading @, or a profile URL. Send exactly one of username, userId or secUid; none, or more than one, is a 400.

userId string optional

The account’s numeric id, as a string (the `id` a profile returns). An alternative to username that survives a rename.

secUid string optional

The account’s secUid, as a profile returns it. An alternative to username.

format string optional

json or markdown, lowercase; any other value is a 400. Over MCP, markdown returns the result rendered as text; the REST API accepts it and returns JSON. (default: json)

timeoutMs integer optional

Time limit for the whole request, in milliseconds (1000–120000); a value outside that range is a 400. When it runs out, a paged request returns what it has with nextCursor, billed for the pages it returned; a request with nothing to return yet fails with a 503 you can retry, marked with the response header X-Timeout-Source: caller. Left out, the request runs as long as it needs.

Response Fields

user-profile

Get a TikTok account profile

transport string

The data source: always the platform id, "tiktok".

notes string[]

Caveats you can act on — a private account, comments turned off, a list that ran out early, paging that has gone as deep as it goes. Empty when there are none. An empty result always comes with a note explaining it, never as an unexplained empty array.

pagesFetched number

Pages of results fetched, which is what the request costs: one credit per page. resolve-url reports 0 and is not billed.

profile.id string

TikTok’s numeric account id.

profile.uniqueId string

The @handle, without the @.

profile.nickname string

The display name.

profile.url string

Canonical profile URL.

profile.signature string

The bio text.

profile.avatarUrl string

Avatar image. Pass it to GET /media to re-fetch it after TikTok’s own signed link expires.

profile.verified boolean

Whether TikTok shows the verification badge.

profile.privateAccount boolean

Whether the account is private. Its profile still comes back; its posts are not, and user-videos answers with the note "This account is private, so its posts are not public."

profile.createdAt string

When the account was created, or null.

profile.region string | null

The account’s registered country or region, as a two-letter code such as "US" — the same fact accountRegion reports on each video. The first request for an account answers at once with null and the note “`region` is being worked out for this account; ask again shortly.”; later requests carry it, and it is kept for 90 days. It stays null for a private account or one with no public videos, with the note “This account is private or has no public videos, so `region` is null.” To have it at once, read accountRegion off a video with include ["exactStats"]. Not postingRegion, which is where the account’s recent videos were posted (the two can differ), and not a video’s createdRegion, where that one post was made.

profile.isOrganization boolean

Whether TikTok marks the account as an organization.

profile.bioLink string

The link in the bio, or null.

profile.secUid string

TikTok’s opaque secondary account id.

profile.stats.followerCount number

Followers — the exact figure, not the rounded one. Counts are as TikTok shows them to US viewers. TikTok keeps two US copies of an account’s counts, which can differ by about one post and a few hundred followers; successive requests can land on either, and neither is newer.

profile.stats.followingCount number

Accounts this one follows.

profile.stats.heartCount number

Total likes across the account’s videos.

profile.stats.videoCount number

Public videos posted.

profile.stats.friendCount number

Mutual follows.

profile.roundedStats string[]

Which profile counts are rounded. Normally empty: profile counts are the exact figures, not the rounded ones shown on the page (1719888, not 1.7M).

profile.postingRegion object

Where the account’s recent videos were posted, or null. Not a registered country. It is kept for 30 days per account and worked out again on the first request after that; on that request, and on the very first, it is null with the note "`postingRegion` is being worked out from where this account's recent videos were posted; ask again shortly.", and filled about 10–25 seconds later. It is also null, with a note saying why, for a private account, an account with no public videos, or one whose recent videos do not say where they were posted.

profile.postingRegion.code string

The most common region, such as "US", across the videos checked; a tie goes to the region of the newest video.

profile.postingRegion.basis string

Always "recent_videos": the account’s 10 most recent videos, 20 when those disagree.

profile.postingRegion.videosSampled number

How many videos were checked.

profile.postingRegion.videosWithRegion number

How many of those say where they were posted.

profile.postingRegion.share number

The count for code divided by videosWithRegion, 0 to 1. A low share means the account posts from several regions.

profile.postingRegion.computedAt string

When it was worked out (ISO 8601).

Request

curl -X POST "https://api.fetchlayer.dev/tiktok/user-profile" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"username":"@nasa"}'

Response

{
  "transport": "tiktok",
  "notes": [],
  "pagesFetched": 1,
  "profile": {
    "id": "7664638705177150477",
    "uniqueId": "nasa",
    "nickname": "NASA",
    "url": "https://www.tiktok.com/@nasa",
    "signature": "Making the seemingly impossible, possible.✨",
    "avatarUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/...",
    "verified": true,
    "privateAccount": false,
    "createdAt": "2026-07-20T15:55:49.000Z",
    "region": "US",
    "isOrganization": true,
    "bioLink": null,
    "secUid": "MS4wLjABAAAAU9BRVzC8oCaegVnia8IbqWhPb_-dbU7s00Y3wS1_Nx8g5RUaYvyXrpejgjdxTwd6",
    "stats": {
      "followerCount": 1719888,
      "followingCount": 23,
      "heartCount": 8962614,
      "videoCount": 45,
      "friendCount": 17
    },
    "roundedStats": [],
    "postingRegion": {
      "code": "US",
      "basis": "recent_videos",
      "videosSampled": 20,
      "videosWithRegion": 20,
      "share": 0.95,
      "computedAt": "2026-10-14T10:16:54.310Z"
    }
  }
}
Product overviewTikTok API: what it returns, pricing and use cases