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

Returns TikTok Creative Center lists as rows: top ads with CTR score, likes, objective, industry, video file and landing page, plus TikTok's visitor preview of trending hashtags (top 3 per list, with posts, views and trend curve) and trending videos (top 4 per list), per country. No login.

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

## Pricing

from $0.65 / 1,000 list entries

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 📈 TikTok Creative Center Scraper - Top Ads & Trends, No Login

Returns the lists of the [TikTok Creative Center](https://ads.tiktok.com/business/creativecenter/inspiration/topads/pc/en) as rows: the **top ads** of a country with CTR score, likes, objective, industry, video file and landing page, the **trending hashtags** with posts, views and trend curve, and the **trending videos**. No login, no cookies, no browser. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

**What a row costs**

| Plan | Row (ad, hashtag or video) | Ad details (optional, per ad) |
|---|---|---|
| Free | $0.0008 | $0.0005 |
| Bronze | $0.00075 | $0.00047 |
| Silver | $0.0007 | $0.00044 |
| Gold and above | $0.00065 | $0.0004 |

100 top ads cost $0.08 on the Free plan, $0.13 with landing pages. **Not charged:** a list TikTok has no entries for, a country it does not cover, an ad whose details did not come (the row is saved at the row price), and a run that could not read TikTok at all.

**What users report on other Creative Center Actors, and what this one does**

| Reported or stated there | Here |
|---|---|
| "Add cookies from an account that can access TikTok Creative Center" (required input) | No account, no cookies. The Actor reads what a logged-out visitor is shown. |
| "trending_hashtags: totalCount capped at exactly 3 for every filter combination" (open issue) | That is TikTok's limit for visitors since its 2026 rework, and it is stated here. With `hashtagsByIndustry` the Actor reads the top 3 of each of the 15 industries plus the overall list: 48 entries per country and period. |
| "not working", "TypeError ... after API deprecation", "TikTok Creative Center Update" (May 2026 issues) | Built on the reworked site of 2026. Songs and creators, which TikTok closed, are refused with a note instead of failing a run. |
| "Without login TikTok surfaces roughly 20-100 top ads per filter combination" | A visitor gets 20 per list call. This Actor asks the same list in TikTok's seven sort orders and by objective and likes tier, and keeps each ad once: 122 of the 136 ads TikTok counted for the US in 30 days in one run. |
| "The Actor does not paginate automatically", one page per run | One run reads several lists, countries and industries. |
| "Free tier: up to 5 top ads per run, 5 runs per day" | No plan limits. Your spending limit is the only cap. |
| 1 to 4 GB of memory; one starts a browser in every run | Plain HTTP at 256 MB; a default run takes about two seconds. |

### 🔎 What is the TikTok Creative Center Scraper?

The Creative Center is TikTok's own showcase of what performs on the platform: the ads with the best results per country and industry, and the hashtags and videos that are trending. This Actor calls the same data endpoints the Creative Center pages call, with the headers the site's own script sets for a visitor who is not logged in.

#### What data does it extract?

- **Top ads** (`listType: topAd`): ad text, brand, TikTok's CTR score, likes, spend tier, industry, campaign objective, video file in the best quality given, cover image, length and size, the ad's page in the Creative Center, and its rank in the list.
- **Ad details** (optional): landing page, comments, shares, the countries the ad runs in, source and voice-over flag.
- **Trending hashtags** (`listType: hashtag`): rank, posts and views in the period, industries, a popularity value per day, and the three creators TikTok names for the hashtag.
- **Trending videos** (`listType: video`): rank, caption, post date, views, organic views, engagement rate, six-second view rate, content tags, creator handle and followers, video file and cover.

Every row carries `listType`, `listName`, `country`, `periodDays` and `rank`.

### ⬇️ Input

| Field | What it does |
|---|---|
| `lists` | `topAds`, `hashtags`, `videos`. Empty means `topAds`. |
| `countries` | Two-letter codes. Top ads: 28 countries and `ALL`. Hashtags: 27 countries. Videos: US, JP, VN, TH, ID. Empty means `US`. |
| `period` | Days. Top ads 7, 30, 180; hashtags 7, 30, 90; videos 7, 30. Another number becomes the nearest one. Default 30. |
| `maxItems` | Rows per list. Above 20, a top ads list is read deeper (see below). Default 20. |
| `includeDetails` | Adds landing page, comments, shares and countries to every top ad. |
| `orderBy` | Top ads: `for_you`, `ctr`, `like`, `cvr`, `play_2s_rate`, `play_6s_rate`, `impression`. |
| `industries` | Names or ids. Each industry is a list of its own. |
| `hashtagsByIndustry` | Reads the hashtag list of each of the 15 industries as well. |
| `objectives`, `likeTiers`, `adLanguages`, `adFormat` | Filters of the top ads list. |
| `videoOrderBy`, `videoContentTags`, `videosByContentTag` | Orders and content tags of the video lists. |

The input names of other Creative Center Actors are read too: `mode`, `target`, `region`, `countryCode`, `maxResults`, `extractDetails`, `fetchAdDetails`, `industry`, `objective`, `likeTier`, `adLanguage`.

#### Example input

```json
{
  "lists": ["topAds", "hashtags"],
  "countries": ["US", "GB"],
  "period": 30,
  "maxItems": 100,
  "includeDetails": true,
  "hashtagsByIndustry": true
}
```

### ⬆️ Output

A top ad (links shortened):

```json
{
  "listType": "topAd",
  "listName": "topAds US 30d",
  "country": "US",
  "periodDays": 30,
  "rank": 1,
  "readVia": null,
  "orderBy": "for_you",
  "adId": "7687535563487117319",
  "adTitle": "What happens next,Click Here to read on!",
  "brandName": null,
  "ctr": 0.69,
  "likes": 1,
  "costScore": 0,
  "industryKey": "label_23118000000",
  "industryName": "Reading",
  "objectiveKey": "campaign_objective_conversion",
  "objective": "Conversions",
  "isSearchAd": true,
  "videoId": "v14033g50000dao1927og65gpdvf88ag",
  "durationSec": 234.034,
  "width": 720,
  "height": 1280,
  "coverUrl": "https://p16-common-sign.tiktokcdn.com/...",
  "videoUrl": "https://v16m-default.tiktokcdn.com/...",
  "videoQuality": "1080p",
  "videoUrl720p": "https://v16m-default.tiktokcdn.com/...",
  "detailUrl": "https://ads.tiktok.com/business/creativecenter/topads/7687535563487117319/pc/en?countryCode=US&period=30",
  "detailFetched": true,
  "landingPageUrl": "https://ad.thnovel.com/wap-ad/pages/...",
  "comments": 0,
  "shares": 0,
  "countryCodes": ["NZ", "NO", "GB", "CA", "SG", "ES", "US", "AU", "SE", "OM"],
  "keywords": [],
  "source": "TikTok Ads Manager",
  "voiceOver": false,
  "scrapedAt": "2026-10-07T06:57:59.770495+00:00"
}
```

A trending hashtag:

```json
{
  "listType": "hashtag",
  "listName": "hashtags US 90d",
  "country": "US",
  "periodDays": 90,
  "rank": 1,
  "industryFilter": null,
  "hashtagId": "7675592944980033556",
  "hashtagName": "citytastetest",
  "hashtagUrl": "https://www.tiktok.com/tag/citytastetest",
  "posts": 1795840,
  "views": 1875928101,
  "industryIds": [],
  "industryNames": [],
  "trend": [{"date": "2026-10-04", "value": 100}, {"date": "2026-10-05", "value": 99.47}],
  "topCreators": [{"rank": 1, "handle": "outruncook", "nickname": "Out Run Cook", "followers": 317603, "country": "US", "profileUrl": "https://www.tiktok.com/@outruncook"}],
  "detailUrl": "https://ads.tiktok.com/creative/creativeCenter/trends/hashtag/7675592944980033556?region=US&period=90",
  "scrapedAt": "2026-10-07T06:57:45.386054+00:00"
}
```

A trending video:

```json
{
  "listType": "video",
  "listName": "videos US 30d views",
  "country": "US",
  "periodDays": 30,
  "rank": 1,
  "orderBy": "views",
  "contentTagFilter": null,
  "videoId": "7681432597599210765",
  "tiktokUrl": "https://www.tiktok.com/@thejcheneats/video/7681432597599210765",
  "title": "#ad Trying @Domino's NEW Domino ...",
  "createdAt": "2026-09-03T22:01:51Z",
  "views": 98482460,
  "organicViews": 41073252,
  "engagementRate": 0.0016884224866031982,
  "sixSecondViewRate": 0.03331283991786642,
  "contentTags": ["Food & Beverage"],
  "authorHandle": "thejcheneats",
  "authorName": "thejcheneats",
  "authorFollowers": 773972,
  "coverUrl": "https://p16-common-sign.tiktokcdn-us.com/...",
  "videoUrl": "https://v16m-default.tiktokcdn-us.com/...",
  "scrapedAt": "2026-10-07T06:57:48.391788+00:00"
}
```

The run's key-value store holds a `SUMMARY` record: rows per list, TikTok's own count per top ads list, the lists without entries, and the reason a run stopped early.

### 🔬 How more than 20 top ads are read

TikTok shows a visitor the first 20 ads of a top ads list and its total count; page 2 is empty without a login. Another sort order or filter is another list with partly other ads. For `maxItems` above 20 the Actor asks the same country, period and industry again in the other six sort orders, then by objective, by likes tier and by combinations of the two, until it has what you asked for, TikTok's count is reached or six calls in a row bring no new ad.

- The first 20 rows carry their `rank` in the order you chose. Further rows have `rank: null` and `readVia`, for example `sorted by ctr` or `objective Conversions, likes tier 5`. Sort them by `ctr` or `likes` yourself.
- The status message says when TikTok counts more than the Actor could reach, for example `topAds US 30d 122 of 136`.
- TikTok's count for a list ends at 400.

### 📏 Limits, stated plainly

- **Hashtags: the top 3 per list.** A logged-out visitor gets three hashtags per country, period and industry, no more. Per-industry lists give up to 48 entries per country and period (46 different hashtags in a US test).
- **Videos: the top 4 per list**, for US, JP, VN, TH and ID only. With three orders and five content tags that is up to 72 entries per country and period.
- **Top ads: what a visitor's filters reach**, see above. Not every ad TikTok counts.
- **No keyword search.** The top ads search returned nothing to a visitor for every word tried.
- **No songs, no creators.** TikTok closed both rankings; its endpoints answer `deprecated`.
- **No rank change, no "new on board" flag** in the hashtag data TikTok serves now.
- **`ctr` is TikTok's score between 0 and 1**, not a measured click rate. `costScore` is a relative spend tier.
- **`brandName` is filled for few ads** (6 of 20 and 1 of 10 in two test runs), and it is TikTok's own text: some ads read `Not Mention`.
- **Video and cover links are signed and expire.** Download what you need soon after the run.
- **With details the Actor reads about 27 ads a minute.** TikTok allows a visitor 30 quick calls and then answers "too many requests" for about a minute; the Actor stays below that and waits when it happens.
- Hashtag lists exist for 27 countries (US, FR, DE, IT, ES, GB, AR, AU, BR, CA, CO, EG, ID, IL, JP, KR, MY, MX, PH, SA, SG, ZA, TW, TH, TR, AE, VN), top ads for 28.

### ⏱ Measured

On a test server outside Apify, on 2026-10-07, without a proxy. Times on Apify can differ and will be replaced with cloud measurements.

| Run | Rows | Time |
|---|---|---|
| Default: top ads US, 30 days | 20 | 2 s |
| Top ads US, 30 days, `maxItems` 200 | 122 (TikTok counts 136), 50 list calls | 109 s |
| Three industries in the US and in all countries, objectives filter, 16 hashtag lists, 6 video lists | 312 from 28 lists | 59 s |
| Top ads US and GB with details (90 ads), hashtags, videos | 104 | 3.5 min |

Peak memory was 76 MB. An answer with 20 ads is about 50 KB, a detail record 2 to 4 KB, a hashtag list 3 to 16 KB, a video list 10 to 13 KB. Five visitors (one German address, four US addresses) got identical lists.

### 🤖 For AI agents

One input to copy; no credential is needed, every list input is an array:

```json
{"lists": ["topAds"], "countries": ["US"], "period": 30, "maxItems": 20}
```

- Cost: rows × $0.0008 on the Free plan, plus $0.0005 per ad with `includeDetails`. The default input returns 20 rows for $0.016.
- `lists` takes `topAds`, `hashtags`, `videos`. Hashtag lists return 3 rows each and video lists 4, whatever `maxItems` says.
- Rows are told apart by `listType` (`topAd`, `hashtag`, `video`); ids are `adId`, `hashtagId`, `videoId`.
- An empty dataset with a SUCCEEDED run means TikTok has no such list (the status message names it).

### 💡 Use cases

- 🎯 **Creative research:** the top ads of your industry and country with their video files, weekly, as a swipe file.
- 🛒 **Product and offer research:** `objectives: ["Conversions", "Product sales"]` with `includeDetails` shows which landing pages the winning ads send traffic to.
- 📊 **Trend monitoring:** schedule `hashtags` with `hashtagsByIndustry` daily and keep the trend curves.
- 🧠 **Briefs and reports:** feed top ads and trending videos of a market into a dashboard or an AI agent.

### ❓ FAQ

**Do I need a TikTok account or cookies?** No. The Actor reads what TikTok shows a visitor who is not logged in.

**Why only 3 hashtags and 4 videos per list?** That is TikTok's preview for visitors since it reworked the Creative Center in 2026. Actors that return more ask for your account's cookies.

**Why do some top ads have no rank?** Only the first 20 of a list come in TikTok's order. Further ads are found through other orders and filters of the same list; `readVia` says which.

**Can I get every top ad of a country?** Not always. In a test the Actor reached 122 of 136. The status message and the `SUMMARY` record give both numbers.

**How do the fields differ from other Creative Center Actors?** Names follow the flat style of the top-ads Actors: `adId`, `adTitle`, `brandName`, `ctr`, `likes`, `costScore`, `industryKey`, `industryName`, `objectiveKey`, `videoId`, `durationSec`, `coverUrl`, `videoUrl720p`, `detailUrl`, `landingPageUrl`, `keywords`, `detailFetched`, `rank`. Different here: `videoUrl` is the best quality given (`videoQuality` says which) instead of one column per quality; `countryCodes`, `comments` and `shares` come with details; `periodDays` and `country` name the list; `isSearchAd` replaces `isSearch`. Actors that return TikTok's raw answer use `ad_title`, `like`, `video_info` and so on; those are not kept.

**What happens at my spending limit?** The Actor counts the limit in money, saves what fits and stops. A list that was cut is read on when you resurrect the run; no row is saved twice.

**Does a run that is moved to another server repeat rows?** No. A continued run reads what is in its dataset first and saves only what is missing.

**How fresh is the data?** TikTok updates the lists daily; hashtag curves ended one to two days before the run in tests.

**Is it legal?** The Actor reads public advertising and trend data that TikTok publishes for anyone without a login. Rows can contain creator handles and display names; if you store or process them, you are responsible for complying with GDPR, CCPA and TikTok's terms. Do not use the data for spam.

### 🔗 You might also like

- [TikTok Scraper](https://apify.com/benthepythondev/tiktok-scraper): profiles and their videos.
- [TikTok Comments Scraper](https://apify.com/benthepythondev/tiktok-comments-scraper): all comments of a video.
- [TikTok Shop Scraper](https://apify.com/benthepythondev/tiktok-shop-scraper): products, categories and stores.
- [Meta Ad Library Scraper](https://apify.com/benthepythondev/meta-ad-library-scraper): ads on Facebook and Instagram.
- [Google Ads Transparency Scraper](https://apify.com/benthepythondev/google-ads-transparency-scraper): ads on Google and YouTube.

**Keywords:** tiktok creative center scraper, tiktok top ads scraper, tiktok ad spy, tiktok ads library, tiktok trending hashtags, tiktok trends api, tiktok trending videos, tiktok ad creatives, tiktok ad research, competitor ads tiktok, tiktok landing pages, tiktok ctr, tiktok hashtag analytics, tiktok creative center api, top performing tiktok ads, tiktok ads by industry, tiktok ads by country, tiktok marketing data

# Actor input Schema

## `lists` (type: `array`):

Chooses which Creative Center lists are read: topAds (the top ads), hashtags (the trending hashtags) and videos (the trending videos). Every list is read for every country below. Empty means topAds. TikTok closed its song and creator rankings in 2026.

## `countries` (type: `array`):

Sets the countries to read, as two-letter codes such as US, GB, DE, JP. Top ads exist for 28 countries (and ALL for every country at once), hashtags for 27, videos for US, JP, VN, TH and ID. A country TikTok has no list for gives no rows and costs nothing. Empty means US.

## `period` (type: `integer`):

Sets the time window in days. Top ads offer 7, 30 and 180, hashtags 7, 30 and 90, videos 7 and 30; another number is replaced by the nearest one the list offers, and each row says which window it is from.

## `maxItems` (type: `integer`):

Caps the rows of one list, where a list is one kind, country, period and filter. A logged-out visitor gets 20 top ads per list call, so for more than 20 the Actor asks the same list again in TikTok's other sort orders and filters and keeps each ad once. Hashtag lists have 3 entries and video lists 4, whatever is set here.

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

Adds the detail record to every top ad: landing page, comments, shares, the countries the ad runs in and its keywords. One more request per ad (about 27 ads a minute) and a second charge per ad.

## `orderBy` (type: `string`):

Sets the order of the top ads list: for_you (TikTok's default), ctr, like, cvr, play_2s_rate, play_6s_rate or impression (reach). The first 20 rows carry their rank in this order.

## `industries` (type: `array`):

Narrows top ads and hashtags to industries, by TikTok's name or id (for example Beauty & Personal Care or 14000000000). Each industry is a list of its own with its own rows. Top ads know 258 industries; hashtag lists know 15 main ones and skip the others.

## `hashtagsByIndustry` (type: `boolean`):

Reads the hashtag list of each of the 15 industries in addition to the overall list: 16 lists of 3 hashtags per country. A hashtag that is in several lists gives a row in each.

## `objectives` (type: `array`):

Keeps top ads with these campaign objectives: Traffic, App Installs, Conversions, Video Views, Reach, Lead Generation, Product sales.

## `likeTiers` (type: `array`):

Keeps top ads whose likes are in these tiers: 1 is the top 1-20%, 2 the top 21-40%, up to 5 for 81-100%.

## `adLanguages` (type: `array`):

Keeps top ads in these languages, as TikTok's codes: en, es, ar, vi, th, de, id, pt, fr, ms, nl, ja, it, ro, zh-Hant, ko.

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

Keeps Spark ads (ads made from organic posts) or non-Spark ads only. Empty keeps both.

## `videoOrderBy` (type: `array`):

Chooses the orders of the trending videos list: views, engagement, six_second_view_rate. Each order is a list of its own with 4 videos. Empty means views.

## `videoContentTags` (type: `array`):

Narrows trending videos to content tags: Beauty & Care, Fashion, Food & Beverage, Lifestyle & Leisure, Technology & Finance. Each tag is a list of its own with 4 videos.

## `videosByContentTag` (type: `boolean`):

Reads the video list of each of the five content tags in addition to the overall list: 6 lists of 4 videos per country and order.

## `debug` (type: `boolean`):

Logs every request with its size and time. For support.

## Actor input object example

```json
{
  "lists": [
    "topAds"
  ],
  "countries": [
    "US"
  ],
  "period": 30,
  "maxItems": 20,
  "includeDetails": false,
  "orderBy": "for_you",
  "hashtagsByIndustry": false,
  "adFormat": "",
  "videosByContentTag": false,
  "debug": false
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

# 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 = {
    "lists": [
        "topAds"
    ],
    "countries": [
        "US"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/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 = {
    "lists": ["topAds"],
    "countries": ["US"],
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/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 '{
  "lists": [
    "topAds"
  ],
  "countries": [
    "US"
  ]
}' |
apify call benthepythondev/tiktok-creative-center-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,benthepythondev/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/4aj7wJBMRwyyqwzgA/builds/ljOhiJqgqFdio2eFt/openapi.json
