# TikTok Ads Scraper - Top Ads & Creative Center (`vulnv/tiktok-ads-scraper`) Actor

Scrape TikTok Creative Center: Top Ads by keyword, industry, objective and period, full ad details with landing pages, ad performance analytics, similar ads, the Top Videos ranking and trending hashtags. Export to JSON/CSV/Excel. No login or cookies needed.

- **URL**: https://apify.com/vulnv/tiktok-ads-scraper.md
- **Developed by:** [VulnV](https://apify.com/vulnv) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 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 Ads Scraper - Top Ads & Creative Center

**Scrape TikTok Creative Center and export Top Ads, ad details, ad performance analytics, similar ads, the Top Videos ranking and trending hashtags to JSON, CSV or Excel.** Search the Top Ads library by keyword, industry, campaign objective, period, performance band, ad format and language; open any ad to get its landing page, delivery countries and engagement; pull its second-by-second retention, CTR and conversion curves with percentile ranks; and track which organic videos and hashtags are trending in a market. Each result is one clean, flat row.

No TikTok account, TikTok For Business login, cookies or proxies to configure - data is fetched through a fast, managed pipeline. Just pick an operation, add your input and press **Start**.

> **Unofficial notice:** This is an independent tool and is **not** affiliated with, endorsed by, or connected to TikTok, TikTok For Business, TikTok Creative Center or ByteDance. "TikTok" and "TikTok Creative Center" are trademarks of their respective owners, used here only to describe what the Actor scrapes.

### What is TikTok Creative Center?

TikTok Creative Center is TikTok's public hub of advertising inspiration. Its **Top Ads** library showcases high-performing ads across dozens of markets and industries, with like counts, click-through scores, spend levels, landing pages and per-second performance analytics. Alongside it, Creative Center publishes rankings of the **top organic videos** and **trending hashtags** per country. Marketers, media buyers and creative teams use it to see what works before they spend. This scraper turns those pages into structured data you can filter, chart and feed into your own tools.

### Operations

Pick one **Operation** and fill in the matching field:

| Operation | Input field | What you get |
|-----------|-------------|--------------|
| **Search Top Ads** | `keywords` (optional) | Top Ads matching your keyword and filters: ad text, brand, industry, objective, likes, CTR score, budget level and the video. |
| **Ad details** | `adIds` | One ad's full detail: everything above plus landing page, delivery countries, all objectives, comments, shares and source. |
| **Ad performance analytics** | `adIds` | Percentile ranks for impressions, CTR, CVR, clicks and conversions, plus second-by-second retention, CTR, CVR, click and conversion curves and highlight seconds. |
| **Similar ads** | `adIds` (+ `countries`) | The ads Creative Center recommends as similar to a given ad, in each country you list. |
| **Top Videos ranking** | `countries` | The top organic TikTok videos in a country, by views, engagement rate or 6-second view rate, with creator data. |
| **Trending hashtags** | `countries` | The top trending hashtags in a country: rank, posts, views, a daily popularity curve and top creators. |

`adIds` accept Creative Center Top Ads URLs (`ads.tiktok.com/business/creativecenter/topads/<id>/...`) or bare ad IDs (e.g. `7215972609221296129`). Every ad row carries its ID in `ad_id`, so you can search first and then feed the IDs into the other ad operations.

### How to use it (step by step)

1. Choose an **Operation**.
2. Fill in the matching input:
   - Search Top Ads -> optionally add **Search keywords** and any **Ad filters** (industry, period, objective, performance band, ad format, language, sort).
   - Ad details / Ad performance analytics / Similar ads -> paste **Ad IDs / URLs**.
   - Top Videos ranking -> set **Countries** and optionally the ranking period, date, sort metric, categories and organic-only switch.
   - Trending hashtags -> set **Countries**, optionally an industry and the trend period.
3. Set **Maximum results per input** (default 100, or 0 for all available).
4. Press **Start**. Export the dataset as JSON, CSV, Excel, XML or via the API.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `operation` | string | **Required.** `search_ads`, `ad_detail`, `ad_analytics`, `similar_ads`, `top_videos` or `trending_hashtags`. |
| `keywords` | array | Search keywords (for `search_ads`; leave empty to list top ads by filters only). |
| `adIds` | array | Ad IDs or Top Ads URLs (for `ad_detail`, `ad_analytics`, `similar_ads`). |
| `countries` | array | Two-letter country codes for similar ads, Top Videos and trending hashtags. Default `["US"]`. |
| `maxItems` | integer | Max new results per keyword, per ad, or per country. `0` = all available. Default `100`. |
| `industry` | string | Industry name (e.g. `Beauty & Personal Care`) or numeric ID (search and hashtags). |
| `period` | string | `7`, `30` or `180` days (default `180`). |
| `objective` | string | `traffic`, `app_installs`, `conversions`, `video_views`, `reach`, `lead_generation` or `product_sales`. |
| `performance` | string | `top_1_20`, `top_21_40`, `top_41_60`, `top_61_80` or `top_81_100`. |
| `adFormat` | string | `spark_ads` or `non_spark_ads`. |
| `adLanguage` | string | Language code such as `en`, `es`, `ja`, `de`. |
| `sortBy` | string | `for_you` (default) or `likes`. |
| `rankingPeriod` | string | `daily` (default), `weekly` or `long_term` (Top Videos). |
| `rankingDate` | string | `YYYY-MM-DD`; empty = newest published ranking (Top Videos). |
| `videoSort` | string | `views` (default), `engagement_rate` or `six_second_view_rate` (Top Videos). |
| `contentCategories` | array | Top Videos category IDs; empty = overall ranking plus every category. |
| `organicOnly` | boolean | Rank only organic videos (Top Videos). |
| `hashtagPeriod` | string | `7` (default), `30` or `90` days (Trending hashtags). |

### Output

Every row carries a `record_type` of `ad`, `ad_analytics`, `top_video` or `hashtag`.

| Field | Description |
|-------|-------------|
| `ad_id`, `ad_url`, `ad_title`, `brand_name` | Ad identity, its Creative Center page, text and brand. |
| `industry_id`, `industry_name`, `objective`, `objectives` | Industry and campaign objective(s). |
| `like_count`, `comment_count`, `share_count`, `ctr`, `budget_level` | Engagement, click-through score and relative spend level. |
| `landing_page`, `countries`, `source`, `has_voice_over` | Ad detail fields. |
| `video_id`, `video_url`, `cover_url`, `duration_seconds`, `width`, `height` | The ad creative. |
| `country` | On similar-ad rows, the market the recommendations were requested for. |

Fields that only the ad detail provides (`objectives`, `countries`, `landing_page`, `source`, `keywords`, `has_voice_over`, `comment_count`, `share_count`) are `null` on search and similar-ad rows. Analytics (`ad_analytics`) rows add `impressions_percentile`, `ctr_percentile`, `cvr_percentile`, `clicks_percentile`, `conversions_percentile`, the per-second curves `retention_by_second`, `ctr_by_second`, `cvr_by_second`, `clicks_by_second`, `conversions_by_second` and the matching `*_highlight_seconds`. Top video (`top_video`) rows add `rank`, `country`, `category`, `ranking_date`, `video_page_url`, `title`, `views`, `organic_views`, `engagement_rate`, `six_second_view_rate` (each also as lifetime), `create_time` and the creator's `author_*` fields. Hashtag (`hashtag`) rows add `rank`, `hashtag`, `hashtag_url`, `post_count`, `view_count`, `popularity_trend`, `top_creators` and `top_creator_followers`.

Example ad detail row:

```json
{
  "record_type": "ad",
  "operation": "ad_detail",
  "input": "7215972609221296129",
  "ad_id": "7215972609221296129",
  "ad_url": "https://ads.tiktok.com/business/creativecenter/topads/7215972609221296129/pc/en",
  "ad_title": "Acquista ora in offerta speciale",
  "brand_name": "Super_Offerte",
  "industry_name": "Hardware & Electrical",
  "objective": "Conversions",
  "objectives": ["Conversions", "Traffic"],
  "countries": ["IT"],
  "landing_page": "https://...",
  "budget_level": 1,
  "ctr": 0.33,
  "like_count": 118,
  "comment_count": 4,
  "share_count": 16,
  "duration_seconds": 29.211
}
```

### Common use cases

- **Creative research** - find the best-performing ads in your industry and market before you brief a shoot.
- **Competitor ad monitoring** - search a competitor's brand or product and collect their ads, landing pages and objectives.
- **Hook analysis** - use the per-second retention and CTR curves to see where viewers drop off and where they click.
- **Trend spotting** - snapshot the Top Videos ranking and trending hashtags on a schedule to catch rising formats and topics.
- **Agency reporting and AI datasets** - build structured libraries of ad creatives with performance signals.

### Notes on reliability

- Top Ads returns at most 400 ads per keyword. Its search covers the whole Top Ads library rather than one country, so use the **Ad details** operation to see which countries an ad ran in (`countries`). Short periods (7 or 30 days) return far fewer ads than 180 days, and stacking many filters can return none; widen the filters if a search comes back empty.
- **Similar ads** returns a short list (usually 0-3) per ad and country, so list several countries to get more.
- The **Top Videos ranking** is only published for a few countries (US, JP, TH, ID and VN at the time of writing) and appears 2-3 days after the day it covers. Each ranking shows only its first few videos, so with no categories selected the Actor walks the overall ranking plus every content category, which typically yields 40-60 unique videos per country.
- **Trending hashtags** returns the top 3 hashtags per country and filter. Vary the countries, industry or period to collect more.
- Ad analytics percentiles and curves are only available for ads that have them in Creative Center; ads without analytics are skipped and the run continues.
- Video and image URLs are served from TikTok's CDN and expire; download them promptly.
- Unknown or removed ad IDs are skipped and the run continues.

### FAQ

**Do I need a TikTok account, a TikTok For Business login or cookies?** No. Just add your input and press Start.

**Where do I find an ad ID?** In the Creative Center Top Ads URL (`.../topads/<id>/...`), or in the `ad_id` field of any row from **Search Top Ads**.

**Which countries can I use?** Two-letter codes such as US, GB, CA, AU, DE, FR, ES, IT, JP, KR, BR, MX, ID, TH, VN, SA and AE for similar ads and trending hashtags. The Top Videos ranking is published for fewer countries (see Notes on reliability).

**Can I run several keywords, countries or ads at once?** Yes - add multiple lines. Duplicate ads across keywords are removed automatically.

**Can I try it for free?** Yes. Users on the free Apify plan can fetch up to 10 results in total to try the Actor. Upgrade to a paid Apify plan to run it without that limit.

**What export formats are supported?** JSON, CSV, Excel, XML and HTML, plus the Apify API and integrations such as Google Sheets, Zapier, Make and webhooks.

### Pricing

This Actor is **pay per result**: you are charged for each record it returns (ads, ad details, ad analytics reports, top videos and trending hashtags), plus standard Apify platform usage. Different record types have different prices; see the **Pricing** tab for current rates. You are never charged for inputs that return nothing.

### Related scrapers

- **[Instagram Posts Scraper](https://apify.com/vulnv/instagram-posts-scraper)** - Instagram posts with captions, likes and comments.
- **[Douyin Scraper](https://apify.com/vulnv/douyin-search-scraper)** - 抖音 videos by keyword, with creators and downloads.
- **[Xiaohongshu Scraper](https://apify.com/vulnv/xiaohongshu-scraper)** - 小红书 / RedNote notes, users and comments.

# Actor input Schema

## `operation` (type: `string`):

What to scrape. Each operation uses a different input field below:

• Search Top Ads → Keywords (optional) + Ad filters
• Ad details → Ad IDs / URLs
• Ad performance analytics → Ad IDs / URLs
• Similar ads → Ad IDs / URLs (+ Countries)
• Top Videos ranking → Countries + Top Videos options
• Trending hashtags → Countries

## `keywords` (type: `array`):

For "Search Top Ads". Add one or more keywords (a product, brand or theme). Each keyword is searched independently and duplicates are removed. Leave empty to list the top ads that match your filters without a keyword.

## `adIds` (type: `array`):

For "Ad details", "Ad performance analytics" and "Similar ads". Paste Creative Center Top Ads URLs (ads.tiktok.com/business/creativecenter/topads/<id>/...) or bare ad IDs (e.g. 7215972609221296129), one per line. Every ad row has its ID in the ad_id field.

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

Two-letter country codes (e.g. US, GB, JP, DE). Used by "Similar ads", "Top Videos ranking" and "Trending hashtags"; each country is fetched separately. "Search Top Ads" searches the whole library and does not use it. The Top Videos ranking is only published for a few countries (US, JP, TH, ID and VN at the time of writing).

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

Upper bound on new results per keyword (Search Top Ads), per ad (Similar ads) or per country (Top Videos, Trending hashtags). Top Ads returns at most 400 ads per keyword. Set 0 to fetch all available.

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

For "Search Top Ads" and "Trending hashtags". An industry name as shown in Creative Center (e.g. Beauty & Personal Care, Games, Apparel & Accessories, Food & Beverage, Tech & Electronics) or its numeric ID (e.g. 14000000000). Leave empty for all industries. Hashtags use the top-level industry.

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

Time window for "Search Top Ads" and the comparison window for "Ad performance analytics". Shorter windows return far fewer ads.

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

Only ads run with this campaign objective. Leave empty for all.

## `performance` (type: `string`):

Only ads in this like-performance band. Leave empty for all.

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

Spark Ads (boosted organic posts) or non-Spark Ads. Leave empty for both.

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

Only ads in this language, as a language code: en, es, ar, vi, th, de, id, pt, fr, ms, nl, ja, it, ro, ko or zh-Hant. Leave empty for all.

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

How Top Ads are ordered.

## `rankingPeriod` (type: `string`):

For "Top Videos ranking". Daily, weekly (ending Sunday) or the long-term ranking.

## `rankingDate` (type: `string`):

For "Top Videos ranking". The ranking date as YYYY-MM-DD. Leave empty for the newest published ranking (rankings appear 2-3 days after the day they cover).

## `videoSort` (type: `string`):

For "Top Videos ranking". The metric the ranking is ordered by.

## `contentCategories` (type: `array`):

For "Top Videos ranking". Pick one or more categories. Leave empty to walk the overall ranking plus every category, which returns the most videos.

## `organicOnly` (type: `boolean`):

For "Top Videos ranking". Rank only organic (non-promoted) videos.

## `hashtagPeriod` (type: `string`):

For "Trending hashtags". The trend window.

## Actor input object example

```json
{
  "operation": "search_ads",
  "keywords": [
    "skincare"
  ],
  "countries": [
    "US"
  ],
  "maxItems": 100,
  "period": "180",
  "sortBy": "for_you",
  "rankingPeriod": "daily",
  "videoSort": "views",
  "organicOnly": false,
  "hashtagPeriod": "7"
}
```

# Actor output Schema

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

All scraped TikTok Creative Center results in the default dataset.

## `overview` (type: `string`):

Overview table of the scraped results.

# 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 = {
    "keywords": [
        "skincare"
    ],
    "countries": [
        "US"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vulnv/tiktok-ads-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 = {
    "keywords": ["skincare"],
    "countries": ["US"],
}

# Run the Actor and wait for it to finish
run = client.actor("vulnv/tiktok-ads-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 '{
  "keywords": [
    "skincare"
  ],
  "countries": [
    "US"
  ]
}' |
apify call vulnv/tiktok-ads-scraper --silent --output-dataset

```

## MCP server setup

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