Docs · Profile
Profile
A creator's bio, avatar, verification and exact follower, like and video counts.
https://api.lurkapi.com/v1/tiktok/profileWhen to use this
Use it to size up a creator or brand account: followers, total likes and video count as exact numbers, plus bio, link and category. user.secUid is TikTok's stable id; user.roomId is set while they're live.
Unknown, banned and deleted accounts return 404 not_found. Private accounts return their profile with privateAccount: true.
Parameters
All parameters go in the query string.
| Parameter | Description |
|---|---|
handlestringrequired | TikTok username, with or without @ (e.g. nike), or the profile URL.
|
Example request
Replace YOUR_API_KEY with your key, or set LURKAPI_KEY for the code. Get a free key.
curl "https://api.lurkapi.com/v1/tiktok/profile?handle=nike" \
-H "x-api-key: YOUR_API_KEY"const params = new URLSearchParams({
handle: "nike",
});
const res = await fetch(`https://api.lurkapi.com/v1/tiktok/profile?${params}`, {
headers: { "x-api-key": process.env.LURKAPI_KEY },
});
const data = await res.json();
if (!data.success) throw new Error(`${data.code}: ${data.error}`);
console.log(data);import os
import requests
res = requests.get(
"https://api.lurkapi.com/v1/tiktok/profile",
params={
"handle": "nike",
},
headers={"x-api-key": os.environ["LURKAPI_KEY"]},
timeout=60,
)
data = res.json()
if not data["success"]:
raise RuntimeError(f"{data['code']}: {data['error']}")
print(data)Example response
A real response from this endpoint, captured from the live API and trimmed to a couple of items. Strings over 96 characters (mostly signed media URLs) are cut short and end in ….
Show the example response (2 KB)Hide
{
"success": true,
"credits_remaining": 99985,
"credits_charged": 1,
"user": {
"id": "208464585232822272",
"uniqueId": "nike",
"nickname": "Nike",
"signature": "Just Do It.",
"secUid": "MS4wLjABAAAA_3ndMt8d_tECTdpKgCxcx238tOnQZX-20wqN01aMui5zQ7hsqSdff-jC5qYC-Cl_",
"verified": true,
"privateAccount": false,
"createTime": 1490044565,
"avatarLarger": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/e0b0ac7…",
"avatarMedium": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/e0b0ac7…",
"avatarThumb": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/e0b0ac7…",
"bioLink": "http://empli.fi/niketiktok",
"language": "en",
"category": "Sports, Fitness & Outdoors",
"commerceUser": true,
"ttSeller": false,
"isOrganization": true,
"roomId": null
},
"stats": {
"followerCount": 9253124,
"followingCount": 91,
"heartCount": 49280939,
"videoCount": 1089,
"diggCount": 0,
"friendCount": 46
}
}Response fields
Every field of a successful response. [] marks a list: a[].b is the b of each item in a. nullable fields can be null; optional fields can be missing.
Show all 29 fieldsHide
| Field | Type | Description |
|---|---|---|
| success | true | Always true here; errors have success: false. |
| credits_remaining | number | Your balance after this call. On anonymous playground calls: free tries left today. |
| credits_charged | number | Credits this call cost; 0 on free endpoints. On anonymous playground calls: tries used (1). |
| user | object | The account. |
| user.id | string | Numeric user id. |
| user.uniqueId | string | Username (handle), without @. |
| user.nickname | string | Display name. |
| user.signature | string | Bio text. |
| user.secUid | string | TikTok's long, stable user id; other tools ask for it. |
| user.verified | boolean | Has the verified badge. |
| user.privateAccount | boolean | The account is private: videos and follower lists are hidden. |
| user.createTime | number | Account created, Unix seconds. |
| user.avatarLarger | stringnullable | Large avatar URL (expires after a few days); null if TikTok has none. |
| user.avatarMedium | stringnullable | Medium avatar URL (expires after a few days); null if TikTok has none. |
| user.avatarThumb | stringnullable | Small avatar URL (expires after a few days); null if TikTok has none. |
| user.bioLink | stringnullable | The link in the bio; null if none. |
| user.language | stringnullable | Account language, e.g. en; null if unknown. |
| user.category | stringnullable | Business category, e.g. "Sports, Fitness & Outdoors"; null for personal accounts. |
| user.commerceUser | boolean | A business account. |
| user.ttSeller | boolean | Sells on TikTok Shop. |
| user.isOrganization | boolean | Registered as an organization. |
| user.roomId | stringnullable | Live room id TikTok reports; may belong to a finished stream. Use live status to verify; null when none. |
| stats | object | Counts when fetched. |
| stats.followerCount | number | Followers, exact. |
| stats.followingCount | number | Accounts they follow. |
| stats.heartCount | number | Total likes received across all videos. |
| stats.videoCount | number | Public videos. |
| stats.diggCount | number | Videos they liked (0 when hidden). |
| stats.friendCount | number | Mutual follows. |
Caching and freshness
Responses are cached for up to 15 minutes, so a repeat call within that window can return the same data. It still costs 1 credit.
Errors
Errors return { success: false, error, code, docs } with the HTTP status below. Validation errors, 401/402/429 rejections and 5xx failures are free; not_found is charged (how charging works). All error codes.
| Status | Code | Meaning |
|---|---|---|
| 401 | missing_api_key | No API key. Send it in the x-api-key header. |
| 401 | invalid_api_key | The key is unknown or was revoked. |
| 402 | insufficient_credits | Not enough credits for this call. Buy a pack or wait for tomorrow's top-up. |
| 404 | not_found | The endpoint, or the thing you asked for (ad, post, subreddit), doesn't exist. Charged when the platform was checked. |
| 405 | method_not_allowed | Endpoints take GET with query params. |
| 429 | rate_limited | Too many calls at once. Wait for the retry-after seconds, then retry. |
| 500 | internal_error | Something broke on our side. Retry; 5xx errors are free. |
| 502 | upstream_error | The platform didn't give a usable answer. Retry; 5xx errors are free. |
| 503 | upstream_busy | All our connections to the platform are busy. Retry in a few seconds; 5xx errors are free. |
| 504 | upstream_timeout | The platform took over 30 seconds to answer. Retry; timeouts are free. |
Use it in Claude
Once LurkAPI is connected to Claude, this endpoint is the tiktok_profile tool. Ask in plain English, for example:
Use LurkAPI's tiktok_profile with handle "nike" and summarize what you find.Claude calls tiktok_profile with arguments like these, and each call costs 1 credit:
{
"handle": "nike"
}Tool results skip nulls and empty lists to save tokens.