Meta Ad Library Scraper - Facebook & Instagram Ads
Pricing
from $0.34 / 1,000 ads
Meta Ad Library Scraper - Facebook & Instagram Ads
Scrape the Meta (Facebook and Instagram) Ad Library with no login and no API key. Ad copy, creatives, CTA, advertiser page, run dates, platforms, and the published spend and impression ranges on political ads. $0.34 per 1,000 ads plus $0.001 per run start, flat on every plan.
Pricing
from $0.34 / 1,000 ads
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
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. On the free plan it undercuts every widely-used Ad Library scraper on the Store: the next cheapest with a real user base is $0.40 per 1,000 with a $0.005 start fee, and most sit between $0.49 and $5.80. Several of them are tier-priced and do go lower than $0.34 once you are paying for a Bronze plan or above — the full table, with the tiers spelled out, 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
nikewill 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.