Facebook Ad Library Scraper - Meta & Instagram Ads, No Login
Pricing
from $0.75 / 1,000 ad scrapeds
Facebook Ad Library Scraper - Meta & Instagram Ads, No Login
Scrape Facebook, Instagram & Meta ads from the public Ad Library by keyword, Page or URL. Ad copy, all images & videos, carousel cards, CTA, links, run dates and advertiser data - 50+ fields per ad, no login. $0.005 per run + $0.75 per 1,000 ads. Export JSON, CSV or Excel.
Pricing
from $0.75 / 1,000 ad scrapeds
Rating
0.0
(0)
Developer
Scrape Sage
Maintained by CommunityActor stats
0
Bookmarked
23
Total users
9
Monthly active users
0.034 hours
Issues response
3 days ago
Last modified
Categories
Share
Disclaimer: This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "Facebook Ad Library" is referenced only to describe the publicly available website this Actor collects data from.
Scrape Facebook, Instagram & Meta ads from the public Meta Ad Library by keyword, Facebook Page, or URL — ad copy, all creatives (images, videos, carousel cards), CTA, destination links, run dates, platforms, and advertiser data, with 50+ structured fields per ad. No login / no cookies.
Why this ad-library scraper?
Meta runs one ad library for its whole network, so a single search covers ads across Facebook, Instagram, Messenger, Threads, Audience Network, and WhatsApp.
| Typical scrapers | This actor |
|---|---|
| Return page name + ad text + one image | Captures all images, all videos (HD/SD/preview URLs), and carousel cards plus extra creatives |
| One way in (keyword only) | Search by keyword, Facebook Page URL/ID, or a full Ad Library URL |
| Pricing you work out after the bill | Published, flat pricing — $0.005 per run + $0.75 per 1,000 ads, and nothing else |
| Skip transparency data | Surfaces spend, impressions & reach for political and social-issue ads, plus Meta's disclaimer status and delivery restrictions on every ad |
| Need a login or cookies | Reads only the public Ad Library — no account, password, or cookies |
| Dump a raw JSON blob | Flattens every creative, link & advertiser detail into clean columns |
Use cases
- Competitor ad research — pull every ad a brand is running and study their angles, offers, and creative across Facebook and Instagram.
- Ad inspiration & swipe files — collect winning copy and creatives across a whole niche by keyword.
- Market & trend research — see which advertisers are live in a country and what they are pushing, by keyword or by category.
- Advertiser watchlists — re-run a Page URL on a schedule and get only the ads you have not already pulled (see Monitoring).
- Political / issue ad transparency — capture the extra disclosures Meta provides for transparency categories (audience estimates, spend, and reach where available).
- Creative & format analysis — compare display formats, CTAs, platforms, and media types across advertisers at scale.
How to use
- Sign up for Apify — the free plan is enough to try this actor.
- Open the Facebook Ad Library Scraper, fill in the inputs you need, and click Start.
- Watch results stream into the dataset table as each record is parsed.
- Export as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the Apify API.
Input
Provide any combination of search terms, Facebook Page URLs/IDs, or full Ad Library URLs, then refine with filters.
{"searchTerms": ["nike"],"pageUrls": [],"startUrls": [],"country": "US","adActiveStatus": "ALL","adType": "ALL","mediaType": "ALL","publisherPlatforms": [],"languages": [],"maxResults": 100,"monitoringMode": false,"pageDelaySeconds": 0,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
searchTerms— keywords to search the Ad Library for (e.g.nike,electric scooter). Each term runs as its own search.pageUrls— Facebook Page URLs (e.g.https://www.facebook.com/nike), page names, or numeric page IDs. Every result comes from that advertiser: a page URL or name is matched to its page ID automatically (one small extra request the first time; later runs reuse it).startUrls— full Meta Ad Library URLs (https://www.facebook.com/ads/library/?...). Every filter encoded in the URL is preserved — the best way to target an exact page or a complex filter combination.country— country whose Ad Library to query (US,GB,DE, … orALLfor every country at once). DefaultUS.adActiveStatus—ALL,ACTIVE, orINACTIVE. DefaultALL.adType—ALL, or a transparency category (POLITICAL_AND_ISSUE_ADS,HOUSING_ADS,EMPLOYMENT_ADS,CREDIT_ADS) that surfaces extra disclosures. DefaultALL.mediaType— restrict by creative format:ALL,IMAGE,VIDEO,MEME, orNONE(text only). DefaultALL.publisherPlatforms— only include ads that ran on chosen Meta surfaces (FACEBOOK,INSTAGRAM,MESSENGER,AUDIENCE_NETWORK,THREADS,WHATSAPP). Leave empty for all.languages— only include ads whose creative is in one of these languages (en,es,fr, …). Leave empty for any.dateFrom/dateTo— only include ads that were live at some point between these dates (YYYY-MM-DD). This is the same date filter as the Ad Library site: an ad that started earlier but was still running in the range counts.maxResults— cap on total ads collected across every source.0= unlimited. In monitoring mode, this caps how many ads are scanned per run (cost control), not how many are output, and is limited to60. Default100.monitoringMode/monitorId— see Monitoring.pageDelaySeconds— extra seconds to wait before each pagination request. Default0= automatic pacing (the scraper rotates residential IPs when Meta rate-limits one); raise it to5–10only if a run keeps stopping early on a rate-limit.proxyConfiguration— required. Leave on Residential (see Tips).
Output
Each ad becomes one clean row. Creatives, links, and advertiser details are flattened into columns rather than dumped as a raw blob.
{"adArchiveId": "1234567890123456","adLibraryUrl": "https://www.facebook.com/ads/library/?id=1234567890123456","pageName": "Nike","pageId": "15087023444","pageLikeCount": 39000000,"isActive": true,"status": "ACTIVE","startDate": "2026-03-17T00:00:00.000Z","endDate": null,"publisherPlatforms": ["FACEBOOK", "INSTAGRAM", "MESSENGER"],"displayFormat": "DPA","title": "Just Do It","bodyText": "Celebra tu cumpleaños con Nike y obtén acceso a productos exclusivos.","ctaText": "Shop Now","ctaType": "SHOP_NOW","linkUrl": "https://www.nike.com/","images": [],"videos": [],"cards": [{ "title": "Air Max", "linkUrl": "https://…", "imageUrl": "https://…" }],"countryIsoCode": "US","spend": null,"impressions": null,"isPoliticalOrIssueAd": false,"sourceInputType": "search","sourceQuery": "nike","scrapedAt": "2026-06-14T10:00:00.000Z","collationId": "595080484809801","gatedType": "ELIGIBLE","isReshared": false,"pageIsDeleted": false,"deliveryLimited": { "finserv": false, "twAntiScam": false }}
Notes:
- Most fields are
nullable— fields likeendDate,byline,caption,disclaimerLabel, andbrandedContentPartnerare populated only when the ad has them. spend,impressions, andreachEstimateare populated only for political and social-issue ads. Meta doesn't publish them for ordinary commercial ads, so they'renullthere (expected, not an error).gatedTypeis Meta's disclaimer status for the ad (ELIGIBLE,MISSING_DISCLAIMER,DISCLAIMER_REVIEW,TAKEN_DOWN,PAGE_DISABLED),deliveryLimitedflags regional delivery restrictions,collationIdgroups the creative variants Meta collates together, andpageIsDeletedtells you the advertiser's page is gone.- For DPA/carousel ads the primary
imagesarray is often empty and the creative lives incards. - Business/advertiser data only — never personal contact details.
- If a search returns nothing, the run still succeeds and the status message explains the likely reason.
Monitoring — get only new ads
Turn on monitoringMode and the run remembers every ad it has returned before and outputs only ads it has not seen in a previous run — perfect for scheduled runs answering "what new ads has this advertiser launched since I last checked?"
- The first run returns everything (your baseline). Every run after returns only the new ads.
- In this mode,
maxResultscaps how many ads are scanned per run (cost control), not how many are output — capped at 60 per run. A run pays the run fee plus only the genuinely new ads it returns; ads already reported are never charged again. - Set
monitorId(e.g.nike-us) to tie runs together into one monitor: runs sharing a Monitor ID share the same memory of seen ads. Leave it blank to auto-derive one from your input — but set it explicitly if you want the monitor to survive small input changes, or to run several independent monitors. - Pair it with Apify Schedules for hands-off competitor alerts.
What monitoring can and cannot see
Monitoring compares against the ads Meta returns for your query, and Meta ranks those by relevance, not by date. So a run scans the first N ads of that ranking, and a brand-new ad that ranks below N will not appear until it climbs into the window.
Monitor an advertiser's page, not a broad keyword. A single advertiser's ad set is
bounded, so a 60-ad scan covers it completely and "no new ads" genuinely means no new ads
(an advertiser with more than 60 live ads is best split into several monitors, e.g. by
country or by ad status). On a broad keyword like shoes the result set is far larger than any one scan, and
"no new ads" only means none inside the scanned window. The run's status message states the
scanned count every time, so you always know which of the two you are looking at.
How much does it cost to scrape Facebook Ad Library?
This Actor uses Apify's pay-per-event pricing, with no monthly rental. There are exactly two charges, and both are listed here in full:
| Event | Price | When it is charged |
|---|---|---|
Run fee (actor-start) | $0.005 per run | Once per run, and only once your input is accepted and Meta has served the first page. A run with no usable input, or one Meta blocked before any data loaded, is free. |
Ad scraped (ad-scraped) | $0.00075 per ad — $0.75 per 1,000 ads | Once for each ad written to your dataset. |
Worked example: a run returning 1,000 ads costs $0.005 + $0.75 = $0.755. A run returning 100 ads costs $0.08.
Why there is a run fee — plainly. Every run does the same fixed work before it knows whether it has anything to return: it opens a residential connection, clears Meta's bot check, and fetches the first page. That work costs real money even when the answer is "nothing new". Charging per ad alone meant runs that legitimately returned zero ads were unpaid, which is not sustainable. The run fee covers that floor and is deliberately small — it is the going rate among comparable Ad Library scrapers, several of which charge $0.05 for the same thing, and unlike some we never charge it when your input is unusable.
What you are never charged for: a run with no usable input, a run Meta blocked before any data loaded, ads already returned by a previous run in monitoring mode, or anything beyond the Max total charge you set on the run. Set that cap if you want a hard spend ceiling, and use maxResults to control how much the Actor fetches. The live prices are always shown on the Pricing tab of this page.
Automate & schedule
Run this actor on autopilot and pull results into your own stack:
- Apify API — start runs, fetch datasets, and manage schedules over REST.
- apify-client for JavaScript and apify-client for Python — official SDKs.
- Schedules — run it on a cron to keep your data fresh.
- Webhooks — trigger downstream actions the moment a run finishes.
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });const run = await client.actor('scrapesage/facebook-ad-library-scraper').call({searchTerms: ['nike'],country: 'US',adActiveStatus: 'ACTIVE',maxResults: 100,proxyConfiguration: { useApifyProxy: true, apifyProxyGroups: ['RESIDENTIAL'] },});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Got ${items.length} records`);
Integrate with any app
Connect the dataset to 5,000+ apps — no code required:
- Make — multi-step automation scenarios.
- Zapier — push new records straight into your CRM or sheet.
- Slack — get notified when a run finds something new.
- Google Drive / Sheets — auto-export every run to a spreadsheet.
- Airbyte — pipe results into your data warehouse.
- GitHub — trigger runs from commits or releases.
Use with AI assistants (MCP)
The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the Apify MCP server — ask your assistant to "find every active Facebook and Instagram ad Nike is running in the US and summarize their offers and CTAs" and let it run this scraper for you.
Agent-ready: autonomous payments (x402 & Skyfire)
This actor is agent-ready — AI agents can discover it, run it, and pay for it autonomously, with no Apify account and no human in the loop. It uses pay-per-event pricing and limited permissions, so it qualifies for Apify's agentic-payment standards:
- x402 — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the Apify MCP server — no account, no API key.
- Skyfire — agent-to-service payments for fully autonomous AI-agent workflows.
Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.
More scrapers from scrapesage
Need data from elsewhere? Try these scrapesage actors:
- Google Ads Transparency Scraper — who's advertising what on Google.
- LinkedIn Jobs Scraper — filter-based LinkedIn job postings, no login.
- Multi-ATS Job Scraper — jobs from Greenhouse, Lever, Ashby, Workday & more.
- Eventbrite Scraper — events plus organizer leads with contacts.
- Telegram Scraper — channels, messages, media & search.
- Airbnb Scraper — short-stay listings, prices, availability & market monitor.
- Bark Scraper — Bark.com provider profiles & leads.
Tips
- Keep the proxy on Residential. Meta blocks datacenter IPs at the network level, so the scraper must reach the Ad Library through Apify Residential proxy. It rotates to a fresh residential IP automatically if Meta rate-limits one.
- To target one advertiser, put its Facebook page URL, page name or numeric page ID in
pageUrls, or paste the Ad Library "view all ads" URL intostartUrls— every filter in that URL (country, status, dates, platforms, sort) is kept for every page of results. - If a large run stops early with a rate-limit message, raise
pageDelaySecondsto8–10. Higher is slower but more reliable for big pulls. - Control your spend with
maxResults— you're billed per ad returned, so it caps cost. Use0only when you truly want everything. - Set a
monitorIdwhen using monitoring mode so your monitor survives small input tweaks and you can run several independent monitors side by side.
FAQ
- Do I need to log in? No. It reads only the public Ad Library — no Facebook account, password, or cookies.
- Do I need a proxy? Yes — Residential proxy is required and on by default. Meta blocks datacenter IPs, so datacenter proxies and no-proxy runs will be blocked.
- Is scraping the Ad Library legal? The Ad Library is public and this tool collects business/advertiser data only — never personal contact details. Your results can still contain personal data, which is protected by the GDPR in the EU and similar laws elsewhere; scrape personal data only with a legitimate reason, and consult a lawyer if unsure.
- Why are
spendandimpressionsempty? Meta only publishes those for political and social-issue ads. For ordinary commercial ads they'renullby design. - What happens if a search returns no ads? The run still succeeds and the status message explains the likely reason (wrong country, active-only with no live ads, different ad language, etc.).
- How can I export the data? As JSON, CSV, Excel, XML, or RSS from the dataset, or programmatically via the Apify API.
Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.
"Facebook Ad Library" and any related marks are the property of their respective owners and are used here only in a descriptive, nominative sense - to identify the publicly accessible website from which this Actor collects data. This Actor is not an official Facebook Ad Library product, is not authorised or certified by Meta Platforms, Inc., and does not distribute Facebook Ad Library software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of the source website.
Need help?
Open an issue on the actor's Issues tab, or visit the Apify help center. Feature requests are welcome — this actor is actively maintained.