Facebook Ads Library Scraper · No Login · $0.3/1k
Pricing
from $0.30 / 1,000 ads
Facebook Ads Library Scraper · No Login · $0.3/1k
Search Meta ads by keyword, page or URL. Export copy, creatives, CTA, dates, platforms and optional EU reach to CSV, Excel or JSON. Core fields align with Apify's official scraper. $0.30/1k ads on Business or $0.45/1k on Free; no start fee or platform charge.
Pricing
from $0.30 / 1,000 ads
Rating
0.0
(0)
Developer
Alfalfa
Maintained by CommunityActor stats
0
Bookmarked
67
Total users
15
Monthly active users
3 days ago
Last modified
Categories
Share
Facebook Ads Library Scraper (No Login)
Search the Meta Ad Library (Facebook, Instagram, Messenger, Audience Network, Threads ads) by keyword, advertiser page or Ad Library URL and get every ad as a clean record: ad text, title, call to action, landing page, images, videos and carousel cards, start and end dates, platforms, advertiser page and, on request, the EU transparency data (total reach and the reach by country, age and gender) and advertiser details. No Facebook account, login or cookies needed. Core ad and snapshot fields align with the official Apify Facebook Ads Scraper; optional enrichment differs. $0.45 per 1,000 ads on Apify Free, less on paid plans, with no start fee and ad details included.
Export to JSON, CSV or Excel, read the dataset through the API, or run it on a schedule from n8n, Make or Zapier. Paste plain page URLs (facebook.com/Nike), sort by impressions, filter by ad language and date, and use the watchlist to get new ads only on scheduled runs.
What you can do with Facebook ad data
- Competitor monitoring: pull every active ad of a competitor's page each week and see what they promote, which landing pages they push and how long each ad has been running. With a watchlist, each ad arrives once: later runs deliver and charge only the new ones.
- Creative research and swipe files: search a niche keyword ("running shoes", "meal prep", "CRM software") and collect the ads with their images, videos, hooks and calls to action.
- Lead generation: advertisers in your niche are businesses with a marketing budget. Get their page names, page IDs, likes, Instagram handles and landing pages in one table.
- Agency reporting: track a client's ads and the competition, with the EU reach breakdown by age, gender and country for European campaigns.
- Political, housing, employment and credit ads: filter the special ad categories Facebook keeps for years, with spend and impression ranges where Facebook publishes them.
- Brand protection: find ads that use your brand name in their text, including ads from resellers and scammers.
What data do you get
| Field | Example |
|---|---|
adArchiveID, url, isActive, startDateFormatted, endDateFormatted | 1785179045778580, the Ad Library URL, true, 2026-05-07T07:00:00.000Z |
pageName, pageID, snapshot.pageProfileUri, snapshot.pageLikeCount, snapshot.pageCategories | advertiser page, its likes and categories |
snapshot.body.text, snapshot.title, snapshot.caption, snapshot.linkDescription | the ad copy |
snapshot.ctaText, snapshot.ctaType, snapshot.linkUrl | Shop now, SHOP_NOW, the landing page |
snapshot.images, snapshot.videos, snapshot.cards, snapshot.displayFormat | creatives with original and resized image URLs, HD and SD video URLs, carousel cards |
publisherPlatform, collationCount, categories, targetedOrReachedCountries | ["FACEBOOK", "INSTAGRAM"], number of ad versions, special ad categories |
spend, impressionsWithIndex, currency, reachEstimate | ranges Facebook publishes for political and issue ads |
ad_details (with Include ad details) | advertiser About text, likes, Instagram followers and verification; payer and beneficiary; eu_transparency with eu_total_reach and the reach by country, age and gender; spend of political advertisers |
inputUrl | the keyword, page ID or URL the ad was found from |
How to scrape the Facebook Ad Library
- Type one or more Keywords (one per line), paste Advertiser page IDs, or paste Ad Library URLs copied from your browser (keyword searches, advertiser pages or single ads). Plain page URLs such as
https://www.facebook.com/Nikework too. - Pick the Country, and optionally the ad status, media type, category, platforms, ad languages, date range and sorting.
- Set Max ads per search, switch on Include ad details if you need the EU reach data or advertiser info, and click Start. Ads stream into the dataset as they are found.
Input
| Field | Type | Description |
|---|---|---|
searchQueries | array of strings | Keywords to search for, each one is a separate search. |
pageIds | array of strings | Numeric advertiser page IDs (view_all_page_id in Ad Library URLs). All ads of the page. |
startUrls | array of { "url": ... } | Ad Library URLs in the same form as the official Facebook Ads Scraper: ?q=..., ?view_all_page_id=... or ?id=.... Filters in the URL override the fields below. Plain page URLs (https://www.facebook.com/Nike) return every ad of that page. |
country | string | ISO code (US, GB, DE...), English country name (Thailand) or ALL. Default ALL. |
activeStatus | all / active / inactive | Default all. |
mediaType | all / image / video / meme / image_and_meme / none | Default all. |
adType | all / political_and_issue_ads / housing_ads / employment_ads / credit_ads | Default all. |
publisherPlatforms | array | facebook, instagram, audience_network, messenger, whatsapp, threads. Empty = all. |
searchType | keyword_unordered / keyword_exact_phrase | How keywords are matched. |
sortBy | date / impressions | date (default) puts the newest ads first (the Ad Library's Most recent order); impressions puts the most viewed ads first. |
contentLanguages | array | Only ads written in these languages, ISO 639-1 codes such as de, fr, pt. Empty = any. |
startDateMin, startDateMax | YYYY-MM-DD or a period | Only ads shown in this range (Facebook's Impressions by date). Periods count back from the run: 7d, 30 days, 3 weeks, 2 months, 1 year, today, yesterday. |
watchlistId | string | Name of a watchlist that remembers delivered ads (key-value store watchlist-<name> in your account). |
newAdsOnly | boolean | With a watchlist: skip ads delivered by an earlier run, neither written nor charged. |
maxAds | integer | Max ads per keyword, page or URL (default 100). resultsLimit works too. |
scrapeAdDetails | boolean | Add ad_details to every ad (advertiser info, payer and beneficiary, EU reach breakdown). No surcharge. |
maxConcurrency | integer | Searches run in parallel (default 5). |
proxyConfiguration | object | Residential proxies by default, included in the price. Optionally pick a country or use your own proxy servers. |
Example:
{"searchQueries": ["running shoes"],"pageIds": ["15087023444"],"country": "US","activeStatus": "active","mediaType": "video","maxAds": 200,"scrapeAdDetails": true}
Output
One record per ad (illustrative, trimmed):
{"adArchiveID": "1785179045778580","adArchiveId": "1785179045778580","pageID": "721404351056614","pageId": "721404351056614","pageName": "IControl: Easy Widgets Themes","isActive": false,"startDate": 1778137200,"endDate": 1782716400,"startDateFormatted": "2026-05-07T07:00:00.000Z","endDateFormatted": "2026-06-29T07:00:00.000Z","publisherPlatform": ["FACEBOOK", "INSTAGRAM", "AUDIENCE_NETWORK", "MESSENGER", "THREADS"],"collationCount": 1,"collationId": "974017695598335","categories": ["UNKNOWN"],"isAaaEligible": true,"snapshot": {"body": { "text": "❤️Aesthetic presets for your phone✨" },"title": "🥰a FREE and personalized APP for you","caption": "play.google.com","ctaText": "Install now","ctaType": "INSTALL_MOBILE_APP","linkUrl": "http://play.google.com/store/apps/details?id=com.icontrol.easy.widgets.themes","displayFormat": "IMAGE","images": [{ "originalImageUrl": "https://scontent.xx.fbcdn.net/v/t39.35426-6/...", "resizedImageUrl": "https://scontent.xx.fbcdn.net/v/t39.35426-6/..." }],"videos": [],"cards": [],"pageName": "IControl: Easy Widgets Themes","pageProfileUri": "https://www.facebook.com/people/IControl-Easy-Widgets-Themes/61575866489402/","pageLikeCount": 4601,"pageCategories": ["App page"]},"ad_details": {"advertiser": {"page": { "about": { "text": "iControl: Simple Widget Theme is a professional theme application..." } },"ad_library_page_info": {"page_info": { "likes": 4601, "ig_followers": null, "page_verification": "NOT_VERIFIED", "page_category": "App page" },"page_spend": { "is_political_page": false }}},"aaa_info": { "targets_eu": true, "payer_beneficiary_data": [{ "payer": "BEIJING XINMEI HUTONG TECHNOLOGY CO., LTD.", "beneficiary": "BEIJING XINMEI HUTONG TECHNOLOGY CO., LTD." }] },"transparency_by_location": {"eu_transparency": {"eu_total_reach": 1208452,"age_audience": { "min": 25, "max": 64 },"gender_audience": "All","location_audience": [{ "name": "Czech Republic", "type": "countries", "excluded": false }],"age_country_gender_reach_breakdown": [{ "country": "CZ", "age_gender_breakdowns": [{ "age_range": "25-34", "male": 25656, "female": 29841, "unknown": 1632 }] }]}}},"url": "https://www.facebook.com/ads/library/?id=1785179045778580","inputUrl": "nike"}
ad_details is present only with Include ad details on. Political and issue ads can include spend, impressionsWithIndex and currency when Meta publishes them.
Verified EU detail from a real run
The example below comes from ad 2016127759183309 in a successful Actor run on 2026-09-19 with Include ad details on. It is shortened to one country and one age band; the actual record contains the full breakdown.
{"adArchiveID": "2016127759183309","pageName": "Travis Scott","ad_details": {"transparency_by_location": {"eu_transparency": {"eu_total_reach": 15011800,"age_audience": { "min": 18, "max": 65 },"gender_audience": "All","age_country_gender_reach_breakdown": [{ "country": "DE", "age_gender_breakdowns": [{ "age_range": "55-64", "female": 15089, "male": 21948, "unknown": 1416 }] }]}}}}
The EU detail uses the same dataset item price; there is no additional detail event. Some ads do not have an EU transparency block, and its fields depend on what Meta publishes for that ad.
Only new ads: the watchlist for scheduled runs
Give the run a Watchlist name (watchlistId, for example nike-us) and every delivered ad is remembered in a key-value store called watchlist-nike-us in your Apify account. Switch on New ads only (newAdsOnly) and the next run with the same name skips every ad it delivered before: those ads are not written to the dataset and not charged, and the log ends with "N ads already delivered on this watchlist skipped". With the default date sorting, each search is read to the end once a day; the runs in between read only the newest ads and stop when they reach ads older than that complete pass, so a frequent schedule finishes after a few pages when nothing is new. An older ad that newly matches the search (for example a paused ad that runs again) arrives with the next complete pass, at most a day later. With sortBy: "impressions" every run reads the whole list.
{"startUrls": [{ "url": "https://www.facebook.com/Nike" }],"country": "US","watchlistId": "nike-us","newAdsOnly": true}
Put this input on a daily schedule and the dataset of each run contains exactly the ads that appeared since the previous run. The first run delivers everything (nothing is remembered yet); to start from "now", run it once and let the second run be the first one you use. The store holds the record delivered, with one ad ID per line, so you can read or reset it in the Storage tab; next to it, full-passes keeps the time of each search's last complete pass (delete it and the next run reads every search to the end). With watchlistId set and newAdsOnly off, ads are remembered but nothing is skipped. Without a watchlist name, newAdsOnly does nothing.
Page URLs as input
Besides Ad Library URLs and numeric page IDs, startUrls takes the page URL as you see it on Facebook: https://www.facebook.com/Nike, https://m.facebook.com/Nike/, a tab such as facebook.com/Nike/about, facebook.com/profile.php?id=100044541544829 or facebook.com/people/Nike/100044541544829/. The advertiser page ID is looked up for you (the number in a profile URL is the profile, not the Ad Library page) and every ad of the page in the selected country is returned. A page that does not exist, or a profile that runs no ads, is reported in the log and skipped without failing the run.
Sort by impressions
sortBy: "impressions" returns the most viewed ads first, the Ad Library's Impressions: high to low order. Facebook publishes impression ranges only for issue, election and political ads, so combine it with adType: "political_and_issue_ads" to get the campaigns with the widest reach on a topic at the top; for other ad categories Facebook keeps its own order. The default date is the Ad Library's Most recent order: newest ads first, grouped by the month they started (within a month Facebook keeps its own order, and the first results can include a few older, highly relevant ads). An Ad Library URL with sort_data[mode]=total_impressions sets the same sorting.
Dates: absolute or relative
startDateMin and startDateMax are Facebook's Impressions by date filter: an ad matches when it was shown on at least one day of the range, so an ad that started months ago but still runs is included. Besides YYYY-MM-DD you can write a period counted back from the moment the run starts (UTC): 7d, 30 days, 3 weeks, 2 months, 1 year, today, yesterday. "startDateMin": "7d" in a weekly schedule always means "shown in the last week" without editing the input.
Ad languages
contentLanguages: ["de"] returns only ads written in German, whatever the country filter says; use two-letter ISO 639-1 codes (de, fr, es, pt, ja), several at once if you like. Handy for multilingual markets and for a worldwide keyword search in one language.
Pricing
$0.45 per 1,000 ads on the Free plan ($0.00045 per ad), no start fee. Ad details, platform usage and the default residential proxy routing are included. You pay only for records written to the dataset. If you supply your own proxy, your proxy provider may bill you separately. Set the maximum budget per run in the Actor settings; the scraper stops when it is reached and never overshoots the number you typed.
Final Actor price with default routing. The per-ad price includes platform usage and the default proxy routing; there is no start fee or per-run minimum. A custom proxy provider can charge you separately.
| Apify plan / Store tier | Price per 1,000 ads |
|---|---|
| Free | $0.45 |
| Starter / Bronze | $0.40 |
| Scale / Silver | $0.35 |
| Business / Gold, Platinum, Diamond | $0.30 |
These are the current Actor Store prices; your Apify plan determines the tier automatically. The Free plan's $5 monthly usage credit covers about 11,100 ads if spent entirely on this Actor. For comparison, the official Facebook Ads Scraper charges $5.80 per 1,000 ads on the Free plan.
Switching from the official Facebook Ads Scraper
- Replace the Actor ID in your integration and keep your
startUrlsandresultsLimit; the URL formats are the same (keyword search,view_all_page_id, single adid). - If you use details, change the official input flag
isDetailsPerAdtoscrapeAdDetails. Core ad fields andsnapshotpaths such asbody.text,ctaText,linkUrl,images,videosandcardsalign. - Compare a sample of your output before switching a production workflow. The official Actor also offers
pageInfoand optional e-commerce enrichment, which this Actor does not return. Keywords and page IDs can be typed directly (searchQueries,pageIds) instead of building URLs.
Limitations
- Only what the Ad Library shows to a visitor without a login: ads Facebook has removed from the library are not returned, and reach or spend ranges exist only for political and issue ads (plus the EU transparency block for ads targeting the EU).
- Facebook offers two orders: newest first by start month (
date, the default) and by impressions (sortBy: "impressions"), meaningful for issue, election and political ads. Use the date range, language, status and media filters to narrow a search. - Ads that share a creative come as a group (
collationId,collationCount), and Facebook lists only part of each group's ads, so a search can return fewer ads than the group counts add up to. - A single ad by
id=returns that ad; theisActiveflag and dates reflect the moment of the run.
FAQ
Can I scrape the Facebook Ad Library without logging in?
Yes. Everything the public Ad Library shows is collected without a Facebook account. Nothing is posted, liked or followed, and no cookies of yours are used.
How do I get all ads of one advertiser?
Paste the page ID into Advertiser page IDs (or the Ad Library URL with view_all_page_id=) and pick the country. Set Max ads per search high enough; large brands run thousands of ads.
What is the EU transparency data?
For ads shown in the European Union, Facebook publishes the total reach and the reach by country, age range and gender, plus who paid for the ad and who benefits. Switch on Include ad details and read ad_details.transparency_by_location.eu_transparency.
Can I run it every day and get only new ads?
Yes. Set a Watchlist name and switch on New ads only: every run remembers the ads it delivered and later runs skip them, so each ad is delivered and charged once. Between the daily complete passes a run reads only the newest ads, so even a schedule every few minutes stays quick. Schedules and webhooks are built into Apify. If you prefer to filter yourself, startDateFormatted is in every record.
How fast is it?
About 10 to 20 ads per second per search when details are off, and 3 to 5 per second with details on. Searches run in parallel, so five keywords with 100 ads each finish in well under a minute.
Is scraping the Facebook Ad Library legal?
The Ad Library is public data Meta publishes for transparency. Scraping publicly available data is generally legal, but you are responsible for how you use it: respect Meta's terms, copyright of the creatives and privacy laws such as GDPR. This Actor is not affiliated with Meta.
Use it from n8n, Make, Zapier or an AI agent
- n8n, Make, Zapier: add the Apify node, pick
alfalfa/facebook-ads-library-scraperas the Actor, paste the same JSON input as above and read the run's dataset in the next step. A workflow that scrapes a competitor's ads every Monday and appends the new ones to Google Sheets takes three nodes. See the Apify integrations docs. - AI agents and MCP (Claude, Cursor, VS Code, ChatGPT): connect the Apify MCP server with this Actor as a tool,
https://mcp.apify.com/?tools=alfalfa/facebook-ads-library-scraper, and the agent can search the Ad Library by describing what it wants in plain language. See Apify MCP docs. - API and scheduling: every run is available through the Apify API and the Apify CLI; schedules, webhooks and dataset exports (JSON, CSV, Excel, XML) are built into the platform.
Examples you can run in one click
Each example opens with its input already filled in and a sample of the results, so you can change any field and run it right away.
- Competitor Facebook ads
- EU ad transparency and reach
- Facebook Ad Library export to CSV
- Facebook ads by keyword
- Facebook Ads Library API alternative
- Facebook video ads
- Find advertisers in a niche
- Instagram ads library
- Meta ads of a brand worldwide
Need something the examples do not cover? Every field is on the Input tab, and any example input works unchanged in an API call or an n8n, Make or Zapier workflow.
Was this useful?
If this Actor saved you time, a short review on its Store page helps others find it and tells me what to improve next. Missing a field or stuck on an input? Open an Issue on the Actor page; issues are answered within a day.
More Facebook scrapers by Alfalfa
| Actor | What it does | Price |
|---|---|---|
| Facebook Posts Scraper | posts of any public page or profile with reactions, comment counts, media, optional video transcripts | $2 per 1,000 posts |
| Facebook Comments Scraper | comments and replies of any public post | $0.30 per 1,000 comments |
| Facebook Pages Scraper | page details with email, phone, address, followers, rating, About text | from $2.50 per 1,000 pages |
| LinkedIn Jobs Scraper | public LinkedIn job postings by keyword, location, date, company or URL, with full description, salary, applicants, seniority and poster | $0.30 per 1,000 jobs |
| LinkedIn Company Scraper | LinkedIn company pages from URLs, names, websites or a filtered keyword search with size, employee count, followers, offices and recent posts | $1 per 1,000 companies |
| Google Ads Transparency Scraper | every Google ad of an advertiser or website domain with format, dates, regions, previews and YouTube video ids | $0.30 per 1,000 ads |
| Google Maps Scraper | places from any search and location with address, phone, website, rating and hours, plus reviews and website emails | $0.07 per 1,000 places |
| Amazon Product Scraper | products from searches, Best Sellers lists and ASINs in 22 Amazon stores with price, rating, BSR and details | $0.28 per 1,000 products |
| YouTube Scraper | videos of a search, channel, playlist or URL list with views, likes, date, tags, plus transcripts and comments; no API key | $0.50 per 1,000 rows |
| Facebook Events Scraper | events by search, city, page or URL, with organizer email | $3 per 1,000 events |
Public data, no login and no start fees. Check each Actor's sample and plan tier before switching an integration.
Not working?
Open an issue in the Issues tab of this Actor with your input and the run ID. Facebook changes its pages often; fixes usually ship within a day.