Meta Ad Library Scraper
Scrape Facebook and Instagram Ad Library ads by keyword, advertiser Page ID or URL. No login, no Meta API token. Ad copy, creatives, dates, platforms, spend.
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 |
| Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.001 |
Pay-per-event pricing: you are billed per result, not per subscription — a run that returns nothing costs nothing beyond the start fee. 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's datacenter proxy to the fallback chain if the built-in addresses are refused. Off by default because Meta rate-limits shared datacenter ranges harder. | 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 official TikTok Creative Center hashtag rankings by country and period: rank, posts, views, popularity curves, industries and top creators.
SaaS Competitor Monitor: Pricing, Changelog & Positioning
Track competitor SaaS pricing, changelogs, and positioning changes on a schedule. Get structured deltas and Slack alerts for only what changed.
G2 Reviews Scraper
Scrape G2 software reviews at $1.70 per 1,000: rating, title, full text, reviewer, date and URL. Any product slug. No G2 account or API key needed.
Google Trends Scraper
Google Trends data with no API key: keyword interest over time, interest by region or city, top and rising related queries, and Trending Now by country.
Yandex Search Engine Scraper (SERP API)
Scrape Yandex search results by keyword or URL. Rank, title, URL, domain, snippet, ads and SERP features, with region targeting. No API key.
Google Ads Transparency Scraper
Scrape Google Ads Transparency Center by domain, advertiser name or advertiser ID. Ad creatives, formats, first/last shown dates, countries and previews.
Where this tool sits
- Categories
- Ad Intelligence & Competitor Research
- Platforms
- Facebook & Meta Ads
Meta Ad Library Scraper — Facebook & Instagram ads API
Pulls ads out of Meta's public Ad Library (facebook.com/ads/library) as clean JSON. Search by keyword, by advertiser Page ID, or by pasting an Ad Library URL straight from your browser. You get the ad copy, the creative URLs, the advertiser page, the run dates, the platforms it ran on — and, for political & issue ads, Meta's published impression, spend and reach ranges.
No Facebook login, no Meta API token, no cookies to supply. Point it at a search and it runs.
$0.34 per 1,000 ads, plus a $0.001 start fee. Flat — that is the price on every Apify plan, including the free one, with no volume tiers to unlock and no plan gates. Most Ad Library scrapers charge several times this on a new account, and the better rates they advertise are volume tiers you have to be on a paid subscription to reach — the full breakdown of what you pay here is under Pricing below.
---
What you get, with real numbers
Every figure below comes from actual runs of this Actor, not from an estimate.
| Input | Ads returned | Time |
|---|---|---|
nike, US, active only, max 5 | 5 | 5.8 s |
Advertiser Page ID 15087023444 (Nike), max 80 | 80 | 12.4 s |
election, US, political & issue ads, max 120 | 120 | 24.0 s |
nike, US, active only, max 250 | 250 | 41.3 s |
coffee, US, active + inactive, max 1000 | 1000 | 162.9 s |
The 1,000-ad run returned 1,000 distinct adArchiveId values and zero duplicates.
Field coverage measured over that 1,000-ad commercial search:
| Field | Filled |
|---|---|
adArchiveId, adLibraryUrl, pageId, pageName, isActive, startDate, endDate | 100% |
pageUrl, pageProfilePictureUrl | 100% |
pageCategories, pageLikeCount, adBody, displayFormat | 98% |
ctaText, ctaType, linkUrl, caption | 92% |
adTitle | 79% |
linkDescription | 51% |
images | 38% |
videos | 35% |
cards (carousel / DPA slides) | 26% |
The transparency fields, honestly
impressions, spend, currency, reachEstimate, byline and disclaimerLabel are not published by Meta for ordinary commercial ads. Meta publishes them for political and issue ads only. That is a Meta policy, not a limitation of this scraper — nobody can give you Nike's ad spend, because Meta does not publish it.
So the numbers depend entirely on what you search:
| Search | impressions | spend | currency | reachEstimate | byline |
|---|---|---|---|---|---|
adType: "political_and_issue_ads" (120 ads, US) | 100% | 100% | 100% | 96% | 99% |
adType: "all" (1,000 ads, US, coffee) | 2% | 2% | 2% | 2% | 2% |
The 2% on a general search is real data — it is the handful of political ads that matched the keyword. If you want spend and impressions, set Ad category → Political and issue ads.
Real values look like impressions: ">1M", spend: "$450K - $500K", currency: "USD", byline: "Facebook, Inc.", disclaimerLabel: "PAID_FOR_BY". Meta publishes ranges, not exact figures, so that is what you get.
Example row (trimmed)
A real row, copied out of a run (long CDN URLs shortened):
{
"adArchiveId": "1249043200627555",
"adLibraryUrl": "https://www.facebook.com/ads/library/?id=1249043200627555",
"isActive": true,
"pageId": "15087023444",
"pageName": "Nike",
"pageUrl": "https://www.facebook.com/nike/",
"pageProfilePictureUrl": "https://scontent-iad3-1.xx.fbcdn.net/v/t39.35426-6/653833698_…jpg",
"pageCategories": ["Sportswear"],
"pageLikeCount": 39574229,
"startDate": "2026-03-17",
"endDate": "2026-08-08",
"publisherPlatforms": ["FACEBOOK", "INSTAGRAM", "AUDIENCE_NETWORK", "MESSENGER"],
"adTitle": "Nike: Shoes, Apparel & Stories",
"adBody": "Celebra tu cumpleaños con Nike y obtén acceso a productos exclusivos, MSI, envío y devoluciones gratis el resto del año.",
"caption": "play.google.com",
"linkUrl": "http://play.google.com/store/apps/details?id=com.nike.omega",
"ctaText": "Shop now",
"ctaType": "SHOP_NOW",
"displayFormat": "DPA",
"images": [],
"videos": [],
"cards": [
{
"title": "Nike",
"linkUrl": "https://www.nike.com/mx/t/espinillera-de-fútbol-charge-MFtBhV/DX4608-100",
"linkDescription": "…the ad's own link description…",
"ctaText": "Shop Now",
"imageUrl": "https://scontent-iad3-1.xx.fbcdn.net/v/t39.35426-6/653801683_…jpg"
}
],
"impressions": null,
"spend": null,
"categories": [],
"searchTerm": "page:15087023444",
"country": "US",
"scrapedAt": "2026-08-08T16:09:32.563Z"
}
Input
Give it at least one of these three:
searchTerms—["nike", "solar panels"]. One scrape per term.advertiserPageIds—["15087023444"]. Every ad from one advertiser's Page.adLibraryUrls— pastehttps://www.facebook.com/ads/library/?...from the browser. The
country, ad type, status, platform and date filters in the URL are read and applied.
Then narrow it down:
| Option | What it does |
|---|---|
country | Two-letter code, or ALL. Default US. |
maxResults | Ads per search term. Default 100. |
activeStatus | active, inactive, or all. |
adType | all, or political_and_issue_ads for the spend/impressions data. |
mediaType | all, image, video, meme, none. |
searchType | Words in any order, or exact phrase. |
publisherPlatforms | Facebook, Instagram, Messenger, Audience Network, Threads, WhatsApp. |
startDate / endDate | An overlap window — see the FAQ. |
includeAdDetails | Adds EU age/gender/region reach and advertiser page stats. |
Leave the input completely empty and you get one clearly labelled _sample: true row, free, so you can see the shape before you spend anything.
What includeAdDetails adds
One extra request per ad, no extra charge, roughly double the run time. Measured on 12 political ads, all at 100% coverage except advertiserAbout (67%):
ageGenderBreakdown, regionReach, advertiserEntityType, advertiserPageCategory, advertiserPageAlias, advertiserPageLikes, advertiserInstagramUsername, advertiserInstagramFollowers, isPoliticalPage, lifetimeSpendByDisclaimer, advertiserAbout.
Example: advertiserInstagramFollowers: 5721292, lifetimeSpendByDisclaimer: [{"disclaimer": "Facebook Inc.", "spend": 497126}].
What this does not do
Read this part before you buy.
- It cannot give you spend or impressions for commercial ads. Meta does not publish them. Any
tool that claims otherwise is guessing.
- No exact numbers, ever. Meta publishes buckets:
">1M","$450K - $500K". There is no
underlying precise figure to extract.
- No ad performance data — no CTR, no conversions, no ROAS. The Ad Library is a transparency
archive, not an analytics product.
- No creative downloads. You get image and video URLs from Meta's CDN. Those URLs expire after a
while, so fetch them soon after the run.
- Meta caps a keyword search at 50,001 reported matches and stops handing out pages well before
that. Searching a broad term such as nike will not hand you 50,000 ads. If you need depth, search by advertiser Page ID instead — that returns the advertiser's full set.
- No targeting data for non-EU ads. EU age/gender/region reach comes through
includeAdDetails; US commercial ads have none to give.
- No login-only views. Everything here is what a logged-out visitor can see.
violationTypesis not returned. It was empty on every ad tested, and an always-blank column
is worse than no column.
How it works
The Ad Library page server-renders its first 30 results inside the HTML, along with the CSRF token and the exact GraphQL variables the page was built with. This Actor reads that blob, then continues through Meta's own AdLibrarySearchPaginationQuery endpoint — the same one the site calls when you scroll — 10 ads per page, replaying the page's own variables with a fresh cursor each time.
Requests go out over rented static-ISP addresses with a Chrome TLS fingerprint. Apify's residential proxy is never used; PROXY_RESIDENTIAL_TRANSFER_GBYTES is 0 on every run. If one exit address gets throttled mid-run, the Actor moves to the next one and keeps going without re-billing ads it already delivered.
Pricing
| Per ad delivered | $0.00034 ($0.34 per 1,000) |
| Actor start | $0.001 per run |
You are charged for ads that actually reach your dataset. The free sample row, a search that returns nothing, and a search that gets blocked are all uncharged — they arrive as labelled diagnostic rows so you can see what happened.
One number, every plan. $0.34 per 1,000 ads is what a brand-new free account pays and what a top-tier enterprise account pays — there is no volume ladder to climb here, so the figure you see before you press start is the figure on the invoice. That is the cheapest Meta Ad Library scraper on the market for a new account.
Being straight about the one caveat: some Ad Library Actors are tier-priced, and a handful of them dip below $0.34 *if* you are already paying for a high-volume Apify subscription. Several of those also attach a per-run start fee an order of magnitude larger than the $0.001 here, which puts them back above this on small and medium runs. If you are on a large subscription and running millions of ads a month, price every option at your own tier before deciding; for everyone else, this is the lowest number available.
| Ads | Cost here |
|---|---|
| 100 | $0.035 |
| 1,000 | $0.341 |
| 10,000 | $3.401 |
| 100,000 | $34.001 |
FAQ
What is the Meta Ad Library? A public archive Meta runs at facebook.com/ads/library. Every ad currently running on Facebook, Instagram, Messenger, Threads and Audience Network appears in it, and political & issue ads stay there for seven years with their spend and impression ranges attached.
Can I scrape the Facebook Ad Library without an API key? Yes. The Ad Library is public and this Actor reads it the same way a browser does. You do not need a Meta developer account, an access token, or a Facebook login. Meta's official Ad Library API covers political ads only and requires ID verification; this covers all ads and requires nothing.
How do I get a competitor's Facebook ads? Two ways. Put their brand name in searchTerms, or — better — find their numeric Page ID and put it in advertiserPageIds. The Page ID route returns that advertiser's full active ad set instead of whatever a keyword happens to match. Nike's is 15087023444.
How do I find an advertiser's Page ID? Open their ads in the Ad Library UI and look at the view_all_page_id= value in the address bar. Or just paste that whole URL into adLibraryUrls and skip the step.
Why is spend empty on my results? Because you searched all ads. Meta only publishes spend for political & issue ads. Set adType to political_and_issue_ads and the field fills in on essentially every row.
Do the date filters mean "started in this range"? No. Meta treats them as an overlap window: you get ads that were running at some point between the two dates, including ones that started earlier. Measured — a nike search dropped from 50,001 matches to 179 with a 2025-01-01 to 2025-03-31 window, and every returned ad had been live inside it. Both dates must be set or Meta ignores both.
How many ads can I get from one search term? Meta reports huge match counts (50,001 is its ceiling value) but stops serving new pages long before that. Expect several hundred to low thousands per keyword. For complete coverage of one advertiser, use their Page ID.
Can it scrape Instagram ads too? Yes — the Ad Library is one archive for all Meta surfaces. publisherPlatforms: ["INSTAGRAM"] narrows it to ads that ran on Instagram. Every row also lists the platforms it ran on.
Does it work outside the US? Yes. Set country to any two-letter code, or ALL. EU countries carry extra transparency data that includeAdDetails will pull in.
What does a 1,000-ad run cost? $0.341 — the $0.001 start fee plus 1,000 × $0.00034. It took 163 seconds in testing.
Is scraping the Ad Library allowed? The Ad Library is published by Meta as a public transparency tool and contains no personal data beyond the advertiser's own public Page. You are responsible for how you use what you collect, including under the GDPR and Meta's terms.