Apify Actor · early access

Meta Ad Library Scraper

Facebook and Instagram ads from the public Meta Ad Library as clean dataset rows. Search by keyword or by advertiser page and get the ad text, start date, platforms, call to action and destination domain. No login, no browser. A free status row says why when a search finds nothing or is blocked.

Early access: no Actor fee yet. You pay only Apify platform usage.

Example: the input {"pages": ["15087023444"], "country": "BR", "activeStatus": "all", "maxAds": 200} returns one row per ad of the Nike page. Real run on 09/11/2026, 186 unique ads, 23 requests, no retries, 39 seconds. Four of the rows: ad 1702938977100376, active since 2025-04-07 on facebook, instagram, audience_network and messenger, text "Bring sports more fully into your day with the Nike App.", call to action "Install now", destination domain itunes.apple.com. Ad 1520310666349109, inactive, since 2026-04-29 on facebook and instagram, text "Add a retro touch to any fit.", "Shop now", nike.com. Ad 996224476183210, active since 2026-11-03, text "As melhores ofertas em produtos selecionados.", "Shop now", nike.com.br. Ad 2198056247442845, active since 2026-10-26, text "Amortecimento responsivo e estabilidade segura.", "Shop now", nike.com.br.Real run on 09/11/2026, a brand page. Independent tool, not affiliated with Meta.
  • 200 / 200Ads delivered for “running shoes” (US, active) in one run on Residential, 41 s (a small test)
  • 186Unique ads from the Nike page in Brazil, all statuses, one run
  • 10 / 10Searches that returned ads on Residential; 8 of 10 reached 50
  • Early accessNo Actor fee yet

What it does

The Meta Ad Library, as rows.

Reads the public Meta Ad Library (ads on Facebook, Instagram, Messenger and Audience Network) and returns one dataset row per ad. Search by keyword, by advertiser page (numeric page ID), or paste an Ad Library URL with your filters already applied. No login and no Facebook account.

Each row carries adArchiveId, adUrl, pageId, pageName, isActive, startDate, endDate, platforms, displayFormat, text, title, ctaText, linkUrl, linkDomain, the image and video links, cards (carousel items), variations, searchCountry and scrapedAt.

Example: the Nike page in Brazil, all statuses, returned 186 unique ads in one run. The first, ad 1702938977100376, is active since 2025-04-07 on Facebook, Instagram, Audience Network and Messenger, says “Bring sports more fully into your day with the Nike App.”, has the call to action “Install now” and points to itunes.apple.com.

Free status rows. no_results, blocked, error and invalid_input, with a reason. A made-up search term came back as no_results in our tests.

Inputs

searchTerms
Keywords or brand names, one search each (e.g. nike, tênis de corrida).
pages
Numeric Facebook page IDs, profile.php?id= links or Ad Library links with view_all_page_id=. Returns the ads of that advertiser.
libraryUrls
Links copied from the Ad Library with filters already applied.
country
Two-letter code where the ads ran (US by default, BR, GB...) or ALL.
activeStatus
active (default), inactive or all.
mediaType
all (default), image, video, meme or none (text only).
maxAds
Ads per search, 50 by default. Volumes above 200 per search are not tested.
proxyConfiguration
Apify Proxy, Residential group by default. See “Why Residential” below.

Use cases

What it is built for.

  1. Competitor ad research

    See which ads a brand runs, since when, on which platforms and where they point.

  2. Copy and offer swipe files

    Collect ad text, headlines and calls to action for a keyword and country.

  3. Campaign snapshots

    Run the same search again later and compare the two datasets yourself.

  4. Datasets for analysis and LLMs

    Structured ad rows to sort, group and summarise, or feed to a model.

  5. Matching advertisers across libraries

    Use pageName and linkDomain to line up the same advertiser with Google Ads data.

Proxy

Why Residential is the default.

The first page of results (about 27–30 ads) comes with the page itself. The next pages come from Meta’s own paging request, and Meta rate-limits it (“Rate limit exceeded”, code 1675004). Without a proxy or from datacenter IPs, that paging failed in every attempt of our comparison, so only the first page came back.

That is why proxyConfiguration defaults to the Residential group, also for API runs and Store tests that send no proxy input. On a rate limit the Actor waits, retries and switches to a new exit IP. Residential traffic (about 1 MB per 200 ads in our volume test) is part of your Apify platform usage.

These are small tests, not a guarantee. Even on Residential, 2 of 10 searches stopped around 30 ads.

Our tests, 9 Nov 2026

No proxy
3 of 3 searches returned ads, but only the first page (27–30 each)
Datacenter proxy
3 of 3 returned ads, only the first page (27–30 each)
Residential (default)
10 of 10 searches returned ads; 8 of 10 reached the 50 requested
Volume on Residential
“running shoes”, US, active, 200 requested: 200 of 200 unique ads, 21 requests, 0 retries, 41 s. Nike page, BR, all statuses: 186 ads, the run ended without a status row (probably that page’s total for the filter; not confirmed)

Pairs with

Google Ads Transparency, side by side.

The Google Ads Transparency Scraper covers Google’s ad library. This Actor returns pageName and linkDomain; the Google one returns the advertiser name and, for search ads, the display URL. You can line up the same advertiser in the two libraries yourself, for example by brand name or by a domain such as nike.com.

There is no automatic cross-matching and no monitor mode in this version: each run is a fresh search, and the comparison is up to you.

Fields to match on

pageName
The advertiser’s name as Meta shows it (partnership ads show the creator’s name; isBrandedContent marks them).
linkDomain
The domain the ad points to, e.g. nike.com.br; missing when the ad has no link.
pageId
Meta’s numeric page ID, to repeat a search for the same advertiser.

Price

Early access, no Actor fee yet.

Early accessno Actor fee yet

Early access: no Actor fee yet. You pay only standard Apify platform usage, including the Residential proxy (in our tests on 9 Nov 2026: about US$ 0.05–0.08 per 1,000 ads). Pay-per-result pricing may be introduced later; Apify notifies users 14 days in advance.

Open on Apify

What you pay

Actor fee
None yet
Apify platform usage
Standard Apify rates, including Residential proxy
Status rows
Free rows that say why a search returned no ads

Good to know

Limits, stated plainly.

What the rows can and cannot tell you.

  • Not affiliated with Meta. Independent tool.
  • Public Ad Library data only, no login. Respect Meta’s terms of use and check what you may do with the data.
  • Meta rate-limits the paging: some searches stop around 30 ads even on Residential. Volumes above 200 ads per search were not tested.
  • Page names such as facebook.com/nike cannot be resolved without a login: use the numeric page ID, found in the advertiser’s Ad Library link.
  • The Actor depends on undocumented Ad Library internals (including a query ID that Meta can change). When that happens, runs fail with a clear status and the Actor needs maintenance.
  • The Residential proxy is the default and adds to your Apify platform usage.
  • Meta does not show spend or reach for non-political ads, so those figures are not in the rows.
  • Information only, not legal or advertising advice.