Meta Ad Library Scraper - Facebook Ads, Days Running & Changes
Pricing
from $17.00 / 1,000 ad scrapeds
Meta Ad Library Scraper - Facebook Ads, Days Running & Changes
Scrape Meta Ad Library by keyword and get what other scrapers skip: exact days each ad has been running, AFINN sentiment on the copy, advertiser Page likes, per-carousel-card creatives, and a new-vs-changed flag across scheduled runs. Facebook, Instagram, Messenger, Threads. 249 countries.
Pricing
from $17.00 / 1,000 ad scrapeds
Rating
5.0
(1)
Developer
WebDataLabs
Maintained by CommunityActor stats
15
Bookmarked
536
Total users
58
Monthly active users
1.9 days
Issues response
3 days ago
Last modified
Categories
Share
Meta Ad Library Scraper - Facebook & Instagram Ads, Competitor Intelligence
Extract competitor ads from Meta's Ad Library (Facebook, Instagram, Messenger, Audience Network). Get ad copy, creatives, targeting data, sentiment analysis, and track changes over time.
Pricing: from $0.017 per ad | No coding required | Export to CSV, JSON, Excel
What This Scraper Does
The Meta Ad Library Scraper extracts publicly available advertising data from Meta's transparency database. Unlike unreliable DOM scrapers, this tool uses GraphQL interception to capture the actual API responses - the same data Meta displays in their interface.
Platforms covered:
- Messenger
- Audience Network
Quick Start
1. Configure Your Search
{"searchQueries": ["running shoes", "fitness app", "gym membership"],"country": "US","activeStatus": "active","adType": "all","mediaType": "all","maxAds": 20}
2. Run the Scraper
Click Start in Apify Console, or use the API:
apify call webdatalabs/meta-ad-library-scraper -i '{"searchQueries": ["running shoes", "fitness app"],"country": "US","maxAds": 20}'
3. Export Your Data
Download results in CSV, JSON, or Excel format. Integrate with n8n, Zapier, Make, or any automation tool.
What You Get
Each ad record includes:
| Field | Description |
|---|---|
adArchiveId | Unique Meta ad identifier |
pageName | Advertiser name |
pageId | Advertiser's Facebook Page ID |
pageUrl | Link to advertiser's Page |
pageLikeCount | Page follower count |
pageCategory | Business category |
isActive | Whether ad is currently running |
startDate | When ad started running |
endDate | When ad stopped (if inactive) |
runDurationDays | How long the ad has been running |
platforms | Where ad runs (Facebook, Instagram, etc.) |
adCopy | Main ad text |
headline | Ad headline |
ctaType | Call-to-action type (LEARN_MORE, SHOP_NOW, etc.) |
ctaText | CTA button text |
landingUrl | Destination URL |
imageUrls | Array of image URLs |
videoUrls | Array of video URLs |
cards | Carousel card data (for multi-image ads) |
sentimentScore | NLP sentiment score (-5 to +5) |
sentimentLabel | positive / negative / neutral |
impressionsText | Impression range (EU transparency) |
categories | Ad categories (Housing, Political, etc.) |
scrapedAt | Timestamp of data collection |
Example Output
{"adArchiveId": "1908832149745499","pageName": "Nike","pageId": "15087023444","pageUrl": "https://www.facebook.com/15087023444","pageLikeCount": 36254891,"pageCategory": "Clothing Brand","isActive": true,"startDate": "2024-01-15T00:00:00.000Z","endDate": null,"runDurationDays": 45,"platforms": ["FACEBOOK", "INSTAGRAM", "AUDIENCE_NETWORK"],"platformCount": 3,"adCopy": "Just Do It. New Pegasus 41 - engineered for your fastest runs yet.","headline": "Nike Pegasus 41","ctaType": "SHOP_NOW","ctaText": "Shop Now","landingUrl": "https://www.nike.com/running/pegasus","imageUrls": ["https://scontent.xx.fbcdn.net/v/..."],"videoUrls": [],"cards": [],"sentimentScore": 2.5,"sentimentComparative": 0.25,"sentimentLabel": "positive","impressionsText": null,"categories": [],"firstSeenAt": "2024-01-20T10:30:00.000Z","lastSeenAt": "2024-03-01T14:22:00.000Z","changeDetected": false,"scrapedAt": "2024-03-01T14:22:00.000Z","searchQuery": "running shoes","country": "US"}
Use Cases
1. Competitive Intelligence
Monitor what ads your competitors are running:
- Track their messaging and positioning
- See which platforms they target
- Analyze their creative strategies
- Identify new product launches
2. Ad Creative Inspiration
Research successful ad formats in your industry:
- Find high-performing ad copy patterns
- Discover trending visual styles
- Analyze CTA strategies
- Study carousel vs. single image performance
3. Market Research
Understand advertising trends in any market:
- Compare ad activity across countries
- Track seasonal advertising patterns
- Analyze industry spending trends
- Monitor political/issue ads in specific regions
4. Brand Protection
Monitor unauthorized use of your brand:
- Find ads mentioning your brand
- Detect counterfeit product ads
- Track competitor brand comparisons
- Identify affiliate compliance issues
5. Agency Reporting
Create comprehensive competitor reports:
- Scheduled daily/weekly data collection
- Historical trend analysis
- Sentiment analysis on competitor messaging
- Export-ready data for client presentations
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQueries | string[] | required | Keywords to search. Add multiple entries to scrape several queries in one run. Legacy searchQuery (single string) still supported for backward compatibility. |
country | select | DE | Country to search, picked from a dropdown of all 249 ISO 3166-1 codes. Free text is no longer accepted - "India" is rejected before the run starts, "IN" is correct. |
activeStatus | enum | active | Filter: active, inactive, or all |
adType | enum | all | Filter: all, political_and_issue_ads, housing, employment, credit |
mediaType | enum | all | Filter: all, image, video, meme |
maxAds | number | 20 | Maximum ads per query (1-10,000). Total ads = maxAds × number of queries. |
sortMode | enum | newest | newest = recently created ads first (fresh leads each run). most_impressions = highest-reach ads first (competitive research). |
analyzeSentiment | boolean | true | Enable AFINN-165 sentiment analysis |
trackChanges | boolean | true | Track changes across scheduled runs |
useProxies | boolean | true | Use residential proxies (recommended) |
proxyGroups | array | ["RESIDENTIAL"] | Apify proxy groups to use |
Country Codes
Pick the country from the dropdown in the Console. Over the API, pass the two-letter ISO 3166-1 alpha-2 code, not the country name:
US (United States), IN (India), SA (Saudi Arabia), DE (Germany), GB (United Kingdom), FR (France), CA (Canada), AU (Australia), ES (Spain), IT (Italy), NL (Netherlands), BR (Brazil)
Full list of ISO 3166-1 alpha-2 codes
If you have a saved task or schedule created before July 2026 that stores a country name (e.g.
India), open it once and re-pick the country from the dropdown.
How to read the result of a run
Every run writes a OUTPUT record to the key-value store and prints a per-query summary, so a zero is never ambiguous:
| Per-query status | Meaning | What to do |
|---|---|---|
delivered | Ads found and written to the dataset | Nothing |
no-ads-found | Meta's Ad Library genuinely has no ads for that term in that country | Try the advertiser's native-language spelling (an Arabic brand usually only matches its Arabic name), a shorter term, or Ad Status All ads |
blocked | We could not reach Meta (block, rate limit, proxy failure). Not an empty result | Re-run; make sure residential proxies are enabled |
partial-budget / skipped-budget | The run's cost limit was reached, so the remaining ads were not scraped | Raise Max total charge in the run options |
partial-timeout / partial-interrupted | Stopped early on the run time limit or a dropped connection | Re-run, or raise the run timeout |
The number printed as "Ads delivered to the dataset" is the number of rows that actually landed - it can never be higher than the dataset item count.
Run cost limit
This actor bills per delivered ad. If a run hits its Max total charge, it stops immediately, tells you how many ads it delivered versus how many you asked for, and lists the queries it never got to. You are never charged for ads that were not delivered.
Memory
1 GB is the right setting and is the actor default. The fast HTTP path peaks around 160 MB; more memory just costs more. The browser fallback (used only when Meta blocks the HTTP path) needs at least 1 GB - below that the actor refuses to launch it and says so rather than being killed by the container.
How to Use
Via Apify Console
- Go to Meta Ad Library Scraper
- Fill in the input form
- Click Start
- Download results when complete
Via API
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('webdatalabs/meta-ad-library-scraper').call({searchQueries: ['fitness app', 'gym membership', 'protein powder'],country: 'US',activeStatus: 'active',maxAds: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Via CLI
apify call webdatalabs/meta-ad-library-scraper \-i '{"searchQueries":["coffee shop","cafe","espresso"],"country":"GB","maxAds":20}'
Scheduled Runs
Set up recurring scrapes for continuous monitoring:
- Go to Schedules in Apify Console
- Create new schedule (daily, weekly, etc.)
- Enable Change Tracking to identify new/modified ads
- Connect webhook for real-time notifications
Features
GraphQL Interception
Unlike DOM scrapers that break when Facebook changes their UI, this scraper intercepts the actual GraphQL API responses. This provides:
- Reliability: Captures the same data Facebook uses internally
- Completeness: Gets all fields, not just visible ones
- Speed: Direct data access without DOM parsing
Sentiment Analysis
Built-in AFINN-165 NLP analysis on ad copy:
- sentimentScore: Raw score (-5 to +5 scale)
- sentimentComparative: Normalized score (per word)
- sentimentLabel: Simple classification (positive/negative/neutral)
Useful for understanding competitor messaging tone and tracking sentiment trends.
Change Tracking
When enabled, the scraper maintains state across runs:
- Identifies new ads that weren't seen before
- Detects changes to existing ads (copy, status, etc.)
- Stores firstSeenAt and lastSeenAt timestamps
Perfect for scheduled monitoring and trend analysis.
Proxy Support
This scraper uses Apify's proxy infrastructure for reliable access to Meta's Ad Library:
- Uses Apify's residential proxy pool by default
- Distributes requests across IPs for reliability
- Runs in non-headless mode for maximum compatibility
Technical Details
How It Works
- URL Construction: Builds Ad Library URL with your search parameters
- Browser Launch: Opens Chrome for JavaScript-rendered page extraction
- GraphQL Interception: Captures API responses as you scroll
- Data Transformation: Normalizes raw GraphQL to clean output format
- Sentiment Analysis: Runs AFINN-165 on ad copy (if enabled)
- State Management: Tracks seen ads for change detection
- Dataset Storage: Saves each ad with pay-per-event billing
Rate Limits
- Scroll-based pagination (no direct API calls)
- Built-in delays between scrolls
- Residential proxies provide geo-distributed access for reliability
Limitations
- Spend/Impressions: Only available for EU transparency ads (political, housing in some regions).
impressionsText,impressionsIndexandspendTextarenullfor everything else - we never substitute a placeholder value. - Historical data: Only current ads visible (Meta doesn't expose a historical archive)
- Search matches ad text, not brands: Meta matches the words in the ad itself. A brand that advertises in Arabic will not be found by its Latin transliteration - search the native-language spelling.
- Rate limits: Meta throttles per IP. The actor detects a throttle and reports it as
blocked; it never reports a throttle as "0 ads found".
Pricing
From $0.017 per ad (pay-per-event billing; $0.02 on the free plan, lower rates on paid Apify plans)
| Ads | Cost (from) |
|---|---|
| 100 | $1.70 |
| 500 | $8.50 |
| 1,000 | $17.00 |
| 5,000 | $85.00 |
Plus Apify platform costs (compute + residential proxy bandwidth).
Residential proxy usage: ~50-100 MB per 1,000 ads
Integrations
n8n
Use the Apify Trigger node to start scrapes and Apify Dataset node to retrieve results. Connect to Google Sheets, Slack, or any other n8n node.
Zapier
- Add Apify integration
- Trigger: "New Dataset Item"
- Connect to your destination (Sheets, Airtable, Slack, etc.)
Make (Integromat)
Use the Apify modules to:
- Schedule recurring scrapes
- Process new ads automatically
- Push to CRM or database
Webhooks
Configure webhooks in Apify to receive notifications when:
- Scrape completes
- New ads detected (with change tracking)
FAQ
Is this legal?
Yes. Meta Ad Library is a public transparency database. All data scraped is publicly accessible without login. This scraper accesses the same data any user can see by visiting ads.facebook.com.
Why do I need residential proxies?
Residential proxies provide geo-distributed IPs that improve reliability and access consistency when extracting from Meta's Ad Library.
How often can I run this?
As often as needed. For competitive monitoring, daily or weekly schedules work well. Enable Change Tracking to only flag new/modified ads.
What if I hit rate limits?
The scraper automatically handles rate limiting through scroll delays and proxy rotation. Very large scrapes (10,000+ ads) may run slower but will complete.
Can I scrape without an Apify account?
No, this runs on the Apify platform. You need an account (free tier available) and API token for automation.
Related Scrapers
Looking for other data sources? Check out these scrapers on Apify Store:
- Social Media: TikTok, Reddit, Discord scrapers
- E-commerce: Shopify, Amazon, eBay scrapers
- Business Data: Google Maps, LinkedIn scrapers
Browse all scrapers at apify.com/store
Support
Need help? Have questions?
- Open an issue in the Apify Console on this actor's page
- Check the Apify Documentation for platform help
📬 Custom Solutions & Enterprise
Need a custom data feed, modified output format, or enterprise integration?
Contact: Furkanc58@gmail.com
I offer:
- Daily/weekly data feeds (Snowflake, S3, BigQuery, Google Sheets)
- Custom scrapers for platforms not yet covered
- White-label solutions for agencies
- Priority support and SLAs
Response within 24-48 hours.
Leave a review
Is this actor saving you time? A quick review on the Store helps other people find it — and tells us which fields to add next. Rate this actor →
Legal Disclaimer
This actor is provided for legitimate business purposes such as competitive analysis, market research, and brand monitoring using publicly available data from Meta's Ad Library transparency database.
Users are solely responsible for ensuring compliance with:
- Applicable laws and regulations (GDPR, CCPA, etc.)
- Meta's Terms of Service
- Apify's Terms of Service
The developer disclaims liability for any misuse. By using this actor, users agree to indemnify the developer against any claims arising from their use of the scraped data.
Changelog
v1.2.0 (July 2026)
- Honest delivery accounting: the run summary now counts ads that actually landed in the dataset. Previously a run that hit its cost limit could log "Total ads: 20" while writing 1 row.
- Cost-limit handling: when the run's cost limit is reached the crawl stops immediately, names how many ads were delivered vs requested, and lists the queries it skipped - instead of scraping on and discarding the results.
- Per-query outcome report: every run writes an
OUTPUTkey-value record and logs one line per query, distinguishing "Meta has no ads for this term" from "we were blocked". - Country is now a dropdown of all 249 ISO 3166-1 codes, so a country name can no longer fail a started run.
- Rate limits are no longer reported as empty results: a throttled response from Meta now fails loudly instead of returning zero ads.
- Browser fallback memory guard: refuses to launch below 1 GB instead of being OOM-killed mid-run.
- No fabricated values: an unknown ad start date is
null(previously today's date), unknown page likes arenull(previously0), and Meta's-1"not disclosed" impressions sentinel isnull.
v1.1.0
- Multi-query support:
searchQueriesarray — scrape multiple keywords in one run maxAdsnow applies per query (total = maxAds × number of queries)- Backward compatible: legacy
searchQuerystring still works
v1.0.0
- Initial release
- GraphQL interception for reliable data extraction
- Sentiment analysis (AFINN-165)
- Change tracking across runs
- Carousel and video ad support
- Residential proxy support
Keywords
Meta Ad Library Scraper, Facebook Ad Library API, Instagram Ads Scraper, Facebook Ads Data Extraction, Meta Advertising API, Competitor Ad Analysis, Facebook Ad Spy Tool, Social Media Ad Scraper, Ad Creative Research, Facebook Marketing Data, Meta Business Suite Scraper, Facebook Ad Transparency, Political Ads Scraper, Housing Ads Data, Ad Library Export CSV, Facebook Ad Monitoring, Competitor Intelligence Tool, Meta Ads Database, Social Media Marketing Research, Ad Copy Analysis
Built with Apify SDK and Playwright. Data accuracy depends on Meta Ad Library availability.