# TikTok Top Ads Scraper & API: Creative Center Ad Spy (`s_actors/tiktok-top-ads`) Actor

TikTok Creative Center top ads by country: video, brand, ad text, likes, CTR score, objective, industry, landing page, target countries and second-by-second viewer retention. The whole ranking, not just 20. Keyword filter, new-ad alerts. No login.

- **URL**: https://apify.com/s_actors/tiktok-top-ads.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Social media, Marketing, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 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

### TikTok Top Ads Scraper & API: Creative Center Ad Spy

Get the **top-performing TikTok ads** of any of 28 countries from TikTok Creative Center (Top Ads): the **ad video** (up to 1080p), brand, ad text, **likes**, **CTR score**, campaign objective and industry, plus the **landing page**, every **target country** and the **second-by-second retention curve** of each ad. A logged-out visitor sees only **20 ads per filter**; this Actor reads every sort order and splits the ranking by objective, industry, format and language until it has **the whole ranking: thousands of ads per country** for the last 180 days.

```json
{ "countries": ["US"], "period": "30", "maxAdsPerCountry": 200 }
```

No TikTok login, no cookies, no browser. Use it as a **TikTok top ads API** or a **TikTok ad spy tool**: build a swipe file of winning creatives, find a competitor's ads by brand or domain, or schedule it with **Only new ads** to get every new top ad of your niche.

#### What you get

Real example, October 2026, United States, last 180 days:

| # | brand | ad text | likes | CTR score | objective | industry |
|---|---|---|---|---|---|---|
| 1 | wondermart | Prism Pavilion — every item earns its place | 36,951 | 0.16 | Reach | Tech & Electronics |
| 2 | Korea Ginseng Corp | Korean Ginseng For Energy, Fatigue, Immunity | 103,823 | 0.13 | Lead Generation | Health |
| 3 | Tactipup | Upgrade your dog's gear | 70,101 | 0.23 | Conversions | Pets |
| 4 | balticbornclothing | Not to influence you, but these dresses… | 4,528 | 0.24 | Conversions | Apparel & Accessories |
| 5 | Marvel Unlimited | Your favorite Marvel characters, all in one app | 255,087 | 0.23 | — | Apps |
| 6 | PaintYourLife.com | The most sentimental gift for your loved ones | 1,714,412 | 0.21 | Lead Generation | Life Services |

| Field | Description |
|---|---|
| `adId`, `adUrl` | The ad and its Creative Center page |
| `brandName`, `adTitle` | Brand (empty for many advertisers) and the ad text |
| `likes` | Likes of the ad video |
| `ctrScore` | TikTok's CTR score from 0 to 1: the ad's click-through rate against other top ads |
| `budgetTier` | TikTok's spend level of the ad, 0-2 |
| `objective`, `industry`, `subIndustry` | Campaign objective (Traffic, Conversions, App Installs…) and industry |
| `videoUrl`, `videoQuality`, `videoUrls` | MP4 of the ad, best quality first (1080p / 720p / 540p…), and every quality |
| `coverUrl`, `videoDurationSeconds`, `videoWidth`, `videoHeight` | Cover image and video size |
| `rank` | Place in TikTok's top 20 for the chosen sort order (empty for the others) |
| `country`, `periodDays`, `position` | Country, period and our order |
| `isNew` | Not in the previous run of this monitor (empty on the first run) |

With **Ad details and retention curve** on (default):

| Field | Description |
|---|---|
| `landingPage`, `landingDomain` | Where the ad sends people, with UTM parameters |
| `targetCountries` | Every country the ad runs in |
| `comments`, `shares` | Comments and shares of the ad |
| `retentionAt2s`, `retentionAt6s` | % of viewers still watching at 2 and 6 seconds: how strong the hook is |
| `averageWatchSeconds` | Average seconds watched |
| `retentionCurve` | % of viewers still watching at every second of the video |
| `objectives`, `creativeKeywords`, `createdWith` | All objectives, TikTok's creative keywords, the tool the ad was made with (TikTok Ads Manager…) |

#### How it works

1. Choose **countries**: US, GB, DE, FR, IT, ES, NL, SE, RO, TR, AE, SA, PK, ZA, CA, MX, BR, AR, CO, AU, JP, KR, ID, MY, PH, SG, TH, VN
2. Choose the **period** (last 7, 30 or 180 days), **max ads per country** and the **sort order** (For You, Reach, CTR, 2s / 6s view rate, CVR, Likes)
3. Optional filters: **keywords** (brand, ad text, landing page), **industries**, **campaign objectives**, **Spark Ads**, **ad language**
4. Run, then download the dataset as CSV, Excel, JSON or HTML

#### Why this Actor

| | |
|---|---|
| 📦 **The whole ranking, not 20** | Logged out, Creative Center returns the first 20 ads of a filter and says "400" at most. The Actor reads all 7 sort orders and splits the ranking by objective, industry, sub-industry, format, like tier and language: 2,300+ US ads for 180 days, ~150 for 30 days |
| ⏱️ **Retention curve** | The share of viewers still watching at each second, the 2 s and 6 s hold rate and average seconds watched: see which hooks keep people |
| 🔗 **Landing pages** | Landing page and domain of every ad, with UTM tags: find the offer behind the creative |
| 🔎 **Keyword search without login** | TikTok's Top Ads search needs a login. The Actor filters the whole ranking by brand, ad text and landing page: put a competitor's name or domain |
| 🔔 **New-ad alerts** | `isNew` on every row; **Only new ads** returns just the ads that entered the ranking since the previous run |
| 💰 **$0.99 per 1,000 ads** | Details and retention $0.89 per 1,000 more. No subscription |

#### Find a competitor's TikTok ads

1. Put the brand name or domain into **Keywords** (e.g. `temu`, `shein.com`)
2. Choose the countries and **Last 180 days**
3. Keep **Ad details** on: the Actor also searches the landing pages (of up to 1,000 ads per country)
4. The dataset holds every top ad of that brand with its video, landing page and retention

#### Track new top ads in your niche

1. Choose the countries, an **industry** or **objective**, and turn on **Only new ads**
2. Save as a task and add a schedule, e.g. every morning
3. The **first run** returns the whole ranking as a baseline. **Every later run** returns only new ads: send them to [Google Sheets](https://apify.com/s_actors/google-sheets-import-export), Slack or email with an integration

The memory is kept in your account (key-value store `tiktok-top-ads-state`). Use a different **Monitor name** for each task.

#### Pricing

Pay per ad, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Ad (one row) | $0.00099 | $0.000891 | $0.000792 |
| Ad details & retention (only with the option on) | $0.00089 | $0.00079 | $0.00069 |

| Task | Cost |
|---|---|
| Top 100 US ads of the last 30 days with landing pages and retention | ~$0.19 |
| 1,000 ads without details | ~$1.00 |
| Daily new-ad alert for one country (~10 new a day, with details) | ~$0.60 per month |

#### Ready-made tasks

Open it, change the countries, and run:

| Task | What you get |
|---|---|
| TikTok Top Ads in the US | The top ads of the last 30 days with landing pages and retention |

#### FAQ

**Why do other tools stop at 20 ads or "3,000 per run"?** Logged out, Creative Center returns only the first page (20 ads) of each filter. The Actor reads many filter combinations and merges them without duplicates.

**What is the CTR score?** TikTok's own 0-1 score of the ad's click-through rate among top ads of the period (shown as "CTR" on Creative Center), not the raw percentage.

**Why is the brand empty?** Many advertisers do not show a brand name on Creative Center. Use the landing page domain instead (Ad details on).

**Are the video links permanent?** No: TikTok's CDN links expire after some days. Download the MP4s soon after the run.

**Why only 28 countries?** These are the countries Creative Center has top ads for.

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

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Find this month's top TikTok ads in the US for pet products, with their landing pages and hold rates."

#### Other tools

| Tool | What it does |
|---|---|
| [TikTok Trending Hashtags Scraper](https://apify.com/s_actors/tiktok-trending-hashtags-scraper) | Trending TikTok hashtags by country: posts, views, trend curve, industries, top creators, new-hashtag alerts |
| [TikTok Trending Videos Scraper](https://apify.com/s_actors/tiktok-trending-videos-scraper) | Top TikTok videos by country: ~80 per country (not just the top 4), period and organic views, engagement, creators |
| [TikTok Trending Sounds & Songs Scraper](https://apify.com/s_actors/tiktok-trending-sounds-scraper) | Trending TikTok sounds and songs by country and Explore category: videos using each sound, plays, commercial use, MP3 |
| [TikTok Video Downloader](https://apify.com/s_actors/tiktok-video-downloader) | Download TikTok videos without watermark in HD, in bulk, as a ZIP |
| [TikTok Shop Scraper](https://apify.com/s_actors/tiktok-shop-scraper) | TikTok Shop products, prices, stock and sales by keyword or shop |
| [TikTok Comments Scraper](https://apify.com/s_actors/tiktok-comments-scraper) | Comments and replies of TikTok videos and profiles, keyword filter, only-new alerts |
| [LinkedIn Ad Library Scraper](https://apify.com/s_actors/linkedin-ad-library-scraper) | LinkedIn ads by advertiser or keyword: impressions, targeting, landing pages |
| [Google Ads Transparency Scraper](https://apify.com/s_actors/google-ads-transparency-scraper) | Google ads of any advertiser: text, images, countries, dates |
| [Google Sheets Import & Export](https://apify.com/s_actors/google-sheets-import-export) | Send the ads to a Google Sheet |

# Actor input Schema

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

Countries whose top ads you want. TikTok Creative Center ranks top ads in these 28 countries; each country is collected separately.

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

Ads that ran in the last 7, 30 or 180 days. TikTok ranks about 30-50 (7 days), 100-160 (30 days) or a few thousand (180 days) ads per country.

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

Stop after this many ads per country. Above the size of TikTok's ranking you get the whole ranking.

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

TikTok's ranking to put first. Its top 20 come in TikTok's exact order (column rank), the rest follow by likes (by CTR score for CTR).

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

Only ads whose brand, ad text or landing page contain one of these words (a competitor's brand or domain, a product). TikTok's own search needs a login, so the Actor reads the whole ranking and filters it. Landing pages are searched only with Ad details on.

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

Only ads of these industries. Empty = all industries.

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

Only ads of these campaign objectives (Traffic, Conversions, App Installs...). Empty = all.

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

Spark Ads are organic TikTok posts the advertiser boosted (often creator UGC).

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

Only ads in this language. Empty = all languages.

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

Adds the landing page and its domain, every country the ad targets, comments, shares, the share of viewers still watching at 2 and 6 seconds, average seconds watched and the second-by-second retention curve. Charged as a separate event per ad.

## `onlyNew` (type: `boolean`):

For scheduled runs (save the input as a task and add a schedule). The first run returns the whole ranking and remembers it; every later run returns only ads that were not in it before. Without it, every row still has isNew.

## `monitorName` (type: `string`):

Name of the memory used by isNew and Only new ads. Use a different name for each task.

## `maxConcurrency` (type: `integer`):

How many requests to TikTok run at the same time.

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

Requests go direct first and switch to Apify datacenter proxies when TikTok refuses them. The default works for most runs.

## `debugLog` (type: `boolean`):

Log every retried request (for troubleshooting).

## Actor input object example

```json
{
  "countries": [
    "US"
  ],
  "period": "30",
  "maxAdsPerCountry": 20,
  "sortBy": "for_you",
  "adFormat": "all",
  "includeDetails": true,
  "onlyNew": false,
  "monitorName": "default",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debugLog": false
}
```

# Actor output Schema

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

Ads with brand, text, likes, CTR score, objective, industry and video.

## `details` (type: `string`):

Landing pages, target countries and viewer retention (with Ad details on).

## `all` (type: `string`):

Every field of every row, with all video qualities and the retention curve.

# 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": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/tiktok-top-ads").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": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("s_actors/tiktok-top-ads").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": 20
}' |
apify call s_actors/tiktok-top-ads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/tiktok-top-ads"
        }
    }
}
```

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/laRXPmdjF7DMNIW34/builds/ghdNH017lQisBVaSN/openapi.json
