Meta Ad Library Scraper
Scrape Facebook and Instagram Ad Library ads by keyword, Page ID or URL. Get ad copy, creatives, dates and platforms. No login. $0.34 per 1,000 ads.
Ad Intelligence & Competitor Research
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchTerms,advertiserPageIds,adLibraryUrls(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00034 per ad = $0.34 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Ad | One ad delivered to your dataset, with ad copy, creatives, advertiser page, run dates, platforms and — for political & issue ads — impression, spend and reach ranges. Sample rows, blocked searches and empty searches are never charged. | $0.00034 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-08, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
searchTerms | Keywords to search the Ad Library for, e.g. "nike" or "solar panels". One scrape per term. | array |
advertiserPageIds | Numeric Facebook Page IDs to pull every ad for, e.g. "15087023444" (Nike). Use this instead of a keyword to get one advertiser's full ad set. | array |
adLibraryUrls | Paste facebook.com/ads/library/ URLs straight from your browser. Filters in the URL (country, ad type, active status) are read automatically. | array |
country | Two-letter country code for the Ad Library edition to search, or ALL for every country. | string |
maxResults | How many ads to return for each search term, page ID or URL. Meta serves 30 ads up front and 10 per page after that, so 1,000 ads takes about 100 requests and 2-3 minutes. | integer |
activeStatus | Return only ads currently running, only ads that have stopped, or both. | string |
adType | All ads, or only political & issue ads. Impressions, spend, currency, reach and byline are published by Meta for political & issue ads ONLY, pick "Political and issue ads" if you need them. On a general search they are empty on ~98% of rows. | string |
mediaType | Filter ads by the kind of creative they use. | string |
searchType | Match the words in any order, or as an exact phrase. | string |
publisherPlatforms | Only return ads shown on these Meta platforms. Leave empty for all of them. | array |
startDate | YYYY-MM-DD. Meta treats this as an OVERLAP window: you get ads that were running at some point between the two dates, not only ads that started in it. Must be set together with the end date or both are ignored. Measured: a Nike search went from 50,001 matches to 179 with a 2025-01-01 to 2025-03-31 window. | string |
endDate | YYYY-MM-DD. The other end of the overlap window. Must be set together with the start date. | string |
includeAdDetails | Adds age/gender reach breakdown, reach by region, advertiser page category, page likes, linked Instagram username and follower count, and lifetime political spend. One extra request per ad, so a 1,000-ad run roughly doubles in length. No extra charge. | boolean |
useApifyDatacenterProxy | Adds Apify Proxy to the fallback chain if the default is refused. Off by default, because Meta is stricter with shared networks. | boolean |
What you get
A structured dataset — each result includes fields like:
adArchiveIdpageNamepageIdisActivestartDateendDateadTitleadBodyctaTextlinkUrldisplayFormatpublisherPlatformsimpressionsspendcurrencycategoriesadLibraryUrlcaptionlinkDescriptionctaTypeimagesvideoscardsbylinedisclaimerLabelreachEstimateExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Ad Intelligence & Competitor Research
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
TikTok Trending Hashtags
Get TikTok Creative Center hashtag rankings by country: rank, posts, views, popularity curve and top creators. Three at a time. No login needed.
SaaS Competitor Monitor: Pricing, Changelog & Positioning
Track a competitor's SaaS pricing, changelog and positioning on a schedule. You get only what changed, sent to Slack. $0.01 per page checked.
G2 Reviews Scraper
Scrape G2 software reviews at $1.70 per 1,000: rating, title, full text, reviewer, date and URL. Works on any product. No G2 account or API key.
Google Trends Scraper
Get Google Trends data with no API key. Interest over time, interest by region or city, top and rising queries. $0.06 per 1,000 rows.
Yandex Search Engine Scraper (SERP API)
Scrape Yandex search results by keyword or URL. Get rank, title, URL, domain, snippet, ads and SERP features. Pick the region. $3.40 per 1,000.
Google Ads Transparency Scraper
Scrape Google Ads Transparency Center by domain, advertiser name or ID. Get ad creatives, formats, first and last shown dates. $0.60 per 1,000 ads.
Where this tool sits
- Categories
- Ad Intelligence & Competitor Research
- Platforms
- Facebook & Meta Ads
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
1. Open Meta Ad Library Scraper and click Try for free. 2. Type a brand into Search terms, or paste an Ad Library link into Ad Library URLs. 3. Set Country and Ad status. Switch Ad category to political and issue ads if you need spend and impressions. 4. Set Max ads per search. Start around 25 to see what the rows look like. 5. 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 a
view_all_page_id on 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.