Meta Ad Library Scraper - Facebook Ads & Scaled Offers avatar

Meta Ad Library Scraper - Facebook Ads & Scaled Offers

Pricing

from $0.43 / 1,000 ad delivereds

Go to Apify Store
Meta Ad Library Scraper - Facebook Ads & Scaled Offers

Meta Ad Library Scraper - Facebook Ads & Scaled Offers

Scrape the Meta Ad Library (Facebook, Instagram, Messenger) without login: ads by keyword, advertiser page or Ad Library link, with text, video, landing page, start date, days running and duplicated creatives, plus a scaled-offer ranking grouped by landing page.

Pricing

from $0.43 / 1,000 ad delivereds

Rating

0.0

(0)

Developer

Scrapewise Data

Scrapewise Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

23 minutes ago

Last modified

Categories

Share

Meta Ad Library Scraper

Meta Ad Library Scraper turns the public Facebook Ad Library (Facebook, Instagram, Messenger, Audience Network and Threads ads) into clean JSON, CSV or Excel, without login, cookies or an API token. Search any keyword in any country, list every ad of an advertiser page, or paste an Ad Library link with your own filters. Each ad comes with its text, title, call to action, landing page, images and video links, start date, days running and how many ads reuse the same creative.

On top of the ads, the Actor ranks the scaled offers it found: one row per landing page and advertiser that shows a scale signal (2+ active ads or 2+ copies of a creative), with how many ads are live, how many creative copies are running and for how long. It is the "offer mining" that media buyers, dropshippers, affiliates and info product sellers do by hand in the Ad Library, done in one run.

US$ 0.50 per 1,000 ads. US$ 1.00 per 1,000 scaled-offer rows (optional). No monthly fee, no start fee. Error rows are free.

At a glance

  • Price per 1,000 ads: US$ 0.50
  • Scaled-offer ranking: Yes, one row per landing page, ranked by a scale score
  • Days running and creative copies per ad: Yes (daysRunning, sameCreativeAdsCount)
  • Filter by minimum days running: Yes (minDaysRunning)
  • Input: Keywords x countries, advertiser pages, or any Ad Library link
  • Login, cookies, Meta API token: None
  • Daily "what is new" mode: Yes, new ads and new advertiser pages since the previous run (compareWithPreviousRun)
  • Error rows (blocked, no results, bad input): Free, with an errorCode

One real row

A keyword search for emagrecer in Brazil, video ads running for at least 14 days (collected on 2026-09-30, trimmed):

{
"type": "ad",
"adArchiveId": "1320765540221734",
"adLibraryUrl": "https://www.facebook.com/ads/library/?id=1320765540221734",
"pageName": "Victor Pareto",
"isActive": true,
"startDate": "2026-06-20",
"daysRunning": 103,
"sameCreativeAdsCount": 1,
"platforms": ["FACEBOOK", "INSTAGRAM", "AUDIENCE_NETWORK", "MESSENGER", "THREADS"],
"displayFormat": "VIDEO",
"title": "Queime gordura e ganhe massa muscular com o treino híbrido!",
"ctaType": "LEARN_MORE",
"linkUrl": "http://m.timehibrido.com.br/rt/desafio/quiz-novo",
"landingDomain": "timehibrido.com.br",
"hasVideo": true,
"searchQuery": "emagrecer",
"country": "BR"
}

And the top of the scaled-offer ranking from the same run:

#Landing domainAdvertiserActive adsAds incl. creative copiesLongest running
1cariani.com.brRenato Cariani22823 days
2pilates.laystrancoso.comLays Sant'anna517134 days
3mercadolivre.com.brVichy101148 days

What you can do with it

  • Find winning offers. Search your niche, keep ads running for 14+ days, and read the offer ranking: an advertiser paying for 28 copies of the same creative is scaling something that sells.
  • Spy on competitors. Put their page ids in pageIds and schedule the run daily: every new ad, every creative they keep on, every landing page they test.
  • Catch clones of your offer. Schedule a daily search with your offer name and get only the ads and advertiser pages that appeared since yesterday (see below).
  • Build a swipe file. Export text, titles, calls to action and video links of the ads that last longest in any country.
  • Feed AI agents and dashboards. Stable field names, one row per ad, free error rows with codes.

Input

FieldTypeWhat it does
searchQuerieslist of stringsKeywords in any language. Each one is searched in each country.
pageIdslist of stringsNumeric page ids, or Ad Library links with view_all_page_id. All ads of that advertiser.
startUrlslist of linksAny facebook.com/ads/library search link; its own filters are kept.
countrieslist of stringsTwo-letter codes (US, BR, GB, MX, FR...). Empty = all countries.
activeStatusactive, inactive, allDefault active.
mediaTypeall, image, video, meme, noneDefault all.
exactPhrasebooleanExact phrase instead of any word.
minDaysRunningintegerOnly ads running for at least N days. Filtered ads are not charged.
maxItemsintegerMax ads per keyword and country, page or link. Default 100.
groupByOfferbooleanAdd the scaled-offer ranking at the end. Default on.
compareWithPreviousRunbooleanMark new ads and new advertisers against the previous run and add a free summary row per search. Default off.
onlyNewbooleanWith the comparison on, deliver (and charge) only ads not seen before. Default off.
snapshotNamestringName of the saved comparison. Empty: derived from the searches and countries.

Examples

{ "searchQueries": ["weight loss", "keto"], "countries": ["US", "GB"], "minDaysRunning": 14, "mediaType": "video", "maxItems": 300 }
{ "pageIds": ["112565745050415"], "countries": ["BR"], "maxItems": 500, "groupByOffer": false }

Daily clone and new-advertiser alerts

Info products, courses and low ticket offers get cloned fast: same name, same creatives, same emoji, on a handful of new pages, often the day after an offer starts to scale. Finding them in the Ad Library means searching by hand every morning and remembering what was there yesterday. This mode does the remembering.

Schedule the Actor once a day (Apify Console, Schedules) with your offer name, the words of your ad or your page, and the comparison on:

{
"searchQueries": ["your offer name", "a sentence from your ad"],
"countries": ["BR", "PT", "MX"],
"activeStatus": "active",
"maxItems": 200,
"compareWithPreviousRun": true,
"onlyNew": true,
"snapshotName": "my-offer-clones",
"groupByOffer": false
}

What you get on each run:

  • Every ad row gets isNewAd (not seen in any earlier run of this comparison), firstSeenAt and isNewAdvertiser (its page never showed up for this search before).
  • One comparison_summary row per search and country, never charged: newAdsCount, newAdvertisersCount, newAdvertisers (page name, page id, page link, Ad Library link of the page, active ads found, new ads found), droppedAdsCount and droppedAdIds (ads of the previous run that did not show up now), and a one-line message. The New since last run table view shows only what matters.
  • With onlyNew, ads you already saw are read but not delivered and not charged, so a quiet day costs close to nothing.
  • The first run saves the baseline: everything comes as new and the summary says first run: baseline saved.

Send the dataset or the summary row to Slack, e-mail, Google Sheets or a webhook with an Apify integration and the alert arrives without you opening the Ad Library.

Notes: the state lives in a named key-value store in your own Apify account (meta-ads-<snapshotName>), one entry per search and country, and is saved only after the ads are delivered, so a failed run never erases it. Use a different snapshotName per schedule. Ids that disappear stay remembered for 60 days, so an ad that leaves the top results and comes back is not "new" again. "Dropped" means not seen in this run, which can also be because it fell beyond maxItems; keep maxItems the same every day. With the comparison off (the default), the output is exactly as before.

Output

Two kinds of rows, told apart by type, with a table view for each (Ads and Scaled offers).

Ad rows (type: "ad")

FieldWhat it is
adArchiveId, adLibraryUrlAd id and its public Ad Library link
pageId, pageName, pageUrl, pageLikeCount, pageCategoriesThe advertiser page
isActive, startDate, endDate, daysRunningStatus and dates; daysRunning counts until today for live ads
sameCreativeAdsCount, collationIdHow many ads share this creative, as the Ad Library groups them
platformsFACEBOOK, INSTAGRAM, MESSENGER, AUDIENCE_NETWORK, THREADS
displayFormatIMAGE, VIDEO, CAROUSEL, DPA (catalog), DCO (dynamic creative)...
bodyText, title, linkDescription, ctaText, ctaTypeThe ad copy. Catalog placeholders like {{product.name}} are replaced by the first card's real text
linkUrl, landingDomain, captionWhere the ad sends people
cards, cardsCountCarousel and catalog cards: title, text, link, image, video
imageUrls, videoUrls, hasVideoMedia links (Meta signs them: download within a few hours)
containsAiContent, categories, disclaimer, spend, currency, impressionsAs shown by the Ad Library; spend and impressions exist only for political and social issue ads
searchQuery, country, scrapedAtWhich search produced the row, and when

Scaled-offer rows (type: "offer")

FieldWhat it is
rank, scaleScoreOnly offers with 2+ active ads or 2+ creative copies. Position and score: 3 points per active ad, 2 per extra copy of a creative, up to 9 for age (capped at 90 days)
landingDomain, landingTypeThe landing domain; ads that send to Instagram, WhatsApp, Messenger or Facebook are grouped by advertiser and landingType says where
pageId, pageName, pageUrlThe advertiser
adsFound, activeAdsFound, adsSharingCreatives, videoAdsCounts over the ads found in this run
oldestStartDate, maxDaysRunningAge of the offer
exampleAdUrl, exampleTitle, exampleBody, exampleLinkUrlThe most duplicated, longest running ad of the offer
searchQueries, platformsWhere it showed up

Comparison summary rows (type: "comparison_summary", never charged)

Only with compareWithPreviousRun. One per search and country.

FieldWhat it is
searchQuery, country, snapshotNameWhich search and which saved comparison
isFirstRun, previousRunAtFirst run of this comparison (baseline saved), or when the previous one ran
adsSeen, advertisersSeenAds and advertiser pages seen in this run
newAdsCount, newAdvertisersCount, newAdvertisersWhat appeared since the previous run; each new advertiser with pageName, pageId, pageUrl, adLibraryPageUrl, activeAdsFound, adsFound, newAdsFound
droppedAdsCount, droppedAdIdsAds of the previous run not seen now (up to 200 ids)
searchComplete, messageFalse when the search stopped early (block, timeout, spending limit); a one-line summary

Error codes (never charged)

errorCodeMeaning
NO_RESULTSNo ad for that search, country and filters
BLOCKEDMeta stopped answering after retries with new IPs; the ads already delivered stay
INVALID_PAGEThe page is not a numeric id or an Ad Library link with view_all_page_id
INVALID_URLThe link is not a facebook.com/ads/library link
INVALID_INPUTA filter has a value the Actor does not know
NOT_REACHEDThe run timeout arrived before this search
ITEM_UNREADABLE, UNEXPECTEDOne ad or one search came in a shape the Actor cannot read; only that part is lost

Pricing

EventPricePer 1,000
Ad deliveredUS$ 0.0005US$ 0.50
Scaled-offer rowUS$ 0.001US$ 1.00

A 300 ad search costs US$ 0.15, plus about US$ 0.07 for its offer ranking (69 offers with a scale signal in our emagrecer test in Brazil). Duplicates, filtered ads and error rows are free, and there is no Apify compute bill on top.

How to use

Through the API

curl -X POST "https://api.apify.com/v2/acts/scrapewise~meta-ad-library-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchQueries":["running shoes"],"countries":["US"],"minDaysRunning":7,"maxItems":200}'

Schedules, integrations and AI agents

Schedule a daily run on a competitor's page and send new rows to Google Sheets, Slack or a webhook. Through the Apify MCP server, an AI agent can call it with plain JSON and read the offer ranking directly.

Limitations

  • What Meta shows to a logged-out visitor. The Actor reads the same public Ad Library a browser does. Reach, spend and demographics exist only for political and social issue ads and for ads delivered in the EU, as on the site.
  • The offer ranking covers the ads of this run. It counts the ads the run collected, so a larger maxItems gives a fuller picture of each offer.
  • Media links expire. Meta signs image and video links; download them within a few hours.
  • Meta changes the Ad Library often. When a field moves the Actor fails loudly with an error code instead of returning empty rows. Open an issue and it gets fixed.
  • This Actor collects only public ads and respects the site's terms. Advertiser pages are businesses and public figures; no personal data of ad viewers exists in the Ad Library.

Changelog

  • 2026-09-30, 0.1 (update): daily comparison mode: compareWithPreviousRun, onlyNew and snapshotName; isNewAd, firstSeenAt and isNewAdvertiser on each ad; free comparison_summary row per search with new advertiser pages and dropped ads. Default output unchanged; prices unchanged.
  • 2026-09-30, 0.1: first release. Keyword, page and link searches in any country, active or inactive, by media type; days running, creative copies, landing domain, cards, media links; minDaysRunning filter; scaled-offer ranking; free error rows.