TikTok API endpoint
Returns the TikTok explore feed for a category, given its category type `id` from the category endpoint. The response has `itemList` with the videos, `hasMore` and a `cursor`. A feed that comes back empty is reported as an upstream error, not as an empty list.
/tiktok/explore/{id}Path parameters:
id: required. Category type id returned by the category endpoint.Notable response behavior:
data.itemList.itemList, the service retries through the signer browser fallback and then returns an upstream error if the fallback is also empty.| Field | Filled in, of 30 checked | Values in the sample |
|---|---|---|
| AIGCDescription | 0 | |
| CategoryType | 30 | 101 to 120, median 113 |
| IsHDBitrate | 30 | true in 0 of 30 |
| ShowAIGC | 30 | true in 30 of 30 |
| anchors | 13 | median 1 entry |
| author | 30 | |
| authorStats | 30 | |
| authorStatsV2 | 30 | |
| backendSourceEventTracking | 0 | |
| challenges | 28 | median 5 entries |
| collected | 30 | true in 0 of 30 |
| contents | 30 | median 1 entry |
| createTime | 30 | 1,789,448,270 to 1,791,614,805, median 1,790,800,986 |
| desc | 30 | |
| digged | 30 | true in 0 of 30 |
| diversificationId | 28 | 10,000 to 10,095, median 10,041 |
| duetDisplay | 30 | 0 |
| duetEnabled | 27 | true in 27 of 27 |
| effectStickers | 30 | median 2 entries |
| forFriend | 30 | true in 0 of 30 |
| id | 30 | |
| isAd | 30 | true in 0 of 30 |
| isProhibited | 30 | true in 0 of 30 |
| isReviewing | 30 | true in 0 of 30 |
| itemCommentStatus | 30 | 0 |
| item_control | 30 | |
| music | 30 | |
| officalItem | 30 | true in 0 of 30 |
| originalItem | 30 | true in 0 of 30 |
| penaltyContext | 30 | |
| privateItem | 30 | true in 0 of 30 |
| secret | 30 | true in 0 of 30 |
| shareEnabled | 30 | true in 30 of 30 |
| stats | 30 | |
| statsV2 | 30 | |
| stickersOnItem | 6 | median 1 entry |
| stitchDisplay | 30 | 0 |
| stitchEnabled | 27 | true in 27 of 27 |
| textExtra | 28 | median 5 entries |
| textLanguage | 30 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| id (path) | integer | Yes | Category type id returned by the category endpoint | 120 |
curl -X GET "https://api.crawlora.net/api/v1/tiktok/explore/120" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"cursor": "0",
"extra": {
"fatal_item_ids": [],
"logid": "20241211134820CAEF8E035EA9CA040BA5",
"now": 1733924900000
},
"hasMore": true,
"itemList": [
{
"AIGCDescription": "",
"CategoryType": 103,
"anchors": [
{
"description": "Effects",
"extraInfo": {
"subtype": ""
},
"icon": {
"urlList": [
"https://p16-sg.tiktokcdn.com/obj/tiktok-obj/capcut_logo_64px_bk.png?shp=81f88b70&shcp=-"
]
},
"id": "334772380",
"keyword": "Number Fit v14",
"schema": "https://www.capcut.com/editor?scenario=tiktok&utm_source=tiktok_anchor_tool&utm_medium=tiktok_anchor&utm_campaign=71351105"
}
],
"author": {
"avatarLarger": "https://p19-pu-sign-useast8.tiktokcdn-us.com/tos-useast5-avt-0068-tx/80f67be06bb65c4c0caed1a981ad5dda~c5_1080x1080.jpeg?lk3s=a5d48078&non...",
"avatarMedium": "https://p16-pu-sign-useast8.tiktokcdn-us.com/tos-useast5-avt-0068-tx/80f67be06bb65c4c0caed1a981ad5dda~c5_720x720.jpeg?lk3s=a5d48078&nonce...",
"avatarThumb": "https://p16-pu-sign-useast8.tiktokcdn-us.com/tos-useast5-avt-0068-tx/80f67be06bb65c4c0caed1a981ad5dda~c5_100x100.jpeg?lk3s=a5d48078&nonce...",
"commentSetting": 0,
"downloadSetting": 0,
"duetSetting": 0
},
"authorStats": {
"diggCount": 1292,
"followerCount": 73700,
"followingCount": 53,
"friendCount": 0,
"heart": 8400000,
"heartCount": 8400000
},
"backendSourceEventTracking": ""
}
],
"log_pb": {
"impr_id": "20241211134820CAEF8E035EA9CA040BA5"
},
"statusCode": 0
}
}Request schema
No body schema
Response schema
#/definitions/tiktok.exploreResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | tiktok.ExploreResp | No | ||||
| data.cursor | string | No | Cursor to pass in the next request to get the next page of videos. | |||
| data.extra | object | No | Response metadata from TikTok, such as the request log id and server time. | |||
| data.extra.fatal_item_ids | array | No | ||||
| data.extra.logid | string | No | ||||
| data.extra.now | integer | No | ||||
| data.hasMore | boolean | No | Whether more videos remain after this page. | |||
| data.itemList | array | No | Videos in the explore feed for the category, one entry per video, as TikTok returns them. | |||
| data.log_pb | object | No | Request tracking information from TikTok, holding the `impr_id` impression id. | |||
| data.log_pb.impr_id | string | No | ||||
| data.statusCode | integer | No | TikTok status code for the request. `0` on a successful response. | |||
| data.status_code | integer | No | Second copy of the TikTok status code, sent as `status_code`. `0` on a successful response. | |||
| data.status_msg | string | No | Status message that goes with the status code. | |||
| msg | string | No | OK |
| 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/explore/120" \
-H "x-api-key: $CRAWLORA_API_KEY"