Facebook Ads Library Scraper · No Login · $0.3/1k avatar

Facebook Ads Library Scraper · No Login · $0.3/1k

Pricing

from $0.30 / 1,000 ads

Go to Apify Store
Facebook Ads Library Scraper · No Login · $0.3/1k

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

Alfalfa

Maintained by Community

Actor stats

0

Bookmarked

67

Total users

15

Monthly active users

3 days ago

Last modified

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

FieldExample
adArchiveID, url, isActive, startDateFormatted, endDateFormatted1785179045778580, the Ad Library URL, true, 2026-05-07T07:00:00.000Z
pageName, pageID, snapshot.pageProfileUri, snapshot.pageLikeCount, snapshot.pageCategoriesadvertiser page, its likes and categories
snapshot.body.text, snapshot.title, snapshot.caption, snapshot.linkDescriptionthe ad copy
snapshot.ctaText, snapshot.ctaType, snapshot.linkUrlShop now, SHOP_NOW, the landing page
snapshot.images, snapshot.videos, snapshot.cards, snapshot.displayFormatcreatives 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, reachEstimateranges 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
inputUrlthe keyword, page ID or URL the ad was found from

How to scrape the Facebook Ad Library

  1. 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/Nike work too.
  2. Pick the Country, and optionally the ad status, media type, category, platforms, ad languages, date range and sorting.
  3. 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

FieldTypeDescription
searchQueriesarray of stringsKeywords to search for, each one is a separate search.
pageIdsarray of stringsNumeric advertiser page IDs (view_all_page_id in Ad Library URLs). All ads of the page.
startUrlsarray 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.
countrystringISO code (US, GB, DE...), English country name (Thailand) or ALL. Default ALL.
activeStatusall / active / inactiveDefault all.
mediaTypeall / image / video / meme / image_and_meme / noneDefault all.
adTypeall / political_and_issue_ads / housing_ads / employment_ads / credit_adsDefault all.
publisherPlatformsarrayfacebook, instagram, audience_network, messenger, whatsapp, threads. Empty = all.
searchTypekeyword_unordered / keyword_exact_phraseHow keywords are matched.
sortBydate / impressionsdate (default) puts the newest ads first (the Ad Library's Most recent order); impressions puts the most viewed ads first.
contentLanguagesarrayOnly ads written in these languages, ISO 639-1 codes such as de, fr, pt. Empty = any.
startDateMin, startDateMaxYYYY-MM-DD or a periodOnly 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.
watchlistIdstringName of a watchlist that remembers delivered ads (key-value store watchlist-<name> in your account).
newAdsOnlybooleanWith a watchlist: skip ads delivered by an earlier run, neither written nor charged.
maxAdsintegerMax ads per keyword, page or URL (default 100). resultsLimit works too.
scrapeAdDetailsbooleanAdd ad_details to every ad (advertiser info, payer and beneficiary, EU reach breakdown). No surcharge.
maxConcurrencyintegerSearches run in parallel (default 5).
proxyConfigurationobjectResidential 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 tierPrice 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

  1. Replace the Actor ID in your integration and keep your startUrls and resultsLimit; the URL formats are the same (keyword search, view_all_page_id, single ad id).
  2. If you use details, change the official input flag isDetailsPerAd to scrapeAdDetails. Core ad fields and snapshot paths such as body.text, ctaText, linkUrl, images, videos and cards align.
  3. Compare a sample of your output before switching a production workflow. The official Actor also offers pageInfo and 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; the isActive flag 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.

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-scraper as 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.

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

ActorWhat it doesPrice
Facebook Posts Scraperposts of any public page or profile with reactions, comment counts, media, optional video transcripts$2 per 1,000 posts
Facebook Comments Scrapercomments and replies of any public post$0.30 per 1,000 comments
Facebook Pages Scraperpage details with email, phone, address, followers, rating, About textfrom $2.50 per 1,000 pages
LinkedIn Jobs Scraperpublic 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 ScraperLinkedIn 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 Scraperevery 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 Scraperplaces 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 Scraperproducts from searches, Best Sellers lists and ASINs in 22 Amazon stores with price, rating, BSR and details$0.28 per 1,000 products
YouTube Scrapervideos 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 Scraperevents 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.