TikTok API endpoint
Returns one LIVE room's detail, keyed by `room_id` — the numeric id that `/api/v1/tiktok/mobile/live/search` returns under `data[].lives.author.room_id`. The upstream is `/webcast/room/info/` on the webcast edge host (no origin header), captured from the running 47.4.3 app's LIVE surface and reproduced against the live gateway. The response projects the fields callers key on — `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_count`, `comment_count`, `share_count`, `follow_count`, `replay_viewers`), `stream` (playable `flv_pull_url` per resolution plus `default_resolution`/`candidate_resolution` and the HLS/RTMP URLs) and `cover` — and keeps the upstream room object unmodified in `data` (it has ~500 keys, so a partial struct would drop fields). Measured 2026-10-22: one room returned 193-198 KB with 1,595-1,600 concurrent viewers, 27,916 cumulative viewers, 27,096 enters and FLV URLs for FULL_HD1/HD1/SD1/SD2. `anchor_id` is deliberately NOT forwarded: it was measured to suppress the audience-only `stats.total_user` (27,916 -> 0 on the same room). A missing, non-numeric or unknown room id answers the webcast envelope's status 10011 and is surfaced as a 400; a finished room (status 30003) is a 400 too.
/tiktok/mobile/live/roomWhat a room carries. The response projects the fields callers key on:
| field | content |
|---|---|
title | the room title |
status | room state (measured 2 = live) |
user_count | concurrent viewers at call time (measured 1,595–1,622) |
create_time | room start, unix seconds |
owner | owner user_id, nickname, avatar_url |
stats | cumulative enter_count / total_user (measured 27,096 / 27,916, later 32,517 enters), watch_user_count, like_count, comment_count, share_count, follow_count, replay_viewers |
stream | playable flv_pull_url per resolution (measured FULL_HD1 / HD1 / SD1 / SD2), default_resolution, candidate_resolution, hls_pull_url, rtmp_pull_url |
cover | room cover |
data | the upstream room object unmodified (~500 keys, kept opaque so no field is lost) |
anchor_id is deliberately not forwarded. The app sends an anchor_id alongside the room id, but it was
measured to change the payload: on the same room it suppressed the audience-only stats.total_user
(27,916 → 0), so this endpoint always asks for the audience projection.
Two measured webcast
hosts answer this route (webcast16-normal-c-useast2a.tiktokv.com and webcast16-normal-useast5.tiktokv.us);
the other six measured hosts answer HTTP 403, so the service uses the family's measured edge.
Errors:
room_id is missing or not numeric, the room is unknown/not live (upstream webcast status 10011
"Request params error"), or the room has finished (status 30003).20003 state measured on sibling LIVE routes).Measured 2026-10-22:
| call | result |
|---|---|
room_id=7699174209096059678 ("Lets Go LIVE!") | 193–198 KB; status 2; 1,595–1,600 concurrent viewers; 27,916 cumulative; 27,096 enters; FLV URLs for FULL_HD1/HD1/SD1/SD2 |
room_id=7699186307263761183 | 142 KB, same shape |
room_id=7699155875222604558 | 169–190 KB on the two measured hosts |
same room + anchor_id | audience stats suppressed (stats.total_user 27,916 → 0) — so not sent |
bare / room_id=1 / stale 19-digit id / room_id=abc | upstream status 10011 "Request params error" → 400 |
| the other six webcast hosts | HTTP 403 |
| shipped-service canary | room=7699174209096059678 title="Lets Go LIVE!" viewers=1622 enters=32517 resolutions=4 |
Example request:
GET /api/v1/tiktok/mobile/live/room?room_id=7699174209096059678
Example response (truncated):
{
"code": 200,
"msg": "OK",
"data": {
"room_id": "7699174209096059678",
"title": "Lets Go LIVE!",
"status": 2,
"user_count": 1595,
"create_time": 1792603783,
"owner": {"user_id": "7507750403595584558", "nickname": "marvinebarnerjr", "avatar_url": {"url_list": ["..."]}},
"stats": {"enter_count": 27096, "total_user": 27916, "watch_user_count": 27916, "like_count": 12, "comment_count": 3, "share_count": 1, "follow_count": 1, "replay_viewers": 21781},
"stream": {
"flv_pull_url": {"FULL_HD1": "https://pull-flv-...tiktokcdn.com/...flv", "HD1": "...", "SD1": "...", "SD2": "..."},
"default_resolution": "AUTO",
"candidate_resolution": ["SD1", "SD2", "HD1", "FULL_HD1"]
},
"cover": {"uri": "720x720/tos-maliva-avt-0068/...", "url_list": ["..."]},
"data": {"title": "Lets Go LIVE!", "...": "the upstream room object"},
"host": "webcast16-normal-c-useast2a.tiktokv.com",
"fetched_at": "2026-10-22T03:58:41Z"
}
}
Notes for callers:
/api/v1/tiktok/mobile/live/search; LIVE rooms end without notice, so re-discover ids and
treat a 400 as "this room is no longer live", not a transient failure.expire/sign parameters), so re-fetch the
room rather than persisting a URL.stats.total_user/enter_count are cumulative for the session, while user_count is the current
concurrent viewership — use the latter for "watching now".| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| room_id | string | Yes | Numeric LIVE room id from /api/v1/tiktok/mobile/live/search (data[].lives.author.room_id) | 7699174209096059678 |
curl -X GET "https://api.crawlora.net/api/v1/tiktok/mobile/live/room?room_id=7699174209096059678" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"room_id": "7699174209096059678",
"title": "Lets Go LIVE!",
"status": 2,
"user_count": 1595,
"create_time": 1792603783,
"owner": {
"user_id": "7507750403595584558",
"nickname": "marvinebarnerjr",
"avatar_url": {
"url_list": [
"..."
]
}
},
"stats": {
"enter_count": 27096,
"total_user": 27916,
"watch_user_count": 27916,
"like_count": 12,
"comment_count": 3,
"share_count": 1,
"follow_count": 1,
"replay_viewers": 21781
},
"stream": {
"flv_pull_url": {
"FULL_HD1": "https://pull-flv-...tiktokcdn.com/...flv",
"HD1": "...",
"SD1": "...",
"SD2": "..."
},
"default_resolution": "AUTO",
"candidate_resolution": [
"SD1",
"SD2",
"HD1",
"FULL_HD1"
]
},
"cover": {
"uri": "720x720/tos-maliva-avt-0068/...",
"url_list": [
"..."
]
},
"data": {
"title": "Lets Go LIVE!",
"...": "the upstream room object"
},
"host": "webcast16-normal-c-useast2a.tiktokv.com",
"fetched_at": "2026-10-22T03:58:41Z"
}
}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, an unknown/not-live room, or a finished room | #/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?room_id=7699174209096059678" \
-H "x-api-key: $CRAWLORA_API_KEY"