# TikTok Creative Center Top Ads Scraper - CTR & Landing Pages (`s-r/tiktok-creative-center-top-ads`) Actor

Export the best-performing TikTok ads from Creative Center Top Ads: ad text, CTR percentile, likes, budget class, video and cover links. Filter by country, period, keyword, industry and objective, and add landing pages, countries, comments and shares when you need them.

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

## Pricing

from $1.50 / 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.

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

Export the TikTok Creative Center Top Ads by country, keyword, industry, campaign objective and time period. Export the ad text, available brand name, video cover, MP4 links, likes, budget class and CTR percentile rank. Turn on ad details to collect landing pages, landing domains, countries, comments and shares alongside the original creative. Built for media buyers, dropshippers, user-acquisition teams and agencies who want winning TikTok ad examples in a spreadsheet instead of scrolling the Creative Center website.

### What the TikTok Creative Center scraper collects

Top Ads is TikTok's collection of ads that advertisers have authorised for inclusion in Creative Center. It is useful for reviewing creative hooks, comparing video lengths, finding examples of a campaign objective and assembling a swipe file for a particular market. It is a curated collection rather than a complete record of every advertisement that has run on TikTok.

Each dataset row represents one unique creative. Its `creative_id` remains a string so large TikTok IDs keep their full precision. The `text` field contains the ad title or caption. The `advertiser_name` field contains the source brand name when one is available; TikTok often leaves it empty, and the scraper preserves that empty value instead of guessing a brand from the landing URL.

The row also includes a public `detail_url`, its position in the requested ranking, industry and objective identifiers and names, video duration and dimensions, and all MP4 URLs that the source makes available. Optional detail fields include the countries listed for the creative, comment and share counts, source provenance and the source voice-over flag. The source keyword list is commonly null and should not be treated as a guaranteed set of keywords.

### Use cases

- **Creative research for media buyers.** Pull the highest-CTR ads for your market and objective and study their hooks, captions and video lengths before briefing a new batch of creatives.
- **Product and niche discovery for dropshippers.** Search a keyword such as a product name or category and see which stores are advertising it, which landing pages they use and how many likes the ads collect.
- **Swipe files for agencies.** Build a searchable archive of TikTok ad examples per industry and country for pitches, client workshops and creative reviews.
- **Competitive monitoring for UA teams.** Run the same filters every week and compare which creatives enter or leave the ranking, using `creative_id` as a stable key.
- **Enriching other ad datasets.** Join `target_domain` to search-ad libraries or company data to see where an advertiser also buys media.

### Input

Choose `country_code`, for example `US`, `GB` or `NL`. You can supply a comma-separated list of supported country codes, or use `ALL` for all countries. The default market is the United States. Choose a lookback period of 7, 30 or 180 days; the default is 30 days.

Use `order_by` to select `for_you`, `ctr`, `like`, `impression`, `play_2s_rate`, `play_6s_rate` or `cvr`. These are the rankings offered by the source. The scraper returns the available metrics on each ad, rather than inventing exact impression or conversion counts from a ranking option. Set `limit` between 1 and 500 to control the total number of unique ads requested. The default limit is 20.

Optional filters include `keyword`, `industry`, `objective`, `ad_language` and `ad_format`. Industries accept their numeric IDs or exact English names. Objectives accept an ID, an English name such as `Conversions`, or the source objective key. Multiple industries or objectives can be separated by commas. Spark ads use `spark` or `1`; non-Spark ads use `non_spark` or `2`. Unsupported filter values produce an input error before collection begins.

Set `include_details` to true to retrieve the extra detail fields. This is false by default. Larger collections continue automatically in the actor. Customers using the direct API can continue with `next_cursor`, preserving the original filters and limit. A returned warning identifies any requested details that could not be collected.

### Output

Results are stored in the default dataset and can be downloaded as JSON, CSV or Excel. The actor's OUTPUT record reports the delivered volume, charges, warnings and free-tier information. Each row includes `fetched_at` in UTC so a saved creative can be compared with a later collection.

The `ctr_percentile` field requires particular care: it is a percentile rank, not the measured click-through rate. A value of 0.37 means the Creative Center label “CTR Top 37%”. Lower percentile values indicate a stronger relative position. The source does not disclose the absolute click-through rate in this response. Likewise, `cost_index` is a budget class: 0 means low, 1 means medium and 2 means high. `budget_tier` provides the matching text label. Neither field is a spend amount or a cost per click.

With successful details, `landing_url` preserves the landing page exactly, including tracking parameters and campaign macros. `target_domain` is the lowercase hostname without a leading `www.`. Some landing URLs lead to tracking domains, so this domain may identify a tracker rather than the advertiser's website. Empty landing pages remain null. The scraper does not follow redirects to infer another company.

#### Example dataset row

A real row from a United States collection (30 days, `for_you` ranking, details on). The signed `image_url`, `video_url` and `video_urls` fields and a few source identifiers are left out here for readability; they are present in every dataset row.

```json
{
  "creative_id": "7684006387986710546",
  "advertiser_name": "",
  "text": "The @DIME Beauty Daily Exfoliating Cleanser has saved my skin. I can finally put on makeup comfortably now, without feeling like everything is constantly shedding off @Ulta Beauty #DIMEpartner #skincare #tretinoin #ultafinds #exfoliation ",
  "target_domain": "dimebeautyco.com",
  "landing_url": "https://dimebeautyco.com/collections/all-skincare?utm_source=tiktok&utm_medium=paid&utm_id=__CAMPAIGN_ID__&utm_campaign=__CAMPAIGN_NAME__&wm_source=tiktok&wm_medium=ads&wm_ad_id=__CID__",
  "region": "US",
  "rank": 4,
  "ctr_percentile": 0.74,
  "cost_index": 0,
  "budget_tier": "low",
  "likes": 22,
  "industry_name": "Beauty & Personal Care",
  "objective_name": "Video Views",
  "video_duration": 61.734,
  "video_width": 720,
  "video_height": 1280,
  "period": 30,
  "order_by": "for_you",
  "detail_url": "https://ads.tiktok.com/business/creativecenter/topads/7684006387986710546/pc/en?countryCode=US&period=30",
  "details_fetched": true,
  "countries": [
    "US"
  ],
  "comments": 0,
  "shares": 0,
  "keyword_list": null,
  "fetched_at": "2026-10-04T23:44:40.059Z"
}
```

Here `ctr_percentile` 0.74 means "CTR Top 74%", `cost_index` 0 is the low budget class, and the landing page keeps the advertiser's tracking parameters exactly as TikTok returns them.

### Pricing

Collection is accounted for per delivered ad. A successfully delivered detail has a separate event, allowing list-only collection and detailed collection to be priced separately. The current price for each event is shown in this actor's Pricing tab. Failed details are not charged as successful details, and a search with no matching ads does not produce an ad charge. There is no invented credit system or duplicated charge for a creative that appears again during pagination.

Users without a paid Apify plan receive up to ten ads per run. Optional details remain available within that limit. Paid users can request up to the source's maximum of 500 ads for one filter combination, subject to how many ads TikTok actually makes available.

### How this compares to other ways of getting TikTok top ads

| Option | What you get | Limits |
|---|---|---|
| TikTok Creative Center website | Browse Top Ads one card at a time, with filters | No export, no bulk download, manual copy of landing pages |
| TikTok Commercial Content Library (ads library) | Ads shown in the EU and other regulated markets, with targeting disclosures | A different collection: no CTR rank, no Top Ads ranking, different coverage |
| Paid ad-spy subscriptions | Large archives across networks | Monthly fees, seat licences, data locked in their interface |
| **This TikTok Creative Center scraper** | Top Ads as JSON, CSV or Excel with CTR percentile, likes, budget class, video links and optional landing pages | Only what Creative Center publishes, at most 500 ads per filter combination |

You pay per delivered ad, so a small weekly check costs very little, and the output plugs straight into spreadsheets, BI tools or your own pipeline through the Apify API.

### Limitations

Creative Center can return fewer ads than requested, especially for a narrow country, keyword or objective. The 500-ad ceiling belongs to the selected filter combination. It is not a promise that 500 ads exist for every market. For a broader research set, collect separate relevant country, industry or objective combinations and join them by `creative_id`.

Video and cover links are signed and temporary, normally lasting about six hours. Download the media promptly if you want to preserve it in a creative archive. The actor exports links, rather than permanently hosting the video files. Rankings and available creatives can change between calls; the collection avoids duplicate IDs but cannot freeze TikTok's catalogue in time.

### FAQ

#### What is the difference between TikTok Creative Center and the TikTok Ads Library?

TikTok Creative Center Top Ads is a curated ranking of ads that advertisers allowed TikTok to showcase, with CTR percentile, likes and budget class. The TikTok Ads Library (Commercial Content Library) is a transparency archive of ads shown in regulated regions. This actor collects the Creative Center Top Ads ranking, not the transparency archive.

#### Do I need a TikTok account or login?

No. The actor collects the public Creative Center Top Ads data without a TikTok login or an Ads Manager account.

#### Is `ctr_percentile` the actual click-through rate?

No. It reports the source's relative percentile position. A value of 0.09 means Top 9%, not a 9% click-through rate. Lower is better for this particular metric.

#### Why is the advertiser name or landing URL empty?

TikTok does not disclose those values for every creative. The scraper keeps missing names empty and missing landing pages null. Enable details for landing-page data when it is available.

#### Can I collect more than 500 ads?

A single source filter combination is limited to 500. You can research additional country, industry or objective combinations and deduplicate the combined data by creative ID. A single actor run accepts a maximum limit of 500.

#### Why did a video link stop working?

Signed media links expire. Download them shortly after the collection, or fetch the creative again to obtain a fresh link if TikTok still lists it.

#### Can I use the domain to join another advertising dataset?

Yes. `target_domain` can join a landing host to a company dataset or another ad library. Review tracking hosts before treating that join as proof of advertiser identity.

# Actor input Schema

## `country_code` (type: `string`):

Supported country codes separated by commas. Empty or ALL selects all countries.

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

Lookback period in days. Allowed values: 7, 30, 180.

## `order_by` (type: `string`):

Ranking. ctr sorts the CTR percentile, with lower values indicating better performance.

## `keyword` (type: `string`):

Optional text search in the ads.

## `industry` (type: `string`):

Industry IDs, label\_ IDs or exact English industry names, separated by commas.

## `objective` (type: `string`):

Objective IDs, keys or English names, separated by commas: Traffic, App Installs, Conversions, Video Views, Reach, Lead Generation, Product sales.

## `ad_language` (type: `string`):

Optional language code from the Creative Center filters.

## `ad_format` (type: `string`):

Spark or non-Spark ads. Empty selects both formats.

## `limit` (type: `integer`):

Total maximum number of unique ads for the selected filters, including cursor continuations.

## `include_details` (type: `boolean`):

Collect landing pages, countries, comments and shares with an additional detail request per ad.

## `cursor` (type: `string`):

Opaque next_cursor from the previous response. Keep the original filters, limit and include_details.

## Actor input object example

```json
{
  "country_code": "US",
  "period": 30,
  "order_by": "for_you",
  "limit": 20,
  "include_details": false
}
```

# Actor output Schema

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

Dataset with one row per unique TikTok creative.

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

Delivered counts, charges and warnings.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/tiktok-creative-center-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 = {}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s-r/tiktok-creative-center-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/Y2n09M6O2asSv6ba1/builds/xth2KA6JLsvBONc5L/openapi.json
