Meta Facebook Ad Library Scraper
Pricing
from $0.70 / 1,000 results
Meta Facebook Ad Library Scraper
Meta Facebook Ads Library scraper for keyword, Page, or URL search. Extract ad creatives, advertiser info, spend, and reach as JSON/CSV, no login needed. Also works as a Meta Ads Library scraper and Facebook Ad Library scraping API via Apify.
Pricing
from $0.70 / 1,000 results
Rating
0.0
(0)
Developer
CodeNodeTools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Facebook Ads Library Scraper pulls ad data straight out of Meta's public Ad Library — no login, no cookies, no browser required. Give it a search term, a Facebook Page, or an Ad Library URL you already built by hand, and it streams back every matching ad as structured JSON: advertiser info, creative text and images, delivery dates, platforms, and more. Whether you're calling it "Facebook Ad Library scraper," "Meta Ads Library scraper," or "Facebook meta ad library scraper" — this Actor is built to do exactly that, at scale, on the Apify platform.
What is this Facebook Ads Library scraper?
It's an Apify Actor that automates Meta's Ad Library the way a person would use the website's search and filters — by keyword, by advertiser Page, or by pasting in an Ad Library search URL — except it runs unattended, in parallel across as many searches as you give it, and hands you clean JSON or CSV instead of a web page. It's a fully async Python actor, so multiple searches collect at the same time instead of one after another.
If you've searched for a "Facebook ads library scraper API," this is that API: every input option below is also available through the Apify API, so you can trigger runs, poll status, and pull results from your own code or product without touching the Console. As a Facebook ads library scraper Apify Actor, it also comes with everything the platform adds on top: scheduling, monitoring, integrations, and residential proxy rotation handled for you.
What data can this Meta Ads Library scraper extract?
For every matching ad, you get:
- Advertiser (Page) name, ID, logo, like count, verification status, and Page URL
- Ad creative content — headline, body text, description, call-to-action, image and video URLs, per creative variant
- Delivery status, start/stop dates, and which platforms it ran on (Facebook, Instagram, Messenger, Threads)
- Reach, spend, and impression ranges, targeting, and audience distribution — where Meta makes that data public (mainly political/issue ads under EU and US transparency rules)
- Categories, disclaimers, funding entity, and byline information
- Collation grouping, so you can tell which ads are variants of the same underlying creative
How to scrape the Facebook Ad Library with this Actor
You don't need to build an Ad Library URL by hand, though you can if you already have one.
Search by keyword
Set queries to a list of search terms — one Facebook Ad Library scraping session runs per term, in parallel:
{ "queries": ["solar panels", "yoga retreat"] }
Search by Page
Set pageIds to numeric Facebook Page IDs to pull a Page's full ad history:
{ "pageIds": ["100119048388845"] }
Paste a URL
Already have a Facebook Ads Library URL from your browser? Drop it straight into urls — country, ad type, and status encoded in the URL are read automatically:
{ "urls": ["https://www.facebook.com/ads/library/?active_status=active&country=US&q=running+shoes"] }
All three can be combined in the same run, and each one becomes its own concurrent session.
Input options
| Field | What it does |
|---|---|
urls | Facebook Ad Library search URLs or Page URLs to scrape. |
queries | Keyword searches to run directly. |
pageIds | Numeric Facebook Page IDs to pull full ad histories from. |
limitPerSource | Cap on ads per individual URL/query/Page ID. |
count | Cap on total ads across the whole run. |
scrapePageAds.activeStatus | all, active, or inactive ads. |
scrapePageAds.sortBy | Sort by impressions or recency. |
scrapePageAds.countryCode | 2-letter country code (e.g. US, IN, GB). |
runTag | A label stamped onto every output row, for telling runs apart downstream. |
pageSize / maxConcurrency | Tune throughput per session and across sessions. |
dedupe | Drop ads with a duplicate ID within the same run. |
hasVideo | Require or exclude video creatives. |
useResidentialProxy / proxyCountry | Apify residential proxy settings (platform runs only). |
Full field-by-field descriptions are also shown directly in the input form in Console.
Example output
One row per ad, already ordered so the columns that actually have data (ad ID, advertiser, creative, platforms) come first — the fields Meta usually leaves empty for ordinary commercial ads (spend, reach, targeting) sit at the end instead of pushing the useful columns off-screen:
{"id": "25805070919168442","page": {"id": "100119048388845","name": "Routine Wellness","profile_picture_url": "https://scontent.xx.fbcdn.net/...","page_url": "https://www.facebook.com/RoutineCos/","likes": 35324,"verified": false},"is_active": true,"creatives": [{"body": "Rose Hips is our best seller!","title": "FREE TRAVEL SIZE WITH CODE: TRAVEL","image_url": "https://scontent.xx.fbcdn.net/...","cta_text": "Shop Now"}],"publisher_platforms": ["FACEBOOK", "INSTAGRAM", "MESSENGER", "THREADS"],"categories": ["UNKNOWN"],"delivery_start_time": "2026-04-24T07:00:00","delivery_stop_time": "2026-08-07T07:00:00","collected_at": "2026-08-07T11:34:27Z"}
The Output tab's table view is also configured with a dataset schema, so the advertiser's logo renders as an actual image thumbnail and Page/snapshot URLs render as clickable links — not just raw strings. Alongside the scraped ads, each run also writes a per-source summary (ads collected, errors) for every URL/query/Page ID, plus one overall run summary — both organized as their own collections in the run's Storage tab rather than mixed into one flat key-value store.
How much does it cost to scrape the Facebook Ads Library?
This Actor runs on Apify's usage-based pricing: you pay for the compute time and (on the platform) residential proxy bandwidth a run consumes, shown on this Actor's Pricing tab. As a rough guide, a small, single-query run with no per-ad enrichment is inexpensive — well under a cent in platform usage — while a run spanning many broad queries with high concurrency costs more, mainly in proxy bandwidth. The cheapest way to find your real number: run a small test with count set to a handful of ads and check the run's Usage tab in Console for the exact compute and proxy cost, then scale that estimate up to the volume you actually need.
FAQ
Do I need a Facebook account, login, or cookies? No. The Ad Library is a public Meta transparency tool, and this Actor only reads what's already publicly visible there.
Can I search across all countries at once?
Meta's own Ad Library UI supports "All countries," but the underlying scraping library this Actor is built on requires a specific 2-letter country code per search — ALL isn't accepted. Run one search per country you care about, or add country=XX to a specific input URL.
Can I pull a competitor's entire ad history?
Yes — use pageIds (or an Ad Library URL with view_all_page_id=) with scrapePageAds.activeStatus set to all to include both active and inactive ads.
How is this different from just browsing the Ad Library manually? Speed and structure. Every query or Page runs as its own session in parallel, output is clean structured JSON/CSV instead of a webpage, and you can schedule it, hit it via the API, or pipe it into another tool.
Does this support the Apify API for programmatic Facebook Ad Library scraping? Yes — every input field works identically through the Apify API and client libraries, so you can run this Apify Meta Ads Library scraper from your own backend, not just Console.
Is this a general-purpose Facebook ads library data scraper, or just for specific niches? General-purpose. Nothing about it is tied to a particular industry — run it against any keyword or Page, in any supported country, and it returns the same structured schema either way. Whether you need one-off Meta Ads Library scraping for a single competitor or a recurring, scheduled Facebook ads library data scraper feeding a larger pipeline, the same input options cover both.
What about vanity Page URLs, like facebook.com/SomeBrand?
Those can't be resolved to a numeric Page ID without an extra lookup step, so they're skipped with a logged warning. Use the numeric Page ID, or an Ad Library URL containing view_all_page_id=, instead.