TikTok API endpoint
Returns the reference set the app's "go LIVE" flow uses to tag a stream: the general LIVE hashtags (`hashtags`, measured 18 entries of `{id, image, namespace, title}`, where `id` 0 is the "None" tag), the live-studio/live-voice/third-party hashtag subsets (`live_studio_hashtags` 16, `live_voice_hashtags` 16, `third_party_hashtags` 9), the single `game_hashtag`, and a 1,500-entry game catalogue (`game_tag_list`, `game_tag_count`) where every entry carries the same 12 keys: `id`, `short_name`, `show_name`, `full_name`, `bundle_id`, `package_name`, `game_category` (`[{game_type, title}]` with PC games/Mobile games/Console games/Others), `hashtag_id`, `hashtag_list`, `gar`, `landscape` (0/1/2) and `is_new_game`. The upstream is `/webcast/room/hashtag/list/` on the webcast edge host (no origin header); the measured body is 539,361 B and byte-identical on both working webcast hosts, `language`/`count` do not change it, and there is no cursor/has_more, so it is a one-shot reference dump. Measured 2026-10-22,
/tiktok/mobile/live/hashtagsThe reference set the app's "go LIVE" flow uses to tag a stream: the LIVE hashtags, their studio/voice/third-party
subsets, and the full game catalogue a streamer can pick from. The upstream is GET /webcast/room/hashtag/list/ 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.
What the catalogue carries.
| field | content |
|---|---|
hashtags | the general LIVE tags: measured 18 entries of {id, title, namespace, image}; id 0 is the "None" tag, then e.g. "Learn" (id 11) |
live_studio_hashtags / live_voice_hashtags / third_party_hashtags | the subsets the app offers for studio, voice and third-party streams: measured 16 / 16 / 9 entries |
game_hashtag | the single "Gaming" tag object |
game_tag_list / game_tag_count | the game catalogue: measured 1,500 entries, every one with the same 12 keys — id, short_name, show_name, full_name, bundle_id, package_name, game_category ([{game_type, title}], titles measured "PC games"/"Mobile games"/"Console games"/"Others"), hashtag_id, hashtag_list ([{id, namespace, title}]), gar, landscape (0/1/2) and is_new_game |
One-shot reference dump. The measured body is 539,361 B and byte-identical on both working webcast hosts
(webcast16-normal-c-useast2a.tiktokv.com and webcast16-normal-useast5.tiktokv.us); language and count do
not change it, and the envelope has no cursor/has_more, so there is nothing to page or filter.
Query parameters: none.
Errors:
Measured 2026-10-22:
| call | result |
|---|---|
bare, on webcast16-normal-c-useast2a.tiktokv.com | 200; 539,361 B; hashtags 18 / studio 16 / voice 16 / third-party 9; game tags 1,500 |
bare, on webcast16-normal-useast5.tiktokv.us | byte-identical 539,361 B |
language=en, count=10 | same body (parameters are no-ops) |
| shipped-service canary | hashtags=18 studio=16 voice=16 third_party=9 games=1500 |
Example request:
GET /api/v1/tiktok/mobile/live/hashtags
Example response (truncated):
{
"code": 200,
"msg": "OK",
"data": {
"hashtags": [
{"id": 0, "title": "None", "namespace": 0, "image": {"uri": "webcast-sg/...topic_none.png", "url_list": ["..."]}},
{"id": 11, "title": "Learn", "namespace": 0, "image": {"uri": "webcast-sg/11Learn.png", "url_list": ["..."]}}
],
"live_studio_hashtags": [{"id": 5, "title": "Gaming", "namespace": 0}],
"live_voice_hashtags": [{"id": 5, "title": "Gaming", "namespace": 0}],
"third_party_hashtags": [{"id": 5, "title": "Gaming", "namespace": 0}],
"game_hashtag": {"id": 5, "title": "Gaming", "namespace": 0},
"game_tag_count": 1500,
"game_tag_list": [
{
"id": 110,
"short_name": "Roblox",
"show_name": "Roblox",
"full_name": "Roblox",
"bundle_id": "431946152",
"package_name": "com.roblox.client",
"game_category": [{"game_type": 1, "title": "PC games"}, {"game_type": 2, "title": "Mobile games"}],
"hashtag_list": [{"id": 5, "title": "Gaming", "namespace": 0}],
"landscape": 1,
"is_new_game": false
}
],
"host": "webcast16-normal-c-useast2a.tiktokv.com",
"fetched_at": "2026-10-22T04:56:40Z"
}
}
Notes for callers:
/api/v1/tiktok/mobile/live/search; for one
room's state use /api/v1/tiktok/mobile/live/room.landscape distinguishes the stream orientation the game is played in (measured 0/1/2); is_new_game was
false on all 1,500 measured entries, so treat it as a flag rather than a discovery source.| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/tiktok/mobile/live/hashtags" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"hashtags": [
{
"id": 0,
"title": "None",
"namespace": 0,
"image": {
"uri": "webcast-sg/...topic_none.png",
"url_list": [
"..."
]
}
},
{
"id": 11,
"title": "Learn",
"namespace": 0,
"image": {
"uri": "webcast-sg/11Learn.png",
"url_list": [
"..."
]
}
}
],
"live_studio_hashtags": [
{
"id": 5,
"title": "Gaming",
"namespace": 0
}
],
"live_voice_hashtags": [
{
"id": 5,
"title": "Gaming",
"namespace": 0
}
],
"third_party_hashtags": [
{
"id": 5,
"title": "Gaming",
"namespace": 0
}
],
"game_hashtag": {
"id": 5,
"title": "Gaming",
"namespace": 0
},
"game_tag_count": 1500,
"game_tag_list": [
{
"id": 110,
"short_name": "Roblox",
"show_name": "Roblox",
"full_name": "Roblox",
"bundle_id": "431946152",
"package_name": "com.roblox.client",
"game_category": [
{
"game_type": 1,
"title": "PC games"
},
{
"game_type": 2,
"title": "Mobile games"
}
],
"hashtag_list": [
{
"id": 5,
"title": "Gaming",
"namespace": 0
}
],
"landscape": 1,
"is_new_game": false
}
],
"host": "webcast16-normal-c-useast2a.tiktokv.com",
"fetched_at": "2026-10-22T04:56:40Z"
}
}Request schema
No body schema
Response schema
#/definitions/tiktokmobile.liveHashtagCatalogResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| extra | unknown | No | ||||
| fetched_at | string | No | ||||
| game_hashtag | tiktokmobile.LiveHashtag | No | ||||
| game_hashtag.id | integer | No | ||||
| game_hashtag.image | unknown | No | ||||
| game_hashtag.namespace | integer | No | ||||
| game_hashtag.title | string | No | ||||
| game_tag_count | integer | No | 1500 | |||
| game_tag_list | array | No | ||||
| game_tag_list[].bundle_id | string | No | ||||
| game_tag_list[].full_name | string | No | ||||
| game_tag_list[].game_category | array | No | ||||
| game_tag_list[].game_category[].game_type | integer | No | ||||
| game_tag_list[].game_category[].title | string | No | ||||
| game_tag_list[].gar | array | No | ||||
| game_tag_list[].hashtag_id | array | No | ||||
| game_tag_list[].hashtag_list | array | No | ||||
| game_tag_list[].hashtag_list[].id | integer | No | ||||
| game_tag_list[].hashtag_list[].image | unknown | No | ||||
| game_tag_list[].hashtag_list[].namespace | integer | No | ||||
| game_tag_list[].hashtag_list[].title | string | No | ||||
| game_tag_list[].id | integer | No | ||||
| game_tag_list[].is_new_game | boolean | No | ||||
| game_tag_list[].landscape | integer | No | ||||
| game_tag_list[].package_name | string | No | ||||
| game_tag_list[].short_name | string | No | ||||
| game_tag_list[].show_name | string | No | ||||
| hashtags | array | No | ||||
| hashtags[].id | integer | No | ||||
| hashtags[].image | unknown | No | ||||
| hashtags[].namespace | integer | No | ||||
| hashtags[].title | string | No | ||||
| host | string | No | webcast16-normal-c-useast2a.tiktokv.com | |||
| live_studio_hashtags | array | No | ||||
| live_studio_hashtags[].id | integer | No | ||||
| live_studio_hashtags[].image | unknown | No | ||||
| live_studio_hashtags[].namespace | integer | No | ||||
| live_studio_hashtags[].title | string | No | ||||
| live_voice_hashtags | array | No | ||||
| live_voice_hashtags[].id | integer | No | ||||
| live_voice_hashtags[].image | unknown | No | ||||
| live_voice_hashtags[].namespace | integer | No | ||||
| live_voice_hashtags[].title | string | No | ||||
| status_code | integer | No | 0 | |||
| status_msg | string | No | ||||
| third_party_hashtags | array | No | ||||
| third_party_hashtags[].id | integer | No | ||||
| third_party_hashtags[].image | unknown | No | ||||
| third_party_hashtags[].namespace | integer | No | ||||
| third_party_hashtags[].title | string | No |
| Status | Description | Schema |
|---|---|---|
| 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/hashtags" \
-H "x-api-key: $CRAWLORA_API_KEY"