TikTok Ad Library Scraper - Reliable avatar

TikTok Ad Library Scraper - Reliable

Pricing

from $0.40 / 1,000 ad scrapeds

Go to Apify Store
TikTok Ad Library Scraper - Reliable

TikTok Ad Library Scraper - Reliable

Scrape the TikTok Ad Library (EU/EEA, UK, CH, TR) by advertiser, keyword, country, date, status, format, reach, age and gender. Fast cards or full details: landing page, CTA, objective, paid by, TikTok account, impressions by country/age/gender, targeting.

Pricing

from $0.40 / 1,000 ad scrapeds

Rating

0.0

(0)

Developer

Christian Machon

Christian Machon

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 hours ago

Last modified

Share

TikTok Ads Library Scraper & API - Reliable

Scrape the public TikTok Ad Library (TikTok's Commercial Content Library) by advertiser name or keyword, country, date range, ad status, format, reach, targeted age and gender. Get every ad's text, video / image, advertiser, first and last shown date and unique reach, and optionally the full ad details: landing page URL, call to action, objective, "paid by", TikTok account, impressions by country with an age x gender split, and targeting (countries, regions, ages, genders, audience size, interests, languages, devices).

It runs a real Chrome browser, because TikTok signs every Ad Library API request in the page (plain HTTP requests get "system busy" errors). No login, no cookies, no proxy needed: if TikTok starts blocking the server's IP, the Actor switches to Apify Proxy sessions by itself.

What can you use it for?

  • Competitor ad research: every ad a brand has run on TikTok in Europe, with video, copy and landing page.
  • Creative inspiration: browse current video ads for a keyword ("skincare", "black friday") and sort by reach.
  • Reach and spend proxies: estimated unique reach and impression ranges per country, age and gender.
  • Targeting intelligence: which countries, regions, ages, genders, interests and devices an advertiser targets.
  • Lead generation: find companies actively advertising on TikTok in a market, with their advertiser ID, registered country and TikTok account.

Two modes: cards (fast) or details (full)

Cards (includeDetails: false, default)Details (includeDetails: true)
What you getAd ID/URL, advertiser name, ad text, video / cover / images, first & last shown, unique reach, industryEverything in cards plus landing page, CTA, objective, advertiser ID & country, paid by, TikTok account, impressions by country / age / gender, targeting
Speed (our tests)about 150-350 ads/minute per search; 500-620 ads/minute with several searches in parallelabout 25-35 ads/minute (about 8-15/minute when TikTok blocks the IP and the run moves to proxies)
Price$0.40 per 1,000 ads$1.50 per 1,000 ads

Details are slower because TikTok serves only one detail record per full page load, so each ad needs its own page load. Use cards for volume and details when you need landing pages, impressions or targeting.

How to use it

  1. Enter one or more search terms: an advertiser name or keyword, exactly like the search box on library.tiktok.com. Wrap a term in double quotes ("free shipping") for an exact phrase. Each term is a separate search.
  2. Optionally pick countries (the Ad Library covers only the EU/EEA, Switzerland, the UK and Turkey), a date range, ad status, format, reach, ages, gender and sort order.
  3. Set Max ads per search (TikTok serves 12 per page and shows at most about 5,000 per search).
  4. Switch Include ad details on if you need the full record.
  5. Run. Ads go to the dataset; a per-input summary goes to the OUTPUT record in the key-value store.

You can also paste Ad Library search URLs (all their filters are kept), single ad URLs (https://library.tiktok.com/ads/detail/?ad_id=...) or plain ad IDs; single ads are always returned with details.

Input examples

Cards only, two brands in Germany and France, last 30 days:

{
"searchTerms": ["nike", "adidas"],
"countries": ["DE", "FR"],
"dateRange": "last-30-days",
"maxAdsPerSearch": 200
}

Full details for active video ads with an exact phrase, sorted by reach:

{
"searchTerms": ["\"black friday\""],
"countries": ["GB"],
"adStatus": "active",
"mediaType": "video",
"sortBy": "reach-desc",
"maxAdsPerSearch": 50,
"includeDetails": true
}

Specific ads:

{
"adIds": ["1863828861691042"],
"adLibraryUrls": ["https://library.tiktok.com/ads/detail/?ad_id=1848312888172689"]
}
FieldDescription
searchTermsAdvertiser names or keywords; "quoted" = exact phrase.
adLibraryUrlsAd Library search URLs or single ad URLs.
adIdsNumeric TikTok ad IDs (returned with details).
countriesISO codes: 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. Empty = all. Other codes are reported in OUTPUT.inputErrors.
dateRangelast-7-days, last-30-days, last-90-days, last-12-months (default), all or custom with startDate / endDate.
adStatusall, active, inactive.
mediaTypeall, video, image, text.
reachunder-10k, 10k-100k, over-100k.
ages, genderTargeted age groups and gender.
sortByLast shown, published date or reach, ascending or descending.
maxAdsPerSearch1-5000, default 50.
includeDetailsDefault false (cards).
maxConcurrencyParallel browser tabs, default 3 (fits 2 GB). For large detail runs use 4 GB and 4.
maxRetriesRetries per search page / detail record, default 6.
proxyConfigurationNot needed. Set it only to force every request through a proxy.

What data you get

Fill rates measured on 4,979 ads from our final test runs (October 2026): 4,670 card-only ads and 309 ads with details.

FieldCardsDetailsNotes
adId, adUrl, adText, mediaType, firstShown, lastShown, removed, searchInput, searchType, detailsStatus, scrapedAt100%100%Dates are YYYY-MM-DD.
advertiserName96%92%
estimatedAudience, estimatedAudienceMin, estimatedAudienceMax96%100%Unique reach, e.g. "10K-100K" → 10000 / 100000.
videoUrl, videoCoverUrl, videoCount79%80%Video ads (about 79% of ads). Video links are signed by TikTok and expire.
imageUrls49%43%Image ads and carousels.
industry29%85%
objective-99%E.g. "Community interaction", "Traffic".
advertiserId, advertiserCountry, paidBy-91-92%
callToAction-61%
landingPageUrl-43%Ads that link off TikTok.
tiktokUsername, tiktokDisplayName, tiktokProfileUrl, tiktokFollowers, tiktokFollowersCount, tiktokAccountType, tiktokAvatarUrl-32%Only when TikTok links the ad to a TikTok account.
totalImpressions (+ Min / Max), impressionsByCountry-100%Ranges per country with byAgeGender split.
targetCountries, targetAges, targetGenders, targetAudienceSize, targetCustomAudience, targetAudienceExclude, targetHighSpendingPower, targetOperatingSystems-99-100%
targetLanguages, targetInterests, targetProvinces, targetCities-1-10%Only when the advertiser used them.
rejectionInfo0%8%For removed ads.

detailsStatus is OK, NOT_REQUESTED (cards mode) or FAILED (the detail record could not be loaded after all retries; the card data is still saved and the details are not charged).

Not published by TikTok and therefore not in the output: exact spend, exact impressions, engagement (likes, comments), and ads shown only outside Europe.

Output example (details mode, shortened)

{
"adId": "1856680845765634",
"adUrl": "https://library.tiktok.com/ads/detail/?ad_id=1856680845765634",
"advertiserName": "buildlegovibes",
"adText": "#afol #lego #harrypotter @LEGO",
"industry": "Household Products",
"mediaType": "video",
"videoUrl": "https://library.tiktok.com/api/v1/cdn/.../video/...",
"videoCoverUrl": "https://p16-common-sign.tiktokcdn.com/...",
"firstShown": "2026-02-09",
"lastShown": "2026-02-12",
"estimatedAudience": "0-1K",
"estimatedAudienceMin": 0,
"estimatedAudienceMax": 1000,
"objective": "Community interaction",
"advertiserId": "7456118493550002193",
"advertiserCountry": "Netherlands",
"totalImpressions": "0-1K",
"impressionsByCountry": [
{ "country": "ES", "impressions": "0-1K", "impressionsMin": 0, "impressionsMax": 1000,
"byAgeGender": [{ "age": "18-24", "gender": "FEMALE", "impressions": "-" }] }
],
"targetCountries": ["ES", "LU"],
"targetAges": [{ "country": "ES", "ages": ["18-24", "25-34"] }],
"searchInput": "lego",
"searchType": "searchTerm",
"detailsStatus": "OK",
"scrapedAt": "2026-10-26T23:40:12.512Z"
}

Run summary (OUTPUT record)

Each input gets one status: SUCCEEDED, PARTIAL, NO_DATA, FAILED or DUPLICATE, with ad counts, the number TikTok reports, errors and network stats. If every input fails, the run is marked as failed, so you are never left with an empty "successful" run.

Pricing

Pay per event, no subscription:

EventPriceWhen
Actor start$0.001 per GB of memory ($0.002 at the default 2 GB)Once per run
Ad$0.0004Every ad in the dataset
Ad details$0.0011Only for ads whose detail record loaded (detailsStatus: "OK")

That is $0.40 per 1,000 ads (cards) and $1.50 per 1,000 ads with full details, plus the start fee. Searches with no results cost only the start fee. Apify's "Maximum cost per run" is respected: the scraper stops cleanly when it is reached.

Examples: 1,000 cards ≈ $0.40 and about 3 minutes; 100 ads with details ≈ $0.15 and about 3-4 minutes.

FAQ

Do I need a TikTok account, cookies or a proxy? No.

Why only European countries? TikTok's Ad Library is a transparency tool under the EU Digital Services Act and only covers ads shown in the EU/EEA, Switzerland, the UK and Turkey.

Why do I get fewer ads than TikTok's total? TikTok shows at most about 5,000 ads per search, and its total is approximate. Split large searches by country or date range.

Is the search exact? Plain terms use TikTok's own relevance search (advertiser names and ad text). Use "quotes" for an exact phrase, or paste an advertiser's search URL from library.tiktok.com.

Limits and honest caveats

  • Details are slow by design: one page load per ad (about 25-35 ads/minute). Use cards mode for volume.
  • IP blocks: TikTok sometimes blocks a server IP after many detail page loads. The Actor then moves to Apify datacenter proxy sessions automatically; those runs are about half as fast but still complete. If no proxy is available and details keep failing, remaining ads are saved as cards (detailsStatus: "FAILED", not charged for details).
  • Search quirks: TikTok sometimes returns duplicates across pages (we remove them) and short pages that claim there are no more results (we keep paging). Sorting by date is mixed with relevance for keyword searches.
  • Test results: on the final test matrix for the current build (32 runs covering cards and details, 1-4 searches, 25 countries, all filters, pasted URLs, ad IDs, invalid input, an empty search, and 1,000-ad and 1,200-ad runs), 32 of 32 runs succeeded. In 3 of them TikTok blocked the server's IP (once before the first page loaded); each run switched to Apify Proxy by itself and still returned every ad with details.