Meta Ad Library Scraper - Facebook & Instagram Ads
Pricing
from $0.34 / 1,000 ads
Meta Ad Library Scraper - Facebook & Instagram Ads
Scrape Facebook and Instagram ads from the Meta Ad Library. Search by keyword, Page ID or URL. Each ad row has the ad copy, creatives, CTA, advertiser Page and platforms. Spend and impressions only exist on political or issue ads, so most rows have none. No login, no API token. $0.34 per 1,000.
Pricing
from $0.34 / 1,000 ads
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
4
Monthly active users
an hour ago
Last modified
Categories
Share
Meta Ad Library Scraper: Facebook and Instagram ads by keyword, Page ID or a URL you paste
Search Meta's public Ad Library and every matching ad comes back as a row: the ad copy, the creative URLs, the call to action, the advertiser Page, the run dates and which platforms it ran on. No Facebook login, no Meta API token, nothing to install.
Read this before you buy. Spend and impressions exist only on political and issue ads. Meta publishes those two figures for that category and no other, so a search for a commercial brand comes back with them empty. That is Meta's policy rather than anything this run can work around. If spend is what you came for, set the ad category to political and issue ads.
| Input | Keywords, advertiser Page IDs, or Ad Library URLs |
| Output | One row per ad |
| Ceiling | 20,000 ads per search. Meta stops serving pages well before its own 50,001 match count |
| Account needed | None, and no Meta API token |
| Price | $0.34 per 1,000 ads, flat on every plan |
🏷️ What Meta Ad Library Scraper does
Three ways in, and they mix freely in one run. Keywords search the Ad Library the way the site's own box does, one scrape per term. Advertiser Page IDs pull one advertiser's whole set rather than whatever a keyword happens to match, which is the better route for watching a brand. Ad Library URLs are pasted from the browser, and the country, ad type, status, platform and date filters already on them are read and applied.
Then narrow it: country, active or stopped ads, media type, exact phrase or loose words, and which Meta platforms the ad ran on.
The date filters are an overlap window, not a start-date filter. Ads that were running at any point between your two dates come back, including ones that started earlier. Set both or Meta ignores both.
includeAdDetails adds the EU transparency block: age and gender reach, reach by region, the
advertiser's page category, likes, linked Instagram account and follower count, and lifetime
political spend. One extra request per ad, so roughly double the run time, and no extra charge.
📥 What you give it
{"searchTerms": ["nike"],"country": "US","activeStatus": "active","adType": "all","maxResults": 250}
| Field | Default | What it is |
|---|---|---|
searchTerms | box starts at nike | Keywords to search, one per line. One scrape per term. |
advertiserPageIds | none | Numeric Facebook Page IDs, to pull one advertiser's full set. |
adLibraryUrls | none | facebook.com/ads/library/ links pasted from the browser. |
country | US | Two-letter code for the Ad Library edition, or ALL. |
activeStatus | active | Also inactive, or all for both. |
adType | all | Set it to political_and_issue_ads for the ads that carry spend and impressions. |
mediaType | all | Also image, video, meme or none. |
searchType | words in any order | Or keyword_exact_phrase for the phrase as typed. |
publisherPlatforms | all of them | Facebook, Instagram, Messenger, Audience Network, Threads, WhatsApp. |
startDate, endDate | none | YYYY-MM-DD. An overlap window, and both must be set. |
includeAdDetails | off | The EU transparency and advertiser block. No extra charge. |
maxResults | 100 | Ads per search term, Page ID or URL, up to 20,000. |
useApifyDatacenterProxy | off | Adds Apify's own network as a fallback route. |
proxyConfiguration | leave it alone | Optional. Only if you want the run to go out through a particular network of your own. |
📤 What you get back
A real row from a run on 20 September 2026, with the long Meta media links cut short:
{"adArchiveId": "925321173274919","adLibraryUrl": "https://www.facebook.com/ads/library/?id=925321173274919","isActive": true,"pageId": "89516513179","pageName": "Nordstrom Rack","pageUrl": "https://www.facebook.com/NordstromRack/","pageProfilePictureUrl": "https://scontent-lga3-3.xx.fbcdn.net/v/t39.35426-6/764807066_...","pageCategories": ["Clothing (Brand)"],"pageLikeCount": 2518019,"startDate": "2026-08-03","endDate": "2026-09-19","startDateTimestamp": 1785740400,"endDateTimestamp": 1789801200,"publisherPlatforms": ["FACEBOOK", "INSTAGRAM", "MESSENGER"],"adTitle": "Fast & Free Pickup","adBody": "Buy online and pick up in store for free! Get up to 70% off Nike, Vince, Madewell, adidas and more.","caption": "Nordstromrack.com","linkUrl": "https://fb.com/canvas_doc/1072291375736811","linkDescription": "Fast & Free Pickup","ctaText": "Learn more","ctaType": "LEARN_MORE","displayFormat": "VIDEO","images": [],"videos": [{ "videoHdUrl": "https://video-lga3-3.xx.fbcdn.net/o1/v/t2/f2/m366/...", "videoSdUrl": "...", "videoPreviewImageUrl": "..." }],"cards": [],"impressions": null,"spend": null,"currency": null,"reachEstimate": null,"byline": null,"disclaimerLabel": null,"categories": [],"collationCount": 2,"collationId": "1022906600523558","containsDigitalCreatedMedia": false,"containsSensitiveContent": false,"searchTerm": "nike","country": "US","scrapedAt": "2026-09-20T07:04:56.805Z"}
| Field | What it is |
|---|---|
adBody, adTitle, caption, linkDescription | The ad copy as Meta renders it. A plain image ad often has no adTitle. |
images, videos, cards | Creative URLs on Meta's own media hosts. cards holds the slides of a carousel, each with its own copy and link. |
displayFormat | VIDEO, IMAGE, DPA and so on, which is the quickest way to sort creative types. |
impressions, spend, currency, reachEstimate, byline, disclaimerLabel, categories | Meta's own published transparency figures, and only on political and issue ads. Meta publishes them as bands, so you get strings like ">1M" and "$450K - $500K", never an exact number. |
collationCount, collationId | Meta groups near-identical variants of one ad. This says how many are in the group. |
searchTerm | Which of your inputs produced this row: the term, page:<id>, or the pasted URL. |
includeAdDetails adds ageGenderBreakdown, regionReach, advertiserAbout,
advertiserEntityType, advertiserPageCategory, advertiserPageAlias, advertiserPageLikes,
advertiserInstagramUsername, advertiserInstagramFollowers, isPoliticalPage and
lifetimeSpendByDisclaimer.
🧾 Reading the output
| Row | How to spot it | Billed |
|---|---|---|
| An ad | It has an adArchiveId and no _sample key | yes |
| A notice | _sample: true, _charged: false and a _notice line | no |
Ad rows carry no _charged field. The flag is only on notice rows, to mark them as not real
results. Filter on _sample being absent.
Notices are how the run tells you something without billing you: empty input, a search that returned
nothing, a network setting it had to adjust. They all look alike, so read the _notice text
rather than assuming an empty result means empty input.
Three dataset views are set up in the Console: overview, creatives for the media arrays, and political for the transparency figures.
▶️ How to run it
- Open Meta Ad Library Scraper and click Try for free.
- Type a brand into Search terms, or paste an Ad Library link into Ad Library URLs.
- Set Country and Ad status. Switch Ad category to political and issue ads if you need spend and impressions.
- Set Max ads per search. Start around 25 to see what the rows look like.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$0.34 per 1,000 ads. Flat on every Apify plan, with no volume tiers.
One billed row per ad delivered. Notice rows are not billed, a search that finds nothing produces no
billed rows, and includeAdDetails adds nothing to the price.
💡 What people use it for
- Watching a rival brand's creative: their Page ID on a schedule, diffing on
adArchiveId. - Building a swipe file of ad copy and creatives for one product category, by keyword.
- Election and issue research, where Meta's published spend and impression bands are the point.
- Checking which platforms a campaign actually ran on, from
publisherPlatforms. - Finding advertisers active in a market by searching the product and grouping on
pageId.
🚧 What it does not do
- No spend or impressions on commercial ads. Meta does not publish them, so nothing can return them.
- No exact figures. Even on political ads Meta publishes bands, not numbers.
- No performance data. No click-through rate, no conversions, no return on spend. It is an archive, not an analytics product.
- No creative files. You get URLs on Meta's media hosts, and those expire. Fetch them soon.
- A broad keyword will not hand you 50,000 ads. Meta reports huge match counts and stops serving new pages long before them. Search by advertiser Page ID for depth.
- No targeting data outside the EU. The age, gender and region breakdown is an EU transparency requirement, so US commercial ads have none to give.
- A single-ad
?id=link is not a search. Pasted links need a search term or aview_all_page_idon them. Links without one, and Page IDs that are not numeric, are dropped, and if nothing else was supplied the run comes back with just the sample row. - If the
includeAdDetailsrequest fails, the row still arrives without those fields, and is still billed as an ad. Check for the field rather than assuming it is there. - Very large runs can hit the platform time limit. Split a big job across several runs.
🧭 Which ads and social scraper do you need?
| If you want | Use |
|---|---|
| Facebook and Instagram ads from Meta's Ad Library | This one |
| Ads running on Google Search, YouTube and Display | Google Ads Transparency Scraper |
| Instagram profiles, follower counts and bio links | Instagram Profile Scraper |
| Instagram posts and reels under a hashtag | Instagram Hashtag Scraper |
| Public LinkedIn posts by keyword | LinkedIn Post Search Scraper |
❓ Questions people ask
Do I need a Meta API token? No. This reads the public archive the way a browser does.
How do I find an advertiser's Page ID? Open their ads in the Ad Library and read the
view_all_page_id= value out of the address bar. Or paste that whole URL in and skip the step.
Why is spend empty? Because the search covered all ads. Switch Ad category to political
and issue ads and it fills in.
Does it cover Instagram ads? Yes, one archive covers every Meta surface. Set
publisherPlatforms to Instagram to keep only those.
Is scraping the Ad Library allowed? Meta publishes it as a transparency archive and it holds no personal data beyond the advertiser's own public Page. How you use what you collect is on you. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the search term, Page ID or URL you used and the run
ID. The _notice line on the notice row usually names the problem on its own.