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

Scrape TikTok's best-performing ads from the TikTok Creative Center Top Ads. Get ad videos, titles, brands, CTR, likes, landing pages, industries, objectives and the countries each ad ran in. Filter by country, industry, objective, language and period. No login.

- **URL**: https://apify.com/jmlp/tiktok-creative-center-scraper.md
- **Developed by:** [Mary Lou](https://apify.com/jmlp) (community)
- **Categories:** Social media, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.15 / 1,000 ads

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Top Ads Scraper

See **TikTok's best-performing ads** in any country and industry. This actor
scrapes the Top Ads section of the [TikTok Creative Center](https://ads.tiktok.com/business/creativecenter/inspiration/topads/pc/en).
For each ad you get the video, its text, the brand, the industry and campaign
objective, CTR and likes, plus the landing page and every country the ad ran
in.

No login, no TikTok account.

***

### What you can do with it

- **Creative research**: collect the ads TikTok itself ranks as top
  performers in your niche, for briefs and swipe files
- **Competitor and market monitoring**: see which brands and offers win in
  each country, and where they send their traffic
- **Hook and format analysis**: video length, ranking by 6-second view rate
  or CTR, and the ad text, side by side
- **E-commerce and dropshipping research**: product ads ranked by
  conversions and CTR, with their landing pages
- **Agency reporting**: the top ads in a client's industry, every week

***

### How to scrape TikTok top ads

**1.** Pick the **Countries**: `US`, `United Kingdom`, `DE`...

**2.** Optionally narrow it down with **Industries** (`beauty`, `games`),
**Campaign objectives** (`conversions`) and **Ad languages**.

**3.** Choose how to **Rank by**. Each ranking is its own top list: `for
you`, `likes`, `ctr`, `reach`, `conversion rate`, `6s view rate`,
`2s view rate`, or `all`.

**4.** Press Start.

***

### How many ads you get

TikTok shows a signed-out visitor **the top 20 ads per query**, where a query
is a country, a period, a ranking, and optionally an industry, objective and
language. This actor runs every combination you ask for and keeps each ad
once. So:

- `US`, ranked `for you` → up to 20 ads
- `US`, `GB`, `DE`, ranked by `all` 7 rankings → 21 queries, up to 420 ads
  before the duplicates between lists are removed
- add industries or objectives to go deeper into a niche

***

### Output

One row per ad. Export as **JSON, CSV, Excel, XML or RSS**.

```json
{
  "ad_id": "7686160240678191125",
  "ad_title": "Explore our collection of premium human hair wigs and extensions",
  "brand_name": "TRES JOLIE BEAUTY LOUNGE",
  "industry": "Wig & Hair Styling",
  "objective": "Conversions",
  "ctr": 0.54,
  "likes": 0,
  "comments": 0,
  "shares": 0,
  "landing_page": "https://tresjoliebeautylounge.com/collections/ready-made-closure-wigs?utm_source=tiktok",
  "countries": ["GB"],
  "source": "TikTok Ads Manager",
  "video_url": "https://v16m-default.tiktokcdn.com/.../video/tos/useast2a/...",
  "video_urls": {"360p": "...", "480p": "...", "540p": "...", "720p": "..."},
  "video_cover": "https://p16-common-sign.tiktokcdn.com/...",
  "video_duration": 121.068,
  "video_width": 720,
  "video_height": 1280,
  "creative_center_url": "https://ads.tiktok.com/business/creativecenter/topads/7686160240678191125/pc/en?countryCode=GB&period=7",
  "rank": 1,
  "scraped_country": "GB",
  "scraped_period": 7,
  "scraped_sort": "ctr",
  "scraped_industry": "Beauty & Personal Care"
}
```

| Field | Notes |
| --- | --- |
| `ad_title`, `brand_name` | The ad's text and the advertiser's brand, when TikTok shows one |
| `industry`, `objective` | As the Creative Center names them |
| `ctr`, `likes`, `comments`, `shares` | TikTok's own figures for the ad |
| `landing_page` | Where the ad sends people, with its UTM parameters |
| `countries` | Every country the ad ran in |
| `video_url`, `video_urls`, `video_cover` | The MP4 in up to four qualities, and the cover image. TikTok's video links expire after a few hours, so download what you need soon after the run |
| `rank`, `scraped_*` | Its position in the top list that found it, and that list's country, period, ranking and filters |

`landing_page`, `countries`, `comments`, `shares` and `keywords` come from
each ad's detail. Turn off **Scrape ad details** for a faster, lighter run
without them.

***

### Reliable on big runs

- **Inputs are read forgivingly.** `uk`, `Deutschland` and `DEU` are
  countries. `last week` and `6 months` are periods. `beauty` finds Beauty &
  Personal Care. Anything that cannot be read is skipped with a note in the
  log, not the whole run.
- **Refusals are retried.** A refused query moves to a new exit IP. Queries
  still refused at the end get a second pass on a residential proxy, and one
  that fails costs only itself.
- **No failed runs for blocks.** If TikTok refuses everything, or no browser
  starts, the run ends normally and its status message says why.
- **Resumable.** Progress is saved every 30 seconds.

***

### FAQ

**Do I need a TikTok account?**
No. The Creative Center's Top Ads is public, and the scraper reads it as a
signed-out visitor.

**Why only 20 ads per query?**
That is what TikTok shows a signed-out visitor. Use more countries, rankings,
industries or objectives to collect more. Every combination is its own top
list.

**Which countries are covered?**
Top Ads 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. Others are skipped
with a note.

**Does it scrape TikTok trends (hashtags, songs, creators)?**
No. TikTok retired the old trend lists and now shows a signed-out visitor
only the top three trends, so this actor focuses on Top Ads.

**Can I run it on a schedule?**
Yes. Use **Period: Last 7 days** and run it weekly to see what is new.

***

### Related scrapers

- **TikTok Ad Library Scraper**: every ad an advertiser ran in the EU and UK,
  with reach and targeting
- **Meta Ads Library Scraper**: Facebook and Instagram ads
- **Google Ads Transparency Center Scraper**: Google Search, YouTube and
  Display ads
- **LinkedIn Ad Library Scraper**: LinkedIn ads with impressions and
  targeting

# Actor input Schema

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

Where the ads ran: ISO codes or names (US, United Kingdom, Deutschland). Top Ads 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. Empty means all of them.

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

How far back the ranking looks.

## `sortBy` (type: `array`):

Each ranking is its own top list, so several give more ads: for you (TikTok's default), likes, ctr, reach, conversion rate, 6s view rate, 2s view rate - or 'all'.

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

Names as the Creative Center shows them, matched loosely: 'beauty' finds Beauty & Personal Care. A category covers its sub-industries. Empty means every industry.

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

Any of: traffic, app installs, conversions, video views, reach, lead generation, product sales. Empty means every objective.

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

Codes or names: en, es, ar, vi, th, de, id, pt, fr, ms, nl, ja, it, ro, zh-Hant, ko. Empty means every language.

## `maxAds` (type: `integer`):

Stop after this many unique ads. Each query returns up to 20 - TikTok's limit for a signed-out visitor - and more countries, industries, objectives or rankings mean more queries. Empty means every ad the queries return.

## `maxQueries` (type: `integer`):

A cap on the number of country x industry x objective x language x ranking combinations. Each returns up to 20 ads.

## `scrapeAdDetails` (type: `boolean`):

Open each ad's detail for its landing page, every country it ran in, comments, shares and keywords. One extra request per ad.

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

Optional. If TikTok refuses the run's exits, it moves to new ones and finally tries a residential proxy.

## `resume` (type: `boolean`):

Save progress every ~30s so a run that gets migrated or restarted picks up where it stopped.

## `continueFromLastRun` (type: `boolean`):

If your previous run with the same input was interrupted, run only the queries it missed.

## Actor input object example

```json
{
  "countries": [
    "US"
  ],
  "period": "30",
  "sortBy": [
    "for you"
  ],
  "maxAds": 100,
  "maxQueries": 500,
  "scrapeAdDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "resume": true,
  "continueFromLastRun": false
}
```

# Actor output Schema

## `ads` (type: `string`):

One record per unique ad.

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

Queries run, the totals TikTok reports for each, industries covered, and anything refused.

# 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"
    ],
    "sortBy": [
        "for you"
    ],
    "maxAds": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jmlp/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 = {
    "countries": ["US"],
    "sortBy": ["for you"],
    "maxAds": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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