# TikTok Creative Center Scraper - Top Ads, Hashtags & Trends (`clover_folktale/tiktok-creative-center-scraper`) Actor

Scrape the TikTok Creative Center: search top-performing TikTok ads by keyword, industry, objective and period, get ad details and performance analyses, trending hashtags, videos and search words, music charts and creator search insights. No login or cookies needed. Export JSON, CSV or Excel.

- **URL**: https://apify.com/clover_folktale/tiktok-creative-center-scraper.md
- **Developed by:** [Silkline](https://apify.com/clover_folktale) (community)
- **Categories:** Social media, Marketing
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Scrape the TikTok Creative Center without a login: top-performing TikTok ads by keyword, industry, objective and period, ad details with performance analyses, trending hashtags, trending videos, trending search words, the music charts and creator search insights (the topics people search for). Built for ad research, trend tracking, content planning and competitor monitoring.

### What is the TikTok Creative Center?

The TikTok Creative Center is TikTok's public research site for advertisers and creators. It ranks the best-performing ads and the fastest-growing hashtags, videos, sounds and search topics by region and period. This Actor is not affiliated with TikTok; it reads the lists anyone can open on the site and returns them as flat records.

### What data can you get?

| Mode | What it returns |
|---|---|
| `topAds` | Top-performing ads found by keyword, or the top ads for the chosen filters when no keyword is given (ads are ranked across regions) |
| `adDetail` | One record per ad ID, plus optional records for the ad's keyframe retention curve, percentile and interactive analysis |
| `trendingHashtags` | Trending hashtags of a region for the last 7, 30 or 90 days, optionally with audience ages, countries and recent videos |
| `trendingVideos` | Top trending videos of a region ranked by views, engagement or six-second view rate, optionally with comments |
| `trendingSearches` | About 96 trending search words, ranked |
| `musicChart` | The Top 50 or Viral 50 music chart |
| `searchInsights` | Topics people search for, optionally with audience, weekly trend and top videos per topic |

Ad records (`type: ad`): `adId`, `title`, `brandName`, `industry`, `objective`, `likeCount`, `ctr`, `costLevel`, `videoId`, `durationSeconds`, `width`, `height`, `coverUrl`, `videoUrl`, `keyword`.
Ad detail records (`type: adDetail`) add `objectives`, `countries`, `commentCount`, `shareCount`, `landingPageUrl`, `highlight`, `keywords`, `hasVoiceOver`. Analyses are separate records: `adKeyframeAnalysis` (`series` of second and value, `durationSeconds`), `adPercentileAnalysis` (`metric`, `percentile`), `adInteractiveAnalysis` (`series`, `percentileMetric`, `percentile`).
Hashtag records (`type: trendingHashtag`): `rank`, `hashtagId`, `hashtag`, `country`, `periodDays`, `videoViews`, `postCount`, `industries`, `popularityCurve`, `topCreators`; with details also `audienceAges`, `audienceCountries`, `recentVideos`.
Video records (`type: trendingVideo`): `rank`, `videoId`, `title`, `createdAt`, `coverUrl`, `videoUrl`, `authorId`, `authorHandle`, `authorName`, `authorBio`, `authorFollowerCount`, `categories`, `views`, `organicViews`, `engagementRate`, `sixSecondViewRate`, the same four with a `lifetime` prefix, and with details `authorRegion` and `comments`.
Search word records (`type: trendingSearch`): `rank`, `keyword`, `capturedAt`.
Music records (`type: musicTrack`): `chart`, `rank`, `trackId`, `title`, `artist`, `album`, `durationSeconds`, `videoCount`, `language`, `isOriginalSound`, `coverUrl`, `audioUrl`, `chartUpdatedAt`.
Search insight records: `searchInsight` (`queryId`, `query`, `popularity`, `popularityIndex`, `videoCount`, `weeklyTrend`, `categories`, `reason`, `reasonDetail`, `updatedAt`), `searchInsightAudience` (`topAge`, `topGender`, `topLocation` and breakdowns), `searchInsightTrend` (`weeklyTrend`, `weeklyVolume`, `topCountries`, `relatedProducts`) and `searchInsightVideo` (`videoId`, `description`, `authorHandle`, `views`, `likeCount`, `commentCount`, `shareCount`, `createdAt`).

### How to use TikTok Creative Center Scraper

1. Open the Actor and choose a mode.
2. Fill the fields that belong to the mode (keywords or ad IDs, region, period, filters); every field is named after its mode in the form.
3. Set the maximum number of results and run.
4. Export the dataset as JSON, CSV or Excel, or read it through the API.

### Input

| Field | Type | Mode | Meaning |
|---|---|---|---|
| `mode` | string | all | One of the seven modes. Default `topAds` |
| `keywords` | list | topAds | Each keyword is a separate search. Empty: the top ads for the chosen filters |
| `adIds` | list | adDetail | Ad IDs (the `adId` of a top ads result) or Creative Center ad links |
| `country` | string | trendingHashtags, trendingVideos | One of the 28 regions the Creative Center offers. Default `US`. Ad search does not use it: ads are ranked across regions |
| `industry` | string | topAds, trendingHashtags | One of the 21 top-level industries. Empty: all |
| `adPeriod` | string | topAds | `7`, `30` or `180` days. Default `180` |
| `adSort` | string | topAds | `for_you` (default ranking) or `likes` |
| `objective`, `adLanguage`, `adFormat`, `adPerformance` | string | topAds | Filters by campaign objective, ad language, Spark Ads or not, and performance rank |
| `includeKeyframe`, `includePercentile`, `includeInteractive` | boolean | adDetail | Add the analysis records |
| `hashtagPeriod` | string | trendingHashtags | `7`, `30` or `90` days. Default `7` |
| `videoPeriod`, `videoSort`, `organicOnly` | string, string, boolean | trendingVideos | Standard or longer window, rank by `views`, `engagement` or `completion`, leave out ads |
| `includeDetails` | boolean | trendingHashtags, trendingVideos | Complete each record with its detail view |
| `chart` | string | musicChart | `top` (Top 50) or `viral` (Viral 50). Default `top` |
| `includeAudience`, `includeTrend`, `includeVideos` | boolean | searchInsights | Add the extra records of each topic |
| `maxResults` | integer | all | Maximum records per keyword or ad, up to 1000. Default 20 |

An empty input `{}` lists the top ads of the last 180 days and returns 20 ads.

```json
{"mode": "topAds", "keywords": ["shoes"], "adPeriod": "30", "adSort": "likes", "maxResults": 100}
```

```json
{"mode": "trendingHashtags", "country": "US", "hashtagPeriod": "30", "includeDetails": true, "maxResults": 50}
```

### Output example

```json
{"type": "ad", "adId": "7218843647072075778", "title": "Adakah anda kenali Brand XES? #xesshoes #shoesforeverymoment #tiktokshop #tiktokmalaysia #ootd #foryou #foryoupage #racuntiktok  #racunintiktok #tiktok #fypage #kasutRAYA #ramadan #fashion #fypdongggggggg #raya #shoes", "brandName": null,
 "industry": "Other Apparel & Accessories", "objective": "Video Views", "likeCount": 1819, "ctr": 0.8, "costLevel": 2,
 "videoId": "v09044g40000cgn5h7rc77u681cst5fg", "durationSeconds": 90.883, "width": 576, "height": 1024,
 "keyword": "shoes"}
```

```json
{"type": "trendingHashtag", "rank": 1, "hashtagId": "7691443554018656263", "hashtag": "tiktokscaryhorrorcontest", "country": "US",
 "periodDays": 7, "videoViews": 312182870, "postCount": 73462, "industries": [],
 "popularityCurve": [{"date": "2026-10-09T00:00:00Z", "value": 0}, {"date": "2026-10-10T00:00:00Z", "value": 49.96}]}
```

### How much does it cost?

You pay per event: a start fee of $0.005 per run and $0.0017 per record returned. Every record of every mode costs the same, including the records of optional analyses and extras.

- Keyword search pays the start fee again for every further keyword. All other modes pay one start fee per run.
- Example: 100 ads for one keyword cost $0.005 + 100 x $0.0017 = $0.175. Two keywords with 50 ads each cost $0.01 + 100 x $0.0017 = $0.18.
- Example: one ad with keyframe, percentile and interactive analysis is four records: $0.005 + 4 x $0.0017 = $0.0118.
- Example: 100 trending hashtags with details cost $0.005 + 100 x $0.0017 = $0.175.
- A spending limit set on the run is respected: the run stops cleanly when the next record or start fee does not fit.

Free Apify plan: every run returns a sample dataset (a real result of the prefilled input) so you can see the output format; your input is not used and nothing is charged. To run your own queries, use any paid Apify plan.

### Use cases

- Study which ads perform best in your industry and region: hooks, length, objective and likes.
- Watch trending hashtags, videos and sounds every day and plan content around them.
- Compare the audience of a hashtag or topic by age, gender and country before you commit budget.
- Track the music charts to pick sounds for campaigns.
- Find topics people search for and the videos that already answer them.

### Integrations and API

Runs can be started through the Apify API, scheduled, and connected to integrations such as webhooks, Zapier or Make.

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("clover_folktale/tiktok-creative-center-scraper").call(run_input={"mode": "trendingHashtags", "country": "US", "maxResults": 50})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["rank"], item["hashtag"], item["videoViews"])
```

### Tips and limits

- Ad search ranks ads across all regions (a region filter changed nothing in tests), so ads from several markets and languages appear; narrow them with keyword, industry, objective and language.
- The ranking lists hold 100 records at most (trending hashtags, trending videos); ads can be paged much further, up to your `maxResults`.
- Later ad pages are only requested while the page before them brought ads you do not have yet, so a run can return fewer records than `maxResults` when the platform has no more.
- Records already delivered in the run are never charged twice: an ad found under two keywords is returned once.
- Trending videos are read for a period that ended three days ago, because the newest period is not final yet.
- Search insight topics are partly shuffled on every page, so about half of the second page repeats the first; repeats are removed and not charged.
- Ad IDs the platform does not know give no record. A run with four such IDs ends early with a message, so a list full of wrong IDs cannot run up costs.
- The first start fee is charged once the platform has answered; an empty answer counts. An empty region or keyword therefore costs the start fee and nothing else.
- Video and audio addresses in the records are temporary; download what you need soon after the run.
- The regions are the 28 the Creative Center offers for ads and trends; other regions answer with an empty list.

### FAQ

**Do I need a TikTok account?** No login or cookies are needed.

**Is it legal?** Only public data is returned. No phone numbers, messages or other private data. You are responsible for how you use it.

**How fresh is the data?** Each run reads the platform at that moment; trending videos are read for a period that ended three days ago.

**Why are some fields empty?** The platform does not show every field for every ad or video, for example `brandName` or `landingPageUrl`.

**How many results can I get?** Ads: up to 1000 per keyword. Trending hashtags and videos: up to 100 per run. Search words: about 96. Music charts: 50.

**Can I schedule runs and export?** Yes, to JSON, CSV, Excel and more.

### More tools from the same developer

- [TikTok Scraper - Video Search, Hashtags & Author Profiles](https://apify.com/clover_folktale/tiktok-scraper)
- [TikTok Shop Scraper - Products, SKUs, Reviews & Reviewer IDs](https://apify.com/clover_folktale/tiktok-shop-scraper)
- [Douyin 抖音 Scraper - Videos, Comments, User IDs & IP Location](https://apify.com/clover_folktale/douyin-scraper)
- [Instagram Scraper - Posts, Reels, Profiles & Followers](https://apify.com/clover_folktale/instagram-scraper)
- [YouTube Scraper - Shorts, Channel Videos & Video Search](https://apify.com/clover_folktale/youtube-scraper)

# Actor input Schema

## `mode` (type: `string`):

What to scrape: top ads by keyword (or the top ads for the chosen filters), the details and analyses of single ads, trending hashtags, trending videos, trending search words, the music charts, or creator search insights (topics people search for).

## `keywords` (type: `array`):

Search keywords; each keyword is a separate search and pays its own start fee. Leave empty to list the top ads for the chosen filters.

## `adIds` (type: `array`):

Ad IDs (the adId field of a topAds result) or Creative Center ad links. One start fee per run.

## `country` (type: `string`):

Region of the ranking. These are the regions the Creative Center offers. Ad search (mode topAds) does not use it: the platform ranks ads across regions.

## `industry` (type: `string`):

Only ads or hashtags of this industry. Leave empty for all industries.

## `adPeriod` (type: `string`):

Time window of the ad ranking.

## `adSort` (type: `string`):

Order of the ads: the Creative Center's default ranking, or by likes.

## `objective` (type: `string`):

Only ads with this campaign objective. Leave empty for all.

## `adLanguage` (type: `string`):

Only ads in this language. Leave empty for all.

## `adFormat` (type: `string`):

Only Spark Ads (boosted organic posts) or only other ads. Leave empty for both.

## `adPerformance` (type: `string`):

Only ads in this fifth of the ranking by performance. Leave empty for all.

## `includeKeyframe` (type: `boolean`):

Add one record per ad with the second-by-second retention curve. Charged as one more result.

## `includePercentile` (type: `boolean`):

Add one record per ad with its click-through rate percentile among all ads. Charged as one more result.

## `includeInteractive` (type: `boolean`):

Add one record per ad with the viewer-interaction curve and its percentile. Charged as one more result.

## `hashtagPeriod` (type: `string`):

Time window of the hashtag ranking.

## `videoPeriod` (type: `string`):

Standard or longer ranking window of the trending videos.

## `videoSort` (type: `string`):

Metric the trending videos are ranked by.

## `organicOnly` (type: `boolean`):

Leave out videos that are ads.

## `includeDetails` (type: `boolean`):

Complete every record with its detail view: audience ages, countries and recent videos for a hashtag, comments and author region for a video. Slower; the records cost the same.

## `chart` (type: `string`):

Which music chart to read.

## `includeAudience` (type: `boolean`):

Add one record per topic with the age, gender and location of the people searching. Charged as one more result.

## `includeTrend` (type: `boolean`):

Add one record per topic with its weekly trend and top countries. Charged as one more result.

## `includeVideos` (type: `boolean`):

Add the top videos of each topic as records (up to 20 per topic). Each video is charged as one result.

## `maxResults` (type: `integer`):

Maximum records for each input (up to 1000; a mode without a list is one input). You are charged $0.0017 per record returned, plus a $0.005 start fee per run. Keyword search pays the start fee again for every further keyword.

## Actor input object example

```json
{
  "mode": "topAds",
  "keywords": [
    "shoes"
  ],
  "country": "US",
  "adPeriod": "180",
  "adSort": "for_you",
  "includeKeyframe": false,
  "includePercentile": false,
  "includeInteractive": false,
  "hashtagPeriod": "7",
  "videoPeriod": "standard",
  "videoSort": "views",
  "organicOnly": false,
  "includeDetails": false,
  "chart": "top",
  "includeAudience": false,
  "includeTrend": false,
  "includeVideos": false,
  "maxResults": 20
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped items (JSON, CSV, Excel via the dataset API).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "shoes"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("clover_folktale/tiktok-creative-center-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "keywords": ["shoes"] }

# Run the Actor and wait for it to finish
run = client.actor("clover_folktale/tiktok-creative-center-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "shoes"
  ]
}' |
apify call clover_folktale/tiktok-creative-center-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clover_folktale/tiktok-creative-center-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GIZmZeD1neVkmB0wR/builds/1XebJ7u6HG5cT5bPc/openapi.json
