An Apify Actor Store listing soon
Facebook Ad Library scraper, with Google and Bing ads in the same run
Search a brand, a keyword or a domain once. Get the public ads of the Meta Ad Library, the Google Ads Transparency Center and the Microsoft Ad Library back in one table: advertiser, text, creatives, landing page, dates, reach and targeting. No Facebook account, no API token.

What you get
One row per ad, the same fields on every platform.
Where a library does not publish a field, it is null rather than guessed, so a Meta row and a Bing row sit in the same spreadsheet without a mapping step.
- The ad: ID and link to it in its library, title and body text, format, image and video URLs, landing page and display URL, call to action, publisher platforms (Facebook, Instagram, Messenger, Threads, Audience Network, Bing).
- When and where: first and last day shown, active today (Meta), the countries it was shown in.
- Reach and targeting (Google and Microsoft): impressions range, impressions or share per country, targeting criteria used and excluded, the payer where named.
- The advertisers: one row per advertiser and platform, with ID, country, verification and, on Google, how many ads it has in the library.

Meta, Google and Microsoft, side by side
What each ad library actually publishes.
The three libraries do not expose the same things, and the logged-out Meta page shows less than Meta's own transparency details. This is what the Actor reads from each.
| Field | Meta | Microsoft | |
|---|---|---|---|
| Read from | The public Ad Library search page, logged out, in a real browser | The Ads Transparency Center's public pages | Microsoft's official public Ad Library API, no key |
| Countries | All; one search per country | All; reach for the EEA | EEA only |
| Ad text | Title and body | Not extracted (image or preview URL) | Title and body |
| Creatives | Image and video URLs | Archived image or preview URL | Image URLs |
| Dates | First and last day shown, active today | First and last day shown, per country too | First and last day shown |
| Reach | Not on the logged-out page | Impressions range, per country | Impressions range, share per country |
| Targeting | Not on the logged-out page | Criteria used and excluded | Criteria used and excluded |
| Depth per run | Up to 1,000, by start date | Up to 1,000 | Up to 1,000 |
Past the first 30 Meta ads
Meta shows 30 results logged out. The Actor reads 1,000.
Logged out, the Ad Library page shows the first 30 results of a search and answers "Rate limit exceeded" to every request for more, from every network we tried. So the Actor never asks for page two. It reads the top 30 by impressions, then the page's own "most recent" order, moving the start-date filter back one day at a time: each page load brings up to 30 ads that started before the last one read.
The blind spot: a start day with more than 30 new ads shows only its first 30. The run summary says so whenever it makes a result short, and every platform reports "partial" with the reason when the library shows more than was read. The guide explains the walk step by step.
Reach by country
The transparency data the EU requires, in one view.
The EU's Digital Services Act requires very large platforms to keep a public, searchable ad repository with, at least, the content of each ad, who it was presented for, who paid, the period, the main targeting parameters and the recipients reached, broken down by Member State for targeted groups (Regulation (EU) 2022/2065, Article 39). Google and Microsoft publish those figures per ad; the Actor reads them with details on and lays them out one row per ad and country.

A real run
Nike in France, three platforms, 22.5 seconds.
This input returned 60 ads (20 per platform) and 9 advertiser rows on 2026-10-02. Two of the rows, trimmed:
{
"query": "nike",
"countries": ["FR"],
"platforms": ["meta", "google", "microsoft"],
"maxResultsPerPlatform": 20,
"includeDetails": true,
"maxAdvertisers": 3
}{
"rowType": "ad",
"platform": "meta",
"adId": "1870984290951787",
"adLibraryUrl": "https://www.facebook.com/ads/library/?id=1870984290951787",
"advertiserName": "Nike",
"firstShown": "2026-09-02",
"lastShown": "2026-10-01",
"isActive": true,
"format": "dynamic",
"title": "Nike Sportswear Club Essentials",
"body": "Get the gear that's up for it all. Any time. Anywhere.",
"linkUrl": "https://www.nike.com/",
"ctaText": "Shop now",
"publisherPlatforms": ["FACEBOOK", "INSTAGRAM", "AUDIENCE_NETWORK", "MESSENGER", "THREADS"],
"impressionsMin": null,
"payer": null
}{
"rowType": "ad",
"platform": "microsoft",
"adId": "71124892377247",
"advertiserName": "Groupe COURIR",
"firstShown": "2023-06-03",
"lastShown": "2026-09-30",
"title": "Baskets & Vêtements Streetwear NIKE pour - Tendances 2026",
"displayUrl": "courir.com",
"countries": ["FR", "LU"],
"impressionsMin": 1000000,
"impressionsMax": 2500000,
"reachByCountry": [
{ "country": "FR", "countrySharePercent": 100 },
{ "country": "LU", "countrySharePercent": 0 }
],
"targeting": { "included": ["location", "microsoft_audiences", "advertiser_audiences"], "excluded": ["location"] }
}A search for a brand also returns ads that mention it: in France, "nike" brings Courir, Foot Locker and Amazon.fr ads alongside Nike's own. Use the advertiser domain, or filter on advertiserName, for one advertiser only.
Pricing
Pay per ad, no subscription.
$0.50 per 1,000 ads on any platform and $0.003 per advertiser row, billed by Apify with platform usage included. 1,000 Meta ads cost $0.50; the run above cost $0.057, of which $0.027 for the 9 advertiser rows (set them to 0 if you only want ads). Apify's free plan covers about 10,000 ads a month.
For developers
The Apify Actor, in one HTTP call.
Run it and get the ads back in the same request through the Apify API. Snippets for Node.js and Python are in the Actor's README.
curl -X POST "https://api.apify.com/v2/acts/agenttoolworks~ad-library-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query": "nike", "countries": ["FR"], "maxResultsPerPlatform": 50, "maxAdvertisers": 0}'Questions
Do I need a Facebook account to scrape the Facebook Ad Library?
No. The Actor reads the Ad Library the way a logged-out visitor sees it, in a real browser with no account and no cookies. Meta's own Ad Library API needs a Facebook account and an identity confirmation, and it returns commercial ads only when they reached the EU.
How many ads can it read from the Facebook Ad Library?
Up to 1,000 per platform per run. Logged out, Meta shows the first 30 results of a search and refuses further pages, so the Actor walks back through start dates instead: 1,000 Nike ads in France came back in a 139-second run. A start day with more than 30 new ads shows only its first 30, and the run summary says so.
Which platforms does it cover?
Meta (Facebook, Instagram, Messenger, Threads, Audience Network), Google (Search, YouTube, Display, Shopping, through the Ads Transparency Center) and Microsoft (Bing, through Microsoft's official public Ad Library API, which covers ads served in the European Economic Area only).
Does it return reach and targeting?
For Google and Microsoft, yes, with details on: impressions per country, first and last day shown, and the targeting criteria used and excluded. On Meta, reach, payer and beneficiary are null for commercial ads, because the logged-out page does not include Meta's EU transparency details.
Does it return the text of Google ads?
No. Google rows carry the archived image or the preview URL Google renders the ad from, with dates, reach and targeting. Meta and Microsoft rows carry the title and body text.
What does it cost?
$0.50 per 1,000 ads on any platform and $0.003 per advertiser row, billed by Apify with platform usage included. Apify's free plan includes $5 of monthly usage, about 10,000 ads.
Public ad library data only: no login, no account, no data about the people who saw the ads. Not affiliated with Meta, Google or Microsoft.