Meta Ad Library Scraper - Facebook Ads, Days Running & Changes avatar

Meta Ad Library Scraper - Facebook Ads, Days Running & Changes

Pricing

from $17.00 / 1,000 ad scrapeds

Go to Apify Store
Meta Ad Library Scraper - Facebook Ads, Days Running & Changes

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

WebDataLabs

Maintained by Community

Actor stats

15

Bookmarked

536

Total users

58

Monthly active users

1.9 days

Issues response

3 days ago

Last modified

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:

  • Facebook
  • Instagram
  • Messenger
  • Audience Network

Quick Start

{
"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:

FieldDescription
adArchiveIdUnique Meta ad identifier
pageNameAdvertiser name
pageIdAdvertiser's Facebook Page ID
pageUrlLink to advertiser's Page
pageLikeCountPage follower count
pageCategoryBusiness category
isActiveWhether ad is currently running
startDateWhen ad started running
endDateWhen ad stopped (if inactive)
runDurationDaysHow long the ad has been running
platformsWhere ad runs (Facebook, Instagram, etc.)
adCopyMain ad text
headlineAd headline
ctaTypeCall-to-action type (LEARN_MORE, SHOP_NOW, etc.)
ctaTextCTA button text
landingUrlDestination URL
imageUrlsArray of image URLs
videoUrlsArray of video URLs
cardsCarousel card data (for multi-image ads)
sentimentScoreNLP sentiment score (-5 to +5)
sentimentLabelpositive / negative / neutral
impressionsTextImpression range (EU transparency)
categoriesAd categories (Housing, Political, etc.)
scrapedAtTimestamp 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

ParameterTypeDefaultDescription
searchQueriesstring[]requiredKeywords to search. Add multiple entries to scrape several queries in one run. Legacy searchQuery (single string) still supported for backward compatibility.
countryselectDECountry 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.
activeStatusenumactiveFilter: active, inactive, or all
adTypeenumallFilter: all, political_and_issue_ads, housing, employment, credit
mediaTypeenumallFilter: all, image, video, meme
maxAdsnumber20Maximum ads per query (1-10,000). Total ads = maxAds × number of queries.
sortModeenumnewestnewest = recently created ads first (fresh leads each run). most_impressions = highest-reach ads first (competitive research).
analyzeSentimentbooleantrueEnable AFINN-165 sentiment analysis
trackChangesbooleantrueTrack changes across scheduled runs
useProxiesbooleantrueUse residential proxies (recommended)
proxyGroupsarray["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 statusMeaningWhat to do
deliveredAds found and written to the datasetNothing
no-ads-foundMeta's Ad Library genuinely has no ads for that term in that countryTry the advertiser's native-language spelling (an Arabic brand usually only matches its Arabic name), a shorter term, or Ad Status All ads
blockedWe could not reach Meta (block, rate limit, proxy failure). Not an empty resultRe-run; make sure residential proxies are enabled
partial-budget / skipped-budgetThe run's cost limit was reached, so the remaining ads were not scrapedRaise Max total charge in the run options
partial-timeout / partial-interruptedStopped early on the run time limit or a dropped connectionRe-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

  1. Go to Meta Ad Library Scraper
  2. Fill in the input form
  3. Click Start
  4. 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:

  1. Go to Schedules in Apify Console
  2. Create new schedule (daily, weekly, etc.)
  3. Enable Change Tracking to identify new/modified ads
  4. 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

  1. URL Construction: Builds Ad Library URL with your search parameters
  2. Browser Launch: Opens Chrome for JavaScript-rendered page extraction
  3. GraphQL Interception: Captures API responses as you scroll
  4. Data Transformation: Normalizes raw GraphQL to clean output format
  5. Sentiment Analysis: Runs AFINN-165 on ad copy (if enabled)
  6. State Management: Tracks seen ads for change detection
  7. 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, impressionsIndex and spendText are null for 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)

AdsCost (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

  1. Add Apify integration
  2. Trigger: "New Dataset Item"
  3. 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

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.


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?



📬 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 →

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 OUTPUT key-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 are null (previously 0), and Meta's -1 "not disclosed" impressions sentinel is null.

v1.1.0

  • Multi-query support: searchQueries array — scrape multiple keywords in one run
  • maxAds now applies per query (total = maxAds × number of queries)
  • Backward compatible: legacy searchQuery string 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.