# TikTok Creative Center Top Ads + Landing Pages, No Login (`neverempty/tiktok-top-ads-landing-pages`) Actor

For media buyers, dropshippers and creative teams: TikTok Creative Center Top Ads with the landing page, CTR rank, likes, comments, shares, budget level, industry, objective and video URL in every row. No extra fee for ad details. Filter by country, period, industry, objective, language.

- **URL**: https://apify.com/neverempty/tiktok-top-ads-landing-pages.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 ad returneds

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 + Landing Pages, No Login

**For media buyers, dropshippers and creative teams: this TikTok Top Ads scraper exports the ads of TikTok Creative Center to CSV, Excel or JSON with the landing page in every row, with no login, no cookies and no TikTok account.** Each ad is one flat row with the ad text, brand, landing page and its domain, country, industry, campaign objective, CTR rank, likes, comments, shares, budget level and the video URL.

On 2026-10-19 it exported 200 different Top Ads of the United States and the United Kingdom (last 30 days) in 5 minutes. 141 of them had a landing page (95 different shops and sites), and every row was read with its ad details.

- **The landing page is in every row, at no extra fee.** Each ad's detail is read before the row is returned, so `landingPage`, `landingDomain`, `comments`, `shares` and the other countries the ad runs in come with the row you pay for. There is no second event for details.
- **Readable names, not codes.** `industryName` and `parentIndustryName` (for example "Daily Essentials" under "Household Products") and `objective` ("Conversions", "Traffic", "Lead Generation") are written out as the Top Ads page shows them.
- **More than 20 ads per country.** Without a login TikTok shows 20 ads per list. When you want more, the Actor also reads the other sort orders and each objective and industry of the country, and returns each ad once, even when several lists or countries show it.
- **Numbers explained.** `ctrTopPercent` is TikTok's "CTR Top N%" rank (smaller is better), and `budgetLevel` is the page's budget level (Low, Medium or High), not money.
- **Filter like on the page**: countries, last 7, 30 or 180 days, industries by name, campaign objectives and ad languages.
- **$3.50 per 1,000 ads, down to $2.00 on paid Apify plans.** No start fee. Rows that explain a missing result are free.

Unofficial and not affiliated with TikTok. It reads only what TikTok Creative Center shows to any visitor without logging in.

### What people use it for

- **Winning product and offer research**: see which shops run the top TikTok ads in a country and open their landing pages.
- **Ad creative inspiration**: collect the best-ranked ads of your industry with their ad text, video and CTR rank, for your creative team or an AI model.
- **Competitor tracking**: run it every week for your industry and countries and compare the brands, domains and objectives that appear.
- **Market reports**: count the top ads per industry, objective and budget level across up to 28 countries.

### How to scrape TikTok Creative Center Top Ads

1. Choose the `countries` (the United States is the example), the `period` and, if you want, `industries`, `objectives` and `adLanguages`.
2. Set `maxItems` (100 by default, up to 3,000) and the `sortBy` order to read first.
3. Click **Start**. The example input (US, 20 ads) took 39 seconds; 200 ads of two countries took 5 minutes.
4. Download the dataset as CSV, Excel or JSON, or call the Actor from the Apify API, Python or Node.js and read the rows as JSON.

### Input

| Field | Default | What it does |
| --- | --- | --- |
| `countries` | none (the example is US) | Country codes of the Top Ads to read, from the 28 TikTok covers. The maximum is shared between the countries, and an ad is returned once, under the first country it was found in. |
| `period` | `"30"` | Ads of the last `7`, `30` or `180` days. |
| `sortBy` | `for_you` | The order read first: `for_you` (TikTok's pick), `impression`, `like`, `ctr` or `play_6s_rate`. |
| `industries` | none | Industry names as on the Top Ads page (`Games`, `Beauty & Personal Care`, `E-Commerce (Non-app)`) or industry ids. A main industry also reads its sub-industries. |
| `objectives` | none | Campaign objectives: `conversion`, `traffic`, `video_view`, `reach`, `lead_generation`, `app_install`, `product_sales` or `app_promotion`. |
| `adLanguages` | none | Ad languages, for example `en`, `es`, `de`, `ja`. |
| `maxItems` | `100` | The run stops after this many ad rows. Up to 3,000. |

```json
{
    "countries": ["US", "GB"],
    "period": "30",
    "industries": ["Beauty & Personal Care"],
    "objectives": ["conversion"],
    "maxItems": 200
}
```

If you leave `countries` out, the example (US) is read and the run log says so. A country, industry, objective or language that TikTok Top Ads does not offer gets a free `invalid-input` row that lists the ones it does.

### Output

One row per ad. This row was read on Apify on 2026-10-19 (UTC) with the example input (the long media links are shortened here):

```json
{
    "adId": "7683355492748214279",
    "adTitle": "Bring spa-day comfort home. Enjoy 28% off WarmPress™.",
    "brandName": "canonyx",
    "landingPage": "https://canonyx.com/products/warmpress-towel-dispenser?utm_source=tiktok&utm_id=__CAMPAIGN_ID__&utm_campaign=__CAMPAIGN_NAME__&utm_medium=paid&tt_campaignid=__CAMPAIGN_ID__",
    "landingDomain": "canonyx.com",
    "country": "US",
    "countries": ["CA", "US"],
    "periodDays": 30,
    "industryId": "18101000000",
    "industryName": "Daily Essentials",
    "parentIndustryName": "Household Products",
    "objective": "Conversions",
    "objectiveKey": "conversion",
    "ctrTopPercent": 67,
    "likes": 4,
    "comments": 0,
    "shares": 0,
    "budgetLevel": "Low",
    "videoDurationSec": 21.6,
    "videoWidth": 720,
    "videoHeight": 1280,
    "videoUrl": "https://v16m-default.tiktokcdn.com/.../video/tos/alisg/...",
    "videoUrls": { "1080p": "https://...", "720p": "https://...", "540p": "https://...", "480p": "https://...", "360p": "https://..." },
    "coverUrl": "https://p16-common-sign.tiktokcdn.com/...",
    "mediaUrlsExpireAt": "2026-10-19T17:12:39.000Z",
    "hasVoiceOver": false,
    "adSource": "TikTok Ads Manager",
    "adDetailUrl": "https://ads.tiktok.com/business/creativecenter/topads/7683355492748214279/pc/en",
    "foundBy": { "sortBy": "for_you", "industry": null, "objective": null, "adLanguage": null },
    "detailsRead": true,
    "source": "tiktok-top-ads",
    "status": "ok",
    "scrapedAt": "2026-10-19T11:12:19.117Z"
}
```

Notes on the columns:

- `brandName` is `null` when the advertiser did not give one (TikTok leaves it empty for most ads: 44 of the 200 rows on 2026-10-19 had a brand name).
- `landingPage` and `landingDomain` are `null` when TikTok does not show a landing page for the ad (mostly video-view, reach and lead-generation ads, which keep people on TikTok): 141 of 200 had one.
- `ctrTopPercent` is the "CTR Top N%" rank of the Top Ads page: `5` means the ad is in the top 5% by click-through rate. It is not the click-through rate itself.
- `budgetLevel` is the page's budget level (`Low`, `Medium` or `High`). TikTok does not publish the amount spent.
- `country` is the country the ad was found under; `countries` lists every country TikTok says the ad runs in.
- `videoUrl` is the best quality; `videoUrls` has every quality. Media links are signed by TikTok and expire at `mediaUrlsExpireAt` (a few hours after the run), so download the files if you need to keep them.
- `detailsRead` is `false` if TikTok did not answer an ad's detail request after retries; the row then has the list fields only (no landing page, comments or shares). All 220 rows of the 2026-10-19 runs had it `true`.
- `foundBy` says which list (sort order and filter) the ad came from. `adDetailUrl` opens the ad on the Top Ads page.

### FAQ

**How do I export TikTok Creative Center Top Ads to CSV or Excel?**
Choose the countries and period, click Start and download the dataset as CSV, Excel or JSON. Each ad is one flat row with the landing page, industry, objective, CTR rank, likes, comments, shares and video URL. No TikTok account, login or cookie is needed.

**Can I get the landing pages of TikTok Top Ads?**
Yes. Every row is read with the ad's details, so `landingPage` and `landingDomain` are in the same row at no extra fee. On 2026-10-19, 141 of 200 US and UK Top Ads had a landing page.

**How many TikTok Top Ads can I get per country?**
Without a login TikTok shows 20 ads per list. The Actor reads the other sort orders, objectives and industries of the country to collect more, and returns each ad once. On 2026-10-19 it returned 100 different ads each for the US and the UK without running out.

**What does CTR Top 5% mean?**
It is TikTok's rank of the ad's click-through rate among the Top Ads: `ctrTopPercent: 5` means the top 5%. TikTok does not publish the click-through rate itself, and the Actor does not invent one.

**How much does it cost?**
$3.50 per 1,000 ads on the Apify Free plan, down to $2.00 per 1,000 on paid plans, with the ad details included and no start fee. Rows that explain a missing result are free.

### Rows that are never charged

| Status | Meaning |
| --- | --- |
| `invalid-input` | A country, industry, objective, language or period that TikTok Top Ads does not offer. The row lists the ones it does. |
| `no-ads` | TikTok lists no (new) ads for the country, period and filters. |
| `blocked` | TikTok did not open the Top Ads page, or stopped accepting it part way. The Actor does not try to get past a verification check; the rows returned before it are complete. |

### Pricing

- **$3.50 per 1,000 ads** on the Apify Free plan, down to $2.00 per 1,000 on paid plans, charged only for rows with `status: "ok"`. The ad details (landing page, comments, shares, countries) are part of the row. No start fee.
- An ad found by several lists or countries is returned and charged once.
- The Actor stops at the run's maximum total charge, and the run log says so.

### Good to know

- Unofficial. Public data only. This Actor is not affiliated with TikTok.
- The Actor opens the Top Ads page once in a real browser to start a visitor session, then reads the lists as the page does. It does not log in, use cookies or get past verification checks.
- TikTok asks a session to slow down after about 40 requests; the Actor then opens the page again (about 15 seconds) and goes on. That is why 200 ads take about 5 minutes.
- TikTok counts the ads of its unfiltered view per country (on 2026-10-19 for the last 30 days: US 143, UK 163). The run log shows this number for each country.
- Industry and objective are missing for a few ads that TikTok lists without them (9 of 200 without an industry on 2026-10-19).
- The Actor does not download video files or read the Top Ads analytics charts.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

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

Countries to read the Top Ads of (TikTok covers these 28). Each ad is returned once, under the first country it was found in, and the maximum is shared between countries. Leave empty to read the United States.

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

Ads that ran in the last 7, 30 or 180 days, as on the Top Ads page.

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

Which ads are read first: TikTok's own pick (For you), most impressions, most likes, best CTR or best 6-second view rate. When more ads are wanted than one list shows, the other orders are read too.

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

Only ads of these industries, by name as on the Top Ads page (Games, Beauty & Personal Care, E-Commerce (Non-app), Financial Services...) or by industry id. A main industry also reads its sub-industries. Leave empty for all industries.

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

Only ads run for these campaign objectives. Leave empty for all objectives.

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

Only ads in these languages. Leave empty for all languages.

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

The run stops once this many ad rows have been returned (charged). Ads are counted once even when several filters or countries list them. Up to 3,000.

## Actor input object example

```json
{
  "countries": [
    "US"
  ],
  "period": "30",
  "sortBy": "for_you",
  "maxItems": 20
}
```

# Actor output Schema

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

One row per TikTok Top Ad: the ad id, title and brand, the landing page and its domain, the countries it ran in, the industry and objective by name, the CTR rank (Top N%), likes, comments, shares, budget level, video length, video and cover URLs with their expiry time, and the filter that found it. Each ad is returned once per run. Countries with no ads, invalid input and blocked page sessions come back as free rows that say why.

# 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"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/tiktok-top-ads-landing-pages").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"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/tiktok-top-ads-landing-pages").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"
  ],
  "maxItems": 20
}' |
apify call neverempty/tiktok-top-ads-landing-pages --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/tiktok-top-ads-landing-pages"
        }
    }
}
```

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/ywxLTMl2HMQGdI8Fk/builds/PXJjyo8T2LDnfmcBw/openapi.json
