# TikTok Creative Center Scraper for Top Ads (`maximedupre/tiktok-creative-center-scraper`) Actor

Collect ranked public TikTok Creative Center Top Ads and trending hashtags for creative and competitor research. Choose a market, time window, CTR ranking, and useful filters, then save structured rows with source links and public metrics.

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

## Pricing

from $1.25 / 1,000 top ads

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

### 🎯 Public TikTok Creative Center research for marketers

This TikTok Creative Center scraper helps marketing teams, creative researchers, and competitor analysts collect ranked public TikTok Creative Center Top Ads and trending hashtags. Choose a market and time window, rank Top Ads by CTR, and save source links, creative details, public performance data, and hashtag popularity in an Apify Dataset. Public Creative Center access does not require a user-supplied source credential.

- Compare ranked public ads by market and time window with **[TikTok Top Ads](https://apify.com/maximedupre/tiktok-creative-center-scraper/examples/tiktok-top-ads)**.
- Review public ad creative and performance fields for campaign research with **[TikTok Ad Examples](https://apify.com/maximedupre/tiktok-creative-center-scraper/examples/tiktok-ad-examples)**.
- Track ranked hashtag names, categories, and popularity signals with **[TikTok Trending Hashtags](https://apify.com/maximedupre/tiktok-creative-center-scraper/examples/tiktok-trending-hashtags)**.
- Plan hashtag-focused Creative Center research with **[TikTok Hashtag Research](https://apify.com/maximedupre/tiktok-creative-center-scraper/examples/tiktok-hashtag-research)**.
- Explore both supported result types in one public data workflow with **[TikTok Creative Center](https://apify.com/maximedupre/tiktok-creative-center-scraper/examples/tiktok-creative-center)**.

#### 📊 Public Top Ads and Trending Hashtags

Each Dataset row represents one eligible public Creative Center result. Top Ads rows can include source identity, caption, rank, market, creative details, public performance values, media links, landing-page context, and target countries. Trending hashtag rows can include rank, market, category, public video and view counts, and source or analytics links. Optional fields appear only when TikTok provides them, and unavailable source values are not invented.

#### ▶️ Run a Focused TikTok Creative Center Collection

1. Choose `Top Ads` or `Trending hashtags` in `resultType`.
2. For Top Ads, choose a ranking signal and add any matching keyword, industry, objective, language, format, or likes filter.
3. Choose the `market` and `timeWindow`. Set `maxItems` when you want to stop after a chosen number of returned rows.
4. Start the Actor and open the `results` link to review the Dataset.

The Actor uses public Creative Center surfaces and does not require a user-supplied source credential.

#### ⚙️ Input

Choose one public result type. Filters for the other result type are ignored.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `resultType` | string: `topAds` or `trendingHashtags` | Chooses ranked public Top Ads or ranked public trending hashtags. |
| `topAdsRanking` | string: `ctr`, `engagement`, `impressions`, `conversion`, `viewRate`, or `forYou` | Chooses the signal used to rank Top Ads. |
| `topAdsKeyword` | optional string | Searches Top Ads with one brand or product keyword. Leave it empty for all keywords. |
| `topAdsIndustry` | optional string | Filters Top Ads by one Creative Center industry value. Leave it empty for all industries. |
| `topAdsObjective` | optional string | Filters Top Ads by one campaign objective value. Leave it empty for all objectives. |
| `topAdsLanguage` | optional string | Filters Top Ads by one ad language value. Leave it empty for all languages. |
| `topAdsFormat` | string: `all`, `spark`, or `nonSpark` | Chooses whether Top Ads can include all formats, Spark ads, or non-Spark ads. |
| `topAdsLikesBand` | optional string | Filters Top Ads by one source likes band, such as `10K-100K`. Leave it empty for all bands. |
| `trendingHashtagCategory` | optional string | Filters trending hashtags by one industry or category. Leave it empty for all categories. |
| `market` | string | Sets the Creative Center market, such as `US`. |
| `timeWindow` | string: `7d` or `30d` | Sets the lookback window for Top Ads or trending hashtags. |
| `maxItems` | optional integer, minimum 1 | Stops after this many returned rows. Leave it empty to return all available results until the public source is exhausted. |

**Example input**

This is the public input from a successful current-beta default-input run.

```json
{
  "resultType": "topAds",
  "topAdsRanking": "ctr",
  "topAdsFormat": "all",
  "market": "US",
  "timeWindow": "30d",
  "maxItems": 25
}
```

#### 🧾 Output

The run output exposes a link to the successful Dataset.

**Run output**

| Field | Type | What it does |
| --- | --- | --- |
| `results` | URL string | Opens the successful Creative Center results in the default Dataset view. |

**Top Ads rows**

| Field | Type | What it does |
| --- | --- | --- |
| `resultType` | string | Identifies this row as `topAds`. |
| `adId` | string | Source identifier for the Top Ad. |
| `rank` | integer | Rank reported by the public source. |
| `market` | string | Creative Center market reported for the row. |
| `caption` | string | Source caption for the Top Ad. |
| `industry` | string | Source industry when available. |
| `campaignObjective` | string | Source campaign objective when available. |
| `videoDurationSeconds` | number | Source video duration in seconds when available. |
| `videoDimensions` | object | Video dimensions when available. |
| `videoDimensions.width` | integer | Video width in pixels. |
| `videoDimensions.height` | integer | Video height in pixels. |
| `advertiser` | object | Advertiser identity when available. |
| `advertiser.name` | string | Advertiser or brand name. |
| `performance` | object | Public performance values reported for the Top Ad. |
| `performance.ctr` | number | Source-reported click-through rate. |
| `performance.likes` | integer | Source-reported like count. |
| `performance.comments` | integer | Source-reported comment count. |
| `performance.shares` | integer | Source-reported share count. |
| `performance.relativeCost` | number | Relative cost signal reported by the source. |
| `media` | object | Source-hosted media links. |
| `media.coverImageUrl` | URL string | Direct source URL for the ad cover image. |
| `media.videoUrl` | URL string | Main direct source URL for the ad video. |
| `media.alternateVideoUrls` | array of URL strings | Direct source URLs for other available video resolutions. |
| `landingPage` | object | Landing-page context when available. |
| `landingPage.url` | URL string | Public landing-page URL. |
| `landingPage.title` | string | Landing-page title when available. |
| `targetCountries` | array of strings | Countries targeted by the Top Ad when reported. |
| `hashtags` | array of strings | Hashtags in the Top Ad creative when exposed. |
| `mentions` | array of strings | Mentions in the Top Ad creative when exposed. |
| `sourceUrl` | URL string | Public Creative Center source URL for the row. |

This complete row is from a successful current-beta default-input run.

```json
{
  "resultType": "topAds",
  "adId": "7449696075790336017",
  "rank": 1,
  "market": "US",
  "caption": "Hardcore Gamer? Entropia is a Real Cash Economy MMO, meaning every item has a real world value.",
  "industry": "label_23125000000",
  "campaignObjective": "campaign_objective_traffic",
  "videoDurationSeconds": 23.546,
  "videoDimensions": {
    "width": 720,
    "height": 1280
  },
  "advertiser": {
    "name": "EntropiaUniverseOfficial"
  },
  "performance": {
    "ctr": 0.03,
    "likes": 904,
    "comments": 1,
    "shares": 12,
    "relativeCost": 2
  },
  "media": {
    "coverImageUrl": "https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0051c001-sg/o8CbbeGNEWGelWDDIQEJoo1IBKVLIGVTDQAALf~tplv-noop.image?dr=18692&refresh_token=acecf39f&x-expires=1790129594&x-signature=ZvSocHVBWXToKIRV7VZ4hFEG1RM%3D&t=9276707c&ps=14f1eb3e&shp=9e36835a&shcp=317596d8&idc=my2&VideoID=v14033g50000da439enog65la0i39vig",
    "videoUrl": "https://v16m-default.tiktokcdn.com/77a29cbb2b09e41fcef6f1644fd3f923/6ab335ba/video/tos/alisg/tos-alisg-ve-0051c001-sg/owxZQgEfXGAnRoIgZULODbOgbGDAMC9xIZeeFI/?a=0&bti=NTU4QDM1NGA%3D&&bt=1460&ft=cApXJCz7ThWHJUhHLGZmo0P&mime_type=video_mp4&rc=NzM5OTs0ZWloNTY8NDszZ0Bpank2M285cmg2ZDMzODYzNEBjNS4vLzBfXzUxYWBfNTQuYSNmNmZeMmRrNjFhLS1kMDFzcw%3D%3D&vvpl=1&l=20260923041251D0538D8FBBB0CACB24BE&btag=e000b8000",
    "alternateVideoUrls": [
      "https://v16m-default.tiktokcdn.com/9f85b9db2bd0cc80b8d7a87fab8664b0/6ab335ba/video/tos/alisg/tos-alisg-ve-0051c001-sg/ogMIiAAihIBzxmQwvSBsmGEVXCoVBfMAo0Uz0i/?a=0&bti=NTU4QDM1NGA%3D&&bt=2792&ft=cApXJCz7ThWHJUhHLGZmo0P&mime_type=video_mp4&rc=OjY6OTo6ODdmZ2Q1ZmYzM0Bpank2M285cmg2ZDMzODYzNEBeNDUtYS4yXjAxNTUzMy9jYSNmNmZeMmRrNjFhLS1kMDFzcw%3D%3D&vvpl=1&l=20260923041251D0538D8FBBB0CACB24BE&btag=e000b8000",
      "https://v16m-default.tiktokcdn.com/78500cc25b801d8f4a8fc8339bd1ff7f/6ab335ba/video/tos/alisg/tos-alisg-ve-0051c001-sg/oARVGzQCIimMuWBAVozBiBzAsE20ohdfwAviFm/?a=0&bti=NTU4QDM1NGA%3D&&bt=506&ft=cApXJCz7ThWHJUhHLGZmo0P&mime_type=video_mp4&rc=ZzZkNDc6NTo4Ojs1MzU7ZUBpank2M285cmg2ZDMzODYzNEA1MmAyYTMwNjQxNGM2Xl4tYSNmNmZeMmRrNjFhLS1kMDFzcw%3D%3D&vvpl=1&l=20260923041251D0538D8FBBB0CACB24BE&btag=e000b8000",
      "https://v16m-default.tiktokcdn.com/eb50e5bcd13d840a9330ad662f560756/6ab335ba/video/tos/alisg/tos-alisg-ve-0051c001-sg/o4AJABzzoiVQCmKEGCifAiosdBzvvVIzm1hM0w/?a=0&bti=NTU4QDM1NGA%3D&&bt=747&ft=cApXJCz7ThWHJUhHLGZmo0P&mime_type=video_mp4&rc=Ozw6Z2UzZTo0ZmU7Mzg4aEBpank2M285cmg2ZDMzODYzNEBhLS9gLl42X18xNl8tXjMvYSNmNmZeMmRrNjFhLS1kMDFzcw%3D%3D&vvpl=1&l=20260923041251D0538D8FBBB0CACB24BE&btag=e000b8000",
      "https://v16m-default.tiktokcdn.com/a30f5a6c768c53b539ae7f42ffc2ca70/6ab335ba/video/tos/alisg/tos-alisg-ve-0051c001-sg/oMmzoz3BfAAAQ0BVBz9iGvEwMimsVsIChoiIAC/?a=0&bti=NTU4QDM1NGA%3D&&bt=995&ft=cApXJCz7ThWHJUhHLGZmo0P&mime_type=video_mp4&rc=Z2VoZTlnNDZmaDU2NzVkOUBpank2M285cmg2ZDMzODYzNEBgLjU1YzMyXy0xMTUwLjY0YSNmNmZeMmRrNjFhLS1kMDFzcw%3D%3D&vvpl=1&l=20260923041251D0538D8FBBB0CACB24BE&btag=e000b8000"
    ]
  },
  "landingPage": {
    "url": "https://www.entropiauniverse.com/?ccode=tiktok&utm_source=tiktok&utm_medium=paid",
    "title": "Entropia Universe - The Ultimate MMO Experience"
  },
  "targetCountries": [
    "GB",
    "US",
    "FR",
    "DE",
    "PL",
    "SE",
    "IE",
    "BE",
    "NO",
    "HU",
    "FI",
    "DK",
    "RO"
  ],
  "sourceUrl": "https://ads.tiktok.com/business/creativecenter/topads/7449696075790336017/pc/en?countryCode=US&period=30"
}
```

**Trending hashtag rows**

| Field | Type | What it does |
| --- | --- | --- |
| `resultType` | string | Identifies this row as `trendingHashtags`. |
| `hashtag` | string | Source name of the trending hashtag. |
| `rank` | integer | Rank reported by the public source. |
| `market` | string | Creative Center market reported for the row. |
| `category` | string | Source category for the trending hashtag. |
| `popularity` | object | Public popularity metrics for the hashtag. |
| `popularity.videoCount` | integer | Source-reported number of public videos for the hashtag. |
| `popularity.viewCount` | integer | Source-reported public view count for the hashtag. |
| `sourceUrl` | URL string | Public source URL for the hashtag. |
| `analyticsUrl` | URL string | Public analytics URL when available. |

This complete row is from a successful current-beta trending-hashtag run.

```json
{
  "resultType": "trendingHashtags",
  "hashtag": "securepayeveryday",
  "rank": 1,
  "market": "US",
  "category": "14000000000",
  "popularity": {
    "videoCount": 51580,
    "viewCount": 52239570
  },
  "sourceUrl": "https://ads.tiktok.com/creative/creativeCenter/trends/hashtag/7619137204643856414?region=US&period=30",
  "analyticsUrl": "https://ads.tiktok.com/creative/creativeCenter/trends/hashtag/7619137204643856414?region=US&period=30"
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. A primary event covers one successfully returned public row of its matching type. Current tier prices are shown in the Apify pricing panel.

| Event | What it covers |
| --- | --- |
| `Top Ad` | One public Top Ad saved to your Dataset. |
| `Trending Hashtag` | One public trending hashtag with its available trend metrics saved to your Dataset. |

#### 🔌 Integrations

Open the `results` link in Apify, use the default Dataset API, or export the saved rows in a standard Apify format.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Which public data can I collect?

Choose ranked public Top Ads or ranked public trending hashtags. Top Ads can include creative, performance, media, landing-page, and targeting fields. Hashtag rows can include category, popularity, and source links.

##### Do I need a TikTok account or API key?

No. This Actor uses public Creative Center surfaces and does not require a user-supplied source credential.

##### How are Top Ads ranked?

CTR is the default ranking signal. The input also offers engagement, impressions, conversion, view rate, and For You choices for the selected Top Ads collection.

##### Can one run collect both result types?

No. Choose one `resultType` per run. Filters for the other result type are ignored.

##### What happens when TikTok does not provide a field?

Optional fields are omitted from that row. The Actor keeps source values as available and does not create replacement values.

##### What does an empty `maxItems` value do?

Leaving `maxItems` empty returns all available results until the public source is exhausted.

##### Are the media and source links permanent?

They are source-hosted links, so the source may change or expire them. The Actor does not promise long-term media storage.

##### Can one run combine several independently configured ad searches?

No. A run uses one selected result type and one set of input filters.

### 📝 Changelog

**v0.0** (22-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~tiktok-creative-center-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [TikTok Keywords Discovery Tool](https://apify.com/maximedupre/tiktok-keywords-discovery-tool) - Expand hashtag and keyword research before selecting a market.
- [TikTok Hashtag Search Scraper](https://apify.com/maximedupre/tiktok-hashtag-search-scraper) - Review public hashtag metrics for campaign planning.
- [TikTok Shop Trending Products](https://apify.com/maximedupre/tiktok-trending-products) - Add TikTok Shop trend signals to product research.
- [TikTok Creative Center Top Ads Scraper](https://apify.com/parseforge/tiktok-creative-center-top-ads-scraper) - Compare a separate public Top Ads workflow for creative research.
- [TikTok Ads Scraper - Creative Center Top Ads Data, No API Key](https://apify.com/scrapers_lat/tiktok-creative-center-scraper) - Review another Creative Center Top Ads collection when comparing ad data.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `resultType` (type: `string`):

Choose the public Creative Center rows to collect.

## `topAdsRanking` (type: `string`):

Choose the signal used to rank Top Ads. CTR is the default.

## `topAdsKeyword` (type: `string`):

Optional. Search Top Ads with one brand or product keyword. Leave empty for all keywords.

## `topAdsIndustry` (type: `string`):

Optional. Enter one Creative Center industry value to filter Top Ads. Leave empty for all industries.

## `topAdsObjective` (type: `string`):

Optional. Enter one campaign objective value to filter Top Ads. Leave empty for all objectives.

## `topAdsLanguage` (type: `string`):

Optional. Enter one ad language value to filter Top Ads. Leave empty for all languages.

## `topAdsFormat` (type: `string`):

Choose whether Top Ads can include all ads, only Spark ads, or only non-Spark ads.

## `topAdsLikesBand` (type: `string`):

Optional. Enter one likes band used by the source, such as `10K-100K`. Leave empty for all bands.

## `trendingHashtagCategory` (type: `string`):

Optional. Enter one industry or category to filter trending hashtags. Leave empty for all categories.

## `market` (type: `string`):

Choose the Creative Center market for Top Ads or trending hashtags. Enter a market code such as `US`.

## `timeWindow` (type: `string`):

Choose the lookback window for Top Ads or trending hashtags.

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

Optional. Stop after this many returned rows for the selected result type. Leave empty to return all available results until the public source is exhausted.

## Actor input object example

```json
{
  "resultType": "topAds",
  "topAdsRanking": "ctr",
  "topAdsFormat": "all",
  "market": "US",
  "timeWindow": "7d",
  "maxItems": 25
}
```

# Actor output Schema

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

Open the successful Creative Center results.

# 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 = {
    "resultType": "topAds",
    "topAdsRanking": "ctr",
    "topAdsFormat": "all",
    "market": "US",
    "timeWindow": "7d",
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/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 = {
    "resultType": "topAds",
    "topAdsRanking": "ctr",
    "topAdsFormat": "all",
    "market": "US",
    "timeWindow": "7d",
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/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 '{
  "resultType": "topAds",
  "topAdsRanking": "ctr",
  "topAdsFormat": "all",
  "market": "US",
  "timeWindow": "7d",
  "maxItems": 25
}' |
apify call maximedupre/tiktok-creative-center-scraper --silent --output-dataset

```

## MCP server setup

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