TikTok Ads Library Scraper — EU Ad Library & Top Ads
Pricing
from $1.05 / 1,000 ads
TikTok Ads Library Scraper — EU Ad Library & Top Ads
Scrape TikTok's EU Ad Library (advertiser, ad text, video, first/last shown, reach by country, targeting) and Creative Center Top Ads (CTR, likes, industry, objective). Only-new monitor mode, advertiser summary. Pay per ad.
Pricing
from $1.05 / 1,000 ads
Rating
0.0
(0)
Developer
LatentLark
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Share
TikTok Ads Library Scraper — EU Ad Library & Top Ads (Creative Center)
For performance marketers, agencies and ad-spy / competitor-research teams. Pull competitors' TikTok ads from both of TikTok's public ad sources in one Actor:
- 🇪🇺 EU Ad Library (library.tiktok.com): every ad shown in the EU/EEA, Switzerland, the UK and Turkey, with advertiser, ad text, video, first/last shown, reach by country and age/gender/interest targeting, landing page and call to action.
- 🏆 Creative Center Top Ads (ads.tiktok.com): TikTok's curated best-performing ads in the US and 27 other markets, with CTR, likes, industry, objective, landing page and video in up to 1080p.
Outcome: a clean table of what your competitors run on TikTok right now, plus a weekly "only new ads" feed for monitoring, with no login, no TikTok account and no residential proxy.
- 🔎 Search by keyword or advertiser (name,
Name|bizIdor an advertiser link). Exact phrases with"quotes". - ♾️ Past TikTok's ceilings: automatic query slicing beyond the EU Library's short pages and Top Ads' 20-ads-per-filter anonymous cap, deduped by ad id.
- 🔔 Monitor mode:
onlyNewSinceLastRunreturns only ads you have not seen before (permonitorKey). Skipped ads are free. - 📊 Advertiser summary rows: ad count, new ads, countries, industries and landing domains per advertiser.
- 🟢 Soft fail: if TikTok rate-limits or nothing is found, the run still SUCCEEDS with a free
statusrow explaining why, so schedules stay green. - 💸 Pay per ad: $1.50 per 1,000 ads (+$1.00 per 1,000 with details).
Quick start (first run in about 30 seconds)
- Click Try for free (or Start in Console). The form is prefilled with source EU Ad Library, keyword
nike, countryDE, last 30 days and 10 ads max, details on. - Click Start. In about a minute you get ~10 Nike ads shown in Germany (advertiser, ad text, video, cover, first/last shown, reach in DE, targeting, landing page) plus an advertiser summary row, for about $0.03.
- Swap in your competitors' names or keywords and countries, raise Max ads per keyword/advertiser (default 200), or switch Source to Top Ads for US creatives.
What you can do with it
- Competitor ad spy: every TikTok ad a brand ran in Europe in the last 7/30/90/365 days, with the landing pages and offers they push.
- Creative research: Top Ads by CTR or likes for your industry (e.g. Apparel & Accessories, Beauty & Personal Care) and objective (Conversions, Traffic…) to brief UGC creators.
- Weekly new-ads alerts: schedule the Actor with
onlyNewSinceLastRunand pipe new rows to Slack, email or Google Sheets. - Targeting and reach intel (EU): which countries, ages and genders a competitor targets and the estimated reach per country.
- Lead generation for agencies: brands actively spending on TikTok ads in a market, with their landing domains.
- Straight into a spreadsheet: send the dataset to Google Sheets with Google Sheets Export.
Input
| Field | What it does |
|---|---|
source | euLibrary (default), topAds or both |
keywords | EU: advertiser name or ad text (nike, meal kit); "quotes" = exact phrase. Top Ads: only used with topAds.matchKeywords |
advertisers | EU only: advertiser name (exact legal name works best, e.g. NIKE Retail B.V.), Name|bizId, or an advertiser link from library.tiktok.com |
countries | EU: EU/EEA + CH, GB, TR (empty = all). Top Ads: US, GB, DE, FR, JP, BR… or ALL (empty = US) |
dateRange | EU: last7days, last30days (default), last90days, lastYear or custom with startDate/endDate |
onlyActive | EU: only ads still running |
topAds | {period: 7|30|180, sortBy: for_you|ctr|like|impression|play_6s_rate|cvr, industry, objective, adLanguage, slice, matchKeywords} |
maxAdsPerQuery | Max ads per keyword/advertiser × country (EU) or per country × period × filter (Top Ads). Default 200, prefilled 10 |
includeDetails | Landing page, CTA, objective, reach by country, targeting (EU); landing page, countries, comments/shares (Top Ads). Default on |
onlyNewSinceLastRun + monitorKey | Monitor mode: only ads not seen in earlier runs for this key |
outputAdvertiserSummary | One summary row per advertiser (default on) |
proxyConfiguration | Apify datacenter proxy (default). Residential is not needed |
EU example (two competitors, three countries, last 90 days):
{"source": "euLibrary","advertisers": ["NIKE Retail B.V."],"keywords": ["adidas"],"countries": ["DE", "FR", "IT"],"dateRange": "last90days","maxAdsPerQuery": 100,"includeDetails": true}
Top Ads example (US e-commerce, best CTR, last 30 days):
{"source": "topAds","countries": ["US"],"topAds": { "period": 30, "sortBy": "ctr", "industry": "Apparel & Accessories" },"maxAdsPerQuery": 50}
Output
One dataset item per ad (rowType: "ad"). EU Ad Library row (with details):
{"rowType": "ad","source": "euLibrary","adId": "1879578150853938","advertiserName": "NIKE Retail B.V.","advertiserBizId": "6876453864464188162","adText": "Neue Winterausrüstung in Nike Factory Stores.","videoUrl": "https://library.tiktok.com/api/v1/cdn/…/video/…","coverImageUrl": "https://p16-common-sign.tiktokcdn.com/…","landingUrl": "https://www.nike.com/de/retail?cp=…","landingDomain": "nike.com","firstShown": "2026-10-20T00:00:00Z","lastShown": "2026-10-25T00:00:00Z","daysActive": 6,"countries": ["DE"],"reachTotal": "200K-300K","reachByCountry": { "DE": "209K" },"targeting": {"age": [{ "region": "DE", "18-24": true, "25-34": true, "35-44": true, "45-54": false }],"gender": [{ "region": "DE", "female": true, "male": true }],"target_audience_size": "15.2M-18.6M","provinces": ["Berlin"]},"industry": "Apparel & Accessories","objective": "Traffic","callToAction": "Learn more","tiktokUsername": "nike","advertiserRegistryLocation": "Netherlands","adLibraryUrl": "https://library.tiktok.com/ads/detail/?ad_id=1879578150853938","detailsFetched": true,"isNew": true,"sourceInput": "nike","scrapedAt": "2026-10-26T22:05:25+00:00"}
Top Ads row (with details):
{"rowType": "ad","source": "topAds","adId": "7685323149223460884","advertiserName": null,"adText": "Ekorren Schlafsofa","videoUrl": "https://v16m-default.tiktokcdn.com/…","landingUrl": "https://www.sweef.de?utm_source=tiktok…","landingDomain": "sweef.de","countries": ["DE", "SE"],"ctr": 0.78,"likes": 0,"industry": "Furniture","industryParent": "Home Improvement","objective": "Conversions","videoDurationSec": 30.9,"topAdsPeriodDays": 30,"topAdsUrl": "https://ads.tiktok.com/business/creativecenter/topads/7685323149223460884/pc/en","detailsFetched": true,"isNew": true,"sourceInput": "DE / 30d"}
Advertiser summary row (rowType: "advertiserSummary"):
{ "rowType": "advertiserSummary", "source": "euLibrary", "groupedBy": "advertiser", "advertiserName": "NIKE Retail B.V.", "advertiserBizId": "6876453864464188162", "adCount": 30, "newAdCount": 30, "firstShown": "2026-10-14T00:00:00Z", "lastShown": "2026-10-25T00:00:00Z", "countries": ["DE"], "industries": ["Apparel & Accessories"], "landingDomains": ["nike.com"] }
- Status rows (
rowType: "status", free) explain soft failures:reason(e.g.eu_library_busy,top_ads_rate_limited,top_ads_no_results,top_ads_unknown_filter,advertiser_not_resolved), ahint, andretry: true/false. - Storage → Key-value store → SUMMARY: per keyword/country ads found, slices used, server totals, errors.
- Dataset view Ads shows a table with cover thumbnails.
Pricing
Pay per event, with volume discounts on higher Apify plans:
| Event | What it is | Free plan | Bronze | Silver | Gold+ |
|---|---|---|---|---|---|
apify-actor-start | Once per run (per GB of memory; default 512 MB = one start) | $0.005 | $0.005 | $0.005 | $0.005 |
ad | One ad saved to the dataset | $0.0015 | $0.00135 | $0.0012 | $0.00105 |
ad-details | Extra detail fetch that succeeded for an ad (includeDetails) | $0.001 | $0.0009 | $0.0008 | $0.0007 |
advertiser-summary | One advertiser summary row | $0.003 | $0.0027 | $0.0024 | $0.0021 |
- Free: status rows, ads skipped by only-new mode, duplicates, and details that failed to load.
- Examples (Free plan): 10 ads with details + 1 summary ≈ $0.04; 1,000 EU ads without details ≈ $1.51; 1,000 ads with details ≈ $2.51 plus summary rows.
- Set Max cost per run in Console to cap spend; the Actor stops cleanly at the limit.
How it works and limitations
- EU Ad Library covers Europe only. It is TikTok's DSA transparency archive: ads shown in the EU/EEA, Switzerland, the UK and Turkey. For US creatives use
source: "topAds". - Top Ads is a curated sample, not a full library. Anonymous Creative Center access returns at most 20 ads per (country, period, sort order, industry, objective). With
slice: true(default) the Actor combines sort orders and industry/objective sub-filters to go further (e.g. 142 of 143 US ads for 30 days). TikTok's pool itself tops out around 400 ads for 180 days orALLcountries. - Top Ads brand is often empty. Creative Center hides
brand_namefor many ads, soadvertiserNamecan benull. UselandingDomainto identify the brand; advertiser summaries for Top Ads are grouped by landing domain (2+ ads per group). - Top Ads has no keyword search without a login.
topAds.matchKeywords: truefilters the fetched Top Ads by your keywords client-side. - EU short pages. TikTok's EU search often stops after ~50 ads per query; the Actor re-requests, flips sort orders, halves date windows and splits by country to go further, deduping by ad id.
- "System busy" (HTTP 421). TikTok's EU Library answers some requests with 421; the Actor re-mints its session token and retries automatically (about 1 in 5 requests on datacenter proxies, all recovered in tests). Persistent 421s end with a free
eu_library_busystatus row. - Reach and targeting come from the EU detail page and are TikTok's own estimates (ranges like
200K-300K). - Video and image URLs are signed TikTok CDN links that expire after some days; download what you need soon after the run.
- Public data only: no login, no TikTok account, no private data.
FAQ
I got 0 results. Check the source and countries first: EU Ad Library only has ads shown in Europe (a US-only brand returns nothing; use Top Ads). Try a wider dateRange (last90days), a shorter keyword (nike instead of nike air max 90 sale), or remove quotes. For advertisers, use the exact legal name shown in the library (e.g. NIKE Retail B.V., not Nike) or paste the advertiser link. For Top Ads, try period: 180, a parent industry, or fewer filters. The status row and the SUMMARY record say what happened.
Why is advertiserName empty on Top Ads? TikTok does not show the brand for many Creative Center ads. Use landingDomain and topAdsUrl.
Can I get US ads with reach and targeting? No public TikTok source has that for the US. EU ads have reach/targeting; US ads are available only as Top Ads (CTR, likes, industry, objective).
How do I monitor a competitor weekly? Turn on Only new ads since last run, set a Monitor key (e.g. nike-weekly), and create a schedule. Each run returns only ads not seen before for that key.
Some runs show top_ads_rate_limited or eu_library_busy. TikTok throttled the requests. Partial results are kept, the run succeeds, and you can re-run later.
More from LatentLark
- Google Ads Transparency & LinkedIn Ad Library Scraper: the same competitor monitoring for Google Search/Display/YouTube and LinkedIn ads.
- Google Sheets Export & Import (No OAuth): send any dataset to Google Sheets.
- Google Local Services Ads Scraper: which local pros pay for Google Local Services Ads.
- Facebook Reels Scraper + Transcripts: public Facebook Reels with plays, reactions, shares and a spoken-word transcript (captions or Whisper), no login.