Meta Ad Library Scraper - Facebook & Instagram Ads · Apify
Meta (Facebook & Instagram) Ads Library Scraper avatar

Meta (Facebook & Instagram) Ads Library Scraper

Pricing

from $0.14 / 1,000 results

Go to Apify Store
Meta (Facebook & Instagram) Ads Library Scraper

Meta (Facebook & Instagram) Ads Library Scraper

💰From $0.14/1K ads | Scrape all Facebook & Instagram ads of any page from the Meta Ad Library. Extract ad creatives, texts, titles, CTAs, image & HD video URLs, spend, reach and dates. Fast parallel scraping, multiple pages per run, date filters, no login or API key. Daily checks to ensure quality!

Pricing

from $0.14 / 1,000 results

Rating

4.9

(11)

Developer

Mary Lou

Mary Lou

Maintained by Community

Actor stats

8

Bookmarked

2K

Total users

1K

Monthly active users

2 hours

Issues response

2 hours ago

Last modified

Features

Limited permissions

Share

See every ad your competitors are running — or every ad mentioning your keyword — and download it all as a spreadsheet.

Facebook's Ad Library shows every ad any page is running on Facebook and Instagram. It's public, but you can only scroll it one ad at a time in a browser, and you can't export anything.

This scraper does that scrolling for you. Give it a page (or ten), or just a keyword to search across every advertiser, press start, and you get a clean table of every ad: the ad copy, the headline, the button, the landing page link, and direct links to every image and video — ready to open in Excel, Google Sheets, or push into your own tools.

No Facebook account. No API key. No coding.


What you can use it for

  • 🔍 Competitor research — see exactly which ads a competitor is running right now, and which ones they've been running for months (long-running ads are usually their winners)
  • 🎨 Creative inspiration — download competitor images and videos to study hooks, formats and angles before your next campaign
  • 📈 Track over time — run it on a schedule and watch when competitors launch, pause, or scale creatives
  • 📊 Market research — search a keyword and pull ads from an entire industry at once, whoever is running them, and analyse messaging trends
  • 🧲 Find advertisers you don't know yet — a keyword search surfaces every page advertising on that topic, not just the brands you already track
  • 🕵️ Ad spying at scale — thousands of ads across many brands in one run, instead of endless manual scrolling
  • 🇪🇺 EU reach — for ads shown in the EU, see how many people they reached, by country, age and gender, and who paid for them (optional, see EU transparency)

How to use it — step by step

1. Find the brand in the Ad Library

Go to facebook.com/ads/library, pick your country, choose All ads, and search for the brand name. Click the brand to open its page of ads.

2. Copy the URL from your browser's address bar

It will look something like this:

https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=ALL&search_type=page&view_all_page_id=116700222203350

3. Paste it into the "Ad Library or Facebook page URLs" field

That's the only thing you have to fill in. You can paste several URLs — one per line — to scrape multiple brands in the same run. Already on the brand's Facebook page? Its ordinary link works here too, like https://www.facebook.com/zara.

4. (Optional) Raise or remove the limit

Max ads comes prefilled with 100 so your first run finishes in seconds and costs almost nothing. Raise it once the output looks right, or clear the field to scrape everything.

5. Click Start

Results appear in the Storage → Dataset tab as they're scraped. When it's finished, use the Export button for CSV, Excel, JSON, or copy the API link.

Don't want to bother with URLs? Just type the brand's name — ZARA, nike — into the Page IDs or names field. The scraper looks it up the same way the Ad Library's own search box does. The numeric page ID (the view_all_page_id= number in the Ad Library URL), an @username or the brand's facebook.com link work too.

Searching by keyword instead of by page

Don't have a specific brand in mind? Type a word or phrase into the Keyword field (or several into Keywords) and the scraper searches the whole Ad Library, returning matching ads from every advertiser — exactly like typing it into the Ad Library search box. Pasting a keyword search URL from your browser (the ones with q= in them) works too.

Two match types, set with Keyword match type:

  • Any order (default) — the words can appear anywhere in the ad, in any order. Same as the Ad Library's own default.
  • Exact phrase — the words must appear together, in that order.

Keyword searches can match tens of thousands of ads, so set Max ads and narrow the Country and dates on your first run. And clear the Page ID field if it's prefilled — otherwise that page gets scraped as well.


Input options

Everything is optional except telling it what to scrape — a page or a keyword. Leave that out and the run ends straight away, with the log saying what to fill in.

SettingWhat it does
Ad Library or Facebook page URLsPaste one or more URLs copied from your browser — Ad Library page URLs (view_all_page_id=), keyword search URLs (q=), a single ad's link (?id=), or simply a brand's Facebook page link (facebook.com/zara, /people/Name/123…, /p/Name-123…). A page link is opened to read the page ID the Ad Library uses, so the page is found even when its username isn't its advertiser name (facebook.com/autohausschmidgmbh is Auto Schmid GmbH). A brand's Instagram profile or website works too (instagram.com/zara, zara.com). Each Ad Library page or keyword URL is scraped as it reads, with all its filters: country, dates, active status, sort order, media type, platform, language. This is the easiest way to use the scraper.
Ad Library or Facebook page URLSame thing, for a single URL.
Page IDs or namesPages instead of full URLs: numeric page IDs, or simply the advertisers' names (ZARA), @usernames or facebook.com page links.
Page ID or nameA single page, any of those ways. Clear it if you're searching by keyword.
KeywordSearch every advertiser's ads for this word or phrase, instead of scraping one page.
KeywordsSeveral keywords in one run, all using the settings below.
Keyword match typeAny order (default) or Exact phrase. Applies to keyword searches only. Typed spellings like exact work too; anything else means any order.
Active statusAll ads = the page's entire history (often far more than the Ad Library shows by default). Active only = ads running right now. Inactive only = ads that have stopped. Typed spellings like Active or running work too; anything else means all ads.
CountryLimit to ads shown in one country — every country the Ad Library lists — or ALL for everywhere. You can also type a country's name or code; one the scraper can't place is searched as ALL, never a failed run.
Start date from / toOnly ads that were running during this window. Note this is not "created in" — an ad that started last year and is still running today will show up in a window covering today.
Max adsStop after this many ads in total. Prefilled with 100 for a quick, cheap first run — raise it or leave it empty to get everything.
Max ads per targetStop each page, keyword or link of your input after this many ads, so one big advertiser can't use up Max ads for the others. A name that leads to several pages shares its limit among them. Empty: no limit per target.
Trust pages known to be empty for (days)0, off, by default. Set a number of days: a page both checks found empty within that many days is checked once instead of twice — roughly half the cost for pages without ads, but a page that starts advertising can be missed for a run if that one check meets a blocked connection. After that many days the page gets both checks again.
Lean first page (less proxy traffic)Off by default. Turn it on and, once the run has loaded one Ad Library page, every further page, keyword or link gets its first ads the way the Ad Library itself does when you type a new search — with its own query, without loading the whole page again. A run within an hour of your last one may load no page at all. Same ads, less proxy traffic and a quicker start: about 45% less traffic on a list of 20 pages, about 30% less on a single 90-ad search. An empty first answer is still double-checked on a full page load, and the run goes back to full page loads by itself if Facebook refuses or rate-limits the query.
Sort byImpressions: high to low (default) or Most recent, like the Ad Library's own Sort by. With Most recent each search comes in newest first, so Max ads gets you its latest ads — the newest 300, say. A search is then scraped in one go rather than in parts, so a big one without Max ads takes longer. A pasted Ad Library URL keeps its own sort order.
Max concurrencyHow many parts of the job to scrape at the same time. Default 4, roughly 4× faster than one at a time for big brands. For big runs raise it to 20–100: a 100,000-ad keyword search took about 10 minutes at 50 and 8 at 100. The run's memory grows with it. Drop it to 1 if you ever see captcha warnings, or need results in strict impression-ranking order.
Delay between pages (ms)Pause between requests. Default 0: the network already spaces pages out, and the old 300 ms pause only slowed runs down (7-30% in tests). Increase it to 1000+ if you ever see captcha warnings in the log.
EU transparency (EU reach, audience, payer)Off by default. Turn it on to get, for every ad shown in the EU, what the Ad Library shows under See ad details: how many people in the EU it reached, that reach by country, age and gender, the places, ages and gender it was shown to, and who paid for it and who it was for. It takes one more request per EU ad, so a run takes longer and uses more proxy traffic.
Search by keyword when a page isn't foundOn by default: a name or link that matches no page is searched as a keyword across every advertiser (up to 1,000 ads), a name with commas is also tried as a list of names, every page sharing a name is scraped, and a page with no matching ads brings its regional pages. Turn it off to scrape only pages the scraper can pin down — a page link, a page ID, a verified page or the only page of that name. Anything else is skipped with a warning, so no unrelated ads come in.
Compatible output (aaa_info)Off by default. Adds the fields other Ad Library scrapers return, so a pipeline built on them works unchanged: aaa_info (EU reach and its breakdown, payer and beneficiary), start_date_formatted / end_date_formatted and url (your input entry as sent). Turns on EU transparency.
Raw outputOff by default. Turn on only if you want Facebook's untouched raw data structure.
ProxyLeave on Residential — this is required for reliable results. Your own residential proxies work too: put {session} where your provider takes a session id (http://user-session-{session}:pass@gate.example.com:7000), and each session the scraper opens gets an IP of its own.

Calling it from code, an AI agent or another tool? Field names and values are read forgivingly. pageId or page_id work as well as pageID, and so do the names other scrapers use: startUrls, urls and url for URLs, maxItems, resultsLimit or count for the ad limit, limitPerSource for the limit per target, scrapeAdDetails for EU transparency, scrapePageAds.activeStatus, scrapePageAds.countryCode and scrapePageAds.sortBy, and sort for the sort. A country can be Italy or it, an active status Active or running, a date 20/11/2025 or Nov 20 2025. A number outside a field's range is brought into it (a concurrency of 10 runs at 6), and null means the default. A link or name the scraper can't use is skipped with a warning rather than failing the run. The run log says how each field was read.

Example: one competitor, everything they've ever run

{
"adLibraryUrls": [
"https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=ALL&search_type=page&view_all_page_id=116700222203350"
]
}

Example: three competitors' currently-active ads, fast

{
"adLibraryUrls": [
"https://www.facebook.com/ads/library/?active_status=active&country=ALL&search_type=page&view_all_page_id=116700222203350",
"https://www.facebook.com/ads/library/?active_status=active&country=ALL&search_type=page&view_all_page_id=102921707941613",
"https://www.facebook.com/ads/library/?active_status=active&country=US&search_type=page&view_all_page_id=688155977722463"
],
"maxConcurrency": 3
}

Example: every advertiser running ads about a topic

{
"keyword": "running shoes",
"searchType": "keyword_unordered",
"country": "US",
"activeStatus": "active",
"maxAds": 500
}

Example: several keywords, exact phrases only

{
"keywords": ["free trial", "money back guarantee"],
"searchType": "keyword_exact_phrase",
"country": "GB",
"maxAds": 1000,
"maxConcurrency": 3
}

Example: a keyword's latest ads

{
"keyword": "summer sale",
"country": "FR",
"activeStatus": "active",
"sortBy": "newest",
"maxAds": 300
}

The 300 newest, in the order the Ad Library lists them under Most recent.

Example: EU reach of a list of pages, matched back to your own records

{
"pageIDs": [
"https://www.facebook.com/zalando?client=4711",
"https://www.facebook.com/asos?client=4712"
],
"country": "ALL",
"activeStatus": "active",
"euTransparency": true,
"maxAds": null
}

Each ad comes with eu_total_reach and the rest of its EU transparency, and with input: the entry that brought it, exactly as you sent it (https://www.facebook.com/zalando?client=4711), parameters and all.

Example: brands by name, no URLs or IDs

{
"pageIDs": ["ZARA", "nike"],
"country": "IT",
"activeStatus": "active",
"maxAds": 200
}

Each name is looked up the way the Ad Library's search box does it. A verified page wins; if several unverified pages share the name, all of them are scraped, the most-liked first; and a name no page has is searched as a keyword instead. Turn off Search by keyword when a page isn't found to skip such names, and namesakes, rather than search for them.

Example: quick, cheap test run

{
"pageIDs": ["116700222203350"],
"activeStatus": "active",
"maxAds": 50
}

What you get

One row per ad. Here's a real (shortened) example:

{
"ad_archive_id": "1227225301509075",
"page_id": "116700222203350",
"page_name": "BetterMe",
"is_active": true,
"start_date": 1723359600,
"end_date": 1787468400,
"publisher_platform": ["FACEBOOK", "INSTAGRAM", "AUDIENCE_NETWORK", "MESSENGER"],
"collation_count": 1,
"snapshot": {
"title": "Entrenador personal 24/7 en la aplicación",
"body": { "text": "Plan de 28 Días para lograr un peso saludable en casa." },
"caption": "itunes.apple.com",
"cta_text": "Install now",
"cta_type": "INSTALL_MOBILE_APP",
"link_url": "http://itunes.apple.com/app/id1264546236",
"display_format": "VIDEO",
"videos": [{ "video_hd_url": "https://...", "video_preview_image_url": "https://..." }],
"images": [],
"page_like_count": 6197887,
"page_categories": ["Health/beauty"]
}
}

The fields you'll care about most:

FieldWhat it is
snapshot.body.textThe main ad copy
snapshot.titleThe headline
snapshot.cta_text / cta_typeThe button ("Shop now", "Install now"…)
snapshot.link_urlWhere the ad sends people
snapshot.images[]Direct image URLs (full resolution)
snapshot.videos[]Direct video URLs (HD, SD, and thumbnail)
snapshot.display_formatVIDEO, IMAGE, DCO, carousel…
is_activeIs it still running right now
start_date / end_dateWhen it ran (Unix timestamps)
publisher_platformFacebook, Instagram, Messenger, Threads…
collation_countHow many variants of this ad exist
page_name, snapshot.page_like_countWho's running it, and how big they are
spend, currency, reach_estimateOnly filled for political/social-issue ads, where Meta discloses it. Blank for normal commercial ads — that's a Facebook limitation, not a scraper one. For ads shown in the EU, turn on EU transparency to get their reach (eu_total_reach).
inputThe entry of your input that brought this ad, exactly as you sent it — a URL with your own parameters (facebook.com/user1?custom-param=1), a page ID or name, or a keyword. Use it to match ads back to your own records. If two entries name the same page, it is scraped once and its ads carry the first entry.
eu_total_reachWith EU transparency on: how many people in the EU saw the ad. Empty for ads not shown in the EU.
eu_transparencyWith EU transparency on: the EU reach by country, age range and gender (age_country_gender_reach_breakdown), and the countries, ages and gender the ad was shown to (location_audience, age_audience, gender_audience).
payer_beneficiary_dataWith EU transparency on: who paid for the ad and who it was for.
aaa_info, start_date_formatted, end_date_formatted, urlWith Compatible output on: the EU transparency as other scrapers shape it (aaa_info.eu_total_reach, aaa_info.age_country_gender_reach_breakdown, …), the dates as 2026-10-05 07:00:00 (UTC), and your input entry as sent.

Every row has the same columns, so nothing breaks when you open it in a spreadsheet. Fields Facebook doesn't provide come back empty rather than missing.

Export: CSV, Excel, JSON, XML, or an API endpoint — from the Export button on the run's Dataset tab.


Speed and limits

Facebook hands out ads in small batches, so time scales with the number of ads:

AdsRoughly how long
200~30 seconds
1,000~2–3 minutes
30,000~3 minutes at Max concurrency 50
100,000~10 minutes at Max concurrency 50, ~8 at 100

Max concurrency (4 by default) is what makes big jobs fast — the scraper automatically splits a big page or search into parts and works on several at once: its running and its stopped ads, its videos and its images, and its history into date ranges. Measured in October 2026 on a keyword search for "shoes" in the US: 30,000 ads in 3 minutes and 100,000 in 10 at 50, 8 at 100.

EU transparency (off by default) takes one more request per EU ad, so a run with it on takes a little longer: 892 German ads took 119 seconds with it and 88 without (November 2026).

If a run is interrupted (you abort it, the platform restarts it, or Facebook rate-limits part of it), progress is saved automatically. A platform restart resumes by itself. If you start a new run afterwards, it scrapes fresh by default so your dataset is always complete in one place — or turn on Continue from last run to fetch only what the interrupted run missed (its ads stay in that run's dataset).


Cost

From $0.14 per 1,000 ads, plus Apify platform usage. No scraper charge for runs that find nothing.

$0.15 per 1,000 on the Free and Starter plans, $0.14 on Scale and above.

Most Ad Library scrapers roll infrastructure into one flat per-result price, with a markup baked in. This one keeps the two separate: you pay per ad for the scraping itself, and Apify bills the compute and proxy traffic at your plan's own rate — the same credits your subscription already includes.

What you scrapeScraper charge+ Platform usageRoughly
200 ads (one brand's active ads)$0.03~$0.01~$0.04
1,000 ads$0.15~$0.04~$0.19
10,000 ads$1.50~$0.40~$1.90
100,000 ads$15.00~$4.00~$19.00

Both columns are quoted at the Free plan rate, which is the most expensive this gets — see below.

Usage figures are measured from real runs on the Free plan rate and rounded up. Expect about $0.04 per 1,000 ads: in October 2026 a 100-ad run cost $0.035 per 1,000 in usage, and 30,000- and 100,000-ad searches $0.034–$0.042. Most of it is residential proxy traffic, so ads with big product carousels cost a little more. Looking a brand up by name, fetching a single ad from its link, or checking a brand's regional pages when its own page has nothing matching each add an Ad Library page load or two to the run — a fraction of a cent.

Pages with no ads cost no scraper charge, only the check. An empty page is checked on a second connection before it's believed, every run, because a blocked connection looks empty too, and a second look sometimes finds ads the first missed. The first time a page link is seen, it's also opened once for its page ID, which is then saved in your account. Measured in November 2026 on 20 page links, 17 of them with no ads: ~$0.05 of usage on the first run, $0.03 on later runs. If you'd rather pay less and accept a small risk, set Trust pages known to be empty for (days): a page both checks found empty within that many days is then checked once ($0.02 for that run), but a page that starts advertising can be missed for a run if its one check meets a blocked connection. It's 0, off, by default.

Lean first page (new, off by default) cuts the page loads themselves. With it on, only the run's first target loads an Ad Library page; every other target's first ads come with the Ad Library's own query, a fraction of the size, and an empty first answer is still checked again on a full page load. Measured on Apify in November 2026, the same ads every time:

What you scrapeProxy trafficWith Lean first page
20 page links, most without ads3.4 MB1.9 MB
The same, with Trust pages known to be empty1.9 MB0.3–0.45 MB
One 90-ad search0.27 MB0.18 MB

That is the platform-usage side of your bill only — the scraper charge per ad is the same. It matters most when you check many pages and most have no ads: there, proxy traffic is nearly all you pay.

EU transparency has no scraper charge of its own, but its extra request per EU ad is proxy traffic: about $0.04 more platform usage per 1,000 EU ads (892 German ads, November 2026). Leave it off and nothing changes.

It gets cheaper as your plan goes up

Both halves are discounted at higher tiers, so the same scrape costs less on a bigger plan:

TierScraper chargeComputeResidential proxy
Free / Starter$0.15 / 1,000 ads$0.20 / CU$8.00 / GB
Scale$0.14 / 1,000 ads$0.16 / CU$7.50 / GB
Business and above$0.14 / 1,000 ads$0.13 / CU$7.00 / GB

Platform usage is drawn from the prepaid usage credit your plan already includes, so on a paid plan a good part of it is money you've spent regardless. See Apify pricing for the full rate card.

Keeping it predictable

  • Set Max ads. The scraper stops exactly there. Perfect for testing, and for putting a hard ceiling on any single run.
  • Set a maximum cost per run (in the run options). The scraper checks this before it starts and stops once the ads it has delivered and the platform usage it has taken reach what your budget covers, so the run finishes normally instead of being cut off. It uses the budget nearly to its end and stays under it: in November 2026, runs with a $0.30 and a $1.00 maximum ended at 92–96% of it (earlier versions stopped a short run at about 75%). Its progress is kept: raise the budget and resurrect the run to collect the rest.

A whole-archive scrape of a very large advertiser can be tens of thousands of ads, so start with Active status: Active only or a Max ads limit if you just want a snapshot of what's running now.


Frequently asked questions

Do I need a Facebook account or login? No. The Ad Library is public information, and the scraper needs no account, password, cookies, or API token.

Do I need the official Meta Ad Library API? No — and it wouldn't help you anyway. Meta's official API only covers political and social-issue ads in most countries. This scraper returns all ad categories, with the full creatives and media URLs.

Is this legal? The Ad Library is Meta's own public ad-transparency tool, published deliberately so anyone can inspect advertising. This scraper only collects what's shown there — no private data, no logged-in data, no personal information. As with any scraping, you're responsible for how you use the data in your own jurisdiction.

Why do I get way more ads than the Ad Library page showed me? The Ad Library UI usually shows active ads by default. The scraper defaults to All ads, which includes everything the page has ever run — often 10–100× more. Set Active status to Active only if you want to match what you saw on screen.

I set a date range but I'm getting ads that started before it. Why? Facebook's date filter means "was this ad running during this window", not "did it start in this window". A long-running evergreen ad legitimately matches every window it was live in. This is Facebook's behaviour, and the same thing happens in the Ad Library UI.

What about spend and reach? Meta only discloses spend for political and social-issue ads. For normal commercial ads those fields come back empty — nobody can scrape numbers Facebook doesn't publish. Reach is the exception in the EU: for every ad shown there, Meta publishes how many people in the EU it reached, by country, age and gender, and who paid for it. Turn on EU transparency to get those (eu_total_reach, eu_transparency, payer_beneficiary_data). It's off by default, since it takes one more request per EU ad.

Can I scrape several competitors at once? Yes. Paste several URLs into Ad Library or Facebook page URLs, or several names or IDs into Page IDs or names. They're scraped in parallel (Max concurrency, 4 by default) into one dataset, and Max ads applies across all of them combined — the first pages to answer fill it, so set it high enough to cover every page.

Can I run this automatically every day/week? Yes — use Apify Schedules on this Actor. A common setup is a daily run per competitor, so you can diff the results and spot new creatives.

How do I get the images and videos themselves? The dataset gives you direct URLs. Open them in a browser, or feed the column to any bulk downloader. The scraper doesn't re-host media files.

What happens if one of my pages won't load? The rest of the run carries on. A page or date range that Facebook blocks or that won't load is tried again once the rest are done: one at a time, after a short pause, as a different browser. If it still fails, it is left out with a warning, the run finishes with everything else, and its progress is saved: run again with Continue from last run to retry just what was missed. If Facebook blocks everything, the run ends without ads and its status message says why. It is not marked as failed.

The log shows a captcha warning — what do I do? That means Facebook rate-limited part of the run. A rate-limited part moves to a fresh connection and carries on from the page it had reached — a run without residential proxy switches to it first. Parts still blocked are retried at the end of the run, and their progress is saved, so a re-run continues where it stopped. To avoid it, lower Max concurrency or raise Delay between pages.

Can it search by keyword instead of by page? Yes. Put a word or phrase in the Keyword field (or paste a keyword search URL with q= in it) and it returns matching ads from every advertiser, with the same output columns as a page scrape. Choose Any order or Exact phrase with Keyword match type. Keyword searches can match tens of thousands of ads, so set Max ads and narrow the country and dates first.

Can I just type the brand's name instead of finding its page ID? Yes. Put it in Page IDs or names — ZARA, nike, @zarahome, or the brand's facebook.com link. The scraper looks it up in the Ad Library's own advertiser search and uses the page whose name or username matches exactly. A verified page always wins. If several unverified pages share the name, it scrapes all of them, the most-liked first, so nothing is missed — the run log lists each one with its ID, and you can give a single ID next time to scrape just that page. If no page has that exact name, the scraper searches every advertiser's ads for the name as a keyword instead. That search stops at 1,000 ads if you haven't set Max ads. The log lists the closest pages it found, so you can give one's ID next time.

My run finished without any ads. Why? Usually one of two things, and the run log says which:

  • Nothing to scrape was given. If the page, keyword and URL fields are all empty, the run ends straight away. The log and the run's status say what to fill in.
  • The page has no ads matching your filters. A brand can advertise heavily and still have nothing in one country. Gymshark had about 4,100 active ads worldwide but none shown in Italy. Try Country ALL, or Active status All ads. The scraper already checks the brand's regional pages for you (see below), and it double-checks an empty result on a fresh connection before believing it.

If you gave a brand's name rather than a page ID, and none of the pages with that name has matching ads, the scraper searches every advertiser's ads for the name instead (the exact phrase first, then the words in any order), so you still get the ads that mention it. The log says when it does this. A page ID is taken as your choice: if it is empty, that is the answer.

Why did I get ads from a page I didn't ask for? Some brands advertise from a separate page in each country. Gymshark, for example, has its main page plus Gymshark Germany and Gymshark France. When a page you asked for has no ads matching your filters, the scraper also checks the brand's regional page for the country you picked, with the same filters, or every regional page when Country is ALL. The run log names each page it adds, or which countries the brand's other pages cover. Every ad carries its own page_id and page name, so you can tell them apart.

Can I scrape one specific ad? Yes. Paste the ad's own link — the one with ?id= in it, like https://www.facebook.com/ads/library/?id=3666222156864560 — into Ad Library or Facebook page URLs. You get that single ad, with the same columns as everything else. The country, date and active-status settings don't apply to it, so they can't hide the ad you asked for.

Can I mix pages and keywords in one run? Yes — fill in both, and every target is scraped in the same run (in parallel when Max concurrency is above 1). Max ads counts across all of them together.


Support

Found a bug, need a field that isn't there, or want a custom scraping setup? Open an issue on the Actor's Issues tab and I'll take a look.