Profile
https://scraper.riken.me/v1/tiktok/profileTry it
Paste your key under Authorization and send a live request to https://scraper.riken.me. The key stays in this browser tab only (session storage, cleared when the tab closes) and is sent nowhere else. A live request spends credits like any other.
One TikTok account: its user record and its counts. stats holds TikTok's
rounded counts and statsV2 the exact counts as strings. itemList is
always empty, as on ScrapeCreators.
An account that does not exist is a 200, charged answer with
account_deactivated: true, as ScrapeCreators answers it. A private
account is the normal body with user.privateAccount: true, charged.
When TikTok's profile page fails and we fall back to the embed, some
user settings and counts can be null.
Latency (our load test, 31 Oct 2026, 40 requests/s on one box): p50 1.14 s, p95 4.51 s.
Headers
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
x-api-key | string | one of the auth headers | Your API key. If both headers are sent, `x-api-key` wins. | sk_... |
Authorization | string | one of the auth headers | `Authorization: Bearer <key>`, the same key. | Bearer sk_... |
Idempotency-Key | string | no | Any string up to 255 characters. Makes a retry safe for 24 hours; bound to this API key and the request's parameters. | profile-dagestantrainingcamp-2026-11-01 |
Query parameters
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
handle | string | no | The TikTok handle. Required unless `user_id` is given. A leading `@` is removed; case does not matter. Letters, digits, `_` and `.` only, at most 64 characters. With both `handle` and `user_id`, `user_id` is ignored. | dagestantrainingcamp |
user_id | string | no | TikTok's numeric user id, at most 20 digits, used only when `handle` is absent. Works only for accounts in our index: an unknown id is `400 unsupported_parameter` ("pass handle"), and an id whose handle has changed is `400 unsupported_parameter` too. Both free, both count toward the free-answer limit. | 6918108151024829445 |
cache_max_age | 1d | 3d | 7d | 14d | 30d | no | Accepted and ignored; we always fetch live. Any other value is `400 bad_request`. | |
trim | boolean | no | Accepted and ignored. Must be `true` or `false` (else `400 bad_request`). | |
region | string | no | Accepted and ignored. Not validated on this route (any value passes). |
Status codes
| Status | Charged | Meaning |
|---|---|---|
| 200 | Charged | The profile, or the not-found answer. Charged either way. |
| 400 | Free | A parameter is missing, malformed, or one we cannot honour yet. Free. |
| 401 | Free | Missing, unknown or revoked key. Free. |
| 402 | Free | The key cannot cover this request. needed_credits is the price. Free. |
| 409 | Free | A request with this Idempotency-Key and parameters is still running. Free; retry after Retry-After (1 s). |
| 429 | Free | over_capacity: no capacity within the time limit, or the server is
restarting (30 s). rate_limited: the free-answer limit (this answer
would have been free). Free; wait Retry-After seconds.
|
| 500 | Free | Our fault. Free; retry and quote X-Request-Id. |
| 502 | Free | TikTok's answer failed or could not be read (including accounts TikTok withholds from logged-out views). Free. |
| 503 | Free | The route has no price yet, so it does not serve. Free. |
| 504 | Free | No answer within the time limit (180 s; audience 300 s). Free. |
The profile, or the not-found answer. Charged either way.
application/json- response
success*unknowncredits_charged*CreditsAn amount in credits, as an exact JSON decimal (1, 0.002), never a rounded float.
0 <= valuecredits_remaining*CreditsRemainingWhat the key can still spend after this request.
user*The account record, ScrapeCreators' keys (internal/sccontract/profile.go). Settings and counts can be null when we fall back to the embed.
stats*TikTok's rounded counts.
statsV2*The exact counts, as strings.
itemList*array<any>Always empty, as on ScrapeCreators.
items <= 0Example request
# A call can be held open up to 180 s (audience: 300 s). Set a client timeout above that.curl -X GET 'https://scraper.riken.me/v1/tiktok/profile?handle=dagestantrainingcamp&user_id=6918108151024829445' \ -H 'Idempotency-Key: profile-dagestantrainingcamp-2026-11-01'{ "credits_charged": 1, "credits_remaining": 999, "itemList": [], "stats": { "diggCount": 0, "followerCount": 8740, "followingCount": 125, "friendCount": 41, "heart": 275500, "heartCount": 275500, "videoCount": 48 }, "statsV2": { "diggCount": "0", "followerCount": "8740", "followingCount": "125", "friendCount": "41", "heart": "275546", "heartCount": "275546", "videoCount": "48" }, "success": true, "user": { "UserStoryStatus": 0, "avatarLarger": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/23acee9247d9576ff8a4626add13fbfd~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=7231d9a6&x-expires=1793563200&x-signature=c41FazTETsYo8P%2BTmuPfZjEZAFI%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8", "avatarMedium": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/23acee9247d9576ff8a4626add13fbfd~tplv-tiktokx-cropcenter:720:720.jpeg?dr=9640&refresh_token=69603e15&x-expires=1793563200&x-signature=scJlakKQv0P9I46Wo9%2FV5pfatIw%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8", "avatarThumb": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/23acee9247d9576ff8a4626add13fbfd~tplv-tiktokx-cropcenter:100:100.jpeg?dr=9640&refresh_token=95abdb08&x-expires=1793563200&x-signature=8OwnKAnW8MdgUe9z%2FBger1%2FN%2FZQ%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8", "bioLink": { "link": "Dagestantrainingcamp.com", "risk": 3 }, "canExpPlaylist": true, "commentSetting": 0, "commerceUserInfo": { "commerceUser": false }, "createTime": 1610747711, "downloadSetting": 0, "duetSetting": 0, "eventList": [], "followingVisibility": 1, "ftc": false, "id": "6918108151024829445", "isADVirtual": false, "isEmbedBanned": false, "isOrganization": 0, "language": "fr", "nickNameModifyTime": 1777223133, "nickname": "Dagestan Training Camp", "nowInvitationCardUrl": "", "openFavorite": false, "privateAccount": false, "profileEmbedPermission": 1, "profileTab": { "showMusicTab": false, "showPlayListTab": false, "showQuestionTab": false }, "recommendReason": "", "relation": 0, "roomId": "", "secUid": "MS4wLjABAAAAynBXrV7vRUXrvgYYr-msCZbjkFi9Xh-AiK6DkKzopQIeqh7Ppoqv81VHPZfD5xf6", "secret": false, "shortDramaCreator": {}, "shortId": "", "signature": "🥊 MMA & Wrestling Training Camp in Dagestan\n⛰️For all level (beginner to professional)\n\nCheck our website ⬇️", "stitchSetting": 0, "suggestAccountBind": false, "ttSeller": false, "uniqueId": "dagestantrainingcamp", "uniqueIdModifyTime": 0, "verified": false }}