Facebook Ad Library Scraper Pro avatar

Facebook Ad Library Scraper Pro

Pricing

Pay per event

Go to Apify Store
Facebook Ad Library Scraper Pro

Facebook Ad Library Scraper Pro

Scrape Facebook Ads Library by keyword, page URL, or advertiser name. Returns full creative + CTA + linkUrl + advertiser identity + active dates. 35% cheaper than the leading alternative. No login required, country dropdown, multi-platform/media filters, resume checkpoints.

Pricing

Pay per event

Rating

5.0

(1)

Developer

Omar Eldeeb

Omar Eldeeb

Maintained by Community

Actor stats

2

Bookmarked

3

Total users

2

Monthly active users

5 days ago

Last modified

Share

Facebook Ad Library Scraper Pro — Keyword + Page + Advertiser Search

Scrape Facebook's public Ad Library — every ad currently or recently running across Facebook, Instagram, Messenger, and Audience Network. Search by keyword, by page URL, or by advertiser name. Get CTA text, link URLs, full creative (image/video), advertiser info, and active dates.

$0.49 per 1,000 ads — 35% cheaper than the leading competitor. First 10 ads of every run are free.

No Facebook login required. No developer-app approval. Works on commercial ads, not just political. Country dropdown with 50+ ISO codes. Resume checkpoints save your run mid-flight.

What does Facebook Ad Library Scraper Pro do?

It pulls structured data from facebook.com/ads/library — the public archive of every ad Meta has run on Facebook, Instagram, Messenger, WhatsApp, Threads, and the Audience Network. Unlike the official Meta Ad Library API (political/issue ads only, EU-only, no creative or link data), this actor returns full commercial ads with CTA, link URLs, body text, creatives, and advertiser identity.

Built for marketers, competitive intel analysts, agencies, and researchers who need the same insights Meta surfaces in the Ad Library UI — but at scale, in JSON/CSV/Excel.

Why use Facebook Ad Library Scraper Pro?

  • Cheapest in its class — $0.49 per 1,000 ads. First 10 every run are free. Compare: leading competitor charges $0.75/1K.
  • Three input modes in one actor. Paste Ad Library search URLs, raw Facebook page URLs (vanity or profile.php?id=...), or just type a keyword / advertiserName and we'll build the right URL for you.
  • Country dropdown with names, not codes. Pick "United States (US)" instead of typing us or US and hoping. Or use the Custom country code field for any of the 240+ ISO-3166 codes.
  • Multi-platform + media-type filters as first-class fields. Filter by FACEBOOK / INSTAGRAM / MESSENGER / AUDIENCE_NETWORK / THREADS / WHATSAPP and image / video / meme / text-only.
  • CSV-ready output. Every creative URL, CTA, link, and advertiser field is emitted as a flat column (linkUrl, ctaText, imageUrl1..5, videoUrl1) — your Sheets import just works. Nested objects preserved for power users.
  • Dedup'd advertiser About cache. Resolve an advertiser's verified status, categories, and profile pic once per page across the whole run — not once per ad. Saves you money on bulk page scrapes.
  • Resume checkpoints. Crashed run? Restart it within 6 hours with the same input — we resume from the last cursor instead of re-charging you for already-scraped ads.
  • EU reach + AAA targeting (optional). Toggle on Scrape ad details to get demographic reach (age × gender × country) and AAA audience metadata for any ad.
  • Residential proxy built-in. Default proxy config rotates per request, avoiding the CAPTCHA traps that kill datacenter scrapes.

How to use Facebook Ad Library Scraper Pro

  1. Open the Apify Console and click Try for free.
  2. Pick a search style — fastest is to type a Keyword (e.g., nike) or Advertiser name (e.g., Spotify) and pick a Country.
  3. Or paste URLs — Ad Library search URLs (https://www.facebook.com/ads/library/?...) or raw Facebook page URLs (https://www.facebook.com/ZapierApp). One per line.
  4. Set Total ads cap (across the whole run) and/or Limit per input URL to control spend.
  5. (Optional) Enable Scrape ad details for EU reach, Resolve advertiser About for page-level verification + categories.
  6. Click Save & Start. First 10 ads are free.
  7. When the run finishes, export the dataset as JSON, CSV, or Excel from the Storage tab.

Input examples

Keyword search (cheapest, fastest):

{
"keyword": "nike",
"country": "US",
"mediaType": "video",
"count": 500
}

Page URL — vanity slug:

{
"urls": ["https://www.facebook.com/ZapierApp"],
"limitPerSource": 200
}

Multiple pages + global cap:

{
"urls": [
"https://www.facebook.com/ZapierApp",
"https://www.facebook.com/Spotify",
"https://www.facebook.com/airbnb"
],
"count": 1000,
"resolveAdvertiser": true
}

Advertiser-name search across all of Europe with date filter:

{
"advertiserName": "Adidas",
"country": "DE",
"period": "last30d",
"mediaType": "video",
"platforms": ["FACEBOOK", "INSTAGRAM"]
}

Migrating from the leading competitor — paste their input shape, we accept it:

{
"urls": [
{ "url": "https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=IN&q=linkedin&search_type=keyword_unordered&media_type=all" }
],
"count": 100,
"scrapePageAds.period": "last7d",
"scrapePageAds.activeStatus": "all",
"scrapePageAds.sortBy": "impressions_desc",
"scrapePageAds.countryCode": "ALL"
}

Output

Sample row:

{
"adArchiveId": "1234567890123456",
"adId": "987654321",
"pageId": "20531316728",
"pageName": "Nike",
"isActive": true,
"startDate": 1709251200,
"endDate": null,
"totalActiveTime": 4320000,
"publisherPlatform": ["FACEBOOK", "INSTAGRAM"],
"country": "US",
"currency": "USD",
"displayFormat": "VIDEO",
"title": "Just Do It.",
"bodyText": "Run with the new Air Zoom Pegasus 41. Built for breakthroughs.",
"linkDescription": "Free shipping on orders $50+",
"ctaText": "Shop Now",
"ctaType": "SHOP_NOW",
"linkUrl": "https://nike.com/w/pegasus-41",
"imageUrl1": "https://scontent.xx.fbcdn.net/v/t39.../creative1.jpg",
"videoUrl1": "https://video.xx.fbcdn.net/v/t39.../ad-hd.mp4",
"videoPreviewImageUrl1": "https://scontent.xx.fbcdn.net/v/t39.../preview.jpg",
"pageVerified": true,
"pageCategories": ["Sportswear store"],
"pageProfilePictureUrl": "https://scontent.xx.fbcdn.net/v/t39.../profile.jpg",
"snapshot": { "...full Facebook payload preserved here..." },
"runTag": "weekly-pull-2026-05",
"sourceUrl": "https://www.facebook.com/ads/library/?...&q=nike",
"scrapedAt": "2026-05-18T14:23:11.482Z"
}

Data fields:

FieldTypeDescription
adArchiveIdstringUnique Ad Library archive ID — primary key.
adIdstringInternal Meta ad ID.
pageId / pageNamestringAdvertiser identity.
isActivebooleanWhether the ad is still running.
startDate / endDateunix epochStart / stop timestamps.
totalActiveTimeintegerSeconds the ad has been running.
publisherPlatformarrayWhere the ad runs: FACEBOOK / INSTAGRAM / MESSENGER / AUDIENCE_NETWORK / THREADS / WHATSAPP.
countrystringISO country code the ad targets.
displayFormatstringIMAGE / VIDEO / CAROUSEL / DCO / etc.
title / bodyText / linkDescriptionstringAd copy.
ctaText / ctaTypestringCall-to-action button (Shop Now, SHOP_NOW).
linkUrlstringDestination URL of the ad.
imageUrl1..5, videoUrl1, videoPreviewImageUrl1stringCreative CDN URLs, flat.
spendLowerBound / spendUpperBound / spendCurrencynumber/stringPolitical/social-issue ads only.
impressionsLowerBound / impressionsUpperBoundnumberPolitical/social-issue ads only.
pageVerifiedbooleanBlue-tick verification status.
pageCategories / pageProfilePictureUrlarray/stringAdvertiser metadata.
snapshotobjectFull original Facebook payload — preserved for power users.
advertiserobjectResolved About-page data (when resolveAdvertiser=true).
demographicReachobjectEU age × gender × country reach (when scrapeAdDetails=true).
runTagstringEchoed from input — useful for joining datasets.
sourceUrlstringWhich input URL produced this row.
scrapedAtISO 8601When we captured the row.

How much does it cost to scrape Facebook Ad Library?

Pay-per-event pricing — only pay for what you get.

EventPriceWhen it fires
ad-scraped$0.00049 ($0.49 / 1,000)Once per ad extracted with creative, CTA, link, body text.
ad-details-fetched$0.00025 ($0.25 / 1,000)Only when scrapeAdDetails=true AND Meta returns non-empty data. EU reach + AAA targeting metadata. Note: per Meta's policy, full demographic reach is only exposed for political/social-issue ads. Commercial ads typically return empty — we don't charge for those empty calls.
advertiser-resolved$0.001 ($1 / 1,000 unique pages)Only when resolveAdvertiser=true — fired ONCE per page across the whole run, not per ad.

First 10 events of every run are free. Cancel anytime.

Typical run costs:

RunAdsDetailsAdvertisersCost
Sample run (free trial)10$0.00
Small competitive scan500$0.20
1K-ad market sweep1,00020 pages$0.49 + $0.02 = $0.51
10K-ad campaign analysis10,000200 pages$4.90 + $0.20 = $5.10
10K with EU reach details10,00010,000200 pages$4.90 + $2.50 + $0.20 = $7.60
100K-ad agency audit100,0002,000 pages$49 + $2 = $51

Compare: the leading competitor charges $0.75/1K with no dedup'd advertiser cache — the 10K + advertiser run above would cost you $7.50 + $7.50 = $15 there. We're 66% cheaper on that workload.

Tips & advanced options

  • country=ALL returns ads from every country Meta indexes. Be cautious — the result count can explode for popular keywords.
  • mediaType=video is one of the highest-signal filters for competitive intel — high-spend advertisers ship video creative.
  • platforms filter is exact-match. Setting ["FACEBOOK", "INSTAGRAM"] excludes ads that only run on Messenger or Audience Network.
  • period=last7d + sortBy=most_recent is the fastest way to surface brand-new ad pushes from a competitor.
  • resolveAdvertiser=true + scraping multiple ads per page costs almost nothing extra — we fire the resolve event once per unique pageId, not per ad. Compare to competitors that re-fetch per ad.
  • Schedule it. Use Apify Schedules to run weekly with period=last7d and a stable runTag, then JOIN datasets by pageId to track advertiser changes over time.
  • Chain into other actors. Pipe the dataset into a Shopify, web-archive, or LLM-summarization actor for full competitive-intel pipelines.
  • Resume checkpoints. Leave enableCheckpoint=true (the default). If the run crashes or you stop it manually, restart with the same input within 6 hours — we pick up from the last successful pagination cursor, no double-charge.

This actor only scrapes data that Facebook makes publicly available in its Ad Library — the same data anyone can see by visiting facebook.com/ads/library. No Facebook login is performed. No private user data is extracted.

Per Meta's Ad Library Terms, ads in the Ad Library are public. However, your jurisdiction's data-protection laws (GDPR, CCPA, etc.) may impose restrictions on how you process advertiser data. You are responsible for compliance with applicable laws in your use of the output.

If you scrape political/social-issue ads, note that some fields (spend range, impressions range, demographic breakdown) are only available for ads in that category — a Meta policy choice.

FAQ & support

Q: Does this work for commercial ads, or only political/issue ads? Yes — works for all ads in the public Ad Library. The official Meta API is restricted to political/issue ads; this actor is not.

Q: Why is the leading competitor $0.75 and you're $0.49 — is the data the same? Same source (facebook.com/ads/library), same field coverage. We're cheaper because (a) newer cost structure, (b) we dedup advertiser-About calls per pageId instead of per-ad, (c) we extract the first page free from SSR HTML instead of paying for the GraphQL call.

Q: My country isn't in the dropdown — what do I do? Use the Custom country code field underneath the dropdown. Type any 2-letter ISO-3166 code (e.g., BD, PK, MA, JM).

Q: I'm getting fewer ads than expected. (1) Some ads are geo-fenced — try country=ALL. (2) activeStatus=active filters out ended ads — try activeStatus=all. (3) Facebook's pagination occasionally returns empty pages mid-run; our retry logic handles up to 2 consecutive empties before stopping that source.

Q: Can I run this on a schedule? Yes. Use Apify Schedules + a stable runTag so you can join datasets across runs.

Q: I'm migrating from another Ad Library scraper — will my old input still work? Yes. We accept the scrapePageAds.period / scrapePageAds.activeStatus / scrapePageAds.sortBy / scrapePageAds.countryCode dot-notation keys as aliases.

For issues: open a ticket on Apify or reach the maintainer through the Apify Store actor page.