TikTok Ads Library Scraper — EU Library & Creative Center
Pricing
from $15.00 / 1,000 results
TikTok Ads Library Scraper — EU Library & Creative Center
Scrape TikTok Ads Library (EU/EEA/UK) and Creative Center (global). Extract ad creatives, targeting data, reach estimates, CTR, video URLs, and industry insights. Dual-source coverage — no login required. Residential proxies built-in.
Pricing
from $15.00 / 1,000 results
Rating
0.0
(0)
Developer
Yuliia Kulakova
Actor stats
0
Bookmarked
1
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Spy · Analyze · Outperform
The only TikTok ad scraper that covers both the EU Ads Library and the global Creative Center —
targeting data, reach estimates, CTR, video URLs, and industry insights. All in one run.
Why this one? · Data sources · Input · Output · Use cases · Pricing · Limitations
TikTok Ads Library Scraper pulls ad data from two complementary TikTok sources:
- TikTok Ads Library — TikTok's official DSA transparency database for EU/EEA/UK. No login required. Returns targeting details, audience reach, and ad creatives for all ads shown in Europe.
- TikTok Creative Center — TikTok's global top-performing ads showcase. Covers US, APAC, LATAM, and every other market. Returns CTR, engagement metrics, video URLs, and industry data.
Both sources are public and require no TikTok account.
✨ What makes this different
| Feature | This actor | Most others |
|---|---|---|
| Covers both Ads Library + Creative Center | ✅ dual-source | ❌ one source only |
| Global coverage via Creative Center (US, APAC, LATAM…) | ✅ | ❌ EU-only |
EU DSA reach estimates (uniqueUsersSeen, usersTargetedEstimate) | ✅ | ❌ |
| CTR and engagement metrics (Creative Center) | ✅ | ❌ |
| Video CDN URLs + thumbnail | ✅ | Partial |
| Industry + campaign objective (Creative Center) | ✅ | ❌ |
| Budget tier (LOW / MEDIUM / HIGH) | ✅ | ❌ |
| Graceful handling of rate limits (429/403 logging) | ✅ | Silent failures |
| Warns when 3,600-result cap is reached | ✅ | No warning |
| Zero-result detection — no wasted compute | ✅ | ❌ |
| Residential proxies built-in (required for TikTok) | ✅ | ❌ |
📡 Data sources explained
Source 1 — TikTok Ads Library (library)
| Property | Detail |
|---|---|
| URL | https://library.tiktok.com/ |
| Login required | ❌ No |
| Coverage | EU-27 + EEA (IS, LI, NO) + Switzerland + UK |
| Why EU only? | Mandated by EU Digital Services Act (DSA), Article 39 |
| Result cap | 3,600 ads per query (TikTok platform limit — 300 pages × 12 ads) |
| Unique fields | targetAgeGroups, targetGender, targetInterests, targetBehaviors, uniqueUsersSeen, uniqueUsersSeenByCountry, adPaidForBy, rejectedInCountries |
Use this source when: you want DSA transparency data — who targeted whom, with what message, reaching how many people in Europe.
Source 2 — TikTok Creative Center (creative_center)
| Property | Detail |
|---|---|
| URL | https://ads.tiktok.com/business/creativecenter/ |
| Login required | ❌ No |
| Coverage | Global — US, GB, AU, BR, JP, KR, IN, and 50+ more |
| Data type | Top-performing ads (sorted by CTR and engagement) |
| Unique fields | ctr, likes, industry, campaignObjective, budgetRange, videoMetrics |
Use this source when: you want global competitive intelligence — what's performing best in your category, market, or country right now.
Source 3 — Both (both)
Runs both sources in a single actor run. Results are deduplicated automatically. Each result includes a source field so you always know where the data came from.
⚙️ Input
| Field | Type | Default | Description |
|---|---|---|---|
source | string | "library" | library · creative_center · both |
searchTerms | string[] | ["Nike"] | Keywords or brand names (library source only) |
countries | string[] | ["DE"] | ISO 2-letter codes. Library: EU/EEA/UK only. Creative Center: any country. |
adType | string | "ALL" | ALL · VIDEO · IMAGE |
dateFrom | string | — | Show ads first seen on/after this date (YYYY-MM-DD). Library only. |
dateTo | string | — | Show ads first seen on/before this date (YYYY-MM-DD). Library only. |
maxResults | integer | 50 | Max ads per search term + country pair. Hard cap: 3,600 (library). |
resolveAdDetails | boolean | false | Library only. Fetch each ad's detail page to unlock: adPaidForBy, advertiserBusinessId, targetAgeGroups, targetGender, targetInterests, targetCountries, targetBehaviors. Adds ~3 sec per ad. |
Note on countries: For
source: "library", only European countries work (see supported list). Forsource: "creative_center", any country code works includingUS,GB,AU,BR,JP.
Example inputs
Quick test — Nike EU ads (library)
{"source": "library","searchTerms": ["Nike"],"countries": ["DE"],"adType": "ALL","maxResults": 25}
Multi-country competitor research — 3 brands × 3 EU markets
{"source": "library","searchTerms": ["Adidas", "Nike", "Puma"],"countries": ["DE", "FR", "NL"],"adType": "ALL","maxResults": 100}
Global top video ads — US market (Creative Center)
{"source": "creative_center","countries": ["US"],"adType": "VIDEO","maxResults": 50}
Combined — EU library + global Creative Center
{"source": "both","searchTerms": ["Samsung"],"countries": ["DE", "US"],"adType": "ALL","maxResults": 50}
Date range — campaign window analysis
{"source": "library","searchTerms": ["Zalando"],"countries": ["DE"],"dateFrom": "2025-01-01","dateTo": "2025-03-31","maxResults": 200}
E-commerce swipe file — top image ads in UK
{"source": "creative_center","countries": ["GB"],"adType": "IMAGE","maxResults": 100}
Supported library countries
The Ads Library source works only for EU/EEA/Switzerland/UK countries. Unsupported countries are automatically skipped with a warning — the actor does not crash.
EU-27: 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 SKEEA: IS LI NOOther: CH (Switzerland) GB (United Kingdom)
For any other country (US, AU, BR, JP…) use source: "creative_center".
📦 Output schema
Each item in the dataset represents one ad. The source field tells you whether it came from the Ads Library or Creative Center.
{"adId": "7318291038472910337","source": "library","advertiserName": "Zalando SE","advertiserBusinessId": null,"adPaidForBy": null,"adText": null,"videoUrl": "https://v19-webapp.tiktok.com/video/tos/.../.mp4","thumbnailUrl": "https://p19-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/.../cover.jpg","imageUrls": [],"firstShownDate": "2025-02-10","lastShownDate": "2025-03-28","adStatus": "INACTIVE","daysRunning": 46,"uniqueUsersSeen": null,"uniqueUsersSeenByCountry": [],"targetCountries": [],"targetAgeGroups": [],"targetGender": null,"targetInterests": [],"targetAudienceType": null,"targetBehaviors": null,"usersTargetedEstimate": null,"rejectedInCountries": [],"industry": null,"campaignObjective": null,"budgetRange": null,"ctr": null,"likes": null,"videoMetrics": null,"scrapedAt": "2025-04-04T14:23:11.000Z"}
Library (default —
resolveAdDetails: false): Returns advertiser name, video/image creatives, ad dates, and run status. Reach estimates and targeting data requireresolveAdDetails: true.
Library example with resolveAdDetails: true (full targeting data unlocked):
{"adId": "7318291038472910337","source": "library","advertiserName": "Zalando SE","advertiserBusinessId": "7123456789012345","adPaidForBy": "Zalando SE","adText": null,"videoUrl": "https://v19-webapp.tiktok.com/video/tos/.../.mp4","thumbnailUrl": "https://p19-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/.../cover.jpg","imageUrls": [],"firstShownDate": "2025-02-10","lastShownDate": "2025-03-28","adStatus": "INACTIVE","daysRunning": 46,"uniqueUsersSeen": { "range": "10M-20M" },"uniqueUsersSeenByCountry": [{ "country": "DE", "impressions": "8.4M" },{ "country": "AT", "impressions": "1.2M" }],"targetCountries": ["DE", "AT", "CH"],"targetAgeGroups": ["18-24", "25-34", "35-44"],"targetGender": "Female","targetInterests": ["Fashion & Accessories", "Shopping"],"targetAudienceType": null,"targetBehaviors": { "videoInteractions": true, "creatorInteractions": false },"usersTargetedEstimate": "8.5M-10.4M","rejectedInCountries": [],"industry": null,"campaignObjective": null,"budgetRange": null,"ctr": null,"likes": null,"videoMetrics": null,"scrapedAt": "2025-04-04T14:23:11.000Z"}
Note:
adTextis always null for Library source — TikTok does not expose ad copy through any public Library API endpoint.
Creative Center example:
{"adId": "7401234567890123456","source": "creative_center","advertiserName": "GlowLab Skincare","advertiserBusinessId": null,"adPaidForBy": null,"adText": "We tested 100 skincare products. This one actually works.","videoUrl": "https://v19-webapp.tiktok.com/video/tos/.../video.mp4","thumbnailUrl": "https://p16-sign-va.tiktokcdn.com/tos/.../cover.jpg","imageUrls": [],"firstShownDate": null,"lastShownDate": null,"daysRunning": null,"adStatus": "ACTIVE","uniqueUsersSeen": null,"uniqueUsersSeenByCountry": [],"targetCountries": ["US"],"targetAgeGroups": [],"targetGender": null,"targetInterests": [],"targetAudienceType": null,"targetBehaviors": null,"usersTargetedEstimate": null,"rejectedInCountries": [],"industry": "Beauty & Personal Care","campaignObjective": "TRAFFIC","budgetRange": "HIGH","ctr": 3.24,"likes": 18400,"videoMetrics": {"duration": 28.5,"width": 1080,"height": 1920},"scrapedAt": "2025-04-04T14:23:45.000Z"}
Creative Center: Returns ad title, video creative, performance metrics (CTR, likes), industry, campaign objective, and budget tier. Dates, reach figures, and targeting details are not available from TikTok's Creative Center API.
Field reference
| Field | Source | Type | Notes |
|---|---|---|---|
adId | both | string | Unique TikTok ad ID |
source | both | string | library or creative_center |
advertiserName | both | string | Brand running the ad |
advertiserBusinessId | library* | string|null | Requires resolveAdDetails: true. TikTok business platform ID |
adPaidForBy | library* | string|null | Requires resolveAdDetails: true. DSA transparency: who paid for the ad |
adText | creative_center | string|null | Ad title/copy. Null for library source |
videoUrl | both | string|null | Direct CDN video URL (.mp4) |
thumbnailUrl | both | string|null | Cover image URL |
imageUrls | both | string[] | Static image creative URLs. Populated for IMAGE ads |
firstShownDate | library | string|null | First impression date (YYYY-MM-DD). Null for CC |
lastShownDate | library | string|null | Most recent impression date. Null for CC |
daysRunning | library | integer|null | Days since first shown. Null for CC |
adStatus | both | string | ACTIVE or INACTIVE (CC always returns ACTIVE) |
uniqueUsersSeen | library* | object|null | {range: "10M-20M"} impression estimate. Requires resolveAdDetails: true. Null for CC |
uniqueUsersSeenByCountry | library* | object[] | Per-country breakdown [{country, impressions}]. Requires resolveAdDetails: true. Empty array otherwise |
targetCountries | library* / CC | string[] | Library: requires resolveAdDetails: true. CC: always populated |
targetAgeGroups | library* | string[] | Requires resolveAdDetails: true. Age brackets: 18-24, 25-34, etc. |
targetGender | library* | string|null | Requires resolveAdDetails: true. Male, Female, or All |
targetInterests | library* | string[] | Requires resolveAdDetails: true. Interest categories |
targetAudienceType | library* | string|null | Requires resolveAdDetails: true |
targetBehaviors | library* | object|null | Requires resolveAdDetails: true. {videoInteractions, creatorInteractions} |
usersTargetedEstimate | library | integer|null | Estimated targeted audience size. Null for CC |
rejectedInCountries | library | string[] | Countries where ad was rejected. Empty for CC |
industry | creative_center | string|null | Advertiser industry category. Null for library |
campaignObjective | creative_center | string|null | TRAFFIC, CONVERSIONS, REACH, etc. Null for library |
budgetRange | creative_center | string|null | LOW / MEDIUM / HIGH. Null for library |
ctr | creative_center | float|null | Click-through rate. Null for library |
likes | creative_center | integer|null | Video like count. Null for library |
videoMetrics | creative_center | object|null | {duration, width, height}. Null for library |
scrapedAt | both | string | ISO 8601 scrape timestamp |
Field availability by source
| Field | library | creative_center | Notes |
|---|---|---|---|
advertiserName | ✅ | ✅ | |
adText | ❌ | ✅ | Not returned by TikTok Library search API |
videoUrl / thumbnailUrl | ✅ | ✅ | |
imageUrls | ✅ | ✅ | Populated for IMAGE ads |
firstShownDate / lastShownDate | ✅ | ❌ | Library only |
daysRunning | ✅ | ❌ | Computed from dates |
adStatus | ✅ | ✅ (always ACTIVE) | |
uniqueUsersSeen | ✅* | ❌ | Requires resolveAdDetails: true. Returns {range: "10M-20M"} |
uniqueUsersSeenByCountry | ✅* | ❌ | Requires resolveAdDetails: true. Per-country impressions |
usersTargetedEstimate | ✅* | ❌ | Requires resolveAdDetails: true. Targeted audience size range |
targetAgeGroups / targetGender | ✅* | ❌ | Library: enable resolveAdDetails: true |
targetInterests / targetBehaviors | ✅* | ❌ | Library: enable resolveAdDetails: true |
targetCountries | ✅* | ✅ | Library: enable resolveAdDetails: true |
advertiserBusinessId / adPaidForBy | ✅* | ❌ | Library: enable resolveAdDetails: true |
rejectedInCountries | ✅ | ❌ | DSA compliance data |
industry / campaignObjective | ❌ | ✅ | CC-only metrics |
budgetRange | ❌ | ✅ | LOW / MEDIUM / HIGH tier |
ctr / likes | ❌ | ✅ | Performance metrics from CC |
videoMetrics | ❌ | ✅ | Duration, dimensions |
Why are some fields null? TikTok's public APIs only expose a subset of ad data. Fields marked ❌ are not returned by TikTok — this is a platform limitation, not a scraper bug. No TikTok scraper can retrieve data that TikTok doesn't expose publicly.
🎯 Use cases
Competitor creative intelligence Pull all active ads from your competitor's brand in their key markets. Analyze which video hooks, CTAs, and creative formats they're investing in — and how large an audience they're reaching.
Building a TikTok ad swipe file
Use Creative Center source to extract top-performing video ads by country, industry, and objective. Filter by budgetRange: HIGH and ctr > 2.0 to collect only proven performers for your creative research.
EU DSA compliance monitoring
Track political, social, or issue-based advertisers in Europe using the Ads Library source. The adPaidForBy, targetAgeGroups, targetGender, and targetInterests fields reveal who is being targeted and by whom — exactly what DSA Article 39 requires to be transparent.
Agency multi-brand reporting Run weekly scrapes for a portfolio of brands across multiple EU markets. Export to CSV, push to Google Sheets, or integrate via Apify API into your reporting dashboard.
E-commerce market intelligence Monitor competitor ads in specific countries before entering a new market. See what formats (video vs image), what hooks, and which brands are getting the highest CTR in your niche.
Ad spend estimation (EU only)
While TikTok doesn't expose exact spend, uniqueUsersSeen + targetCountries gives you a strong signal of which campaigns are getting real budget. A campaign reaching 500K+ users across 5 EU countries is clearly a priority for that advertiser.
Creative trend analysis Track how creative formats are shifting over time. Run the same query monthly and compare: are competitors shifting from video to image? Are they testing new CTA types? Which hooks are disappearing and which are growing?
Influencer & creator strategy
The targetBehaviors.creatorInteractions field reveals which advertisers are targeting users who engage with specific creator profiles — a strong signal about which creator niches are commercially attractive.
💰 Pricing
From $15.00 / 1,000 ads — no monthly fees, pay only for what you scrape.
| Mode | Coverage | ~Cost per 1,000 ads |
|---|---|---|
source: "library" | EU/EEA/UK DSA data | ~$15 |
source: "creative_center" | Global top ads | ~$15 |
source: "both" | Combined — max data | ~$16–17 |
The
bothmode runs two browser sessions (one per source) which adds a small amount of Apify platform compute on top of the base event fee. No monthly fees — pay only for what you scrape.
⚠️ Limitations
TikTok Ads Library is EU/EEA/UK only
This is a hard platform constraint — TikTok built the Ads Library specifically for EU Digital Services Act compliance. US, APAC, LATAM, and Middle East markets are not available through this source. Use source: "creative_center" for global coverage.
3,600-result hard cap per query (library) TikTok caps the Ads Library at 300 pages × 12 ads = 3,600 results per search. The scraper detects this and logs a clear warning. To get more comprehensive data, run multiple narrower searches (e.g., different date ranges, different keywords).
No spend data
TikTok does not expose actual ad spend figures — not even ranges. This is unlike Meta, which provides {min, max} spend for political ads. All TikTok spend intelligence tools (AdSpyder, PiPiAds, etc.) are using estimates, not real figures.
adText is null for Library source
TikTok's Ads Library API does not expose ad copy text — not in the search API, not in the detail API. This is a deliberate platform choice. The Creative Center source does return adText (ad title) when the advertiser configured it.
Residential proxies required TikTok aggressively blocks datacenter IP ranges. The scraper uses residential proxies automatically — no configuration needed on your end.
Creative Center shows only top-performing ads The Creative Center does not return all ads — only ads that TikTok's algorithm has identified as top performers in a given period, country, and category. This is by design: it's a creative inspiration tool, not a complete ad archive.
TikTok page structure may change TikTok periodically updates their frontend. If results become empty after an update, open an issue and we'll push a fix within 24–48 hours.
🌍 Supported countries — quick reference
Ads Library (EU only)
| Code | Country |
|---|---|
| AT | Austria |
| BE | Belgium |
| BG | Bulgaria |
| CY | Cyprus |
| CZ | Czech Republic |
| DE | Germany |
| DK | Denmark |
| EE | Estonia |
| ES | Spain |
| FI | Finland |
| FR | France |
| GR | Greece |
| HR | Croatia |
| HU | Hungary |
| IE | Ireland |
| IT | Italy |
| LT | Lithuania |
| LU | Luxembourg |
| LV | Latvia |
| MT | Malta |
| NL | Netherlands |
| PL | Poland |
| PT | Portugal |
| RO | Romania |
| SE | Sweden |
| SI | Slovenia |
| SK | Slovakia |
| IS | Iceland |
| LI | Liechtenstein |
| NO | Norway |
| CH | Switzerland |
| GB | United Kingdom |
Creative Center (global — examples)
US GB AU CA DE FR BR MX JP KR IN ID TH PH VN SG MY ZA AE SA — and many more.