# TikTok Ad Library & Creative Center Scraper (`scrapesage/tiktok-ad-library-scraper`) Actor

Scrape top-performing TikTok ads from the Creative Center: ad copy, brand, CTR, likes, video creatives, advertiser landing pages, industry & objective. Filter by country, industry, objective, keyword & period. Monitor new ads.

- **URL**: https://apify.com/scrapesage/tiktok-ad-library-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Social media, E-commerce, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 tiktok 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/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 Ad Library & Creative Center Scraper — Top Ads, Performance Metrics & Competitor Intelligence

Extract **top-performing TikTok ads** straight from the official **[TikTok Creative Center](https://ads.tiktok.com/business/creativecenter/inspiration/topads/pc/en)** "Top Ads" library — the ad copy, brand, decoded **industry** and **campaign objective**, real performance metrics (**CTR, likes, comments, shares, CTR percentile**), the **video creative** (cover image + direct MP4), and the **advertiser's landing-page URL**. Filter by **country, industry, objective and time window**, sort by CTR or likes, and **monitor** new competitor creatives over time.

This is the TikTok piece of a complete **ad-intelligence stack** — the same competitor-research job as the **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** and the **[Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper)**, now for the fastest-growing ad platform on the planet.

### Why this TikTok ad scraper?

Most TikTok ad scrapers return raw, half-empty rows: a cryptic `industry_key` code, no objective, no landing page, and a video link with nothing around it. This actor drives a **real browser** so TikTok's own front end signs every request — the **reliable** path that keeps working when TikTok rotates its signing — and ships the **richest dataset in the category**:

| Data | Typical scrapers | This actor |
|---|---|---|
| Ad copy / caption | ✅ | ✅ |
| **Decoded** industry (e.g. *Haircare*, not `label_14103000000`) | ❌ raw code | ✅ |
| **Decoded** campaign objective (Traffic, Conversions, Lead Gen…) | ❌ | ✅ |
| CTR + likes | partial | ✅ |
| **CTR percentile** rank, comments & shares | ❌ | ✅ opt-in |
| **Advertiser landing-page URL** (where the ad sends traffic) | ❌ | ✅ opt-in |
| Every country the ad runs in | ❌ | ✅ opt-in |
| Objective breakdown (weighting) | ❌ | ✅ opt-in |
| Video creative: cover image **+ direct MP4** + duration + aspect ratio | partial | ✅ |
| 0–100 **performance score** + high-performer flag | ❌ | ✅ |
| **Monitor mode** — only NEW ads since last run | ❌ | ✅ |
| Multi-country breadth in one run | ❌ | ✅ |

### Use cases

- **Competitive ad intelligence** — see exactly which creatives are winning for any **industry** in any **country**, with the advertiser's landing page so you know the funnel. Pair it with the **[Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper)** and **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** for full cross-platform coverage.
- **Creative inspiration & ad research** — pull the top-CTR videos in *Beauty & Personal Care*, *Games*, *E-commerce*, *Apparel*, *Financial Services* and 250+ other industries to brief your creative team.
- **Trend & market research** — track what objectives, formats and hooks are trending by country and time window (7 / 30 / 180 days).
- **Affiliate & dropshipping product research** — the landing-page URL surfaces winning products and offers behind the top ads.
- **Agency reporting** — export a branded, structured table of the best-performing ads in your client's vertical every week.
- **Monitoring** — schedule recurring runs and capture only **new** ads to watch a competitor's or category's creative pipeline.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **TikTok Ad Library & Creative Center Scraper**, choose your **countries**, **time window**, and (optionally) **industries** / **objectives**, then click **Start**.
3. Watch results stream into the dataset table — sort by performance score, preview the creative thumbnails.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "countryCodes": ["US", "GB"],
    "period": "30",
    "orderBy": "ctr",
    "industries": ["Beauty & Personal Care", "Apparel & Accessories"],
    "objectives": ["Conversions"],
    "includeAdDetails": true,
    "maxResults": 100
}
```

- **countryCodes** — Creative Center country editions, by ISO code (`US`, `GB`, `DE`, `FR`, `BR`, `JP`, `SG`, `ID`, …). Each is scraped separately.
- **period** — performance window the ranking is computed over: `7`, `30` or `180` days.
- **orderBy** — `for_you` (TikTok's recommended ranking), `ctr` (highest click-through), or `like` (most liked).
- **industries** *(optional)* — filter by advertiser industry, by name (`"Beauty & Personal Care"`, `"Games"`, `"E-commerce"`) or numeric id. Each industry is scraped separately.
- **objectives** *(optional)* — Traffic, App Installs, Conversions, Video Views, Reach, Lead Generation, Product Sales.
- **adLanguages** *(optional)* — filter by creative language (`en`, `es`, `ar`, `de`, …).
- **includeAdDetails** *(default false)* — open each ad's detail page to add the **advertiser landing-page URL**, every **country** the ad runs in, **comments & shares**, the **CTR percentile**, the objective breakdown and ad keywords (billed as an `ad-detail` event).
- **includeVideoUrl** *(default true)* — include the direct (no-watermark) MP4 creative URL. These are temporary TikTok CDN links that expire after a few hours — fetch promptly.
- **maxResults** *(default 100)* — total ad cap across all views.
- **monitorMode** *(default false)* / **monitorKey** — remember ad IDs across runs and emit only **new** ads. Ideal on a [Schedule](https://docs.apify.com/platform/schedules).
- **proxyConfiguration** — Apify Proxy for the headless browser (the default works well).

### Output

One clean record per ad (`type: "ad"`):

```json
{
    "type": "ad",
    "adId": "7651891505322672144",
    "adTitle": "¿Cabello con frizz? 🤯 Solo un toque… #AntiFrizz",
    "brandName": null,
    "industry": "Haircare",
    "industryId": "14103000000",
    "objective": "Reach",
    "objectiveKey": "campaign_objective_reach",
    "countryCode": "US",
    "countries": ["US"],
    "period": "last_30_days",
    "periodDays": 30,
    "orderBy": "ctr",
    "ctr": 0.01,
    "ctrPercentile": 0.99,
    "likes": 1043,
    "comments": 9,
    "shares": 59,
    "costTier": 1,
    "videoId": "v14044g50000d8lqi2fog65ktt868tbg",
    "videoDurationSec": 23,
    "coverImageUrl": "https://p16-common-sign.tiktokcdn.com/…tplv-noop.image",
    "videoUrl": "https://v16m-default.tiktokcdn.com/…mime_type=video_mp4…",
    "videoWidth": 720,
    "videoHeight": 1280,
    "aspectRatio": 0.563,
    "advertiserUrl": "https://www.ulta.com/brand/eva-nyc?utm_source=tiktok&utm_medium=paid",
    "keywords": null,
    "objectiveBreakdown": [
        { "objective": "Reach", "weight": 5 },
        { "objective": "Product Sales", "weight": 15 }
    ],
    "voiceOver": false,
    "isSearchable": true,
    "searchIndustry": "Beauty & Personal Care",
    "creativeCenterUrl": "https://ads.tiktok.com/business/creativecenter/topads/7651891505322672144/pc/en?region=US&period=30",
    "performanceScore": 87,
    "isHighPerformer": true,
    "scrapedAt": "2026-06-26T22:00:00.000Z"
}
```

#### What to expect (field coverage)

TikTok exposes some fields only on the ad **detail** page, and some only for certain ad types — so a few fields are populated only when applicable, never because scraping failed.

| Field group | Always present | Present when applicable |
|---|---|---|
| **Core** (adId, adTitle, industry, objective, countryCode, ctr, likes, period, performanceScore, creativeCenterUrl) | ✅ ~100% | — |
| **Creative** (videoId, duration, cover image, MP4, width/height, aspect ratio) | ✅ ~100% | — |
| `brandName` | — | only for ads run by a registered **brand** account (UGC/creator/spark ads have none) |
| `costTier` | — | only for ads with a **conversion** objective |
| `advertiserUrl`, `countries`, `comments`, `shares`, `ctrPercentile`, `objectiveBreakdown`, `keywords`, `voiceOver` | — | with **`includeAdDetails: true`** (and a landing page only exists for click-objective ads) |

A blank field means TikTok didn't publish that value for that ad — not that the scraper skipped it.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly with `monitorMode` to capture new competitor or category ads as they appear.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (Slack alert, sheet append, creative-brief generator) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/tiktok-ad-library-scraper').call({
    countryCodes: ['US'],
    period: '30',
    orderBy: 'ctr',
    industries: ['E-commerce'],
    includeAdDetails: true,
    maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} top TikTok ads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push top new ads into a sheet, Notion board, or Slack channel.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored industry has new winning ads.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find the top-CTR beauty ads on TikTok in the US this month and summarize the hooks" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **ad-intelligence & marketing-research stack**:

- **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** — who's advertising what on Google & YouTube.
- **[Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper)** — competitor ad intelligence on Meta & Instagram.
- **[Google Trends Scraper](https://apify.com/scrapesage/google-trends-scraper)** — search-demand and rising-topic intelligence.
- **[Keyword Research Scraper](https://apify.com/scrapesage/keyword-research-scraper)** — multi-platform autocomplete & SEO demand.
- **[Google News Scraper](https://apify.com/scrapesage/google-news-scraper)** — track brand & competitor coverage.
- **[Twitch Scraper](https://apify.com/scrapesage/twitch-scraper)** — channels, streams & creator leads.
- **[Spotify Scraper](https://apify.com/scrapesage/spotify-scraper)** — artists, monthly listeners & playlist data.
- **[LinkedIn Jobs Scraper](https://apify.com/scrapesage/linkedin-jobs-scraper)** — job postings as hiring-intent signals.

### Tips

- **Breadth**: pass several `countryCodes` and `industries` to fan out across many Top-Ads views in one run; each view exposes up to a few hundred ranked ads.
- **Best signal**: set `orderBy` to `ctr` and turn on `includeAdDetails` to rank by CTR percentile and capture the landing pages.
- **Fresh creatives only**: use `monitorMode` on a daily [Schedule](https://docs.apify.com/platform/schedules) to build a feed of brand-new ads in your category.
- **Grab videos promptly**: `videoUrl` MP4 links are temporary TikTok CDN URLs that expire within a few hours; download them in the same run that produces them. The `creativeCenterUrl` link is permanent.
- **Cost control**: keep `includeAdDetails` off for fast, cheap category scans; turn it on only when you need landing pages and percentile ranks.

### FAQ

**Where does the data come from?** From TikTok's own public **Creative Center → Top Ads** library (`ads.tiktok.com/business/creativecenter`), the official showcase of top-performing ads that TikTok publishes for marketers. No login, no API key.

**Does it need the TikTok API?** No. TikTok's Creative Center has no public API and signs every request in the browser; this actor runs a headless browser so TikTok's own front end performs the signing — no key, no token to maintain.

**Can I search a specific brand's ads?** This version browses and ranks the Top Ads by country, industry and objective (the highest-signal views). For exhaustive by-advertiser transparency in the EU, see TikTok's separate Commercial Content Library.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**Why is `brandName` / `advertiserUrl` empty on some rows?** Many top ads are creator/UGC ads with no brand account, and only click-objective ads have a landing page. Those fields are blank only when TikTok genuinely doesn't expose them — see the coverage table above.

**The video URL stopped working — why?** `videoUrl` is a temporary TikTok CDN link that expires after a few hours. Re-run the actor to refresh it, or use the permanent `creativeCenterUrl`.

**Is scraping TikTok Creative Center legal?** This actor collects publicly available data that TikTok publishes for marketers. You are responsible for using the data in compliance with applicable laws and TikTok's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `countryCodes` (type: `array`):

Which TikTok Creative Center country editions to pull Top Ads from, by ISO code (e.g. US, GB, DE, FR, BR, JP, SG, ID). Each country is scraped separately. Supported: US, GB, CA, AU, DE, FR, IT, ES, BR, MX, AR, CO, JP, KR, ID, TH, VN, MY, PH, SG, SA, AE, EG, TR, RU, IN, NG, PK. Leave default for the United States.

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

Performance window the Top Ads ranking is computed over.

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

How TikTok ranks the returned ads. "Recommended" is TikTok's blended For-You ranking; or rank purely by click-through rate or by likes.

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

Filter ads by advertiser industry — by name (e.g. "Beauty & Personal Care", "Apparel & Accessories", "Games", "E-commerce", "Food & Beverage", "Financial Services") or numeric industry id. Each industry is scraped separately. Leave empty for all industries.

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

Filter by campaign objective — Traffic, App Installs, Conversions, Video Views, Reach, Lead Generation, Product Sales — by name or id. Leave empty for all objectives.

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

Filter by the language of the ad creative, by code (e.g. en, es, ar, vi, th, de, fr, pt, id, ja, ko). Leave empty for all languages.

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

Open each ad's detail page to add the advertiser LANDING-PAGE URL, every country the ad runs in, comment & share counts, the CTR percentile rank, the objective breakdown and ad keywords. Adds one fast page load per ad (billed as an ad-detail event). Off by default for speed.

## `maxResults` (type: `integer`):

Maximum number of ads to return across all country × industry × objective views combined. Each TikTok filter view exposes up to a few hundred ranked ads. Keep modest for fast, cheap runs.

## `maxResultsPerQuery` (type: `integer`):

Cap the number of ads taken from each individual country × industry × objective view (0 = no per-view cap, bounded only by Max ads). Useful for breadth across many views.

## `monitorMode` (type: `boolean`):

Remember ad IDs seen on previous runs and emit only NEWLY-appearing ads. Ideal on a schedule to track new competitor / industry creatives over time. Works independently of Apify Schedules.

## `monitorKey` (type: `string`):

Name this monitor's memory so different saved searches track new ads separately (e.g. "us-beauty").

## `includeVideoUrl` (type: `boolean`):

Include the direct (no-watermark) MP4 creative URL for each ad. These are temporary TikTok CDN links that expire after a few hours — fetch promptly. The permanent cover image and the Creative Center link are always included.

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

Apify Proxy used for the headless browser. RESIDENTIAL is required — the TikTok Creative Center returns no data to datacenter IPs. The default (Residential, US) works for every country edition; change the country only if you specifically need a local exit node.

## Actor input object example

```json
{
  "countryCodes": [
    "US",
    "GB",
    "DE"
  ],
  "period": "7",
  "orderBy": "for_you",
  "industries": [
    "Beauty & Personal Care",
    "Apparel & Accessories"
  ],
  "objectives": [
    "Conversions",
    "Lead Generation"
  ],
  "adLanguages": [
    "en"
  ],
  "includeAdDetails": false,
  "maxResults": 100,
  "maxResultsPerQuery": 0,
  "monitorMode": false,
  "monitorKey": "default",
  "includeVideoUrl": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped TikTok ad records as JSON items in the default dataset.

# 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 = {
    "countryCodes": [
        "US"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/tiktok-ad-library-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 = {
    "countryCodes": ["US"],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/tiktok-ad-library-scraper").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 '{
  "countryCodes": [
    "US"
  ],
  "maxResults": 100
}' |
apify call scrapesage/tiktok-ad-library-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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