Meta Ad Library Scraper — Facebook & Instagram Ads
Under maintenancePricing
from $1.50 / 1,000 ads
Meta Ad Library Scraper — Facebook & Instagram Ads
Under maintenanceFacebook and Instagram ads from the public Meta Ad Library, no login. Search terms, advertisers or Ad Library links; any country incl. GCC. Ad text, CTA, landing URL, images, videos, dates, platforms, political spend. Only-new alerts.
Pricing
from $1.50 / 1,000 ads
Rating
0.0
(0)
Developer
Dottti
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Get ads from the public Meta Ad Library (facebook.com/ads/library) as clean, flat rows. Search by keyword, by advertiser, or paste Ad Library links. Works for any country, including Saudi Arabia, UAE, Qatar, Kuwait, Bahrain, Oman, Egypt and Jordan. No Facebook login, no cookies, no API token.
Who it is for
- Marketers and agencies who track what competitors run on Facebook, Instagram, Messenger and Audience Network.
- E-commerce teams who look for winning creatives, offers and landing pages.
- Researchers and journalists who follow political and issue ads, with spend and impressions.
- Anyone who wants an alert when an advertiser starts a new ad.
What you get for each ad
| Field | What it is |
|---|---|
adArchiveId, adUrl | Ad Library ID and a link to the ad |
pageId, pageName, pageUrl, pageLikeCount, pageCategories | The advertiser |
isActive, startDate, endDate | Running now or not, and the run dates |
platforms | facebook, instagram, messenger, audience_network, threads, whatsapp |
displayFormat | IMAGE, VIDEO, CAROUSEL, DCO (dynamic creative), DPA (catalog), MULTI_IMAGES |
body, title, linkDescription, caption | Ad text and headline |
ctaText, ctaType, linkUrl | Call to action and landing page |
imageUrls, videoUrls, videoPreviewImageUrls | Media links (HD video when Meta has it) |
cards | Each card of a carousel, catalog or dynamic ad: title, text, link, CTA, image, video |
collationCount | How many versions of this ad Meta groups together |
spend, currency, impressions, reachEstimate, paidForBy | Shown by Meta for political and issue ads (and some regulated ads) |
sourceInput, searchCountry | Which input and country found the ad |
Catalog and dynamic ads use placeholders such as {{product.name}} in their main text. The actor fills body and title from the first real card instead, so you read real text. Landing links keep the advertiser's own tracking tags.
Input
You can mix all three ways of choosing ads in one run.
- Search terms: keywords such as
noon,protein barorعروض. Turn on Exact phrase for phrase matching. - Advertisers: a page ID (
15087023444), a page link, or a page name (Vodafone Egypt). Names are looked up with Meta's own Ad Library search for that country. The run summary shows the page that was picked and other close matches. A page ID is the most precise. - Ad Library links: set filters on facebook.com/ads/library, copy the link, paste it here. A single-ad link (
?id=...) returns that ad.
Filters: countries (each term and advertiser runs once per country; ALL for every country), ad type (all, political and issue, housing, employment, financial), active status, platforms, media type, date range, ad languages, sort (relevance or most impressions), and max ads per input.
Example: two keywords and two advertisers in Saudi Arabia and Egypt.
{"searchTerms": ["noon", "protein bar"],"advertisers": ["Talabat", "15087023444"],"countries": ["SA", "EG"],"activeStatus": "active","platforms": ["instagram"],"maxAds": 100}
Output example (real run, Saudi Arabia, search "noon")
{"type": "ad","adArchiveId": "1416889517216606","adUrl": "https://www.facebook.com/ads/library/?id=1416889517216606","pageId": "258490630951116","pageName": "Lipton Ice Tea","pageUrl": "https://facebook.com/liptoniceteaGCC","pageLikeCount": 5756873,"isActive": true,"startDate": "2026-10-13T07:00:00.000Z","endDate": "2026-10-26T07:00:00.000Z","platforms": ["facebook", "instagram"],"displayFormat": "VIDEO","body": "طريقة سهلة بس بتفيدك 😌🥤\nNo scissors? No problem \n#liptonicetea #ليبتون_آيس_تي #Hack #أسهل_طريقة","caption": "minutes.noon.com","ctaText": "Shop now","ctaType": "SHOP_NOW","linkUrl": "https://minutes.noon.com/saudi-en/search/?f%5Btag%5D=ksa_admon_lipton_26","videoUrls": ["https://video.famm3-3.fna.fbcdn.net/o1/v/t2/f2/m367/AQOlOEk9...mp4?..."],"videoPreviewImageUrls": ["https://scontent.famm3-1.fna.fbcdn.net/v/t39.35426-6/846670700_...jpg?..."],"collationCount": 1,"sourceType": "search","sourceInput": "noon","searchCountry": "SA"}
Political ad (real run, United Kingdom, ad type political and issue ads), selected fields:
{"adArchiveId": "2182679715640357","pageName": "Reform UK","isActive": false,"startDate": "2026-07-23T07:00:00.000Z","endDate": "2026-09-12T07:00:00.000Z","paidForBy": "Reform UK","spend": "£50K - £60K","currency": "GBP","impressions": ">1M","reachEstimate": ">1M","categories": ["POLITICAL"]}
Status rows and run summary
Every input ends with a clear result. Inputs that return nothing get a free status row (type: "status") that says why: no_results, no_new_ads, not_found (advertiser name not found), invalid_input, blocked or api_error. Status rows are never charged.
The RUN_SUMMARY record in the key-value store lists every input with its status, the Ad Library link that reproduces it, the page picked for each advertiser name, and the number of requests.
An ad found by two inputs for the same country is delivered and charged once.
Only new ads (alerts)
Turn on Only new ads and schedule the actor. The first run delivers everything and saves a baseline. Later runs deliver only ads not seen before for each advertiser, search term or link, and the run summary counts new ads per advertiser. Use a different Alert state name for each watchlist. You pay only for new ads.
How to schedule
In Apify Console, open the actor, save your input as a task, then add a schedule (for example every morning at 08:00). Connect the task to email, Slack, Google Sheets or a webhook through Apify integrations.
Pricing
$2.00 per 1,000 ads. Platform usage is included in the price. Status rows are free. A run stops charging when it reaches your maximum cost per run.
Limits
- Data is what Meta's public Ad Library shows to a logged-out visitor. Spend, impressions and reach are shown by Meta for political and issue ads; for most commercial ads Meta shows none.
- Meta returns about 10 ads per request. In our tests one run fetched about 1,000 ads in 90 seconds.
- European audience details (age, gender and reach per country for EU ads) and page "About" details are not included.
- Meta can rate-limit busy addresses. The actor then starts a fresh session and, if needed, moves to Apify datacenter and then residential proxy. If Meta still refuses, the input gets a
blockedstatus row and nothing is charged for it. - Media links are Meta's own CDN links. They expire after some days, so download files you want to keep.