TikTok Ad Library Scraper - Competitor Ads, No Login avatar

TikTok Ad Library Scraper - Competitor Ads, No Login

Pricing

from $0.45 / 1,000 ads

Go to Apify Store
TikTok Ad Library Scraper - Competitor Ads, No Login

TikTok Ad Library Scraper - Competitor Ads, No Login

Returns the ads advertisers run on TikTok in Europe, read from TikTok's public ad library: advertiser, ad text, video or image, first and last day shown, unique users reached, and on request payer, landing page, targeting and reach by country, age and gender. By advertiser or keyword. No login.

Pricing

from $0.45 / 1,000 ads

Rating

0.0

(0)

Developer

Ben

Ben

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

📣 TikTok Ad Library Scraper

Returns the ads advertisers run on TikTok in Europe, read from TikTok's public ad library without a login, a cookie or a browser. Enter an advertiser or a keyword and get one row per ad: advertiser, ad text, format, first and last day shown, the number of different users who saw it, the video or picture and the link to the ad. On request each row also carries who paid for the ad, the landing page, the button text, the campaign objective, the targeting and the users reached per country.

Price (proposal): $0.60 per 1,000 ads on the Apify Free plan, down to $0.45 from the Gold plan up. Details add the same amount per ad. A search without ads, an advertiser TikTok does not know and an ad id that does not exist cost nothing. Export to JSON, CSV or Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

🔎 What is the TikTok Ad Library Scraper?

TikTok publishes every ad shown in the EU, the EEA, Switzerland, the United Kingdom and Turkey in its ad library. The page shows 12 ads at a time and has no export. This Actor makes the calls the page itself makes and returns the ads as a table: one advertiser's 304 active ads in Germany in 37 seconds in our test.

What data does it extract?

  • Ad: id, link to the ad in the library, format (video, image, text), ad text, TikTok's industry label where it gives one
  • Run time: first and last day shown, days running
  • Reach: different users who saw the ad, as TikTok's range ("10K-100K") and as two numbers
  • Creative: video file and cover picture, or the pictures of an image ad
  • Removed ads: a flag, and TikTok's reasons where it publishes them
  • With details: who paid for the ad, the advertiser's business id, country of registration and TikTok account (username, followers, profile link), landing page, button text, campaign objective
  • With details, targeting: countries, age groups, gender, interests, languages, cities, operating systems, devices, audience lists used or excluded, size of the targeted audience
  • With details, reach: users who saw the ad per country, and on request per country, age group and gender

What users report on other TikTok ad Actors, and what this one does

Reported on the leading Actors (issue titles, 2025–2026)Here
"Run with 0 ads", "returns SUCCEEDED with 0 ads when TikTok session-minting fails"A search TikTok did not answer is named in the status message as not answered. A run in which no search was answered fails instead of ending green and empty. A search that really has no ads says "No ads found"
"Does not return all ads", "Incoherent number of ads", "Volumes not matching interface"Lists are read by the second an ad was published, so page borders neither repeat nor drop ads: 1,200 ads of one keyword and 4,548 of one advertiser came without a repeat, and a list read this way and, right after, by place as the website pages differed in 5 of about 300 ads while TikTok was adding ads to it. The status message quotes TikTok's own count when a run stops at your limit
"Exact matching not being respected", "The ads doesn't correspond to advertiser ID"An advertiser name is looked up first and the advertiser of that name with the most ads is read by its exact name. The run summary lists the namesakes ("Nike": seven advertisers)
"Country parameter not respected"Countries are TikTok's own filter. In 92 detailed rows of two test runs every ad was shown in a country that was asked for
"No impressions", "Ads returned without statistics"6,876 of 6,878 rows in the tests carried the range of users reached (TikTok shows a dash for the two others, ads of a Turkish advertiser); every detailed row carried the reach per country
"Actor times out", "after 20 min + only 2 ads"No browser. See the measured times below
"Media not retrieved for some ads"Stated as a limit: TikTok publishes no picture for part of the image ads (see Limits)
Stated limit of a leading Actor: 3,600 ads per search4,548 ads of one search were read; the input accepts up to 20,000

⬇️ Input

FieldTypeDefaultWhat it does
advertisersarrayAdvertiser names, one search each
keywordsarrayWords in the ad text or the advertiser's name, one search each
urlsarraySearch links copied from library.tiktok.com/ads, links of single ads, or ad ids
countriesarrayallTwo-letter codes (DE, FR, GB): only ads shown there
startDate, endDatestringlast 30 daysOnly ads shown in this period (YYYY-MM-DD)
adTypestringALLVIDEO, IMAGE or TEXT
adStatusstringALLACTIVE or INACTIVE
minReachstringANY10K or 100K: only ads that at least this many users saw
maxResultsinteger20Ads to save per search, newest first, up to 20,000
maxAdvertisersPerQueryinteger1How many advertisers to read when TikTok knows several under one name
includeDetailsbooleanfalseReads each ad's own record. Second charge event
includeAudienceBreakdownbooleanfalseWith details: reach per country, age group and gender
onlyNewAdsbooleanfalseDeliver only ads not delivered by an earlier run of the same watch
monitorIdstringName of that watch

With an empty input the Actor reads the sample advertiser Nike, so a first run shows what the rows look like.

The input names of two other TikTok ad library Actors are read as well, so a saved input keeps working: searchTerms, dateFrom, dateTo, resolveAdDetails, and query with queryType, region, maxAds, fetchDetails, startUrls.

Example input

A competitor's ads in Germany and Austria with details:

{
"advertisers": ["Zalando"],
"countries": ["DE", "AT"],
"maxResults": 200,
"includeDetails": true
}

Every advertiser that uses a phrase, only ads that reached 10,000 users or more:

{
"keywords": ["protein powder"],
"minReach": "10K",
"maxResults": 500
}

A search link from the library, a single ad by link and one by id:

{
"urls": [
"https://library.tiktok.com/ads?region=FR&adv_name=Zalando%20Lounge%20c%2Fo%20Zalando%20SE&query_type=2",
"https://library.tiktok.com/ads/detail/?ad_id=1878252115639841",
"1878341972086002"
]
}

⬆️ Output

One row per ad. A row of the default run:

{
"adId": "1878253290765633",
"adUrl": "https://library.tiktok.com/ads/detail/?ad_id=1878253290765633",
"advertiserName": "NIKE Retail B.V.",
"adText": null,
"format": "VIDEO",
"category": null,
"firstShownDate": "2026-10-05",
"lastShownDate": "2026-10-05",
"daysRunning": 1,
"uniqueUsersSeen": "1K-10K",
"uniqueUsersSeenMin": 1000,
"uniqueUsersSeenMax": 10000,
"videoUrl": "https://library.tiktok.com/api/v1/cdn/1791324973/video/aHR0cHM6Ly92NzcudGlrdG9rY2RuLmNvbS9…",
"thumbnailUrl": "https://p16-common-sign.tiktokcdn.com/tos-no1a-p-0037-no/o8Z6NqHGIH3SALebHFQgqAWROtTfGwGaR…",
"imageUrls": [],
"removed": false,
"rejectionReasons": [],
"query": "Nike",
"position": 2,
"hasDetails": false,
"scrapedAt": "2026-10-06T22:16:13.108705+00:00"
}

With includeDetails, the fields a row gets in addition (an ad of Zalando in Germany):

{
"hasDetails": true,
"advertiserNameOnRecord": "Zalando SE",
"advertiserBusinessId": "6876456332912755458",
"adPaidForBy": "Zalando SE",
"advertiserCountry": "Germany",
"advertiserProfile": {
"username": "zalando",
"displayName": "Zalando",
"followerCount": "2.2M",
"accountType": "BLUEV_BA",
"profileUrl": "https://www.tiktok.com/share/user/6725011622526862342?source=ad_review",
"avatarUrl": "https://p16-common-sign.tiktokcdn-eu.com/tos-no1a-avt-0068c001-no/75d1d5edaeaf2747adbe5256d05d2821…"
},
"landingPageUrl": "https://www.zalando.de/?wmc=dis490_rh_tiktok.…",
"ctaType": "Shop now",
"campaignObjective": "Sales",
"targetCountries": ["DE"],
"targetAgeGroups": ["18-24", "25-34", "35-44", "45-54", "55+"],
"targetGender": "All",
"targetInterests": [],
"targetVideoInteractions": null,
"targetCreatorInteractions": null,
"targetLanguages": [],
"targetCities": [],
"targetProvinces": [],
"targetOperatingSystems": ["IPHONE"],
"targetDevices": [],
"targetCustomAudience": false,
"targetExcludedAudience": true,
"targetHighSpendingPower": false,
"usersTargetedEstimate": "22.0M-26.8M",
"usersTargetedMin": 22000000,
"usersTargetedMax": 26800000,
"uniqueUsersSeenByCountry": [
{"country": "DE", "impressions": "3K", "min": 3000, "max": 3000}
]
}

The run also writes a SUMMARY record: the searches that returned nothing, the advertisers TikTok knows under each name with their ad counts, and the reason a run stopped.

💰 What a run costs (proposal, not yet in force)

Apify planPer 1,000 adsPer 1,000 ad details (added)
Free$0.60$0.60
Bronze$0.55$0.55
Silver$0.50$0.50
Gold, Platinum, Diamond$0.45$0.45

Apify's standard start event ($0.00005) is the only other charge; proxies are included. Not charged: a search without ads, an advertiser name TikTok does not know, an ad id that does not exist, an ad already delivered in only-new mode, the same ad found a second time in one run, and the details of an ad whose record TikTok did not return (the row then says hasDetails: false). A single ad opened by its link or id always comes with its details and is charged as one ad plus one detail. Set the run's maximum charge and the Actor stops at it with the rows it has saved.

⏱️ Measured

These times are from a test server outside Apify (October 6 and 7, 2026) and will be replaced by measurements on Apify.

RunAdsTime
Empty input (sample advertiser; seven namesakes are counted first)2012 s
One advertiser, active ads in Germany, the whole list30437 s
One keyword in Germany1,200159 s
A keyword with two words, twice9616 s
An advertiser with 140,000 ads, ads 3,762 to 4,548 of its list787270 s
One advertiser and one keyword with details3256 s
One advertiser with details6082 s
Seven inputs of every kind, three of them without a result1816 s
Only-new watch on an advertiser and a keyword, second run0 new17 s

The last row is the slow case: TikTok was adding ads to that list while it was read (see Limits). Memory peaked at 83 MB. A run with details that was killed after 50 seconds with 21 ads saved went on to 60 ads when it was started again, with no ad twice and places 1 to 60 in order. Of 92 ads with details, all carried payer, advertiser id and country, objective, targeting and reach per country; 77 a landing page, 78 the advertiser's TikTok account, 2 interest targeting.

🔔 Watching for new ads

Turn on onlyNewAds, give the watch a monitorId and put the run on a schedule. The first run delivers the newest ads up to maxResults. Later runs deliver only ads published since, oldest first, and a run without news ends with zero rows and "Nothing new" (measured: 17 ads in the first run, none in a second run right after it). The memory is a key-value store named tiktok-ad-library-monitor in your own account; delete a record there to start a watch over.

TikTok lists an ad only once it has been shown, and that can be days after it was published. A watch therefore reads the last two days again on every run. In one advertiser's 304 active ads, 10 were first shown a day after a later ad and 2 five days after; an ad that starts running more than two days after it was published is the one a watch can miss.

🤖 For AI agents

Smallest useful call:

{"advertisers": ["Nike"], "countries": ["DE"], "maxResults": 20}

Each row is one ad with advertiserName, adText, format, firstShownDate, lastShownDate, uniqueUsersSeen, videoUrl and adUrl. Add "includeDetails": true for adPaidForBy, landingPageUrl, ctaType, campaignObjective, targetCountries, targetAgeGroups, targetGender and uniqueUsersSeenByCountry. advertisers, keywords and urls take several entries at once. A search without ads returns no rows; the status message and the SUMMARY record name it. Only ads shown in Europe exist in this library; a country outside it is skipped with a note. No credentials are needed.

💡 Use cases

  • 🎯 Competitor research: every ad a brand runs on TikTok in a country, with run time and reach, sorted newest first.
  • ✍️ Creative and copy research: hundreds of real ads for a keyword with text, video file and button text in one table.
  • 🔔 Launch monitoring: a scheduled watch that reports only the ads published since the last run.
  • 🇪🇺 Targeting and reach: whom an ad was aimed at and how many users saw it per country, age group and gender.

⚠️ Limits, stated plainly

  • Europe only. TikTok's library holds ads shown in the EU, the EEA, Switzerland, the United Kingdom and Turkey (33 country codes). There is no such library for the United States or other regions.
  • No spend, and reach in ranges. TikTok publishes the number of users reached as a range ("10K-100K") or a rounded number ("3K"), and no spend.
  • Part of the image ads have no picture link. TikTok's list carried neither picture nor video for 11 of the 20 ads of the default run, for 279 of 933 ads of a keyword search and for all 2,805 image ads of one advertiser. Video ads carried their file and cover (1,743 of 1,743 for the same advertiser).
  • Video and picture links expire. TikTok signs them for about six hours; one link still answered after 134 minutes. Download a file soon after the run if you need it.
  • Removed ads come without advertiser and creative; that is what TikTok shows for them.
  • Details take about a second per ad. TikTok refuses an address that asks for ad records faster, for many hours. The Actor asks for four records, rests three seconds and changes the address when one is refused.
  • Lists: about eight ads per second of run time. Searches start 1.25 seconds apart for the same reason, and an address is left after 250 calls.
  • Many ads published in the same second. When an advertiser publishes more than 12 ads within one second, TikTok returns them in an order that changes from call to call. The Actor then pages by position, drops repeats, and says in the status message when it read fewer than 98% of the ads TikTok counts.
  • A keyword search counts at most 5,000 ads. The status then says "5,000 or more".
  • One advertiser per name by default. TikTok knows seven advertisers that begin with "Nike". The one with the most ads in your countries and dates is read; raise maxAdvertisersPerQuery or name the advertiser exactly for another one.
  • An ad link whose ad a search of the same run already saved is not saved a second time.
  • TikTok fills the library with a delay. An ad appears hours after it was first shown, at the place of the second it was published. One advertiser's list of 140,191 ads grew by 154 within 22 minutes on a weekday morning, and the 59 of them we looked at were all first shown the day before. A run is the list as it was while it was read; a run an hour later holds more ads for the same days.
  • Deep in the list of an advertiser with thousands of ads a day a run is slower, about 3 ads per second of run time, because of the two points above. 4,548 ads of one such list were read; deeper was not measured.

❓ FAQ

Do I need a TikTok account, cookies or a proxy? No. The library is public and the Actor reads it as a visitor.

Why do I get fewer ads than TikTok's page counts? maxResults is 20 by default; raise it. Dates default to the last 30 days, as on TikTok's page. And TikTok's page starts with active ads only while this Actor reads active and inactive ones unless adStatus says otherwise, so the two counts differ in both directions.

How do I get the ads of exactly one advertiser? Write the name as the library writes it ("NIKE Retail B.V."), or pick the advertiser in the library and paste that search link into urls.

What does a keyword match? The ad text or the advertiser's name, and every word has to be there. In a test with one word, all 903 ads with a text contained it and the 30 without a text came from an advertiser with the word in its name; with two words, 96 of 96 ads had both in their text.

Can I get ads shown in the United States? No. TikTok publishes this library for Europe only.

Does it download the videos? It returns the link of the video file; the file itself is not copied, and the link expires after some hours.

I used another TikTok ad library Actor. What is different? The detail fields have the names used by brilliant_gum/tiktok-ads-library-scraper (adPaidForBy, advertiserBusinessId, advertiserProfile, advertiserCountry, landingPageUrl, ctaType, campaignObjective, targetAgeGroups, targetGender, targetInterests, targetCountries, usersTargetedEstimate, uniqueUsersSeen, uniqueUsersSeenByCountry, audienceBreakdown). Not offered here: targetBehaviors and rejectedInCountries (see targetVideoInteractions, targetCreatorInteractions and rejectionReasons instead) and TikTok's Creative Center as a second source. data_xplorer/tiktok-ads-library-fast returns ranges as objects with raw, min and max under titles like "Ad Audience"; here a range is three flat fields (uniqueUsersSeen, uniqueUsersSeenMin, uniqueUsersSeenMax).

Can I run it every day? Yes. Use a schedule with onlyNewAds so that you pay only for ads you have not received.

How do I call it from code? With the Apify API or the Python and JavaScript clients; every run returns a dataset you can fetch as JSON or CSV. It also works as a tool through Apify's MCP server.

Is it legal? The Actor reads what TikTok publishes for everyone under the EU's transparency rules for online advertising. Payer and advertiser names can be names of persons; GDPR, CCPA and similar rules apply to how you store and use them, and TikTok's terms apply to you as well.

🔗 You might also like

Keywords: tiktok ad library scraper, tiktok ads library api, tiktok ads scraper, tiktok commercial content library, competitor tiktok ads, tiktok ad spy tool, tiktok ad creatives, tiktok ad targeting data, tiktok ads export csv, DSA ad repository, tiktok ad reach by country, tiktok advertiser search, tiktok ad monitoring, tiktok video ads download, ad intelligence europe, tiktok ads no login, tiktok ad library export