Facebook Ads Library Scraper – Meta Ad Library Ads, No Login
Pricing
from $0.45 / 1,000 results
Facebook Ads Library Scraper – Meta Ad Library Ads, No Login
Facebook Ads Library Scraper for the Meta Ad Library: competitor ads by page, keyword or filtered library URL. Ad text, headline, images, videos, CTA, destination URL, platforms, status, dates and spend/reach ranges when Meta discloses them. No login, no API key – pay per ad delivered.
Pricing
from $0.45 / 1,000 results
Rating
0.0
(0)
Developer
Ani Björkström
Maintained by CommunityActor stats
5
Bookmarked
252
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
The Facebook Ads Library Scraper (also known as a Meta Ad Library Scraper) pulls the ads any advertiser is running from Meta's public Ad Library – Facebook, Instagram, Messenger, WhatsApp, Threads and Audience Network – into flat rows: ad text, headline, images and videos, call to action, destination URL, platforms, status, start/end dates and, where Meta discloses them, spend and reach ranges.
- No login, no API key, no app review. Reads the public Ad Library like a browser does, so you skip Meta's Ad Library API access process entirely.
- Search by page, keyword or filtered URL. Paste a Facebook page URL (
facebook.com/nike), a keyword, or the exact Ad Library URL with your country/status filters already applied. - Pay per ad delivered. Only ads written to the dataset are billed – see the pricing box on this page for the current rate.
What you get
| Field | Description |
|---|---|
adId, adUrl | Ad Library ID and permalink |
pageName, pageId | Advertiser page |
adText, headline | Primary text (up to 2,000 characters) and headline |
status | active or inactive |
platforms | Where the ad runs: facebook, instagram, messenger, audience_network… |
startDate, endDate | Run dates when Meta shows them |
imageUrls, videoUrls, mediaType | Creative assets (up to 10 images and 5 videos per ad) with includeCreativeDetails |
ctaText, destinationUrl | Call-to-action label and the landing page the ad links to |
spendLower, spendUpper, reachLower, reachUpper, impressionsLower, impressionsUpper | Disclosed ranges (political/issue ads and EU transparency views) with includeSpendData |
type, scrapedAt | Always ad, plus an ISO 8601 UTC timestamp |
Input
Runs with no input at all (a default Ad Library page), so a scheduled run is never empty. Realistic inputs:
All active ads of a competitor page
{"urls": [{ "url": "https://www.facebook.com/nike" }],"adStatus": "active","country": "US","maxAds": 200}
Keyword research across advertisers
{"urls": [],"searchQueries": ["protein powder", "creatine gummies"],"country": "GB","maxAds": 300}
A filtered Ad Library URL copied from your browser
{"urls": [{ "url": "https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=DE&q=solar&search_type=keyword_unordered" }],"maxAds": 100,"includeCreativeDetails": true,"includeSpendData": true}
| Option | Default | What it does |
|---|---|---|
urls | one demo Ad Library URL | Ad Library URLs (any filters), Facebook page URLs, or bare page names |
searchQueries | [] | Keywords searched across all advertisers (search_type=keyword_unordered) |
maxAds | 5 | Total ads to extract in the run (up to 50,000) |
country | ALL | ISO country code for page/keyword searches (US, GB, DE…) or ALL |
adStatus | all | all, active or inactive |
adType | all | all or political_and_issue_ads |
includeCreativeDetails | true | Add imageUrls, videoUrls, mediaType |
includeSpendData | true | Add spend / reach / impression ranges when disclosed |
maxRetries | 3 | Retries per URL, each on a fresh proxy IP |
proxyConfiguration | Apify datacenter | The Ad Library is public; switch to residential only if you see login walls |
Output example
{"type": "ad","adId": "2415322339003327","adUrl": "https://www.facebook.com/ads/library/?id=2415322339003327","pageName": "Nike","pageId": "15087023444","adText": "Run your way. New Pegasus 41.","headline": "Nike Pegasus 41","status": "active","platforms": ["facebook", "instagram"],"startDate": "2026-09-01","endDate": null,"imageUrls": ["https://scontent.xx.fbcdn.net/..."],"videoUrls": [],"mediaType": "image","ctaText": "Shop Now","destinationUrl": "https://www.nike.com/","scrapedAt": "2026-09-16T18:34:53Z"}
Fields Meta does not show for a given ad (for example dates on some creatives, or spend outside political/EU views) come back as null or are omitted rather than guessed.
Use cases
- Competitor ads spy – performance marketers and agencies pull every active ad of a competitor page weekly and track new creatives, hooks and offers.
- Ad creative research and swipe files – creative strategists collect
adText,headline,ctaTextand creative URLs by keyword to build a library of what runs long enough to be working. - Ad copy for AI – growth teams feed thousands of ad texts into GPT or Claude to cluster angles, generate variations or score their own drafts against the market.
- Meta ads transparency and research – journalists, academics and compliance teams monitor political and issue ads with disclosed spend and reach ranges.
- Lead generation for agencies – find businesses in a niche or country that are actively advertising and pitch them creative or media-buying services.
- Brand and affiliate monitoring – detect pages running ads with your brand name or product in the copy.
- E-commerce intelligence – see which products, prices and landing pages a retailer is pushing right now.
Pricing
Pay per ad delivered plus a small fixed fee per run – the current rates are shown in the pricing box on this page. Ads are billed only when written to the dataset; a URL that fails or returns nothing adds no per-ad charge. Creative details and spend data are included in the per-ad price.
Integrations
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("nourishing_courier/meta-ads-scraper-pro").call(run_input={"urls": [{"url": "https://www.facebook.com/nike"}],"adStatus": "active","country": "US","maxAds": 100,})for ad in client.dataset(run["defaultDatasetId"]).iterate_items():print(ad["pageName"], ad["headline"], ad["destinationUrl"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('nourishing_courier/meta-ads-scraper-pro').call({searchQueries: ['protein powder'],country: 'GB',maxAds: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((ad) => ad.adText));
curl
curl -X POST "https://api.apify.com/v2/acts/nourishing_courier~meta-ads-scraper-pro/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"urls":[{"url":"https://www.facebook.com/nike"}],"adStatus":"active","country":"US","maxAds":50}'
n8n, Make, Zapier – use the Apify node/module, select this actor, paste an input and route adText, headline, imageUrls and destinationUrl into Airtable, Google Sheets, Notion or Slack. MCP – through the Apify MCP server an agent can call it as a tool ("what is Nike advertising in the US right now?"). Results are also available as JSON, CSV, Excel, XML and RSS.
Limits and fair use
The actor reads the public Ad Library with a headless browser: one listing page per URL or keyword, then each ad's detail. Meta only discloses spend, reach and impression ranges for political/issue ads and in EU transparency views, so those fields are empty for ordinary commercial ads. Pages with very large ad volumes are capped by maxAds; run several narrower searches (by country or status) for full coverage. The Ad Library is public and needs no login, but Meta rate-limits aggressive traffic – the actor retries each URL on a fresh IP. Ad creatives remain the property of their advertisers; use the data for research and analysis within Meta's terms and applicable law.
How it compares with the official Ad Library API
Meta's Ad Library API requires a verified developer account, identity confirmation and, outside the EU, only returns political and issue ads. This scraper reads the same public Ad Library pages you can open in a browser, so it covers all commercial ads of any page or keyword in any country, with creatives and landing pages included, and it starts working the moment you press Run. The trade-off is that it only sees what Meta renders publicly: no audience targeting data and no spend figures for ordinary commercial ads.
FAQ
Can I scrape the Facebook Ads Library without logging in?
Yes. The Ad Library is public. This scraper never logs in and needs no Meta developer account or Ad Library API token.
How do I get all ads of a specific advertiser?
Paste the Facebook page URL (https://www.facebook.com/nike) or just the page name into urls, set country and adStatus, and raise maxAds.
Can I search Meta ads by keyword?
Yes. Put terms in searchQueries; each becomes an Ad Library keyword search in the selected country.
Does it return Instagram ads too?
Yes. The Ad Library covers every Meta placement; each row's platforms lists where the ad runs (Facebook, Instagram, Messenger, Audience Network…).
Does it include ad spend and reach?
When Meta discloses them – political and issue ads, and EU transparency views – spendLower/Upper, reachLower/Upper and impressionsLower/Upper are filled. Ordinary commercial ads outside the EU show no spend, and the actor does not estimate it.
Can I download the ad images and videos?
imageUrls and videoUrls contain direct CDN links to the creatives; download them in your own pipeline (they expire after a while, so fetch soon after the run).
How many ads can I scrape per run?
Up to 50,000 (maxAds). For large advertisers, split by country or status to stay inside Meta's listing limits.
Does it work with n8n or Make?
Yes. Both have Apify integrations; pass the JSON input and consume the dataset rows.
Why did a run return fewer ads than maxAds?
The advertiser or keyword simply has fewer ads matching the filters in that country, or Meta's listing stopped loading; try adStatus: "all" or a different country.