Tiktok Ads Library Creative Center Scraper
Pricing
from $3.20 / 1,000 ad results
Tiktok Ads Library Creative Center Scraper
Extract public TikTok ads, top creatives, landing pages, advertiser data, and creative insights from TikTok Ads Library and Creative Center for competitor research and marketing intelligence.
Pricing
from $3.20 / 1,000 ad results
Rating
0.0
(0)
Developer
Delowar Munna
Maintained by CommunityActor stats
0
Bookmarked
125
Total users
29
Monthly active users
8 hours ago
Last modified
Categories
Share
TikTok Ads Library & Creative Center Scraper — Ads, Creatives & Landing Pages
Other TikTok ad scrapers hand you a list of ads. This one hands you the strategy behind them.
Every row comes with the landing page the ad points to, the CTA and its category, the hook and offer in the copy, and the creative patterns detected in it — plus a shortlist / review / reference bucket, with a stated reason, so you know which ads are worth your time. It covers both the TikTok Ads Library and the TikTok Creative Center in one run, deduplicates across them, and needs no cookies and no login.
⚠️ Coverage — read this first
The two surfaces cover different regions. This trips people up, so it is the first thing on the page rather than a footnote.
| Surface | Coverage | What it gives you |
|---|---|---|
| Creative Center | 🌍 Global — US, GB, AU, BR, JP, DE… | Top-performing ads: video, caption, likes, CTR, industry, objective, duration |
| Ads Library | 🇪🇺 EU/EEA + UK, CH, TR only (33 regions) | Public ad records: advertiser, first/last shown dates, reach, and — with Resolve Ad Details — CTA, objective and full DSA targeting |
The TikTok Ads Library is the EU's Digital Services Act transparency archive. It is not a global ad library. Asking it for US or AU returns nothing — the actor will tell you so in the log rather than silently return an empty run.
Supported Ads Library 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
Other limits: TikTok caps Ads Library results at roughly 3,600 per query (300 pages × 12). Creative Center result counts vary by keyword — a niche term may only have 20 top ads in total.
Which mode should I use?
| If you want to… | Use | Countries |
|---|---|---|
| Research winning creative, hooks and offers in any market | creativeCenter | Any |
| Find every public ad a specific EU advertiser is running | adsLibrary | EU/EEA, UK, CH, TR |
| Get reach and audience targeting (DSA data) | adsLibrary + Resolve Ad Details | EU/EEA, UK, CH, TR |
| Broad competitive intelligence | both | Mix freely — each surface uses the countries it supports |
Why this scraper
Four things no other TikTok ad scraper returns:
- Landing-page intelligence — the URL the ad points to, its domain, and an inferred page type (
product-page,lead-form,app-download…). This is the funnel, not just the ad. Turn onResolve Ad Detailsto get it — TikTok only publishes the landing page on its per-ad detail endpoint, so it costs one extra API call per ad and is billed separately. - CTA text and a normalized CTA category —
shop-now,sign-up,download,learn-more… - Hook, offer and creative-pattern tags —
urgency-hook,discount-offer,social-proof,problem-solution,ugc-style, and eight more. - Analysis buckets with a reason — every ad is scored into
shortlist/review/reference/low-priority, and tells you why.
From a real run — a BJ's Wholesale Black Friday ad, and the funnel behind it:
"caption": "Well, I know I'm shopping for a TV during Black Friday… @BJ's Wholesale Club","landingPageUrl": "https://bjs.com/deals/promo/black-friday/?utm_source=tiktok&utm_medium=paid","landingPageDomain": "bjs.com","landingPageType": "landing-page","objective": "Traffic","industry": "Online Shopping","likes": 2093,"analysisReason": "Has landing page, Clear hook, 1 creative pattern(s) detected, Moderate engagement, Top creative"
And from the Ads Library — who an ad was actually targeted at:
"advertiserName": "HongKong AdTiger Media Co., Limited","ctaText": "Learn more","countries": ["NL","FI","PL","IT","SE","CH","BE","DE","DK","FR","IE","NO","GB"],"targetAgeGroups": ["13-17","18-24","25-34","35-44","45-54","55+"],"targetGender": ["female","male","unknown"],"targetAudienceSize": "131.5M-160.8M","reachRange": "0-1K"
Plus:
- No cookies, no login. Some Creative Center scrapers require you to paste your own TikTok session cookies. This one does not.
- Dual-surface with deduplication — an ad found on both surfaces becomes one row, with its lineage preserved.
- Flat, CSV-ready schema with four pre-configured dataset views. Opens cleanly in Sheets or Excel.
- A run summary in the Key-Value Store: totals by country, industry, advertiser, CTA and creative pattern.
Input
Example 1 — Landing-page intelligence ⭐
Start here. Top skincare ads in the US, each with the landing page it drives to.
{"mode": ["creativeCenter"],"searchTerms": ["skincare"],"countries": ["US"],"sortBy": "likes","resolveAdDetails": true,"maxResults": 25}
resolveAdDetails is what fills landingPageUrl, landingPageDomain and landingPageType. Without it those columns are null — TikTok only publishes the landing page on its per-ad detail record.
Example 2 — Competitor ads in the EU, with DSA targeting
Everything a German advertiser is running: who they are, what they're saying, and who they're targeting.
{"mode": ["adsLibrary"],"advertisers": ["Kärcher"],"countries": ["DE"],"dateFrom": "2026-01-01","dateTo": "2026-06-30","resolveAdDetails": true,"maxResults": 50}
Set dateFrom / dateTo. Without a window TikTok returns only ads first shown today, so every campaign looks like it ran for 0 days.
The residential proxy this needs is applied automatically — there is nothing for you to configure.
Example 3 — Both surfaces at once
{"mode": ["adsLibrary", "creativeCenter"],"searchTerms": ["air fryer"],"countries": ["DE", "US"],"dateFrom": "2026-01-01","dateTo": "2026-06-30","resolveAdDetails": true,"maxResults": 30}
DE is used for both surfaces; US is used for Creative Center only (the Ads Library has no US data) — and the log says so. maxResults is split round-robin, so you get both surfaces rather than whichever one filled up first.
Example 4 — Filtered creative research
Beauty ads optimised for conversions, in English, most-liked first.
{"mode": ["creativeCenter"],"countries": ["US", "GB"],"industries": ["Beauty & Personal Care"],"objectives": ["Conversions"],"adLanguage": "en","sortBy": "likes","resolveAdDetails": true,"maxResults": 50}
No searchTerms needed — filters alone are a valid discovery method.
Example 5 — Recurring competitor monitoring 💰
The cheapest run there is. Keep a list of competitor ad IDs and re-check them on a schedule. No search, no discovery — you pay only for the ads you asked for, and they always come back fully enriched.
{"mode": ["adsLibrary"],"adIds": ["1870685981562098", "1870657101304081"],"resolveAdDetails": true}
Pair this with an Apify schedule to track whether a competitor's ads are still running, and how their targeting changes.
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | select[] | both | Which surfaces to scrape: Ads Library, Creative Center, or both |
searchTerms | string[] | ["skincare"] | Keywords |
advertisers | string[] | [] | Advertiser / brand names (Ads Library) |
adLibraryUrls | string[] | [] | Direct library.tiktok.com URLs |
adIds | string[] | [] | Fetch specific ads by ID, skipping search entirely. The cheapest way to monitor a known set of competitor ads on a schedule — and these rows always come back fully enriched |
advertiserIds | string[] | [] | Ads Library. Look up advertisers by their DSA business ID (the advertiserId in the output) |
countries | select[] | ["US"] | 52 countries. Each option says which surface covers it — "Germany (DE) — both", "United States (US) — Creative Center only" |
industries | select[] | [] | 21 industries (Creative Center) |
objectives | select[] | [] | Traffic, App Installs, Conversions, Video Views, Reach, Lead Generation, Product sales |
adFormats | select[] | [] | Video, Image |
adLanguage | select | all | 16 languages (Creative Center) |
creativeCenterPeriod | select | 180 days | 7 / 30 / 180 days — the only windows TikTok supports. 180 is the maximum, so it is also the "all time" option. Short windows are frequently empty |
sortBy | select | recommended | Creative Center. TikTok's recommended order, or most-liked first. Matters when maxResults is small — it decides whether you get the best ads or an arbitrary slice |
dateFrom, dateTo | date | — | Ads Library. Set these. Without a date window TikTok returns only ads first shown today — see the FAQ |
maxResults | integer | 25 | Max ads returned (cap 3,600 — TikTok's own limit). You are charged per ad — start small |
resolveAdDetails | boolean | false | Adds landing pages. See above. Charged as ad-detail-result |
At least one of searchTerms, advertisers, adLibraryUrls, countries or industries is required.
Creative analysis, landing-page normalization, deduplication and the run summary are always on — they cost nothing extra, so there is no reason to make you choose. Proxying is handled internally: a residential proxy is used automatically, and only when the Ads Library detail path needs it.
Output
Every example below is copied verbatim from a real run (25 ads, both surfaces, resolveAdDetails: true). Nothing here is hand-written.
The schema is stable: 58 columns on every run — whichever surfaces you scrape, whether or not
Resolve Ad Detailsis on. Fields that do not apply come backnullrather than disappearing, so a Sheets formula, a BI import or a downstream script never breaks because a column went missing.
What it looks like in a table
| sourceSurface | advertiserName | caption | landingPageDomain | ctaCategory | objective | reachRange | likes | analysisBucket |
|---|---|---|---|---|---|---|---|---|
| adsLibrary | HongKong AdTiger Media Co., Limited | This cleaning job is open now | — | learn-more | Sales | 0-1K | — | reference |
| creativeCenter | — | Well, I know I'm shopping for a TV during Black Friday… @BJ's Wholesale Club | bjs.com | — | Traffic | — | 2093 | review |
| creativeCenter | — | Under eye protection using not just your typical occlusive… | doublebaycosmeceuticals.com.au | — | Traffic | — | 4778 | shortlist |
The two surfaces complement each other: the Ads Library tells you who, when and to whom; Creative Center tells you what worked and where it sent people.
Creative Center row — the landing page is the point
A real BJ's Wholesale Black Friday ad. Note landingPageUrl — the actual funnel, with TikTok's own UTM parameters intact.
{"sourceSurface": "creativeCenter","sourceInputType": "search","scrapedAt": "2026-07-14T12:05:24.967Z","adId": "7576424992980811793","videoUrl": "https://v16m-default.tiktokcdn.com/.../video/tos/maliva/...","videoThumbnailUrl": "https://p16-common-sign.tiktokcdn.com/tos-maliva-p-0068c799-us/...","caption": "Well, I know I'm shopping for a TV during Black Friday, all because of the amazing deals going on right now @BJ's Wholesale Club 👀 … #BJsWholesalePartner #ad","landingPageUrl": "https://bjs.com/deals/promo/black-friday/?trc=onso%7Cingm%7Cinf%7C…&utm_source=tiktok&utm_medium=paid","landingPageDomain": "bjs.com","landingPageType": "landing-page","adFormat": "Video","objective": "Traffic","industry": "Online Shopping","countries": ["US"],"videoDuration": 33.367,"likes": 2093,"comments": 20,"shares": 15,"ctrRanking": "0.31","performanceLabel": "moderate-interest creative","hookText": "Well, I know I'm shopping for a TV during Black Friday, all because of the amazi","creativeSummary": "video with emotional appeal (Traffic objective)","creativePatternTags": ["emotional-appeal"],"analysisBucket": "review","analysisReason": "Has landing page, Clear hook, 1 creative pattern(s) detected, Moderate engagement, Top creative (Creative Center)","isTopCreative": true,"detailResolved": true,"position": 1}
Ads Library row — the DSA transparency data
Advertiser identity, the CTA, and who the ad was actually targeted at. This is the data brilliant_gum charges $15/1,000 for.
{"sourceSurface": "adsLibrary","sourceInputType": "search","adId": "1870685981562098","videoUrl": "https://library.tiktok.com/api/v1/cdn/.../video/...","imageUrls": ["https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0051c001-sg/..."],"caption": "This cleaning job is open now","advertiserName": "HongKong AdTiger Media Co., Limited","ctaText": "Learn more","ctaCategory": "learn-more","objective": "Sales","adFormat": "Video","countries": ["NL","FI","PL","IT","SE","CH","BE","DE","DK","FR","IE","NO","GB"],"startDate": "2026-07-14T12:05:31.000Z","endDate": "2026-07-14T12:05:31.000Z","durationDays": 0,"reachRange": "0-1K","targetAgeGroups": ["13-17","18-24","25-34","35-44","45-54","55+"],"targetGender": ["female","male","unknown"],"targetAudienceSize": "131.5M-160.8M","reachByCountry": [{ "country": "NL", "impressions": "0-1K" },{ "country": "DE", "impressions": "0-1K" },{ "country": "GB", "impressions": "0-1K" }],"analysisBucket": "reference","analysisReason": "Clear CTA: Learn more, Clear hook","detailResolved": true}
⚠️
startDate === endDateanddurationDays: 0above because this run set no date window. TikTok then defaults to "last shown, newest first" and returns only ads first shown today. SetdateFrom/dateToand you get real campaign spans (verified: 57–89 days). See the FAQ.
Field availability by source
Fields are null when TikTok does not publish them for that surface — not because the scraper missed them. All figures below are counted from the same real 25-ad run (12 Ads Library + 13 Creative Center).
| Field | Ads Library | Creative Center |
|---|---|---|
adId, adFormat, objective, countries, scrapedAt | ✅ 12/12 | ✅ 13/13 |
videoUrl | ✅ 10/12 | ✅ 13/13 |
imageUrls | ✅ 12/12 | ❌ |
caption, hookText | ✅ 10/12 | ✅ 13/13 |
landingPageUrl / Domain / Type ⭐ | ❌ | 🔓 12/13 |
advertiserName | ✅ 12/12 | ⚠️ 1/13 — TikTok rarely publishes the brand here |
advertiserId | 🔓 12/12 | ❌ |
ctaText, ctaCategory | 🔓 12/12 | ❌ |
industry | ❌ | ✅ 13/13 |
startDate, endDate, durationDays | ✅ 12/12 | ❌ |
reachRange | ✅ 12/12 | ❌ |
targetAgeGroups, targetGender, targetAudienceSize, reachByCountry ⭐ | 🔓 12/12 | ❌ |
likes, comments, shares, ctrRanking, performanceLabel | ❌ | ✅ 13/13 |
videoDuration | ❌ | ✅ 13/13 |
analysisBucket, analysisReason, creativeSummary | ✅ 12/12 | ✅ 13/13 |
✅ published · ⚠️ sometimes · ❌ not published by TikTok for this surface · 🔓 needs Resolve Ad Details · ⭐ no competitor returns this
Always null unless the data exists: adUrl, adDescription, advertiserProfileUrl, regions, adLanguage, musicTitle, impressions (see FAQ), topLikesPercentage, errorType, errorMessage.
Creative analysis
Derived with text heuristics — helpful for triage, not official TikTok metrics.
| Field | What it is |
|---|---|
hookText | The opening line of the ad copy |
offerText | Detected offer ("50% Off", "free shipping", "discount code") |
ctaCategory | shop-now, learn-more, sign-up, download, subscribe, contact, watch, apply, claim, other |
creativePatternTags | ugc-style, product-demo, testimonial, urgency-hook, discount-offer, social-proof, question-hook, listicle, problem-solution, emotional-appeal, product-closeup, comparison |
performanceLabel | viral-creative, high-interest, moderate-interest, low-interest |
analysisBucket | shortlist (60+), review (35+), reference (15+), low-priority |
analysisReason | Plain-English explanation of the bucket |
landingPageType | product-page, collection-page, lead-form, content-page, app-download, homepage, other |
Pricing
Usage-based. You are charged per ad returned, so you only pay for results.
| Event | When | Rate |
|---|---|---|
ad-result | Every ad row in the dataset | see the Actor's pricing tab |
ad-detail-result | Only with resolveAdDetails, and only for ads actually enriched | see the Actor's pricing tab |
What a run costs
| Run | Events |
|---|---|
| 25-ad test run | 25 × ad-result |
| 1,000 ads | 1,000 × ad-result |
1,000 ads + resolveAdDetails | 1,000 × ad-result + 1,000 × ad-detail-result |
You are never charged for:
- Failed extractions. If a source breaks, the error row is written so you can see it — free.
- Ads that could not be detail-enriched (a 403'd ad costs you nothing).
- The run summary.
Creative analysis, landing-page enrichment, deduplication and the summary are included at no extra cost.
FAQ
Why did my Ads Library run return nothing for the US?
The TikTok Ads Library is the EU's DSA transparency archive — EU/EEA, UK, CH and TR only. There is no US data in it. Use creativeCenter for the US; it is global.
Do I need TikTok cookies or a login? No. Neither surface requires an account.
Do I need to configure a proxy? No. There is no proxy option, because there is nothing for you to decide. A residential proxy is applied automatically to the one path that needs it — Ads Library detail pages, which TikTok rate-limits per IP. Creative Center detail (where landing pages come from) goes through an API and needs no proxy at all.
Why is landingPageUrl empty?
Turn on Resolve Ad Details. TikTok does not put the landing page in its ad search results — only in the per-ad detail record. That is one extra API call per ad, so it is opt-in and billed as ad-detail-result. With it on, landing pages come back on 100% of Creative Center rows.
Why is advertiserName empty on Creative Center rows?
TikTok does not publish the brand for most Creative Center top ads — roughly 15% carry one. It is not a scraping failure. For reliable advertiser identity, use the Ads Library.
Why is impressions empty, and what is reachRange?
TikTok never publishes an exact impression count for the Ads Library — it publishes a bucket: "0-1K", "1K-10K", "100K-1M". That bucket is reachRange, and it is the honest value. impressions stays null unless TikTok gives a real number, rather than us inventing one from the bucket's lower bound.
Why do all my Ads Library ads say they started today, and ran for 0 days?
Because you did not set a date window. With no dateFrom/dateTo, TikTok defaults to a recent window sorted by "last shown, newest first" — so you only ever see ads first shown today, whose start and end dates are therefore the same. Set dateFrom and dateTo and you get real campaign spans (verified: ads running 61–66 days).
What is an analysisBucket?
A triage score. shortlist means the ad has a clear hook, a detected offer, strong engagement and recognisable creative patterns — worth studying. low-priority means none of that fired. analysisReason always tells you why.
How many ads can I get? TikTok caps the Ads Library at ~3,600 per query. Creative Center depends on the keyword — a niche term may only have 20 top ads that exist at all.
My Creative Center run returned zero ads. Is it broken?
Probably not — check creativeCenterPeriod. TikTok's top-ads index is sparse over short windows. Measured on skincare / US: 0 ads over 7 days, 0 over 30 days, 23 over 180 days. The default is 180 for exactly this reason. If you pick a shorter window and get nothing, the log will tell you to widen it.
Is this legal? It reads only public, officially-published TikTok surfaces — the DSA transparency archive and the public Creative Center. It accesses no private advertiser accounts, no campaign performance data and no non-public audience data.
Limitations
- The Ads Library is EU/EEA + UK/CH/TR only. This is TikTok's constraint, not ours.
impressionsandreachByCountryare TikTok's own range buckets, not exact counts.- Creative-analysis fields are keyword heuristics, not official TikTok signals, and will not catch every creative style.
resolveAdDetailsrequires a residential proxy and adds ~3 seconds per ad.- Ad copy is rarely published on the Ads Library surface; brand names are rarely published on Creative Center.
- TikTok may change its page structure or APIs at any time.
