datagrit

datagrit › Guides › TikTok Top Ads Monitor: New Ads by Industry

Guide

How to track new TikTok Top Ads by industry and country with Python

Pull TikTok Creative Center Top Ads for several countries and industries, merge the lists, and get only the ads that are new since your last run.

Published 2026-10-05 · uses the TikTok Top Ads Monitor: New Ads by Industry Actor

TikTok Creative Center publishes a Top Ads ranking: the ads that perform best in a country, an industry and a campaign objective over the last 7, 30 or 180 days. Media buyers use it as a swipe file, dropshippers use it to spot products that are being pushed, and agencies use it for client reports. The page works well for browsing. It works badly for monitoring, because tomorrow's top 20 looks a lot like today's, and nothing tells you which ads are new.

This guide shows how to turn the ranking into a feed: one row per ad, several countries and industries in a single run, and a flag that separates ads you have already seen from ads that just entered the ranking.

Where the data comes from

The Creative Center page is backed by a JSON API on ads.tiktok.com that anonymous visitors can call. There is no login, but a few things make a hand-written scraper annoying:

The TikTok Top Ads Monitor Actor on Apify handles these. It signs the requests, resolves industry and objective names from the filter catalog, fetches details for you, and fails the run loudly instead of returning silent zeros if TikTok changes its response.

The 20-ad cap is the main limit, and the Actor works around it the only honest way: a single list never returns more than 20 ads, so one run reads many lists and merges them. Each sort order (for_you, ctr, like, impression, cvr) is a different top 20, and so is each country, industry, objective and language. An ad found in several lists becomes one row with its bestRank and the list of matchedSlices it appeared in. One run reads up to 400 lists.

Step by step

1. Define the input

Top ads in the US and the UK, ranked both by the default ranking and by CTR, over the last 7 days, with landing pages:


{
  "countries": ["US", "GB"],
  "periodDays": "7",
  "sortBy": ["for_you", "ctr"],
  "industries": [],
  "objectives": [],
  "adLanguages": [],
  "includeDetails": true,
  "onlyNew": false,
  "maxItems": 50
}

countries takes two-letter codes or names (28 countries are available). industries takes the 21 top-level Creative Center industries, for example Beauty & Personal Care or Apps. objectives takes names such as Conversions or Video Views. An unknown value stops the run with a message that names it, rather than reading the wrong list.

2. Run it from Python


from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "countries": ["US", "GB"],
    "sortBy": ["for_you", "ctr"],
    "periodDays": "7",
    "includeDetails": True,
    "maxItems": 50,
}

run = client.actor("datagrit/tiktok-top-ads-monitor").call(run_input=run_input)
ads = [a for a in client.dataset(run["defaultDatasetId"]).iterate_items() if a.get("found")]

for ad in ads[:10]:
    print(ad["bestRank"], ad["industry"], ad["ctr"], ad["landingDomain"])

3. Or with cURL


curl -X POST \
  "https://api.apify.com/v2/acts/datagrit~tiktok-top-ads-monitor/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"countries": ["US"], "industries": ["Beauty & Personal Care"], "maxItems": 20}'

What you get

One row per unique ad, best rank first. The fields that matter most:

FieldExampleMeaning
adId7687879583547113492TikTok's ad id, stable across runs
industryHotels & AccommodationIndustry name, with industryGroup (Travel) above it
objectiveVideo ViewsCampaign objective
ctr0.95Click-through rate TikTok shows for the ad
likes554Likes on the ad
landingDomainexample-brand.comDomain of the landing page, without www
bestRank1Best position across all lists the ad appeared in
matchedSlices`["US \7d \for_you"]`Every list that contained the ad
isNewtrueNot delivered by an earlier run with the same filters
firstSeenAt2026-10-05T08:00:00.000ZWhen this monitor first saw the ad

You also get title, comments, shares, costLevel, durationSeconds, videoUrl720p, videoUrl1080p, coverUrl, landingPage, shownInCountries, timesSeen, detailStatus and sourceUrl. Fields TikTok does not provide for an ad are null, never an empty string. If a run finds nothing, the dataset holds one status row with found: false and the reason, and that row is not charged.

Recipes

A daily feed of fresh creatives

Set onlyNew: true and schedule the Actor once a day. The first run returns everything that matches. Later runs return only ads that were not delivered before for the same filters, so the output is the list of ads that entered your ranking since yesterday.

The memory is a named key-value store on your own Apify account, keyed by a hash of your countries, industries, objectives, languages, sort orders and period. Two monitors with different filters never hide each other's ads, and reordering the same filters does not reset the memory. Connect the run's webhook to Slack, Zapier or n8n and post each new row with its cover image and landing page.

Which sort order finds the most ads?

A single list is capped at 20, so it pays to check what each order adds. In pandas:


import pandas as pd

df = pd.DataFrame(ads)
orders = df.explode("matchedSlices")
orders["order"] = orders["matchedSlices"].str.split(" \\| ").str[2]

print(orders.groupby("order")["adId"].nunique())
print("unique ads:", df["adId"].nunique())

If two orders overlap heavily, drop one and spend the slots on another country or industry instead.

Landing page watchlist for a niche

Run a niche such as Household Products with objectives: ["Conversions"] and includeDetails: true, then count landing domains over a few weeks:


df = pd.DataFrame(ads)
top_domains = df["landingDomain"].value_counts().head(15)
print(top_domains)

A domain that shows up in several lists, or keeps returning week after week (timesSeen rises), is a store that is scaling its spend. A new domain with isNew: true and a high bestRank is worth a look the same day.

Limitations

The Actor reads only the public Top Ads pages that anyone can open without an account. It returns advertising metrics and links, not personal profiles.

Wrapping up

If you want a daily list of the TikTok ads that just entered the ranking in your industry, TikTok Top Ads Monitor on Apify Store does it in one scheduled run, and the full input reference is on the documentation page.

Try TikTok Top Ads Monitor: New Ads by Industry on ApifyActor documentation

More guides