# TikTok Creative Center Scraper: Top Ads, No Login (`automation_craft/tiktok-creative-center-scraper`) Actor

Scrape TikTok Creative Center Top Ads for 61 countries, no login or cookies: brand, ad title, likes, comments, shares, CTR, cost tier, industry, objective, landing page, video and cover URLs with expiry. Sweeps sort, period, industry and objective combinations for volume. Pay per ad.

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

## Pricing

from $1.20 / 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

### TikTok Creative Center Scraper: Top Ads, No Login

**Scrape TikTok Creative Center Top Ads** for any of 61 countries with no login, no cookies and no API key. Every row is one top performing auction ad with its brand, ad title, likes, comments, shares, click through rate, budget tier, industry, campaign objective, landing page when TikTok publishes it, the cover and every video rendition as signed URLs, plus the exact time those URLs expire. TikTok shows an anonymous visitor one list of 20 ads per filter combination, so the Actor sweeps sort orders, periods, industries and objectives for you, delivers each distinct ad once, and stops by itself when thirty combinations in a row surface nothing new (measured on Germany: about 100 distinct ads across the 7 and 30 day lists).

You pay per top ad delivered, detail record included. Duplicates across filter combinations, ads your dedup memory already knows, status rows and empty runs cost nothing.

### Quick start

1. Open the Actor and pick one or more **Countries** and **Periods** (last 7, 30 or 180 days).
2. Leave **Sort orders to sweep** on every order, or narrow it. Pin an **Industry** or **Campaign objective** if you only want one; otherwise the sweeps add one combination per industry and per objective after the base lists.
3. Set **Max ads (total)**. The sweep stops when it is reached or when the combinations run out.
4. Run it. Download the **Top ads** view as JSON, CSV or Excel, or read the dataset through the API. The run summary lists which filter combinations produced new ads, so you can tune the next run.
5. For a weekly swipe file, give the run a **Dedup memory name** and schedule it: every later run returns only ads it has not delivered yet, and known ads are never charged again.

### What you get

#### Top ad rows (`type: "material"`)

Measured on 644 top ads from 11 platform runs on 2026-09-22 (brand name 34%, ad title 99%, likes 100%, comments 74%, shares 74%, CTR 100%, cost tier 100%, industry 94%, objective 100%, landing page 54%, keywords 0%, pattern labels 0%, video URL 100%, cover 100%, media expiry 100%).

| Field | What it is |
|---|---|
| `materialId`, `creativeCenterUrl` | TikTok's id and the public Top Ads detail page |
| `brandName`, `adTitle` | brand name as TikTok shows it (empty for many ads) and the ad caption |
| `likes`, `comments`, `shares`, `favorite` | engagement counts (comments and shares come from the detail record) |
| `ctr` | click through rate in percent as TikTok reports it |
| `costTier`, `costTierCode` | low, medium or high budget tier and TikTok's code |
| `industryKey`, `industry`, `objectiveKey`, `objective`, `objectives` | industry and campaign objective with their labels |
| `countryCodes`, `source`, `sourceKey`, `isSearchResult` | where the ad ran and how TikTok sourced it |
| `landingPage`, `keywords`, `patternLabels`, `highlightText`, `voiceOver`, `hasSummary` | the detail record's creative fields; landing page is published for about half the ads, keywords and pattern labels rarely (see the measured fill rates above) |
| `videoId`, `videoDuration`, `videoWidth`, `videoHeight` | the video and its dimensions |
| `coverUrl`, `videoUrl`, `videoUrls` | the cover, the best rendition and every rendition (`1080p`, `720p`, `540p`, `360p`) as signed CDN URLs |
| `mediaExpiresAt` | the earliest expiry of the row's media URLs, parsed from the CDN signature; download before then |
| `keyframes`, `metrics` | with **Include retention curve and engagement metrics** (the Retention curve event): the second by second audience retention curve and the like, comment and share counts TikTok reports |
| `country`, `period`, `orderBy`, `rankInList`, `foundBy` | the list that surfaced the ad and its rank in it |
| `isNew`, `scrapedAt` | bookkeeping |

#### The run summary (`type: "summary"`), free

Counters for combinations planned, fetched and empty, list, detail and keyframe calls, ads seen, delivered and charged, duplicates and known ads skipped, the top filter combinations by new ads, HTTP statistics and billing counters that report attempted and platform confirmed charges separately.

### How much does it cost to scrape TikTok Creative Center?

Live prices at the BRONZE tier; Silver 10 percent and Gold 20 percent off the result event, no discount on the Actor start event.

| Event | Price | When it is charged |
|---|---|---|
| Top ad | $1.50 per 1,000 | once per unique top ad delivered, detail record included |
| Retention curve | $1.00 per 1,000 | once per ad that carries the retention curve and engagement metrics (opt in) |
| Actor start | $1.00 per run per GB of memory | once per run; a 1 GB run pays it once |

The Store pricing card shows these same prices per 1,000 events: "$1.50 / 1,000" on the Top ad row means one ad costs less than a fifth of a cent. A sweep that delivers 500 ads costs 500 x $1.50 / 1,000 plus the start event, about $0.75. There is no separate detail event and no login or cookie to provide; the retention curve is the only add on, because it costs two more TikTok calls per ad.

Measured platform cost on 10 runs: about $0.106 per 1,000 top ads with details on the default 1 GB memory (the price is $1.50 per 1,000).

### Input

| Field | Type | Notes |
|---|---|---|
| `countries` | array | Creative Center countries, ISO codes or names; `all` for every one |
| `periods` | array | 7, 30, 180 |
| `orderBy` | array | `for_you`, `impression`, `ctr`, `like`, `play_2s_rate`, `play_6s_rate`, `cvr`; default all |
| `industries`, `objectives` | array | Creative Center ids to pin; the run summary lists ids and labels |
| `adLanguages`, `adFormat`, `likeTiers` | array, string, array | language codes, `spark` or `non_spark`, likes percentile tiers 1 to 5 |
| `sweepIndustries`, `sweepObjectives` | boolean | add the industry and objective layers when nothing is pinned (default on) |
| `maxAds` | integer | cap, 0 = no cap |
| `includeDetails`, `includeKeyframes` | boolean | the detail record (default on, included) and the retention curve (default off, $1.00 per 1,000) |
| `dedupMemoryName`, `resetDedupMemory` | string, boolean | cross run memory |
| `proxyConfiguration`, `maxConcurrency` | object, 1 to 8 | Apify datacenter proxy by default; parallel requests |

```json
{
  "countries": ["US", "GB"],
  "periods": [30],
  "maxAds": 300,
  "dedupMemoryName": "top-ads-weekly"
}
```

### What this Actor does NOT do

- It does not search by keyword. TikTok serves keyword search on Top Ads only to logged in users; for an anonymous visitor the call returns an empty list, so the input does not offer it.
- It does not page past the first 20 of a list. That is what TikTok shows without a login (page two is always empty), which is why the Actor sweeps filter combinations instead.
- It does not scrape trends (hashtags, songs, creators, videos), keyword insights or top products. As of September 2026 the public Creative Center shows three hashtags and four videos to anonymous visitors and has no public song, creator, keyword insight or top product page; the rest is behind a login.
- It does not report spend. `costTier` is TikTok's low, medium or high budget label, not money.
- It does not host media. The URLs expire (`mediaExpiresAt` says when); download what you want to keep.

### FAQ

#### Do I need to log in to TikTok Creative Center?

No. The Actor signs its requests the way the public page does and needs no account, cookie or key. What it cannot do is what TikTok hides behind the login: keyword search, pages past the first 20 of a list, and most trend rankings.

#### How many top ads can I get per country?

TikTok shows an anonymous visitor one list of 20 per filter combination. The Actor sweeps sort orders, periods, industries and objectives and delivers each distinct ad once; measured on Germany, the 7 and 30 day lists together held about 100 distinct ads, and the sweep stops by itself after 30 combinations in a row without a new ad. The run summary lists which combinations produced them.

#### How long do the video URLs work?

They are signed CDN links that expire, usually within a day or two. Every row carries mediaExpiresAt, parsed from the signature, so you can download before then.

#### Does it scrape trending hashtags, songs or creators?

No. As of September 2026 the public Creative Center shows anonymous visitors three hashtags and four videos and has no public song, creator, keyword insight or top product page, so those are not sold here.

#### Is the detail record an extra charge?

No. Landing page, comments, shares, countries and source are fetched for every delivered ad and included in the Top ad price (keywords and pattern labels come along when TikTok publishes them, which is rare). The retention curve and engagement metrics are the one opt in add on, priced separately because they cost two more TikTok calls per ad.

#### How do I build a weekly swipe file without paying twice?

Put a name in dedupMemoryName and use the same name every run. Ads already delivered under that name are skipped free of charge.

#### Why does this Actor run with limited permissions?

Least privilege. It can only reach its own storages: the dataset it writes and the one named key-value store it creates for your dedup memory. It cannot read anything else in your Apify account.

### More data tools by Automation Craft

- [TikTok Ads Library Scraper: EU Ads, No Login](https://apify.com/automation_craft/tiktok-ads-library-scraper)
- [Meta Ad Library Scraper - All Placements, Filters](https://apify.com/automation_craft/meta-ads-library-scraper)
- [Instagram Ads Library Scraper - Creatives, Video](https://apify.com/automation_craft/instagram-ads-library-scraper)
- [Facebook Ads Library Scraper - Page Ads, No Login](https://apify.com/automation_craft/facebook-ads-library-scraper)
- [LinkedIn Ad Library Scraper: Ads by Company](https://apify.com/automation_craft/linkedin-ad-library-scraper)
- [Google Trends Scraper](https://apify.com/automation_craft/google-trends-scraper)

### Changelog

- 0.1.0 (2026-09-23): first release.

# Actor input Schema

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

The Creative Center region filter. Pick several to sweep each. Through the API pass ISO codes or names, or "all".

## `periods` (type: `array`):

The Creative Center time window: last 7, 30 or 180 days. Pick several to sweep each.

## `orderBy` (type: `array`):

Each sort order surfaces a different list of 20. Default: every sort order.

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

Creative Center industry ids, for example 22111000000 (Apparel and Accessories). Leave empty to sweep every industry (see "Sweep industries"). The run summary and the filters row list every id with its label.

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

Creative Center objective ids (1 = App installs, 2 = Traffic and so on; the filters row lists them). Leave empty to sweep every objective.

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

ISO codes such as en, es, de. Empty = any language.

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

Spark ads (boosted organic posts) or non Spark ads. Empty = both.

## `likeTiers` (type: `array`):

The Creative Center "Likes" filter: 1 = top 1 to 20 percent, 2 = top 21 to 40 percent, up to 5.

## `sweepIndustries` (type: `boolean`):

When no industry is pinned, add one combination per industry after the base sweep. More distinct ads, more calls.

## `sweepObjectives` (type: `boolean`):

When no objective is pinned, add one combination per objective after the industry layer.

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

Hard cap on delivered, charged top ads. The sweep stops when it is reached or when the combinations run out. 0 means no cap.

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

Adds landing page, keywords, pattern labels, highlight text, voice over, comments, shares, countries and source to every ad (one extra call per ad, included in the price).

## `includeKeyframes` (type: `boolean`):

Adds the second by second audience retention curve and the like, comment and share counts TikTok reports for the ad. $1.00 per 1,000 ads that carry them (two extra TikTok calls per ad).

## `dedupMemoryName` (type: `string`):

Name this monitor, for example "us-top-ads". Ads delivered under that name are remembered in a key-value store the Actor creates in your account and are never delivered or charged again.

## `resetDedupMemory` (type: `boolean`):

Forget everything stored under the memory name before running.

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

Leave the default (Apify datacenter proxy). The Creative Center API is not IP bound; the proxy only spreads load.

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

Filter combinations fetched at the same time.

## Actor input object example

```json
{
  "countries": [
    "US"
  ],
  "periods": [
    "30"
  ],
  "adFormat": "",
  "sweepIndustries": true,
  "sweepObjectives": true,
  "maxAds": 40,
  "includeDetails": true,
  "includeKeyframes": false,
  "resetDedupMemory": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 4
}
```

# Actor output Schema

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

No description

# 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"
    ],
    "periods": [
        "30"
    ],
    "maxAds": 40,
    "dedupMemoryName": "",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/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"],
    "periods": ["30"],
    "maxAds": 40,
    "dedupMemoryName": "",
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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