TikTok Ads Library Scraper Pro
Pricing
from $1.00 / 1,000 results
TikTok Ads Library Scraper Pro
Scrape TikTok's public ad transparency library by query, advertiser, region, and date range. Pulls ad text, video URL, advertiser, impression buckets, and per-region/age/gender targeting. Pro filters: regionFilter, industryFilter, minImpressions, daysActive derived field.
Pricing
from $1.00 / 1,000 results
Rating
5.0
(23)
Developer
Crawler Bros
Maintained by CommunityActor stats
23
Bookmarked
9
Total users
6
Monthly active users
21 days ago
Last modified
Categories
Share
Scrape TikTok's public Ad Library (DSA transparency database) at scale. Extract every ad currently shown in EU/EEA, UK, Switzerland, and Turkey — with full per-ad targeting breakdowns, advertiser identification, creative URLs, and impression data.
What is TikTok Ads Library Scraper Pro?
TikTok publishes its full ad transparency database under the EU Digital Services Act (DSA). This actor calls TikTok's official library.tiktok.com JSON API directly — no browser, no cookies, no login — and emits clean, structured data ready for analysis.
No browser. No login. Proxy rotation enabled by default to reduce TikTok's per-IP limit exceed rate limits on cloud runs.
What you get out of every ad
- Ad identity —
adId,adUrl,adType(video / image),adFormat(single video / carousel / spark ad / image) - Creative assets —
adVideoUrl,adVideoCover,adImages[], plus a fulladVideos[]list for carousels - Dates —
adStartDate,adEndDate, deriveddaysActive,avgImpressionsPerDay - Reach —
adImpressions(TikTok's bucket like10K-100K), exactadImpressionsExactwhen present,adSpent - Advertiser identity —
advertiserName,advertiserBusinessName,advertiserBusinessId,advertiserCountry(registry country),advertiserSponsor(different from name when ad runs through an agency),advertiserTikTokUser(linked TT account when present),advertiserIndustry - Targeting breakdown — per-region
targetingByLocation[], per-region age buckets intargetingByAge[], per-region gender selection intargetingByGender[], totaltargetAudienceSize, plustargetingTotalRegions,targetingTotalImpressions - Audience targeting flags —
audienceTargeting(Yes/No),interestTargeting,videoInteractionsTargeting,creatorInteractionsTargeting(only emitted when non-empty) - Compliance —
auditStatus,auditStatusLabel(approved,rejected,in_review,removed),sorAuditStatus,rejectionInfo,auditReasons - Misc —
ctaText,landingPageUrl,adLanguages,adPlatforms(TikTok / CapCut / Pangle / Lemon8),creativeId,creativeName,dataSource,commercialContentIndicator,showMode
How to use
Quick start
{"query": "shopify","region": "DE","maxItems": 100}
Filter by advertiser only
{"advertiserName": "Temu","region": "all","maxItems": 500}
Direct lookup by ad ID
{"adIds": ["1863424159438849", "1863615078571137"]}
Pro filters — surgical narrowing of the result set
{"query": "supplements","region": "all","regionFilter": ["DE", "FR", "ES"],"industryFilter": ["health", "beauty"],"languageFilter": ["en", "de"],"ctaFilter": ["Shop Now", "Buy"],"minImpressions": 50000,"maxItems": 1000}
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
query | String | shopify | Free-text search — company name, domain, or ad text. Empty = browse all ads. |
adIds | Array | [] | Direct list of TikTok ad IDs. Bypasses search and fetches each ad's detail page directly. |
advertiserName | String | "" | Filter by advertiser name (substring match). |
region | String | all | TikTok ad region code. EU/EEA + UK/CH/TR are covered (DSA mandate). Use all for cross-region. |
startDate | String | 1 year ago | Earliest ad start date (YYYY-MM-DD). |
endDate | String | today | Latest ad end date (YYYY-MM-DD). |
sortBy | Enum | last_shown_date,desc | One of: last_shown_date/create_time/impression × asc/desc. |
quickSearch | Boolean | true | When true, skip the per-ad detail fetch — faster, but omits targeting / advertiser registry / audience fields. Set false for full detail enrichment. |
maxItems | Integer | 10 | Hard cap on emitted ads (1-5000). |
regionFilter | Array | [] | Pro. Only emit ads that target one of these regions (matched against targetingByLocation). |
industryFilter | Array | [] | Pro. Only emit ads whose advertiser industry contains one of these substrings. |
languageFilter | Array | [] | Pro. Only emit ads in these languages (e.g. en, de). Ads without a detected language are kept (avoids over-filtering). |
ctaFilter | Array | [] | Pro. Only emit ads whose CTA button text contains one of these substrings (e.g. Shop Now, Learn More). Ads without a CTA are dropped. |
minImpressions | Integer | unset | Pro. Drop ads below this many impressions (numeric value parsed from TikTok's bucket like 10K-100K). |
useApifyProxy | Boolean | true | Routes requests through Apify's proxy pool and rotates sessions when TikTok returns limit exceed. |
requestDelaySecs | Integer | 1 | Delay between API requests. Increase this for slower, gentler runs when TikTok is rate-limiting sampled IPs. |
timezone | String | UTC | IANA timezone for date-range bucketing. |
Default empty-input runs use query="shopify", quickSearch=true, and maxItems=10 so Apify's daily test emits real records quickly when TikTok is not rate-limiting the sampled IPs.
Output
Each ad is pushed as a separate dataset row. Empty fields are omitted (no nulls). Sample row:
{"recordType": "ad","adId": "1863424159438849","adUrl": "https://library.tiktok.com/ads/detail/?ad_id=1863424159438849","adType": "video","adFormat": "single_video","advertiserName": "STYLEGRID TRADING LIMITED","advertiserBusinessName": "STYLEGRID TRADING LIMITED","advertiserBusinessId": "7477502534530105361","advertiserId": "7477502534530105361","advertiserCountry": "Hong Kong","advertiserSponsor": "LINGTOK LIMITED","adVideoUrl": "https://library.tiktok.com/api/v1/cdn/.../video.mp4","adVideoCover": "https://p16-common-sign.tiktokcdn.com/.../cover.jpeg","adImages": ["https://p16-common-sign.tiktokcdn.com/.../cover.jpeg"],"adStartDate": "2025-08-12","adEndDate": "2026-04-29","adImpressions": "10K-100K","auditStatus": "1","auditStatusLabel": "approved","sorAuditStatus": "1","showMode": 1,"targetingByLocation": [{ "region": "DE", "impressions": "32K" }],"targetingTotalRegions": 1,"targetingTotalImpressions": "10K-100K","targetingByAge": [{ "region": "DE", "ages": ["25-34", "35-44", "45-54", "55+"] }],"targetingByGender": [{ "region": "DE", "genders": ["female", "male", "unknown"] }],"targetAudienceSize": "17.4M-21.2M","audienceTargeting": "No","daysActive": 261,"avgImpressionsPerDay": 38,"scrapedAt": "2026-04-29T11:39:32+00:00"}
Output field reference
| Field | Type | Description |
|---|---|---|
adId | String | TikTok's internal ad ID. |
adUrl | String | Public ad library detail URL. |
adType | String | video or image. |
adFormat | String | Granular format — single_video, carousel, spark_ad, image. |
advertiserName | String | Advertiser display name (from search card). |
advertiserBusinessName | String | Registered advertiser business name (from detail). |
advertiserBusinessId | String | TikTok's internal advertiser business ID. |
advertiserId | String | Alias of advertiserBusinessId (kept for backwards compatibility). |
advertiserCountry | String | Registry country of the advertiser legal entity (e.g., Germany, Hong Kong). |
advertiserSponsor | String | Sponsor / agency that placed the ad on the advertiser's behalf — often differs from advertiserName. |
advertiserTikTokUser | Object | Linked TikTok user account (id, nickname, uniqueId, avatarUrl) when present. |
advertiserIndustry | String | Industry classification (when published). |
adVideoUrl | String | Direct URL to the ad's primary video. |
adVideoCover | String | Cover image URL. |
adVideos | Array | All videos for carousel ads, each {videoUrl, coverImage}. |
adImages | Array | All static images. |
adStartDate | String | First-shown date (YYYY-MM-DD, UTC). |
adEndDate | String | Last-shown date (YYYY-MM-DD, UTC). |
adImpressions | String | TikTok's impression bucket (e.g. 10K-100K, 1M-10M). |
adImpressionsExact | Integer | Exact impression count if TikTok publishes one. |
adSpent | String | Spend bucket if TikTok publishes one. |
auditStatus | String | TikTok's audit code. |
auditStatusLabel | String | Human label — approved, rejected, in_review, removed. |
sorAuditStatus | String | Statement-of-Reasons audit status (DSA Article 17 compliance). |
rejectionInfo | Object | Rejection-reason payload (only if non-empty). |
auditReasons | Array | List of audit-reason codes (only if present). |
showMode | Integer | Raw show-mode code from TikTok. |
targetingByLocation | Array | [{region, impressions}] per-region impression breakdown. |
targetingTotalRegions | Integer | Number of distinct regions the ad was shown in. |
targetingTotalImpressions | String | Aggregate impression bucket across all regions. |
targetingByAge | Array | [{region, ages: [...]}] — list of age buckets selected per region. |
targetingByGender | Array | [{region, genders: [...]}] — list of genders selected per region. |
targetAudienceSize | String | Total addressable audience bucket (e.g. 22.0M-26.9M). |
audienceTargeting | String | Yes if a custom-audience was used, else No. |
interestTargeting | String | Interest categories targeted (only if non-empty). |
videoInteractionsTargeting | String | Video-interaction targeting rule (only if non-empty). |
creatorInteractionsTargeting | String | Creator-interaction targeting rule (only if non-empty). |
ctaText | String | Call-to-action button label (e.g. Shop Now). |
landingPageUrl | String | Landing-page URL the CTA links to. |
adLanguages | Array | Detected language(s) (e.g. ["en", "de"]). |
adPlatforms | Array | Platforms the ad ran on (TikTok, CapCut, Pangle, Lemon8). |
creativeId | String | TikTok creative ID. |
creativeName | String | TikTok creative name. |
dataSource | String | DSA-transparency or commercial-content. |
commercialContentIndicator | Boolean | Set when ad is flagged as commercial-content. |
daysActive | Integer | Derived: adEndDate - adStartDate + 1. |
avgImpressionsPerDay | Integer | Derived: adImpressions lower bound ÷ daysActive. |
scrapedAt | String | ISO timestamp when this row was emitted. |
Empty fields are stripped — only fields with actual data appear in each row.
FAQ
Why are non-EU regions not supported?
The TikTok Ad Library is a DSA (EU Digital Services Act) transparency mandate. TikTok only publishes ads shown in EU/EEA + UK/CH/TR. The actor returns HTTP 400 for unsupported regions, so we restrict the input enum.
Do I need a proxy?
Proxy rotation is enabled by default because TikTok often rate-limits cloud datacenter IPs with a limit exceed response. If every sampled proxy session is capped, retry after the cooldown window, lower maxItems, or increase requestDelaySecs.
What's the difference between quickSearch=true and quickSearch=false?
quickSearch=true skips the per-ad detail fetch and emits only the search-card data — faster (1 request per page of 50 ads), but omits targeting breakdowns, advertiser registry country, sponsor, and audience targeting.
quickSearch=false makes one extra detail-endpoint call per ad to enrich each row with the full targeting breakdown.
How fresh is the data?
TikTok's ad library refreshes within minutes of an ad being shown. The adStartDate / adEndDate reflect the current display window.
Why do some ads have no adVideoUrl / adImages?
Some ads are fully removed (auditStatus="2" rejected) but still listed in the transparency database with creative assets stripped. Those rows still expose advertiser identity and targeting metadata.
Can I scrape spark ads (organic-style)?
Yes. Set region and a query that matches the advertiser. Spark ads emit with adFormat="spark_ad".
Use cases
- Competitive intelligence — Track every ad your competitors run in Europe, including targeting strategy.
- Creative analysis — Download competitor creative, study CTAs, formats, and language strategies.
- Sponsorship research — Identify which agencies (
advertiserSponsor) place ads for which brands. - Compliance / DSA monitoring — Flag rejected or in-review ads, audit reasons, sponsor disclosures.
- Market sizing — Aggregate impression buckets per industry, region, age bucket.
- Influencer due diligence — Inspect
advertiserTikTokUserto see which brands run paid amplification on a creator's content.
Legal
This actor only extracts publicly-available data from TikTok's official transparency portal. Ensure your downstream use complies with TikTok's Terms of Service, GDPR, and applicable local laws.
Related scrapers
- TikTok Profile Scraper — profile and video metadata
- TikTok Comments Scraper — full comment threads with replies
- TikTok Hashtag Scraper — videos by hashtag
- TikTok Post Scraper — video downloads with metadata