TED Contract Expiry Radar - Recompete Leads
Find EU public contracts approaching expiry from TED award notices: incumbent, buyer, value, end date and renewal options.
datagrit › Data › TikTok Top Ads Monitor: New Ads by Industry
DataDaily monitor of TikTok Creative Center Top Ads: new ads per country, industry and objective with CTR, likes, landing page and video links, no login.
TikTok Top Ads Monitor reads the public TikTok Creative Center Top Ads ranking for the countries, industries and campaign objectives you choose and returns every ad as one clean row: title, brand, industry, objective, likes, CTR, video and cover links, and, when you ask for details, the landing page, comments, shares and the countries the ad ran in. No login and no cookies are needed. Turn on Only new ads and schedule the Actor, and each run returns just the ads that entered your ranking since the last run, so a daily run is a feed of fresh winning creatives instead of the same top 20 again.
One run reads the whole combination of countries, industries, objectives, languages and sort orders, merges an ad found in several lists into one row and tells you its best rank and every list it appeared in. Every row carries isNew, firstSeenAt and timesSeen, kept per set of filters, so two monitors never hide each other's ads. Ad details are included in the one ad price.
{
"adId": "7687879583547113492",
"title": "Discover a slower side of Dubai, surrounded by serene lagoons and lush gardens. #AnantaraThePalm",
"brandName": null,
"industry": "Hotels & Accommodation",
"industryGroup": "Travel",
"objective": "Video Views",
"likes": 554,
"comments": 3,
"shares": 0,
"ctr": 0.95,
"costLevel": 1,
"durationSeconds": 14.079,
"videoWidth": 576,
"videoHeight": 1024,
"coverUrl": "https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0037/oUrrcSzBKIBAb08f0aEB3YB1IKhiigObAwdjcV~tplv-noop.image",
"videoUrl720p": "https://v16m-default.tiktokcdn.com/540d5e3a234bcfca68b01a654cb40cdf/video/tos/alisg/example.mp4",
"videoUrl1080p": "https://v16m-default.tiktokcdn.com/995c8255bd3a5d41b629c31f7a5097c5/video/tos/alisg/example.mp4",
"landingPage": "https://www.example-brand.com/pages/offer?utm_source=tiktok",
"landingDomain": "example-brand.com",
"adSource": "Others",
"shownInCountries": ["US", "DE", "GB"],
"bestRank": 1,
"matchedSlices": ["US | 7d | for_you", "US | 7d | ctr"],
"isNew": true,
"firstSeenAt": "2026-10-05T08:00:00.000Z",
"timesSeen": 1,
"detailStatus": "ok",
"sourceUrl": "https://ads.tiktok.com/business/creativecenter/topads/7687879583547113492/pc/en",
"found": true,
"scrapedAt": "2026-10-05T08:00:00.000Z"
}
Every field is described in the dataset schema of the Actor, and the Top ads view shows the main columns.
Creative Center shows anonymous visitors one page of 20 ads per list, so a single list never returns more than 20 ads. To see more of the ranking, add sort orders, industries, objectives or countries: the Actor reads them all and merges the results. Keyword search is not available because the anonymous Creative Center API returns no results for it. The video and cover links are signed by TikTok and expire after a few days, so download the files if you need to keep them. The status message of every run states how many ads were read, how many had an industry and how many details were fetched, and the run fails instead of returning silent zeros when TikTok changes its response.
The Actor reads only the public Top Ads pages that anyone can open without an account, and returns advertising metrics and links, not personal profiles. You are responsible for how you use the data and for following TikTok's terms and the laws that apply to you.
Found a bug or a missing field? Open an issue on the Actor page and describe the input you used. Issues are answered in English, usually within a day.
Every result is one flat record, so it drops straight into a spreadsheet, a database or a CRM.
| Field | Type | Description | Example |
|---|---|---|---|
adId | string | TikTok Creative Center material ID of the ad. Empty only on the status row. | 7687879583547113492 |
title | string | Caption of the ad as shown in Top Ads, hashtags included. | Discover a slower side of Dubai #UnforgettableJourneys |
brandName | string | Advertiser or brand name when Creative Center shows one; many ads have none. | Anantara |
industry | string | Most specific Creative Center industry of the ad, for example Hotels & Accommodation. Empty when Creative Center uses a code missing from its own industry list. | Hotels & Accommodation |
industryGroup | string | Top-level Creative Center industry, for example Travel. This is the value the Industries input filters on. | Travel |
objective | string | Campaign objective of the ad, for example Conversions or Video Views. | Video Views |
likes | integer | Number of likes on the ad. | 554 |
comments | integer | Number of comments. Empty when details were not read or failed. | 3 |
shares | integer | Number of shares. Empty when details were not read or failed. | 0 |
ctr | number | Click-through rate in percent as ranked by Creative Center. | 0.95 |
costLevel | integer | Creative Center cost bracket of the ad, from 1 (lowest) upward. | 1 |
durationSeconds | number | Video length in seconds. | 14.08 |
videoWidth | integer | Video width in pixels. | 576 |
videoHeight | integer | Video height in pixels. | 1024 |
coverUrl | string | Signed link to the cover image on the TikTok CDN. The link expires after a few days; download the image if you need to keep it. | https://p16-common-sign.tiktokcdn.com/example.image |
videoUrl720p | string | Signed link to the 720p video on the TikTok CDN. Expires after a few days. | https://v16m-default.tiktokcdn.com/example.mp4 |
videoUrl1080p | string | Signed link to the 1080p video on the TikTok CDN. Expires after a few days. | https://v16m-default.tiktokcdn.com/example-1080.mp4 |
landingPage | string | Landing page URL of the ad as stored by Creative Center, tracking macros such as __CID__ left as they are. Empty when the ad has none or details were not read. | https://example.com/product?utm_source=tiktok |
landingDomain | string | Domain of the landing page without www. | example.com |
adSource | string | Tool the ad was made with, for example TikTok Ads Manager, TikTok Video Editor or Others. Empty when details were not read. | TikTok Ads Manager |
shownInCountries | array | Country codes the ad ran in. Empty when details were not read. | ["US","GB"] |
bestRank | integer | Best position of the ad (1 is top) across the lists it appeared in. | 3 |
matchedSlices | array | Every list the ad appeared in, as country | period | sort order | industry | objective | language. On the status row, all lists that were read. | ["US | 7d | for_you"] |
isNew | boolean | True when no earlier run with the same countries, industries, objectives, languages, sort orders and period delivered this ad. On the first run every ad is new. | true |
firstSeenAt | string | ISO 8601 time this monitor first delivered the ad; the current run time for new ads. | 2026-10-05T08:00:00.000Z |
timesSeen | integer | How many runs of this monitor have delivered the ad, this run included. | 1 |
detailStatus | string | ok when the ad detail was read, failed when the detail request failed, notRequested when Include ad details was off. | ok |
sourceUrl | string | Creative Center page of the ad. Empty only on the status row. | https://ads.tiktok.com/business/creativecenter/topads/7687879583547113492/pc/en |
found | boolean | False only for the single status row emitted when no ad matched. | true |
scrapedAt | string | ISO 8601 timestamp of extraction. | 2026-10-05T08:00:00.000Z |
{
"adId": "7687879583547113492",
"title": "Discover a slower side of Dubai #UnforgettableJourneys",
"brandName": "Anantara",
"industry": "Hotels & Accommodation",
"industryGroup": "Travel",
"objective": "Video Views",
"likes": 554,
"comments": 3,
"shares": 0,
"ctr": 0.95,
"costLevel": 1,
"durationSeconds": 14.08,
"videoWidth": 576,
"videoHeight": 1024,
"coverUrl": "https://p16-common-sign.tiktokcdn.com/example.image",
"videoUrl720p": "https://v16m-default.tiktokcdn.com/example.mp4",
"videoUrl1080p": "https://v16m-default.tiktokcdn.com/example-1080.mp4",
"landingPage": "https://example.com/product?utm_source=tiktok",
"landingDomain": "example.com",
"adSource": "TikTok Ads Manager",
"shownInCountries": [
"US",
"GB"
],
"bestRank": 3,
"matchedSlices": [
"US | 7d | for_you"
],
"isNew": true,
"firstSeenAt": "2026-10-05T08:00:00.000Z",
"timesSeen": 1,
"detailStatus": "ok",
"sourceUrl": "https://ads.tiktok.com/business/creativecenter/topads/7687879583547113492/pc/en",
"found": true,
"scrapedAt": "2026-10-05T08:00:00.000Z"
}
| Field | Name | Type | What it does |
|---|---|---|---|
countries | Countries | array | Countries whose Top Ads ranking to read. Use two-letter codes or names. Each country is read separately and the same ad found in several lists is returned once. Available: AR Argentina, AU Australia, BR Brazil, CA Canada, CO Colombia, FR France, DE Germany, ID Indonesia, IT Italy, JP Japan, MY Malaysia, MX Mexico, NL Netherlands, PK Pakistan, PH Philippines, RO Romania, SA Saudi Arabia, SG Singapore, ZA South Africa, KR South Korea, ES Spain, SE Sweden, TH Thailand, TR Turkey, AE United Arab Emirates, GB United Kingdom, US United States, VN Vietnam. |
periodDays | Ranking period | string | Window the Top Ads ranking is calculated over. |
sortBy | Sort orders | array | Ranking orders to read. Each order returns a different top 20, so several orders widen coverage. Ads found in more than one are returned once with their best rank. Available: for_you (default ranking), ctr, like, impression, cvr (conversion rate). |
industries | Industries | array | Limit to these top-level industries. Leave empty for all industries. Available: Apparel & Accessories, Appliances, Apps, Baby, Kids & Maternity, Beauty & Personal Care, Business Services, E-Commerce (Non-app), Education, Financial Services, Food & Beverage, Games, Health, Home Improvement, Household Products, Life Services, News & Entertainment, Pets, Sports & Outdoor, Tech & Electronics, Travel, Vehicle & Transportation. |
objectives | Campaign objectives | array | Limit to these campaign objectives. Leave empty for all objectives. Available: Traffic, App Installs, Conversions, Video Views, Reach, Lead Generation, Product sales. |
adLanguages | Ad languages | array | Limit to ads in these languages, by code. Leave empty for all languages. Available: en English, es Spanish, ar Arabic, vi Vietnamese, th Thai, de German, id Indonesian, pt Portuguese, fr French, ms Malay, nl Dutch, ja Japanese, it Italian, ro Romanian, zh-Hant Traditional Chinese, ko Korean. |
onlyNew | Only new ads | boolean | Return only ads not delivered by an earlier run with the same countries, industries, objectives, languages, sort orders and period. Turn on for a daily or weekly monitor; the first run returns everything. |
includeDetails | Include ad details | boolean | Read each ad detail for its landing page, comments, shares and the countries it ran in. Adds one request per ad; turn off for a faster list-only run. |
maxItems | Maximum ads | integer | Stop after this many ads in total across all lists. |
proxyConfiguration | Proxy configuration | object | Optional proxy. Leave disabled unless TikTok blocks datacenter traffic from your location; residential proxy raises the platform cost of the run. |
Run the Actor and get the results in one request. Replace YOUR_APIFY_TOKEN with the token from your Apify account settings.
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","GB"],"sortBy":["for_you","ctr"],"periodDays":"7","includeDetails":true,"maxItems":50}'import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('datagrit/tiktok-top-ads-monitor').call({
"countries": [
"US",
"GB"
],
"sortBy": [
"for_you",
"ctr"
],
"periodDays": "7",
"includeDetails": true,
"maxItems": 50
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);Install with npm i apify-client.
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("datagrit/tiktok-top-ads-monitor").call(run_input={
"countries": [
"US",
"GB"
],
"sortBy": [
"for_you",
"ctr"
],
"periodDays": "7",
"includeDetails": True,
"maxItems": 50
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(len(items), items[0] if items else None)Install with pip install apify-client.
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.
Find EU public contracts approaching expiry from TED award notices: incumbent, buyer, value, end date and renewal options.
UK public contracts ending soon with incumbent supplier, buyer, value and contact - recompete leads from Contracts Finder award notices.
French company lead lists from Sirene screened by net result and revenue, with net margin, size, matching establishment and optional directors.
Named officers, directors and key employees with pay, hours and titles from IRS e-filed 990, 990-EZ and 990-PF returns.