# TikTok Creative Center Top Ads Scraper (`pulsedata/tiktok-creative-center-top-ads-scraper`) Actor

Export TikTok's top-performing ads from the Creative Center by country, period, industry and objective: ad title, brand, CTR, likes, landing page and video URLs.

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

## Pricing

from $2.00 / 1,000 ad scrapeds

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

## TikTok Creative Center Top Ads Scraper

This actor exports the ads from TikTok Creative Center's **Top Ads** page, the list of high-performing auction ads TikTok publishes per country. You pick countries, a period (last 7, 30 or 180 days), a ranking, and optionally industries, campaign objectives and ad languages. Each ad comes back as one dataset row with its title, brand, industry, objective, CTR, likes, video URLs and, by default, the landing page.

No TikTok account and no API key are needed. The actor runs on Apify's datacenter proxy.

### What you get per ad

| Field | Meaning |
| --- | --- |
| `adId` | TikTok's ID of the ad creative |
| `rank` | Position in this run's results for the country, in the order the actor found the ads |
| `country`, `period`, `sortedBy` | The country, period and ranking the ad was found under (`ALL` when no country was given) |
| `adTitle`, `brandName` | Ad caption and brand, when TikTok shows one |
| `industry`, `parentIndustry`, `industryId` | Creative Center industry, for example "Skincare" under "Beauty & Personal Care" |
| `objective` | Campaign objective: Traffic, Conversions, App Installs, Video Views, Reach, Lead Generation, Product Sales or App Promotion |
| `ctr`, `likes`, `costLevel` | The performance figures the Creative Center shows |
| `videoUrl`, `videoUrls`, `coverImageUrl`, `videoDuration`, `videoWidth`, `videoHeight` | Video in the best resolution, all resolutions, and the cover image |
| `landingPage`, `comments`, `shares`, `adCountries`, `source` | From the ad's detail view, when "Include landing page and engagement details" is on |

Example row (shortened):

```json
{
  "adId": "7680819143491026960",
  "rank": 2,
  "country": "US",
  "period": 30,
  "sortedBy": "for_you",
  "adTitle": "Where Winds Meet Global with DLSS 5 Graphic Comparison",
  "industry": "Games & Utility Software",
  "parentIndustry": "News & Entertainment",
  "objective": "Video Views",
  "ctr": 0.92,
  "likes": 12441,
  "videoDuration": 156.9,
  "videoUrl": "https://v16m-default.tiktokcdn.com/...",
  "landingPage": "https://...",
  "adCountries": ["US"]
}
```

### Input

| Field | Description |
| --- | --- |
| `countries` | ISO codes or names: `US`, `GB`, `Germany`. The Creative Center covers 28 countries (listed in the input form). Empty means all countries combined. |
| `period` | `7`, `30` or `180` days. |
| `sortBy` | `for_you` (the Creative Center's default "Popular"), `like`, `ctr`, `impression` or `play_6s_rate`. |
| `industries` | Industry names as shown in the Creative Center, or their numeric IDs. A top-level industry includes its sub-industries. |
| `objectives`, `adLanguages` | Optional filters. |
| `maxAdsPerCountry` | Stop after this many distinct ads per country. Default 100. |
| `includeDetails` | Adds landing page, comments, shares and countries. On by default. |

### How many ads can I get?

Without a login the Creative Center shows only the first 20 ads of each filter combination. To get more, the actor reads every ranking and then splits the list by industry, objective, likes tier and language until it has the number of distinct ads you asked for, or until no new ads turn up. In our tests a 180-day run for the US returned 500 distinct ads. Ads are de-duplicated per country.

### Speed and cost

A run for one country with 100 ads and details takes about 4 minutes, mostly because TikTok rate-limits the detail view. Without details, 500 ads take about the same time. The actor uses about 500 MB of memory and runs at 1 GB.

You pay per ad saved plus a small start fee; the current price is on the Pricing tab. Set "Maximum cost per run" in the run options to cap a run. The actor stops cleanly at that limit and says so in its status message.

### Limits

- Video and cover URLs are signed by TikTok and expire after some days. Download the videos you need soon after the run.
- The Creative Center publishes Top Ads for 28 countries only. Other countries are skipped with a warning.
- Keyword search on Top Ads does not work without a login, so the actor offers filters instead.
- `rank` is the order in which the actor found the ads, starting with your chosen ranking. It is not TikTok's own rank beyond the first 20.

### FAQ

**Do I need a TikTok account?** No.

**Which proxy should I use?** The default Apify datacenter proxy works. Switch to residential only if your runs get blocked.

**Is this the same as the TikTok Ad Library?** No. The [TikTok Ad Library Scraper](https://apify.com/pulsedata/tiktok-ad-library-scraper) searches every ad an advertiser ran in Europe. This actor lists the ads TikTok picks as top performers, with CTR and likes.

# Actor input Schema

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

Countries whose top ads you want, as ISO codes (US, GB, DE) or names (Germany). The Creative Center covers AR, AU, BR, CA, CO, FR, DE, ID, IT, JP, MY, MX, NL, PK, PH, RO, SA, SG, ZA, KR, ES, SE, TH, TR, AE, GB, US and VN. Each country is scraped separately. Leave empty for all countries combined.

## `period` (type: `string`):

Time window the Creative Center ranks ads over.

## `sortBy` (type: `string`):

Ranking used for the first ads of each country. When you ask for more ads than one ranking shows, the actor also reads the other rankings and filter slices to find more distinct ads.

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

Only ads from these industries, by name as shown in the Creative Center ("Beauty & Personal Care", "Apps", "Skincare") or by numeric industry ID. A top-level industry includes its sub-industries. Leave empty for all industries.

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

Only ads with these campaign objectives: Traffic, App Installs, Conversions, Video Views, Reach, Lead Generation, Product Sales, App Promotion. Leave empty for all.

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

Only ads in these languages, as codes (en, es, de, fr, pt, ja, ko, ar, vi, th, id, ms, nl, it, ro, zh-Hant) or English names. Leave empty for all.

## `maxAdsPerCountry` (type: `integer`):

Stop after this many distinct ads per country. The Creative Center shows up to about 500 ads per country and period; how many exist depends on the country and filters.

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

Open each ad's details to add the landing page URL, comments, shares, the countries the ad ran in and its source. Costs one extra request per ad and makes the run slower, not more expensive per ad.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy works for the Creative Center. Change it only if you see blocks.

## Actor input object example

```json
{
  "countries": [
    "US"
  ],
  "period": "30",
  "sortBy": "for_you",
  "maxAdsPerCountry": 100,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

TikTok top ads stored in the default dataset.

# 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 = {
    "countries": [
        "US"
    ],
    "maxAdsPerCountry": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("pulsedata/tiktok-creative-center-top-ads-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 = {
    "countries": ["US"],
    "maxAdsPerCountry": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pulsedata/tiktok-creative-center-top-ads-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/L4V2IqQSamwNfr9Wj/builds/9o8ktGlC6bcj8LUIu/openapi.json
