TikTok Ads EU — Library Scraper with Demographics avatar

TikTok Ads EU — Library Scraper with Demographics

Pricing

Pay per event

Go to Apify Store
TikTok Ads EU — Library Scraper with Demographics

TikTok Ads EU — Library Scraper with Demographics

Scrape TikTok's EU Ad Library (library.tiktok.com) at scale. Get ads by keyword, advertiser name, or biz ID across 33 DSA regions. Per-region targeting drill-down. Uncapped advertiser deep-drill. Pay per ad scraped, no subs. $0.80 per 1,000 ads — 68% cheaper than competitors.

Pricing

Pay per event

Rating

5.0

(1)

Developer

Omar Eldeeb

Omar Eldeeb

Maintained by Community

Actor stats

2

Bookmarked

3

Total users

2

Monthly active users

3 days ago

Last modified

Share

Scrape TikTok's EU Ad Library (library.tiktok.com) at scale. Three input modes (keyword, advertiser name, advertiser ID), all 33 DSA-supported regions, and per-region × age × gender × reach drill-down for every ad.

$0.80 per 1,000 ads — 68% cheaper than the leading competitor.


What it does

Pulls every public ad TikTok serves in the European Union, EEA, UK, Switzerland, and Türkiye — straight from TikTok's own DSA-mandated transparency portal. Returns structured JSON with creative URLs, advertiser identity, sponsor info, dates active, and the targeting tree (which countries, age brackets, and genders each ad was shown to).

The data is richer than Meta's Ad Library for non-political commercial ads: TikTok's DSA disclosure exposes per-region demographic targeting for every ad, not just political ones.

Why use it

  • Brand & paid-social teams — track competitor TikTok ad spend, creative angles, and audience expansion across EU markets
  • Performance agencies — discover winning creatives by advertiser, region, or product keyword
  • Affiliate marketers & dropshippers — find winning products via Temu, Shein, AliExpress, and small-merchant ad volume
  • DSA & compliance researchers — pull regulator-grade targeting transparency for academic or NGO work
  • Brand monitoring — alert on new ads from competitors via scheduled runs

How to use

  1. Pick ONE input mode: keywords, advertiser names, or advertiser IDs.
  2. Pick the regions to query (default: top 7 EU markets — DE, FR, ES, IT, GB, NL, PL).
  3. (Optional) Set a date range, media-type filter, and includeTargetingDetail.
  4. Click Run.

First 10 chargeable events per run are FREE — validate the output before paying.

Input examples

{
"keywords": ["skincare", "supplements"],
"regions": ["DE", "FR", "NL"],
"includeTargetingDetail": true,
"maxItems": 500
}

⚠️ Keyword search is hard-capped at 1,000 results per (keyword, region) by TikTok. For deeper drills, use Mode B.

Mode B — advertiser name (auto-resolves biz IDs, UNCAPPED)

{
"advertiserNames": ["Temu", "Sephora", "Shein"],
"regions": ["DE", "FR", "ES", "IT", "GB", "NL", "PL"],
"includeTargetingDetail": true,
"maxItems": 10000
}

🚀 PRIMARY MODE. Resolves each name to all matching TikTok biz IDs (Temu has 10+ legal entities), then deep-paginates each. Temu alone has 557K+ ads in NL.

Mode C — direct biz IDs (skip resolution)

{
"advertiserIds": ["7479838683156283393", "7569985924331847688"],
"regions": ["NL", "DE"],
"includeTargetingDetail": true,
"maxItems": 5000
}

All 33 DSA regions, video-only, last 30 days

{
"keywords": ["Black Friday"],
"regions": ["AT", "BE", "BG", "CH", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GB", "GR", "HR", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MT", "NL", "NO", "PL", "PT", "RO", "SE", "SI", "SK", "TR"],
"mediaType": "video",
"dateRange": { "start": "2026-04-18", "end": "2026-05-18" },
"maxItems": 5000
}

Output sample (truncated)

{
"adId": "1865463294145538",
"name": "maja_irishdoodle",
"url": "https://library.tiktok.com/ads/detail/1865463294145538?region=DE",
"isActive": true,
"firstShownDate": "2026-05-17T00:00:00.000Z",
"lastShownDate": "2026-05-17T00:00:00.000Z",
"daysActive": 0,
"mediaType": "video",
"videoUrl1": "https://library.tiktok.com/api/v1/cdn/.../video.mp4",
"coverImage1": "https://p16-common-sign.tiktokcdn.com/.../cover.image",
"advertiserName": "maja_irishdoodle",
"advertiserBizIds": "7535939039262834705",
"advertiserRegistryLocation": "Lithuania",
"advertiserSponsor": "7535939130912407574",
"queryRegion": "DE",
"estimatedAudience": "0-1K",
"totalRegions": 5,
"totalImpressions": "0-1K",
"targetingLocations": [
{ "region": "DE", "impressions": "0-1K" },
{ "region": "BE", "impressions": "0-1K" },
{ "region": "AT", "impressions": "0-1K" },
{ "region": "LT", "impressions": "0-1K" },
{ "region": "GB", "impressions": "0-1K" }
],
"targetingAgePerRegion": [
{ "region": "DE", "13-17": false, "18-24": true, "25-34": true, "35-44": true, "45-54": false, "55+": false }
],
"targetingGenderPerRegion": [
{ "region": "DE", "female": true, "male": false, "unknown": false }
],
"audienceSize": "8.3M-10.1M"
}

Data fields (32 per ad)

FieldTypeNotes
adIdstringTikTok's ad-archive ID
name, urlstringAd name + library.tiktok.com link
isActivebooleanCurrently being shown
firstShownDate, lastShownDate, daysActiveISO date + int
mediaTypevideo / image / mixed / unknown
videoUrl1-2, coverImage1-2, imageUrl1-3URL strings⚠️ Video URLs signed ?x-expires=, valid ~24h
advertiserName, advertiserBizIds, advertiserRegistryLocation, advertiserSponsor, advertiserTtUserstringsDSA-mandated identity disclosure
queryRegionstringWhich DSA region this row was queried from
estimatedAudience, spent, impressionbucket stringsList-level metrics
totalRegions, totalImpressionsint + bucketFrom targeting detail
targetingLocations[]per-region reach bucketsDSA killer field
targetingAgePerRegion[]per-region × 6 age brackets booleansDSA killer field
targetingGenderPerRegion[]per-region × female/male/unknown booleansDSA killer field
audienceSize, interest[]from targeting detail
fetchedAt, scrapedAtISO dates

Pricing

EventPriceWhen
Actor start$0.01Per run
ad-scraped$0.0008 ($0.80/1K)Per ad row emitted
ad-details-fetched$0.0005When includeTargetingDetail=true, per ad
advertiser-resolved$0.001Once per advertiser name in Mode B
proxy-fetch$0.002Only when useProxy=true, per request

First 10 chargeable events per run are FREE.

Typical costs vs competitors

ScenarioOur costivanvs/tiktok-ad-library-scraper
100 ads, no detail$0.09$0.25 (-64%)
1,000 ads with detail$1.32$2.50 (no detail mode)
10,000 ads with detail$13.12$25 (-48% and we deliver more data)
100,000-ad deep drill on Temu$131Not possible (capped at 1K)

Supported regions (33)

EU/EEA + UK/CH/TR only. TikTok does NOT expose ads for US/JP/BR/IN/MX/AU/CA in this library.

EU: AT, BE, BG, CY, CZ, DE, DK, EE, ES, FI, FR, GR, HR, HU, IE, IT, LT, LU, LV, MT, NL, PL, PT, RO, SE, SI, SK EEA: IS, LI, NO Other: GB (UK), CH (Switzerland), TR (Türkiye)

FAQ

Q: Why EU-only? A: This actor scrapes library.tiktok.com — TikTok's Digital Services Act (DSA) transparency portal. The portal only covers regions where DSA-class disclosure is required. For US/global TikTok ads, those aren't exposed via any public TikTok API.

Q: What's the 1,000-ad keyword cap? A: TikTok server-enforces a hard cap of 1,000 results per (keyword, region) query on keyword search (query_type=3). If you need deeper coverage, use Mode B (advertiser names) — that mode uses query_type=2 with explicit advertiser IDs and is uncapped. Temu has 557K+ ads in NL alone via Mode B.

Q: How do I deep-drill a specific advertiser? A: Mode B (advertiser names) auto-resolves the name to all TikTok biz IDs (one advertiser often has 5–10 legal entities), then paginates uncapped per ID per region.

Q: Video URLs return 403 after a few hours A: TikTok signs video URLs with ?x-expires= that's valid for ~24 hours. Each row has fetchedAt so you know when the URL was retrieved. Re-fetch the ad detail to get a fresh URL.

Q: Should I enable the residential proxy? A: Default is OFF. For small one-shot queries (≤300 ads, single region, no concurrency), direct fetch works fine. Enable useProxy=true for: deep advertiser drills (500+ ads), concurrent runs (same actor fired multiple times in parallel), or full all-33-regions scrapes. TikTok soft-rate-limits with "limit exceed" when an IP gets noisy. The actor handles it gracefully (returns 0 ads + warning rather than crashing) but you'll get more data with the proxy enabled. Each request through residential proxy adds a proxy-fetch charge ($0.002 — ~67% markup over Apify's $0.0012/req cost basis).

Q: Why is there an official TikTok Commercial Content API I could use instead? A: Yes — open.tiktokapis.com/v2/research/adlib/ exists, BUT it requires manual research-project approval, OAuth2 setup, slow review, and is capped at 50 ads per call. This actor uses the public DSA portal — no approval, no auth, faster.

Q: How does the per-region targeting drill-down work? A: When includeTargetingDetail=true (default), we fetch the detail endpoint for each ad. TikTok exposes per-region (each country that saw the ad) × per age bracket (13-17, 18-24, 25-34, 35-44, 45-54, 55+) × per gender (female, male, unknown). This is DSA-mandated for every commercial ad and is the killer feature vs other ad-library scrapers.

  • All data comes from TikTok's public, EU-mandated transparency portal. No login, no auth, no data deobfuscation.
  • This actor is not affiliated with TikTok or ByteDance.
  • For competitive research, brand monitoring, academic study, and DSA-compliance auditing. Not for harassing advertisers or for purposes prohibited by TikTok's terms of service.
  • Video and creative URLs are TikTok-hosted CDN links with expiring signatures.

Built by constructive_calm. Sibling actor: Facebook Ad Library Pro.