TikTok Ads Library Scraper Pro avatar

TikTok Ads Library Scraper Pro

Pricing

from $1.00 / 1,000 results

Go to Apify Store
TikTok Ads Library Scraper Pro

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

Crawler Bros

Maintained by Community

Actor stats

23

Bookmarked

9

Total users

6

Monthly active users

21 days ago

Last modified

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 identityadId, adUrl, adType (video / image), adFormat (single video / carousel / spark ad / image)
  • Creative assetsadVideoUrl, adVideoCover, adImages[], plus a full adVideos[] list for carousels
  • DatesadStartDate, adEndDate, derived daysActive, avgImpressionsPerDay
  • ReachadImpressions (TikTok's bucket like 10K-100K), exact adImpressionsExact when present, adSpent
  • Advertiser identityadvertiserName, 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 in targetingByAge[], per-region gender selection in targetingByGender[], total targetAudienceSize, plus targetingTotalRegions, targetingTotalImpressions
  • Audience targeting flagsaudienceTargeting (Yes/No), interestTargeting, videoInteractionsTargeting, creatorInteractionsTargeting (only emitted when non-empty)
  • ComplianceauditStatus, auditStatusLabel (approved, rejected, in_review, removed), sorAuditStatus, rejectionInfo, auditReasons
  • MiscctaText, 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

ParameterTypeDefaultDescription
queryStringshopifyFree-text search — company name, domain, or ad text. Empty = browse all ads.
adIdsArray[]Direct list of TikTok ad IDs. Bypasses search and fetches each ad's detail page directly.
advertiserNameString""Filter by advertiser name (substring match).
regionStringallTikTok ad region code. EU/EEA + UK/CH/TR are covered (DSA mandate). Use all for cross-region.
startDateString1 year agoEarliest ad start date (YYYY-MM-DD).
endDateStringtodayLatest ad end date (YYYY-MM-DD).
sortByEnumlast_shown_date,descOne of: last_shown_date/create_time/impression × asc/desc.
quickSearchBooleantrueWhen true, skip the per-ad detail fetch — faster, but omits targeting / advertiser registry / audience fields. Set false for full detail enrichment.
maxItemsInteger10Hard cap on emitted ads (1-5000).
regionFilterArray[]Pro. Only emit ads that target one of these regions (matched against targetingByLocation).
industryFilterArray[]Pro. Only emit ads whose advertiser industry contains one of these substrings.
languageFilterArray[]Pro. Only emit ads in these languages (e.g. en, de). Ads without a detected language are kept (avoids over-filtering).
ctaFilterArray[]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.
minImpressionsIntegerunsetPro. Drop ads below this many impressions (numeric value parsed from TikTok's bucket like 10K-100K).
useApifyProxyBooleantrueRoutes requests through Apify's proxy pool and rotates sessions when TikTok returns limit exceed.
requestDelaySecsInteger1Delay between API requests. Increase this for slower, gentler runs when TikTok is rate-limiting sampled IPs.
timezoneStringUTCIANA 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

FieldTypeDescription
adIdStringTikTok's internal ad ID.
adUrlStringPublic ad library detail URL.
adTypeStringvideo or image.
adFormatStringGranular format — single_video, carousel, spark_ad, image.
advertiserNameStringAdvertiser display name (from search card).
advertiserBusinessNameStringRegistered advertiser business name (from detail).
advertiserBusinessIdStringTikTok's internal advertiser business ID.
advertiserIdStringAlias of advertiserBusinessId (kept for backwards compatibility).
advertiserCountryStringRegistry country of the advertiser legal entity (e.g., Germany, Hong Kong).
advertiserSponsorStringSponsor / agency that placed the ad on the advertiser's behalf — often differs from advertiserName.
advertiserTikTokUserObjectLinked TikTok user account (id, nickname, uniqueId, avatarUrl) when present.
advertiserIndustryStringIndustry classification (when published).
adVideoUrlStringDirect URL to the ad's primary video.
adVideoCoverStringCover image URL.
adVideosArrayAll videos for carousel ads, each {videoUrl, coverImage}.
adImagesArrayAll static images.
adStartDateStringFirst-shown date (YYYY-MM-DD, UTC).
adEndDateStringLast-shown date (YYYY-MM-DD, UTC).
adImpressionsStringTikTok's impression bucket (e.g. 10K-100K, 1M-10M).
adImpressionsExactIntegerExact impression count if TikTok publishes one.
adSpentStringSpend bucket if TikTok publishes one.
auditStatusStringTikTok's audit code.
auditStatusLabelStringHuman label — approved, rejected, in_review, removed.
sorAuditStatusStringStatement-of-Reasons audit status (DSA Article 17 compliance).
rejectionInfoObjectRejection-reason payload (only if non-empty).
auditReasonsArrayList of audit-reason codes (only if present).
showModeIntegerRaw show-mode code from TikTok.
targetingByLocationArray[{region, impressions}] per-region impression breakdown.
targetingTotalRegionsIntegerNumber of distinct regions the ad was shown in.
targetingTotalImpressionsStringAggregate impression bucket across all regions.
targetingByAgeArray[{region, ages: [...]}] — list of age buckets selected per region.
targetingByGenderArray[{region, genders: [...]}] — list of genders selected per region.
targetAudienceSizeStringTotal addressable audience bucket (e.g. 22.0M-26.9M).
audienceTargetingStringYes if a custom-audience was used, else No.
interestTargetingStringInterest categories targeted (only if non-empty).
videoInteractionsTargetingStringVideo-interaction targeting rule (only if non-empty).
creatorInteractionsTargetingStringCreator-interaction targeting rule (only if non-empty).
ctaTextStringCall-to-action button label (e.g. Shop Now).
landingPageUrlStringLanding-page URL the CTA links to.
adLanguagesArrayDetected language(s) (e.g. ["en", "de"]).
adPlatformsArrayPlatforms the ad ran on (TikTok, CapCut, Pangle, Lemon8).
creativeIdStringTikTok creative ID.
creativeNameStringTikTok creative name.
dataSourceStringDSA-transparency or commercial-content.
commercialContentIndicatorBooleanSet when ad is flagged as commercial-content.
daysActiveIntegerDerived: adEndDate - adStartDate + 1.
avgImpressionsPerDayIntegerDerived: adImpressions lower bound ÷ daysActive.
scrapedAtStringISO 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 advertiserTikTokUser to see which brands run paid amplification on a creator's content.

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.

  • 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