TikTok API endpoint
Returns TikTok Creative Center's ranked trending videos for a country, period, sort order, and optional content tags. TikTok reports the true result-set size (see total_count/page_count in the response) but gates access to it behind a logged-in TikTok One account: an anonymous request always receives page 1 (4 videos) regardless of sort order or period. Country coverage is uneven: only US, JP, ID, VN, and TH have a regional edge host that returns populated results; other countries return an empty videos array (a genuine no-data response, not an error). See the filters endpoint for the complete country, period, sort, and content tag value lists.
/tiktok/creative-center/videosQuery parameters:
country_code: required. ISO-2 country code. Example: US.period: optional. Lookback window in days. Default: 7. Allowed values: 7, 30.sort_by: optional. Sort order. Default: views. Allowed values: views, engagement, six_second_views.content_label_id: optional. Deprecated single content tag id. Use content_label_ids instead.content_label_ids: optional. Repeatable or comma-separated content tag ids; a video matches when it carries any of the selected tags. Allowed values: 11002, 11003, 11010, 11013, 11015. See /api/v1/tiktok/creative-center/filters for the tag names.organic_only: optional. Restrict to organic (non-paid) videos only. Default: false.Notable response behavior:
total_count, page_count) but
gates access to it behind a logged-in TikTok One account: an anonymous
request always receives page 1 (4 videos) regardless of sort order or
period. This was verified live for both periods and all three sort orders.US, JP, VN, TH, and ID return populated results.
Other countries tried live (GB, BR, FR, DE, KR, MX, PH, SG, MY, IT, ES, AU,
CA) returned a valid response with an empty videos array and no
total_count/page_count - a genuine "no data for this market" response,
not an error. Treat an empty result for one of those countries as expected
upstream behavior, not a bug.video_views/organic_video_views and their _lifetime counterparts are
scoped to the requested period vs. the video's full lifetime respectively.engagement_rate and six_seconds_vtr are ratios, not percentages.creator_id identifies TikTok's creator entity and can differ from
author_id, which is the posting account.cover_urls lists the alternative cover renditions (for example jpeg and
avif) in addition to the primary cover_url.| Field | Filled in, of 4 checked | Values in the sample |
|---|---|---|
| item_id | 4 | |
| title | 4 | median 244 characters |
| video_url | 4 | v16m-default.tiktokcdn-us.com |
| cover_url | 4 | p19-common-sign.tiktokcdn-us.com and 1 other host |
| content_type | 4 | 1 |
| create_time | 4 | 2026-02-19 to 2026-09-30 |
| content_tags | 1 | median 1 entry |
| author_id | 4 | |
| author_handle | 4 | |
| author_nickname | 4 | |
| author_avatar_url | 4 | p19-common-sign.tiktokcdn-us.com and 1 other host |
| author_bio | 4 | |
| author_follower_count | 4 | 64,307 to 6,968,672, median 82,122 |
| video_views | 4 | 20,433,757 to 79,724,346, median 21,833,783 |
| video_views_lifetime | 4 | 27,208,520 to 504,014,951, median 79,724,346 |
| organic_video_views | 4 | 862,357 to 3,285,182, median 1,146,082 |
| organic_video_views_lifetime | 4 | 862,357 to 28,636,327, median 3,435,359 |
| engagement_rate | 4 | 0 to 0, median 0 |
| engagement_rate_lifetime | 4 | 0 to 0, median 0 |
| six_seconds_vtr | 4 | 0.02 to 0.1, median 0.03 |
| six_seconds_vtr_lifetime | 4 | 0.02 to 0.1, median 0.02 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| country_code | string | Yes | ISO-2 country code | US | |
| period | integer | No | Lookback window in days Allowed values: 7, 30. | ||
| sort_by | string | No | Sort order Allowed values: views, engagement, six_second_views. | ||
| content_label_id | string | No | Deprecated: single content tag id; use content_label_ids instead | 11015 | |
| content_label_ids | array<string> | No | Content tag ids to filter by, repeatable; matches videos carrying any selected tag Allowed values: 11002, 11003, 11010, 11013, 11015. Repeat this query parameter for multiple values. | 11003,11015 | |
| organic_only | boolean | No | Restrict to organic (non-paid) videos only |
curl -X GET "https://api.crawlora.net/api/v1/tiktok/creative-center/videos?country_code=US&period=7&sort_by=views&content_label_ids=11002&organic_only=true" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"videos": [
{
"item_id": "7662909267317509407",
"title": "anyone else",
"video_url": "https://example.tiktokcdn.com/video.mp4",
"cover_url": "https://example.tiktokcdn.com/cover.jpg",
"cover_urls": [
{
"format": "jpeg",
"url": "https://example.tiktokcdn.com/cover.jpeg"
},
{
"format": "avif",
"url": "https://example.tiktokcdn.com/cover.avif"
}
],
"content_type": 1,
"create_time": 1784160116,
"content_tags": [
{
"id": "11015",
"name": "Technology & Finance"
}
],
"author_id": "7046946248401616902",
"creator_id": "103641138313531392",
"author_handle": "x.ody",
"author_nickname": "ody",
"author_avatar_url": "https://example.tiktokcdn.com/avatar.jpeg",
"author_follower_count": 787488,
"video_views": 79011161,
"video_views_lifetime": 79032186,
"organic_video_views": 11197094,
"organic_video_views_lifetime": 11218118,
"engagement_rate": 0.0101,
"engagement_rate_lifetime": 0.0101,
"six_seconds_vtr": 0.036,
"six_seconds_vtr_lifetime": 0.036
}
],
"total_count": 100,
"page_count": 25
}
}Request schema
No body schema
Response schema
#/definitions/creativecenter.trendingVideosResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | creativecenter.TrendingVideosResp | No | ||||
| data.page_count | integer | No | ||||
| data.total_count | integer | No | ||||
| data.videos | array | No | ||||
| data.videos[].author_avatar_url | string | No | ||||
| data.videos[].author_bio | string | No | ||||
| data.videos[].author_follower_count | integer | No | ||||
| data.videos[].author_handle | string | No | ||||
| data.videos[].author_id | string | No | ||||
| data.videos[].author_nickname | string | No | ||||
| data.videos[].content_tags | array | No | ||||
| data.videos[].content_tags[].id | string | No | ||||
| data.videos[].content_tags[].name | string | No | ||||
| data.videos[].content_type | integer | No | ||||
| data.videos[].cover_url | string | No | ||||
| data.videos[].cover_urls | array | No | ||||
| data.videos[].cover_urls[].format | string | No | Image format, for example `jpeg` or `avif`. | |||
| data.videos[].cover_urls[].url | string | No | Absolute image URL. | |||
| data.videos[].create_time | integer | No | ||||
| data.videos[].creator_id | string | No | ||||
| data.videos[].engagement_rate | number | No | ||||
| data.videos[].engagement_rate_lifetime | number | No | ||||
| data.videos[].item_id | string | No | ||||
| data.videos[].organic_video_views | integer | No | ||||
| data.videos[].organic_video_views_lifetime | integer | No | ||||
| data.videos[].six_seconds_vtr | number | No | ||||
| data.videos[].six_seconds_vtr_lifetime | number | No | ||||
| data.videos[].title | string | No | ||||
| data.videos[].video_url | string | No | ||||
| data.videos[].video_views | integer | No | ||||
| data.videos[].video_views_lifetime | integer | No | ||||
| 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 |
| 503 | Upstream failure | #/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/creative-center/videos?country_code=US&period=7&sort_by=views&content_label_ids=11002&organic_only=true" \
-H "x-api-key: $CRAWLORA_API_KEY"