TikTok Ad Intelligence
Pricing
from $0.00001 / actor start
TikTok Ad Intelligence
Rank a competitor's TikTok ads by how long they have run and how widely they were duplicated, and get a summary per advertiser.
Pricing
from $0.00001 / actor start
Rating
0.0
(0)
Developer
EMT Crawler
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Share
Give it your competitors. Get back which of their TikTok ads are actually working — and a one-row summary of what each advertiser is doing.
Built on TikTok's own Commercial Content Library, so every number traces back to something TikTok publishes. No login, no estimates dressed up as facts.
The idea
An ad that is still running after three weeks is an ad that pays for itself. An ad the advertiser duplicated into twelve separate entries is an ad they are pushing budget behind. Those two signals are public, and this actor extracts both:
| Signal | What it means | Where it comes from |
|---|---|---|
daysRunning | How long the ad has been live | TikTok's first/last shown dates |
duplicateCount | How many live copies of the same creative the advertiser is running | Identical ad text under the same advertiser |
isEvergreen | Still running after 14+ days | Derived from daysRunning |
rankByDaysRunning | The ad's rank inside that advertiser's set | Derived |
advertiserShareOfAds | How much of the scraped category the advertiser occupies | Derived |
What this is not: TikTok does not publish spend. duplicateCount is a budget signal, not a budget figure, and this actor never converts it into one.
Two outputs
Default dataset — one row per ad, with every field from the ad library (creative, dates, reach, advertiser, targeting) plus the five signals above. Open the "Ads by staying power" view to see the winners first.
Key-value store record ADVERTISER_SUMMARY — one entry per advertiser and country. Open it from the run's Storage → Key-value store tab:
{"advertiserName": "JD SPORTS FASHION PLC","country": "GB","adsFound": 200,"videoAds": 164,"imageAds": 36,"firstSeen": "2026-09-12","lastSeen": "2026-10-11","medianDaysRunning": 4,"maxDaysRunning": 557,"evergreenAds": 23,"scaledCreatives": 11,"industries": [{ "value": "Apparel & Accessories", "count": 180 }],"audienceBands": { "10K-100K": 120, "100K-1M": 65 },"targetedAgeGroups": [{ "value": "18-24", "count": 190 }],"targetedGenders": [{ "value": "female", "count": 150 }],"topInterests": [{ "value": "Sports", "count": 88 }],"topCreatives": [{"adTitle": "Reprimo's Echo collection has landed at JD","daysRunning": 29,"duplicateCount": 7,"videoUrl": "https://library.tiktok.com/api/v1/cdn/...","adUrl": "https://library.tiktok.com/ads/detail/?ad_id=...®ion=GB"}]}
How to use it
- Find your competitor's exact name. The library lists legal entities (
JD SPORTS FASHION PLC), not TikTok handles. Run it once with a keyword, look atadvertiserNamein the results, then re-run with the exact names. - Your date window filters, it does not clip. The window decides which ads are returned (those last shown inside it), but
daysRunningis the ad's true flight length — a 30-day window routinely surfaces ads that started 500+ days ago and are still running. Those are the real winners. - Sort by
daysRunning, thenduplicateCount. The ads at the top are the ones worth studying before you brief your own. - Then turn on
includeTargeting. Run it once without targeting to find which advertisers are worth your attention, then re-run on just those names with targeting on. It costs one extra request per ad, so paying for it on everyone is wasteful. - Re-run weekly. Comparing
evergreenAdsandscaledCreativesweek over week tells you where a competitor is shifting budget.
Input
{"advertisers": ["JD SPORTS FASHION PLC", "ASOS.COM LIMITED"],"countries": ["GB"],"lastDays": 30,"includeTargeting": false,"maxAdsPerAdvertiser": 100,"topCreatives": 5}
| Field | Type | Default | Notes |
|---|---|---|---|
advertisers | array | — | Required. Legal names or category keywords. |
countries | array | ["GB"] | EEA, UK, Switzerland and Turkey only — see below. |
lastDays | integer | 30 | Which ads to include, by last shown date. Minimum 7. |
dateFrom / dateTo | string | — | Exact range as YYYY-MM-DD. |
includeTargeting | boolean | false | Adds the age/gender/interest breakdown. One extra request per ad, so it roughly triples run time. |
maxAdsPerAdvertiser | integer | 100 | Per advertiser, per country. Advertisers are scraped side by side, so adding competitors costs far less time than raising this. |
topCreatives | integer | 5 | Winning ads embedded in each summary row. |
proxyConfiguration | object | Residential | The actor pins the proxy to the country it is scraping. |
Country coverage
The library only exists for 33 countries: the EEA, the United Kingdom, Switzerland and Turkey. There is no US, Asian or Vietnamese data — not here, and not on TikTok's site.
Speed
Advertisers are scraped side by side, one session each. Measured: 3 competitors, 232 ads, 3 minutes 33 seconds. A single advertiser takes about four minutes per 100 ads, because paging through one advertiser's results has to happen in order. Turning on includeTargeting roughly triples that.
If TikTok blocks one advertiser mid-run, that advertiser stops where it got to and the rest of the report still completes — the log says exactly which one and how far it got.
Limitations
- Targeting is best-effort, and the shared proxy pool limits it. TikTok rejects the per-ad targeting lookup from IP addresses it has seen too often. Measured over several runs on Apify's shared residential proxies, about half the ads come back with targeting; from a clean IP the same lookups succeed every time. The other ads keep every other field and carry
targeting: null, and the run log tells you the exact count. To improve it, raise Retries per request (slower, costlier) or plug your own proxies into the Proxy section. - Reach comes in bands (
10K-100K), never exact numbers. - TikTok caps a single search at 5,000 ads.
- A minority of ads have no creative published; they still count in the summary and are flagged
creativeAvailable: false. duplicateCountmatches on ad text. Two genuinely different videos sharing one caption will group together.advertiserNameis blank on some search results. Turning onincludeTargetingfills it in from the ad's detail page; the ones TikTok never attributes are grouped as "Unknown advertiser".
Legal
Reads a public transparency database TikTok publishes under the EU Digital Services Act. No personal data, no login.