TikTok API endpoint
Returns the app's suggested creators for the Following page unmodified: `user_list` entries are `{user, aweme_list}` where `user` is the full creator projection (uid, sec_uid, nickname, signature, avatars, follower/following counts, verification and privacy flags) and `aweme_list` holds up to three recent videos, so this is a creator-discovery surface rather than a bare id list. The route has no paging fields and returns one page of 13-17 creators (fresh recommendations differ per call). `count` is accepted for parity but the gateway was measured to ignore it. The route is not signature-value gated, so unlike the profile/posts routes it does not need the device-backed signer.
/tiktok/mobile/user/recommendationsCreator discovery: the suggested accounts the mobile app shows on its Following page, each with up to three
recent videos. The route was captured from the running app (GET /aweme/v1/following/page/user/recommend/ with
recommend_reason_type=combined first in the query) and then reproduced end-to-end against the live gateway, so
the request and the response shape are measured.
user_list is not a bare id list. Every entry is {user, aweme_list}: the full creator projection in
user (uid, sec_uid, nickname, signature, avatars, follower_count/following_count, verification and
privacy flags — 46 keys measured) and up to three recent videos in aweme_list (full item objects, measured
0–3 per entry). That makes this a creator-discovery surface rather than another video feed.
No paging. The measured envelope carries no cursor, no has_more and no max_time; the route returns one
page of 13–17 creators. Recommendations differ between calls, so the server draws a fresh set per request.
Device-free. Unlike the profile/posts/video/search-item routes, this route is not signature-value gated:
the same request signed with the pure-Go placeholder signer returned the same real data, so the deployment does
not need the device-backed signer (TIKTOK_MOBILE_SIGNER_URL) for this endpoint.
Query parameters:
count: optional. Requested page size, sanity-bounded at 50 and forwarded only when set. The gateway was
measured to ignore it: count=5 returned 16 creators and count=30 returned 17, i.e. the same page as
the app's own call, which carries no count at all. Treat it as shape parity, not a page-size control.Measured 2026-10-21 against the live gateway (aggr16-normal.tiktokv.us edge /
api16-normal-useast5.tiktokv.us origin):
| call | result |
|---|---|
default (the app's own recommend_reason_type=combined call) | 3,893,808 B, 17 creators, 3 videos each |
count=30 | 3,851,961 B, 17 creators (count ignored) |
count=5 | 3,172,394 B, 16 creators (count ignored) |
| pure-Go placeholder signer | 2,905,082 B, 13 creators with 3 videos each — real data, so device-free |
One measured variant matters for the contract: without recommend_reason_type=combined the same route
answers 44 bare users whose aweme_list is empty (4,006,767 B in one measurement). This endpoint always sends
the app's combined value, because the app itself never calls the route without it and the video-bearing form is
the product surface.
Notable response behavior:
[]any), so a richer creator or video object never loses fields to an incomplete schema.status_code surfaces as a typed upstream error rather than an empty page.Example request:
GET /api/v1/tiktok/mobile/user/recommendations
Example response (truncated):
{
"code": 200,
"msg": "OK",
"data": {
"user_list": [
{
"user": {
"uid": "7534288336598008838",
"sec_uid": "MS4wLjABAAAA...",
"nickname": "example creator",
"signature": "example bio",
"follower_count": 1200,
"following_count": 34
},
"aweme_list": [
{"aweme_id": "7516855864041540878", "desc": "recent video one"},
{"aweme_id": "7516855864041540879", "desc": "recent video two"},
{"aweme_id": "7516855864041540880", "desc": "recent video three"}
]
}
],
"extra": {"logid": "20261021052839295FD62E359E0309373B", "now": 1792560520000},
"log_pb": {"impr_id": "20261021052839295FD62E359E0309373B"},
"status_code": 0,
"status_msg": ""
}
}
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| count | integer | No | Requested page size; forwarded when set, but the gateway was measured to ignore it | 10 |
curl -X GET "https://api.crawlora.net/api/v1/tiktok/mobile/user/recommendations?count=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"user_list": [
{
"user": {
"uid": "7534288336598008838",
"sec_uid": "MS4wLjABAAAA...",
"nickname": "example creator",
"signature": "example bio",
"follower_count": 1200,
"following_count": 34
},
"aweme_list": [
{
"aweme_id": "7516855864041540878",
"desc": "recent video one"
},
{
"aweme_id": "7516855864041540879",
"desc": "recent video two"
},
{
"aweme_id": "7516855864041540880",
"desc": "recent video three"
}
]
}
],
"extra": {
"logid": "20261021052839295FD62E359E0309373B",
"now": 1792560520000
},
"log_pb": {
"impr_id": "20261021052839295FD62E359E0309373B"
},
"status_code": 0,
"status_msg": ""
}
}Request schema
No body schema
Response schema
#/definitions/tiktokmobile.userRecommendationsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| extra | unknown | No | ||||
| log_pb | unknown | No | ||||
| status_code | integer | No | 0 | |||
| status_msg | string | No | ||||
| user_list | array | No |
| Status | Description | Schema |
|---|---|---|
| 400 | Invalid input | #/definitions/app.Response |
| 429 | Rate limit exceeded | #/definitions/app.Response |
| 500 | Internal server error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/tiktok/mobile/user/recommendations?count=10" \
-H "x-api-key: $CRAWLORA_API_KEY"