# TikTok Creative Center Top Ads — CTR, MP4 & Funnel | $2/1K (`devoted_helix/tiktok-creative-center-scraper`) Actor

Scrape top-performing TikTok Creative Center ads by country, industry, CTR, and 2s/6s hook retention. Extracts MP4 video URLs, landing pages & Shopify/pixel stacks.

- **URL**: https://apify.com/devoted_helix/tiktok-creative-center-scraper.md
- **Developed by:** [batuhan senavci](https://apify.com/devoted_helix) (community)
- **Categories:** Social media, Marketing, E-commerce
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 tiktok top ad creative & analytics extracteds

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 Top Ads Scraper — CTR, Hooks, Video MP4 & Funnel Spy

Extract top-performing TikTok auction ads from the **TikTok Creative Center** across any country, industry, campaign objective, and performance metric (`CTR`, `2-second hook rate`, `6-second retention`, `reach`, `likes`, or `For You`) — enriched with **direct MP4 video links**, **exact advertiser `landing_page` URLs**, and **Shopify / pixel conversion funnel teardowns**.

Works out of the box with **zero login and zero TikTok account required** for the first page of each ranking (with optional `tiktokCookie` support for full pagination and server-side keyword search). See [Anonymous vs. Logged-in Scope](#anonymous-vs-logged-in-scope) for exactly what each mode returns.

***

### Why E-Commerce Brands, UGC Agencies & Growth Teams Use This Actor

1. **Performance-Ranked Winning Creatives (`sortBy`):**
   - Pull ads proven to stop the scroll by sorting directly on **`ctr` (Click-Through Rate)**, **`play_2s_rate` (2-Second Hook Rate)**, **`play_6s_rate` (6-Second Retention)**, **`reach`**, or **`like`**.
   - In zero-login mode, when `maxAdsPerCountry > 20`, the Actor merges the first page of the other sort metrics and periods to return more unique creatives (each row's `rankedBy` and `periodDays` tell you which ranking it came from).
2. **Full Creative Radar Detail Enrichment (`includeAdDetails: true`):**
   - Queries TikTok's Creative Radar Detail endpoint for every ad to unlock the **exact `landingPageUrl`**, **MP4 `videoUrl`**, **`hasVoiceOver` flag**, **`likes` / `comments` / `shares`**, and **objective metadata**.
3. **Optional Shopify & Funnel Teardown (`analyzeLandingPage: true`, off by default):**
   - Visits each advertiser's destination URL to extract **Page Title, H1 Offer Hooks, Discount/Bundle Signals (`% off`, `free shipping`, `1+1`), Tracking Pixels** (`TikTok Pixel`, `Meta Pixel`, `Google Ads gtag`, `Google Tag Manager`, `Clarity`, `Hotjar`, `Pinterest Tag`, `Snapchat Pixel`), and **Store Stack** (`Shopify`, `WooCommerce`, `Webflow`, `Stripe`, `Klaviyo`).

***

### Anonymous vs. Logged-in Scope

TikTok Creative Center limits what an anonymous visitor can see. This Actor does not work around that limit; here is what each mode returns:

| | Without `tiktokCookie` (default) | With `tiktokCookie` |
| :--- | :--- | :--- |
| Ads per ranking | **First page only — 20 ads** per country × sort × period | Full pagination, up to `maxAdsPerCountry` (max 500) |
| `maxAdsPerCountry` > 20 | Filled by merging page 1 of the other 5 sort metrics and 2 other periods: at most 8 rankings × 20 = 160 ads **before de-duplication**. Rankings overlap, so the unique count is lower and can fall short of the number you asked for. | Honoured from the ranking you selected |
| `searchKeyword` | Client-side filter over the anonymously visible ads only — often few or no matches | Server-side keyword search |

You are charged only for ads actually returned, so a short result in anonymous mode costs proportionally less.

Other things to know:

- `videoUrl` and `coverImageUrl` are signed TikTok CDN links that expire; download promptly if you need to keep the files.
- `ctr` and `costTier` are the values Creative Center reports; TikTok does not publish exact spend.

***

### Input Parameters

| Field | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `countries` | `string[]` | `["US"]` | ISO-2 country codes (`US`, `GB`, `DE`, `FR`, `CA`, `AU`, `TR`, `BR`, `JP`, `AE`, etc.). |
| `period` | `"7" \| "30" \| "180"` | `"30"` | Lookback window in days (`7` breakout trends, `30` winners, `180` evergreens). |
| `sortBy` | `string` | `"ctr"` | Sort by `ctr`, `for_you`, `reach`, `play_2s_rate`, `play_6s_rate`, or `like`. |
| `industry` | `string` | `"ALL"` | Filter by TikTok vertical (Beauty, Apparel, Tech, Food, E-Commerce, Health, Apps, etc.). |
| `objective` | `string` | `"ALL"` | Filter by Conversions, Product Sales, Traffic, App Installs, Video Views, or Lead Gen. |
| `searchKeyword` | `string` | `""` | Optional keyword/brand filter (client-side in anonymous mode; server-side search when `tiktokCookie` is provided). |
| `maxAdsPerCountry` | `integer` | `20` | Max unique top ads to return per country (see scope table above for anonymous-mode limits). |
| `includeAdDetails` | `boolean` | `true` | Fetch exact `landingPageUrl`, MP4 video link, engagement, and Creative Radar detail metrics. |
| `analyzeLandingPage` | `boolean` | `false` | Paid add-on: inspect advertiser destination pages for Shopify/tech stack, offers, and pixels. |
| `tiktokCookie` | `string` | `""` | Optional logged-in `ads.tiktok.com` Cookie header for deep pagination & keyword search. |

***

### Sample Output Record

```json
{
  "adId": "7695627102675402759",
  "country": "US",
  "periodDays": 30,
  "rankedBy": "ctr",
  "brandName": "GlowRecipe",
  "adTitle": "3 seconds to glass skin — see why 50,000+ switched this month",
  "ctr": 0.08,
  "likes": 4820,
  "comments": 194,
  "shares": 610,
  "costTier": 3,
  "objectiveKey": "campaign_objective_conversion",
  "industryKey": "label_14000000000",
  "hasVoiceOver": true,
  "durationSeconds": 24.5,
  "videoUrl": "https://v16m-default.tiktokcdn.com/...",
  "coverImageUrl": "https://p16-common-sign.tiktokcdn.com/...",
  "landingPageUrl": "https://glowrecipe.com/pages/starter-kit",
  "creativeCenterUrl": "https://ads.tiktok.com/business/creativecenter/inspiration/topads/pc/en",
  "landingPageIntel": {
    "analyzedUrl": "https://glowrecipe.com/pages/starter-kit",
    "httpStatus": 200,
    "fetchOk": true,
    "pageTitle": "Glass Skin Starter Kit — 20% Off",
    "h1Hooks": ["Clinically proven glow in 7 days"],
    "offerSignals": ["percentage discount", "free shipping", "$39"],
    "adPixelsDetected": ["tiktok_pixel", "meta_pixel", "google_ads_gtag"],
    "techStackDetected": ["shopify", "klaviyo"],
    "funnelReadinessScore": 100
  }
}
```

***

### Pricing (Transparent Pay-Per-Event)

- **TikTok Top Ad Extracted (`tiktok-ad-scraped`):** `$0.002` per ad creative (includes Creative Radar detail enrichment)
- **Advertiser Landing Page Funnel Teardown (`landing-page-analyzed`):** `$0.01` per unique advertiser landing page analyzed (cached per run, optional via `analyzeLandingPage`, **off by default**)

How charging works:

- `tiktok-ad-scraped` is charged first, per ad. The landing page add-on is only charged for ads that were already paid for.
- `landing-page-analyzed` is charged **only after the page loads successfully (HTTP 2xx)**. Blocked or failed pages return `landingPageIntel.fetchOk: false`, `funnelReadinessScore: null`, and cost nothing.
- If the run's maximum charge limit is reached, the Actor stops and pushes only what was paid for.

### Failure Behaviour

If TikTok Creative Center rejects **every** list request across all requested countries (for example an unaccepted session signature, an expired cookie, or an auth wall) and no ads are returned, the run ends as **FAILED** with TikTok's error code in the status message, and nothing is charged. A run where TikTok answers normally but no ads match your filters succeeds with an empty dataset.

# Actor input Schema

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

Two-letter country codes to pull winning TikTok ads from (e.g. US, GB, DE, FR, CA, AU, TR, BR, JP, AE).

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

Lookback window on TikTok Creative Center (7, 30, or 180 days).

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

Rank top TikTok ads by CTR, 2-second hook rate, 6-second retention, reach, likes, or TikTok For You score.

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

Optional TikTok vertical filter.

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

Filter ads by TikTok campaign optimization goal.

## `searchKeyword` (type: `string`):

Filter ads containing a keyword in caption, brand, or landing page. Without tiktokCookie this only filters the anonymously visible top ads (often few or no matches); server-side keyword search activates when tiktokCookie is provided.

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

Maximum unique top ads to extract per country. Without tiktokCookie, TikTok only serves the first page (20 ads) of each ranking, so values above 20 are filled by merging the first pages of the other sort metrics and periods (8 rankings x 20 = at most 160 ads before de-duplication; the unique count is lower because rankings overlap). Full pagination up to 500 requires tiktokCookie.

## `includeAdDetails` (type: `boolean`):

Enriches every ad via Creative Radar Detail API to extract the exact destination landing_page URL, MP4 video link, voice-over flag, engagement counts, and pattern tags.

## `analyzeLandingPage` (type: `boolean`):

Optional paid add-on ($0.01 per unique landing page). Visits each advertiser's landing page to detect Shopify/WooCommerce stack, H1 hooks, discount/bundle offers, and tracking pixels (TikTok, Meta, Google Ads, GTM, Clarity, Hotjar, Pinterest, Snapchat). Charged only when the page loads successfully; blocked or failed pages are never charged.

## `tiktokCookie` (type: `string`):

Optional raw Cookie header from a logged-in ads.tiktok.com session. Not needed for standard top-ads discovery, but unlocks deep multi-page keyword search.

## Actor input object example

```json
{
  "countries": [
    "US"
  ],
  "period": "30",
  "sortBy": "ctr",
  "industry": "ALL",
  "objective": "ALL",
  "searchKeyword": "",
  "maxAdsPerCountry": 20,
  "includeAdDetails": true,
  "analyzeLandingPage": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("devoted_helix/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"] }

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

```

## MCP server setup

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