# TikTok Creative Center Scraper — Top Ads & Trends (`datapeak/tiktok-creative-center`) Actor

Scrape the TikTok Creative Center for Top Ads and trends. Extract ad creatives, brands, industries, CTR/likes signals, video URLs and regions as JSON/CSV. Built for media buyers, UA teams and creative research. Filter by country and industry. Pay per result or run via API.

- **URL**: https://apify.com/datapeak/tiktok-creative-center.md
- **Developed by:** [Gal Gilboa](https://apify.com/datapeak) (community)
- **Categories:** E-commerce, Social media, Lead generation
- **Stats:** 29 total users, 19 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 ad scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## TikTok Creative Center Scraper — Top Ads, Trending Hashtags & Songs

Extract structured data from **TikTok Creative Center** (ads.tiktok.com/business/creativecenter): the **top-performing TikTok ads** by country, industry, campaign objective and keyword — brand name, ad title, downloadable video URL, cover image, likes, comments, shares, CTR score, spend tier and landing page — plus **trending hashtags and songs** by region. No login, no TikTok API key, public data only.

Built for **media buyers, performance-creative teams, dropshippers and agencies**: see which TikTok ads actually win in your vertical, pull the creatives into a swipe file, and track the hashtags/sounds trending in your market — on a schedule, in bulk.

### Why this Actor?

- **API-level reliability** — talks directly to Creative Center's own JSON API instead of driving a headless browser against a JavaScript shell. The required signed headers are minted in-process (JSDOM) — no browser, no brittle UI automation.
- **Landing pages & full engagement included** — most Creative Center scrapers stop at the list data. This Actor's detail mode adds the fields the list hides: **landing page URL**, comments, shares, target countries and creative keywords.
- **Three surfaces in one Actor** — Top Ads (competitor creatives), trending hashtags, trending songs. One tool for the whole creative-research workflow.
- **Winning-ad signals** — TikTok's own CTR score, spend tier, likes and "favorite" flag per ad, sortable by CTR / likes / For-You ranking.
- **Fast & cheap** — plain HTTP + one lightweight header-mint per session. No browser image, no per-page rendering cost.

### What data does it return?

#### Top Ads mode (one item per ad)

- Brand name + ad title (hook text)
- Ad ID + permanent Creative Center URL
- Video URL (highest resolution available) + cover image + video ID, duration, dimensions
- Likes, comments, shares (comments/shares via detail mode)
- CTR score (TikTok-normalized 0–1), spend tier (0–5), favorite flag
- Campaign objective + industry key, search-ad flag
- **Landing page URL**, target countries, creative keywords, pattern labels, voice-over flag (detail mode)

#### Trends modes (one item per hashtag / song)

- Rank, rank change vs. previous period, promoted flag
- Hashtags: name, post count, video views, industry, trend curve, tiktok.com URL
- Songs: title, artist, duration, cover, TikTok music URL, trend curve

### Sample output (Top Ads)

```json
{
  "type": "ad",
  "adId": "7613813410505555976",
  "brandName": "Pacific Mill Lofts",
  "adTitle": "Love the space you're in with loft-style apartments in the heart of the city",
  "likes": 2360,
  "comments": 184,
  "shares": 96,
  "ctr": 0.61,
  "costTier": 2,
  "favorite": false,
  "objective": "Conversion",
  "objectiveKey": "campaign_objective_conversion",
  "industryKey": "label_25100000000",
  "videoUrl": "https://v16m-default.tiktokcdn.com/....mp4",
  "coverUrl": "https://p16-sign-va.tiktokcdn.com/....image",
  "videoDurationSeconds": 15.034,
  "landingPage": "https://pacificmilllofts.example.com/tours?utm_source=tiktok",
  "countryCodes": ["US", "CA"],
  "keywords": ["apartments", "loft living"],
  "detailsUrl": "https://ads.tiktok.com/business/creativecenter/topads/7613813410505555976/pc/en",
  "region": "US",
  "periodDays": 30,
  "scrapedAt": "2026-07-12T12:00:00.000Z"
}
```

Fields TikTok doesn't expose for a given item come back as `null` / `[]` — the Actor never fails a run over a missing field.

### How to use it

| Input | What it does |
|---|---|
| `mode` | `topAds` (default), `hashtags`, or `songs` |
| `region` | Two-letter country code (`US`, `GB`, `DE`, …); empty = worldwide |
| `period` | Trailing window: 7 / 30 / 180 days (trends max out at 120 — mapped automatically) |
| `keyword` | Free-text top-ads search, e.g. `skincare` |
| `industry` | TikTok industry ID — apply the filter in the Creative Center UI and copy the `industry=` value from the URL |
| `objective` | TikTok objective ID — same copy-from-URL trick with `objective=` |
| `orderBy` | `for_you` (default), `ctr`, or `like` |
| `fetchAdDetails` | Per-ad detail call for landing page, comments, shares, countries, keywords (default on) |
| `maxItems` | Cap on dataset items per run (default 100) |
| `proxyConfiguration` | Apify RESIDENTIAL proxy — required in practice, TikTok blocks datacenter IPs |

**Tip:** without login, TikTok surfaces roughly 20–100 top ads per filter combination. For large swipe files, vary `country × industry × period` across scheduled runs — deduplication by ad ID is automatic within a run.

### Use cases

- **Creative swipe files** — pull the top ads in your vertical weekly; study hooks, formats and CTAs of proven winners before your next shoot.
- **Winning-product research** — `objective=Conversions` + your industry + `orderBy: ctr` = the creatives that are actually selling right now.
- **Landing-page intelligence** — detail mode exposes where each winning ad sends traffic; map competitor funnels at scale.
- **Trend-jacking** — schedule the hashtag/song modes daily and catch rising sounds while they're still early.
- **Agency reporting & pitches** — attach the actual top ads (with engagement data) for a prospect's industry to your deck via the API.

### Pricing (pay per event)

| Event | Price | Meaning |
|---|---|---|
| `ad-scraped` | $0.0015 | One Top-Ads record in the dataset |
| `trend-scraped` | $0.001 | One trending hashtag or song record |

Example: 200 top ads with full details = **$0.30**. A daily 50-hashtag trend pull for a month = **$1.50**. The Actor respects your maximum cost per run and stops cleanly when the limit is reached.

### Fair use & limitations

- Only public Creative Center data is accessed — the same ad-inspiration information TikTok shows any logged-out visitor at ads.tiktok.com/business/creativecenter. No login, no personal data.
- `ctr` is TikTok's **normalized 0–1 score**, not a raw click-through rate; `costTier` is a relative spend tier (0–5). TikTok does not publish raw numbers.
- Video CDN URLs are signed and **expire in ~24–48 hours** — download promptly; `coverUrl` lives longer, and `detailsUrl` is permanent.
- TikTok surfaces a limited ad pool per filter combination without login (typically 20–100); this is a platform-side cap, not an Actor limit.
- This Actor covers the global Creative Center. The EU **Ad Library** (DSA transparency archive with targeting/reach data) is a different surface — on the roadmap as a separate mode.

### Integrations

Standard Apify platform features apply: export to JSON/CSV/Excel, API access, webhooks, and scheduled runs for continuous creative monitoring.

### Development

```bash
npm install
npm test           # parses the saved API fixtures, 37 assertions
apify run          # local run (uses ./storage)
```

# Actor input Schema

## `mode` (type: `string`):

<b>Top Ads</b> — top-performing TikTok ads (video URLs, brand, likes, CTR score, landing pages). <b>Trending hashtags</b> / <b>Trending songs</b> — the Creative Center trend rankings.

## `region` (type: `string`):

Two-letter country code, e.g. <code>US</code>, <code>GB</code>, <code>DE</code>, <code>IL</code>. Leave empty for worldwide.

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

Trailing time window in days. Note: for trends (hashtags/songs) TikTok's longest window is 120 days — selecting 180 automatically uses 120.

## `maxItems` (type: `integer`):

Maximum number of dataset items (ads or trend entries) for this run. Note: without login TikTok typically surfaces 20–100 top ads per filter combination — vary filters across runs for bigger datasets.

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

Free-text keyword to search top ads for, e.g. <code>skincare</code>. Leave empty for no keyword filter.

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

TikTok industry ID(s), comma-separated (e.g. <code>25100000000</code> for Beauty & Personal Care). Copy the <code>industry=</code> param from the Creative Center URL after applying the filter in the UI. For hashtags mode this is passed as <code>industry\_id</code>. Leave empty for all industries.

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

TikTok objective ID (e.g. <code>3</code> for Conversions). Copy the <code>objective=</code> param from the Creative Center URL after applying the filter in the UI. Leave empty for all objectives.

## `orderBy` (type: `string`):

Ranking order for Top Ads. <code>ctr</code> surfaces proven click-drivers; <code>like</code> surfaces engagement winners.

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

Two-letter language code to filter ad creative language, e.g. <code>en</code>, <code>es</code>, <code>de</code>. Leave empty for all languages.

## `fetchAdDetails` (type: `boolean`):

If enabled (recommended), the Actor calls the per-ad detail endpoint to add fields the list hides: comments, shares, landing page URL, target countries, objectives and keywords. If disabled, only the lighter list data is returned (faster, same price per ad).

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

Proxy to use for the requests. Apify RESIDENTIAL proxy is required in practice — TikTok blocks datacenter IPs aggressively.

## Actor input object example

```json
{
  "mode": "topAds",
  "region": "US",
  "period": "30",
  "maxItems": 100,
  "orderBy": "for_you",
  "fetchAdDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datapeak/tiktok-creative-center").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 = { "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    } }

# Run the Actor and wait for it to finish
run = client.actor("datapeak/tiktok-creative-center").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call datapeak/tiktok-creative-center --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=datapeak/tiktok-creative-center",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/iS5hKVuzPWnSXSZhv/builds/UYNwAcJICfkwRdKUo/openapi.json
