TikTok API endpoint
Returns the LIVE room a TikTok user is currently streaming, keyed by `user_id`. The upstream is `/webcast/room/info_by_user/` on the webcast edge host (no origin header) and returns the same room payload as `/api/v1/tiktok/mobile/live/room` (title, status, concurrent viewers, owner, cumulative stats, per-resolution FLV URLs, cover and the ~500-key room object in `data`), except that the caller addresses a user and the room id is filled from the payload (both `user_id` and `room_id` are echoed). Measured 2026-10-22: `user_id=6707748031095751686` answered 184,575 B (195,220 B on the second webcast host); `anchor_id` alone answers a 57-byte empty payload, so `user_id` is the address. A user with no live room answers status 30003 "room has finished" and is surfaced as a 400; a non-numeric user id is a 400 (status 10011); a bare call answers a 57-byte empty success envelope, which is why this endpoint requires `user_id`.
/tiktok/mobile/live/room-by-userThe LIVE room a user is currently streaming, keyed by user_id. The upstream is
GET /webcast/room/info_by_user/ on the webcast edge host (no x-tt-ttnet-origin-host header), captured from the
running 47.4.3 app and reproduced end-to-end against the live gateway.
Same room payload as live/room. The response carries the same projections as
/api/v1/tiktok/mobile/live/room: title, status (2 = live), user_count
(concurrent viewers), create_time, owner (user id, nickname, avatar), stats (cumulative enter_count /
total_user, watch_user_count, like/comment/share/follow counters, replay_viewers), stream
(flv_pull_url per resolution plus default_resolution/candidate_resolution, HLS/RTMP URLs) and cover, with
the ~500-key upstream room object unmodified in data. The difference is the address: you give a user, and the
response fills room_id from the payload, echoing both user_id and room_id.
user_id is the address. anchor_id alone answers a 57-byte empty payload, and a bare call answers the same
57-byte empty success envelope β so this endpoint requires user_id rather than silently returning nothing. A user
who is not live answers the webcast status 30003 "room has finished", surfaced as a 400.
Two measured webcast hosts answer this route; the other six answer 403, so the service uses the family's measured edge.
Query parameters:
user_id: required. The numeric TikTok user id (profile owner id, video author id, or the owner.user_id
that live/room returns).Errors:
user_id is missing or not numeric (upstream 10011), or the user has no live room right now
(upstream 30003 "room has finished").Measured 2026-10-22:
| call | result |
|---|---|
user_id=6707748031095751686 (live) | 184,575 B; room 7699244186013010702, 468β513 concurrent viewers, full payload; 195,220 B on the second webcast host |
user_id of a user who is not live | upstream 30003 "room has finished" β 400 |
anchor_id=<uid> only | 57-byte empty payload |
| bare call | 57-byte empty success envelope (why user_id is required here) |
non-numeric user_id | upstream 10011 "Request params error" β 400 |
| shipped-service canary (live chain) | user=6707748031095751686 room=7699244186013010702 title="" viewers=513 |
Example request:
GET /api/v1/tiktok/mobile/live/room-by-user?user_id=6707748031095751686
Example response (truncated):
{
"code": 200,
"msg": "OK",
"data": {
"room_id": "7699244186013010702",
"user_id": "6707748031095751686",
"title": "",
"status": 2,
"user_count": 468,
"create_time": 1792608000,
"owner": {"user_id": "6707748031095751686", "nickname": "kira liseπ", "avatar_url": {"url_list": ["..."]}},
"stats": {"enter_count": 1200, "total_user": 1300, "watch_user_count": 1300},
"stream": {"flv_pull_url": {"FULL_HD1": "https://pull-flv-...tiktokcdn.com/...flv"}, "candidate_resolution": ["SD1", "SD2", "HD1", "FULL_HD1"]},
"cover": {"uri": "...", "url_list": ["..."]},
"data": {"title": "", "status": 2, "...": "the upstream room object"},
"host": "webcast16-normal-c-useast2a.tiktokv.com",
"fetched_at": "2026-10-22T08:16:12Z"
}
}
Notes for callers:
title (measured on one live room); the rest of the payload is complete.| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| user_id | string | Yes | Numeric TikTok user id (e.g. the owner id from a profile, video author or live search row) | 6707748031095751686 |
curl -X GET "https://api.crawlora.net/api/v1/tiktok/mobile/live/room-by-user?user_id=6707748031095751686" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"room_id": "7699244186013010702",
"user_id": "6707748031095751686",
"title": "",
"status": 2,
"user_count": 468,
"create_time": 1792608000,
"owner": {
"user_id": "6707748031095751686",
"nickname": "kira liseπ",
"avatar_url": {
"url_list": [
"..."
]
}
},
"stats": {
"enter_count": 1200,
"total_user": 1300,
"watch_user_count": 1300
},
"stream": {
"flv_pull_url": {
"FULL_HD1": "https://pull-flv-...tiktokcdn.com/...flv"
},
"candidate_resolution": [
"SD1",
"SD2",
"HD1",
"FULL_HD1"
]
},
"cover": {
"uri": "...",
"url_list": [
"..."
]
},
"data": {
"title": "",
"status": 2,
"...": "the upstream room object"
},
"host": "webcast16-normal-c-useast2a.tiktokv.com",
"fetched_at": "2026-10-22T08:16:12Z"
}
}Request schema
No body schema
Response schema
#/definitions/tiktokmobile.liveRoomInfoResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| cover | unknown | No | ||||
| create_time | integer | No | 1792603783 | |||
| data | unknown | No | ||||
| fetched_at | string | No | ||||
| host | string | No | webcast16-normal-c-useast2a.tiktokv.com | |||
| owner | tiktokmobile.LiveRoomOwner | No | ||||
| owner.avatar | unknown | No | ||||
| owner.nickname | string | No | ||||
| owner.user_id | string | No | ||||
| room_id | string | No | 7699174209096059678 | |||
| stats | tiktokmobile.LiveRoomStats | No | ||||
| stats.comment_count | integer | No | ||||
| stats.enter_count | integer | No | ||||
| stats.follow_count | integer | No | ||||
| stats.like_count | integer | No | ||||
| stats.replay_viewers | integer | No | ||||
| stats.share_count | integer | No | ||||
| stats.total_user | integer | No | ||||
| stats.watch_user_count | integer | No | ||||
| status | integer | No | 2 | |||
| stream | tiktokmobile.LiveRoomStream | No | ||||
| stream.candidate_resolution | array | No | ||||
| stream.default_resolution | string | No | ||||
| stream.flv_pull_url | object | No | ||||
| stream.hls_pull_url | string | No | ||||
| stream.rtmp_pull_url | string | No | ||||
| title | string | No | Lets Go LIVE! | |||
| user_count | integer | No | 1595 | |||
| user_id | string | No | 6707748031095751686 |
| Status | Description | Schema |
|---|---|---|
| 400 | Invalid input, or the user has no live room right now | #/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/live/room-by-user?user_id=6707748031095751686" \
-H "x-api-key: $CRAWLORA_API_KEY"