If you want to know what a competitor is advertising, the answer is public, but it is spread across three different libraries. Google has its Ads Transparency Center, Meta has the Ad Library, and TikTok has its own library for Europe. Each one has a different search box, different fields and no shared export, so most people end up copying ads into a spreadsheet by hand.
The Ad Transparency Search actor, published by Hay Equipos on the Apify Store, does that search for you. You type a brand's website or name once, and it returns every ad it finds in all three libraries as rows with the same columns.
What you get back
One row per ad. Every library fills the same fields: source, advertiser name and ID, ad ID, first and last shown dates, format, headline, ad text, media links, landing page, regions, platforms and a direct link to the ad in the public library. Here is a shortened row (illustrative values):
{
"source": "meta",
"advertiserQuery": "example.com",
"advertiserName": "Example Brand",
"adId": "1234567890123456",
"firstShown": "2026-06-01",
"lastShown": "2026-09-20",
"isActive": true,
"formats": ["video"],
"title": "Autumn sale ends Sunday",
"text": "Free shipping on every order this week.",
"landingUrl": "https://www.example.com/sale",
"regions": ["DE"],
"platforms": ["facebook", "instagram"],
"libraryUrl": "https://www.facebook.com/ads/library/?id=1234567890123456"
}
Not every library publishes every field, and the actor does not invent the missing ones:
| Field | Meta | TikTok | |
|---|---|---|---|
| First and last shown | yes | yes | yes |
| Headline and ad text | inside the image snapshot only | yes | yes (caption) |
| Landing URL | not published | yes | not in the list view |
| Active flag | no | yes | no |
A SUMMARY record in the run's key value store shows, for each advertiser, how many ads each library returned and whether a match was found.
Step by step in the Apify Console
- Open the actor's page on the Apify Store and start it in the Console.
- In Advertisers, add domains (
nike.comstyle) or brand names, one per line. A Google advertiser ID (ARplus digits) or a Meta page ID (digits only) also works and is the most precise. - Pick the Ad libraries to search. Leave it empty for all three.
- Optionally set a two letter Country and a date window (Shown on or after, Shown on or before).
- Set Max ads per advertiser per library (default 50, maximum 1,000). This also caps your cost.
- Leave Strict advertiser matching on unless a search returns too little.
- Click Start, then export the dataset as CSV, Excel or JSON.
Calling it from code
With curl, using the synchronous endpoint that returns the dataset items directly:
curl -X POST \
"https://api.apify.com/v2/acts/pistachio_implementation~ad-transparency-multi-library/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"advertisers": ["example.com"], "country": "DE", "maxAdsPerSource": 20}'
With Python and the apify-client package:
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("pistachio_implementation/ad-transparency-multi-library").call(
run_input={
"advertisers": ["example.com", "Example Brand"],
"sources": ["google", "meta", "tiktok"],
"country": "DE",
"dateFrom": "2026-08-01",
"maxAdsPerSource": 20,
}
)
for ad in client.dataset(run["defaultDatasetId"]).iterate_items():
print(ad["source"], ad["advertiserName"], ad["firstShown"], ad["libraryUrl"])
Runs that open a browser for Meta and TikTok can take a minute or more, so for big lists use the Python client (which waits for the run) rather than the synchronous endpoint.
Pricing
Pay per event, no subscription:
- $0.0015 per ad returned ($1.50 per 1,000 ads).
- $0.01 per advertiser resolved, charged once for each advertiser found in at least one library.
For example, 10 competitors with 50 ads from each of three libraries is 1,500 ads, which comes to $2.25 plus $0.10, so $2.35. You can cap spend with the ads per library setting and with the run's maximum charge setting; the actor stops cleanly when the limit is reached.
Limits and what it does not do
- TikTok covers the EU, EEA, UK, Switzerland and Turkey only. That is TikTok's own coverage. With any other country, TikTok is skipped and the summary says so.
- LinkedIn is not included. Its ad library sits behind a bot wall for visitors who are not logged in, and the actor does not log in or try to get around such walls.
- Google publishes no ad text or landing page. Text ads come back as an image snapshot. Turning on the Google details option adds every country a Google ad ran in and the YouTube link for video ads, at the cost of one extra request per ad.
-
A domain search on Google can include resellers and agencies whose ads point at that domain. Check
advertiserName. - A name search on TikTok matches legal entity names, so a short brand name can match several entities. A fuller legal name narrows it.
- Media links from Meta and TikTok are signed and expire after hours or days. Download what you need soon after the run.
- Each run with Meta or TikTok opens a headless browser, so it needs 1 GB of memory.
The actor only reads the public, logged out transparency libraries and does not collect personal data. Please use the ad data in line with each library's terms.
Try it on the Apify Store: https://apify.com/pistachio_implementation/ad-transparency-multi-library
Top comments (0)