Facebook Ads Library Scraper
Pricing
from $3.99 / 1,000 results
Facebook Ads Library Scraper
Facebook Ads Library Scraper extracts ads, advertisers, ad creatives, copy, active status, start dates, platforms, and other public data from the Facebook Ads Library. Automate competitor ad research, campaign monitoring, creative analysis, and market intelligence.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
ScraperForge
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
9 days ago
Last modified
Categories
Share
Facebook Ads Library Scraper — Extract Meta & Instagram Ads, Creatives, Spend and Reach
Turn the Meta Ad Library into structured competitor intelligence. Give the Actor a Facebook Page URL or an Ad Library search link and it returns every matching ad with its full creative — headline, body copy, call-to-action, landing-page URL, images, videos and carousel cards — plus advertiser details, run dates, placements, and the spend, impressions and reach figures Meta publishes for regulated ads.
No Facebook login, no Meta developer app, no access token.
What is Facebook Ads Library Scraper?
The Meta Ad Library is a public transparency database showing every ad currently running across Facebook, Instagram, Messenger and Audience Network. It is genuinely useful and genuinely painful to use by hand: infinite scroll, no export, no bulk view, and creative buried behind clicks.
This Apify Actor reads that library programmatically. Point it at an advertiser's Page or at a search you built in the Ad Library UI, and it paginates the results, normalises each ad into a flat row with a nested creative object, and streams everything into a dataset you can export or query through the API.
It works entirely unauthenticated, because the Ad Library is public by design.
What data can you extract?
| Group | Fields |
|---|---|
| 🧾 Ad identity | adArchiveID, adArchiveId, adId, inputUrl, collationCount, collationId |
| ✍️ Creative copy | snapshot.title, snapshot.body.text, snapshot.caption, snapshot.linkDescription, snapshot.ctaText, snapshot.ctaType, snapshot.displayFormat |
| 🔗 Destination | snapshot.linkUrl, snapshot.extraLinks |
| 🖼️ Media | snapshot.originalImageUrl, snapshot.resizedImageUrl, snapshot.watermarkedResizedImageUrl, snapshot.imageCrops, snapshot.images, snapshot.extraImages |
| 🎬 Video | snapshot.videoSdUrl, snapshot.videoHdUrl, snapshot.watermarkedVideoSdUrl, snapshot.watermarkedVideoHdUrl, snapshot.videoPreviewImageUrl, snapshot.videos, snapshot.extraVideos |
| 🎠 Carousel | snapshot.cards[] — each with its own title, body, CTA and link |
| 🏢 Advertiser | pageName, pageID, snapshot.pageProfileUri, snapshot.pageProfilePictureUrl, snapshot.pageCategories, snapshot.pageLikeCount, pageIsDeleted |
| 🔍 Page transparency | pageInfo.page.about.text, confirmedPageOwner, pagesTransparencyInfo, adLibraryPageTargetingInsight, relatedPages, hiddenAds, adLibrarySystemStatus |
| 📅 Timing | startDate, endDate, startDateFormatted, endDateFormatted, totalActiveTime, isActive |
| 📊 Reach & spend | spend, currency, impressionsWithIndex, reachEstimate, targetedOrReachedCountries, regionalRegulationData |
| 🏷️ Classification | publisherPlatform, categories, gatedType, stateMediaRunLabel, snapshot.byline, snapshot.disclaimerLabel, snapshot.brandedContent, isAaaEligible, containsSensitiveContent, containsDigitalCreatedMedia |
| 🚩 Signals | hasUserReported, reportCount, hideDataStatus, snapshot.isReshared, snapshot.rootResharedPost, snapshot.event |
Why teams scrape the Meta Ad Library
For media buyers and performance marketers
Ads that keep running are ads that work. totalActiveTime and startDateFormatted let you sort a competitor's entire account by longevity — the ads at the top are the ones surviving a real optimisation loop, which tells you more about what converts than any creative brief.
For creative and content teams
Every ad arrives with its headline, body copy, CTA and direct media URLs, including HD and watermarked video variants. That turns the Ad Library into a searchable swipe file you can filter by format, platform or advertiser instead of screenshotting one ad at a time.
For growth and product teams
snapshot.linkUrl on every ad and every carousel card exposes the exact landing pages a competitor drives traffic to — including the offers and funnels they do not advertise organically.
For brand protection and legal teams
Search the Ad Library for your own brand name and you find who is advertising against it: affiliates, resellers, and occasionally impersonators. snapshot.byline and snapshot.disclaimerLabel show who is formally behind a regulated ad.
For researchers and journalists
For political, electoral and social-issue advertising, Meta publishes spend ranges, impressions and reach estimates. Combined with targetedOrReachedCountries and regionalRegulationData, this is the primary public dataset for studying paid political messaging.
How to scrape the Facebook Ads Library step by step
- Decide your entry point. Either copy a Facebook Page URL (e.g.
https://www.facebook.com/examplebrand), or build a search onfacebook.com/ads/librarywith the filters you want and copy that URL. - Paste it into Pages or Ad Library links. Add more lines to cover several advertisers in one run.
- Set Maximum ads — this caps the whole run, not each source.
- Optionally set Ad activity to
activefor currently running ads only, and pick a country for Page sources. - Click Start, then export the Output tab as JSON (recommended — creatives are nested) or CSV.
⬇️ Input
Example input
{"startUrls": ["https://www.facebook.com/SHEINOFFICIAL"],"resultsLimit": 100,"activeStatus": "active","countryCode": "US","isDetailsPerAd": true}
Per-source overrides
Each entry can be an object instead of a plain string, with its own limit and period:
{"startUrls": [{ "url": "https://www.facebook.com/brand-a", "label": "Brand A", "limit": 100 },{ "url": "https://www.facebook.com/brand-b", "label": "Brand B", "limit": 400 }],"resultsLimit": 500}
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | — | Facebook Page URLs and/or Ad Library search links. Plain strings, or objects with url, label, limit and period. |
resultsLimit | integer | 10 | Maximum ads returned across all sources in the run. |
onlyTotal | boolean | false | Return one summary row per source with a total ad count instead of individual ads. |
isDetailsPerAd | boolean | true | Run an extra lookup per ad for richer metadata. Turn off for faster, lighter runs. |
includeAboutPage | boolean | false | For Page sources, attach the page's public title/description text. |
countryCode | string | ALL | Region for Page sources. 62 codes supported (US, GB, DE, FR, BR, IN, AE, JP, MX, …). Ad Library links usually carry their own country. |
period | string | — | Time window when the URL does not specify one. Accepts a calendar date or a relative span such as 7 days; passed through as provided. |
activeStatus | string | all | all, active or inactive. Applies to Page sources or when the link leaves it unspecified. |
proxyConfiguration | object | off | Optional. Enabling Apify Proxy makes the whole run use residential traffic. Requires proxy access on your plan. |
Legacy inputs:
urlsandlimitPerSourceare still accepted and merged automatically intostartUrls/resultsLimit, so older integrations keep working.
⬆️ Output
Example output
{"adArchiveID": "1234567890123456","pageID": "100064123456789","pageName": "Example Brand","isActive": true,"startDateFormatted": "2026-07-02T00:00:00Z","endDateFormatted": null,"totalActiveTime": 3369600,"publisherPlatform": ["FACEBOOK", "INSTAGRAM"],"currency": "EUR","spend": { "lower_bound": "1000", "upper_bound": "1499" },"impressionsWithIndex": { "impressionsText": "100K - 200K", "impressionsIndex": 4 },"reachEstimate": null,"targetedOrReachedCountries": ["DE", "AT"],"collationCount": 6,"categories": [],"snapshot": {"title": "Summer Sale — up to 50% off","body": { "text": "Only this week. Free shipping over €40." },"ctaText": "Shop now","ctaType": "SHOP_NOW","linkUrl": "https://example-brand.com/summer-sale","displayFormat": "DCO","originalImageUrl": "https://scontent.xx.fbcdn.net/…","videoHdUrl": null,"cards": [{ "title": "Dresses", "linkUrl": "https://example-brand.com/dresses", "ctaText": "Shop now" }],"pageCategories": ["Clothing (Brand)"],"pageLikeCount": 482301},"pageInfo": {"page": {"name": "Example Brand","id": "100064123456789","url": "https://www.facebook.com/examplebrand","about": { "text": "Sustainable everyday fashion." }}}}
Illustrative values — a live run returns current Ad Library data.
Output structure
- Top level — identifiers, dates, activity, placements, spend/impressions/reach, classification and reporting signals.
snapshot— the creative: copy, CTA, destination link, images, videos, carousel cards, page branding and disclaimers.pageInfo— the advertiser: page name, ID, URL, about text, confirmed owner, transparency info, targeting insight, related pages and hidden-ad counts.
Usage recipes
Everything a competitor is running right now
{"startUrls": ["https://www.facebook.com/examplebrand"],"activeStatus": "active","resultsLimit": 500,"countryCode": "US"}
Run a keyword search you built in the Ad Library
{"startUrls": ["https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=GB&q=protein%20powder"],"resultsLimit": 300}
Cheap audit — how many ads is each brand running?
{"startUrls": ["https://www.facebook.com/brand-a","https://www.facebook.com/brand-b","https://www.facebook.com/brand-c"],"onlyTotal": true,"activeStatus": "active"}
One row per brand with a total count. Ideal as a scheduled watchdog: when a count jumps, run a full extraction.
High-volume, lightweight export
{"startUrls": ["https://www.facebook.com/examplebrand"],"resultsLimit": 2000,"isDetailsPerAd": false}
Find the winners
Run a full extraction, then sort by totalActiveTime descending. Long-running ads are proven ads.
How does this compare to Meta's official Ad Library API?
Meta's official Ad Library API exists, but it is scoped and gated: it requires a Meta developer account, identity verification, and access is oriented around political and social-issue advertising. Commercial ads are largely outside what the API returns, and the approval process is a real barrier for a one-off research project.
This Actor reads the public Ad Library web interface — the same view any person can browse — so it covers commercial advertisers too, requires no developer account or verification, and works the moment you paste a URL. Where Meta publishes spend and impressions (regulated categories, EU ads), you get those fields as well.
Use the official API if you need Meta's sanctioned political-ads dataset with formal terms. Use this Actor for competitor and creative research across ordinary commercial advertising.
Integrate and automate
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("scraperforge/facebook-ads-library-scraper").call(run_input={"startUrls": ["https://www.facebook.com/examplebrand"],"resultsLimit": 100,"activeStatus": "active",})for ad in client.dataset(run["defaultDatasetId"]).iterate_items():snap = ad.get("snapshot", {})print(ad["pageName"], "|", snap.get("title"), "|", snap.get("linkUrl"))
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });const run = await client.actor('scraperforge/facebook-ads-library-scraper').call({startUrls: ['https://www.facebook.com/examplebrand'],resultsLimit: 100,activeStatus: 'active',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
REST API
curl -X POST "https://api.apify.com/v2/acts/scraperforge~facebook-ads-library-scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"startUrls":["https://www.facebook.com/examplebrand"],"resultsLimit":100}'
n8n, Make, Zapier and AI agents
Call the Actor from n8n, Make, Zapier or an MCP-capable AI agent through Apify's integrations — for example, a workflow that checks a competitor's active ad count daily and posts new creatives into Slack.
Schedules and webhooks
Attach a Schedule to snapshot a competitor's ad set daily and deduplicate on adArchiveID to detect exactly when creatives launch and retire. Add a webhook to push finished runs to your own endpoint, or send results to Google Sheets, Airtable, Slack or Google Drive.
Pricing and what you are charged for
Pay-per-event: a small Actor-start charge plus a charge per ad row delivered to your dataset. You pay for ads, not for run time.
Three ways to control spend:
onlyTotal: truereturns one row per source instead of one per ad — the cheapest way to monitor many brands.isDetailsPerAd: falseskips the enrichment lookup when you only need copy and links.resultsLimitcaps the entire run, so add sources freely without multiplying the bill.
Current rates are on the Pricing tab of this Actor's page, and Apify shows an estimate before and during every run.
Limits, reliability and blocking
resultsLimitis a run-wide total, unless you set a per-entrylimitinsidestartUrls.- Spend, impressions and reach are not published for most commercial ads. Meta discloses them mainly for political and social-issue advertising and for EU ads —
nullthere is Meta's policy, not a gap in the Actor. collationCounttells you how many near-identical variants Meta grouped into one entry; a single row can represent several ads.- Media URLs expire. Images and videos are served from Meta's CDN — download assets promptly if you need to keep them.
- Ad Library coverage varies by country and ad category, and some regions expose fewer fields.
- Enrichment costs time.
isDetailsPerAdadds one request per ad; turn it off for large sweeps. - Default run options are 4 GB memory and a 1-hour timeout; raise the timeout for large multi-source runs.
Is it legal to scrape the Facebook Ads Library?
The Meta Ad Library is a public transparency database that Meta publishes deliberately, in response to regulatory requirements, so that anyone can inspect who is advertising and what they are saying. This Actor reads exactly that public interface — no login, no private data, no protected content.
Ad creatives, images and videos remain the intellectual property of the advertisers who made them: use them for research, analysis and competitive intelligence, and do not republish them as your own. Political-ad records may include named individuals and organisations, so treat that data under GDPR and comparable rules if you store it. You are responsible for ensuring your use complies with Meta's terms and applicable law.
❓ Frequently asked questions
Do I need a Facebook account or a Meta API token?
No. The Ad Library is public and this Actor reads it without authentication.
Can I search by keyword instead of by advertiser?
Yes. Build the search on facebook.com/ads/library, copy the resulting URL, and paste it as a source — every filter in the link is honoured.
Does it cover Instagram ads too?
Yes. Each ad carries a publisherPlatform array; Instagram, Messenger, Audience Network and Threads placements appear when Meta lists them.
Why is spend empty on most ads?
Because Meta only publishes spend for regulated ad categories and EU advertising. Ordinary commercial ads have no public spend figure anywhere, including in Meta's own API.
Can I download the ad videos and images?
The Actor returns direct media URLs, including HD and watermarked video variants. Fetching the files is up to you, and subject to copyright.
How do I find a competitor's best-performing ads?
Sort by totalActiveTime, or compare startDateFormatted against today. Advertisers do not keep paying for ads that fail, so longevity is the strongest public proxy for performance.
What is the cheapest way to monitor a lot of brands?
Run with onlyTotal: true on a schedule to track ad counts, then run a full extraction only for the brands whose count moves.
What does collationCount mean?
Meta groups near-duplicate ads (same creative, different placements or audiences). collationCount is how many were grouped into that entry.
Can I get the landing pages competitors send traffic to?
Yes — snapshot.linkUrl on the ad, and a separate linkUrl on each carousel card.
Which export format should I use?
JSON. The creative lives in nested snapshot and pageInfo objects; CSV works but flattens them.
🔗 Related scrapers
- Facebook Search Scraper — discover Facebook business pages by category and location.
- Facebook Posts Search Scraper — organic Facebook posts by keyword.
- Snapchat Ads Scraper — the same competitive-ad research on Snapchat.
- TikTok Trending Hashtags Scraper — what is trending organically, to pair with paid research.
Browse the full collection on the ScraperForge profile.
💬 Feedback
Need an extra field, a different filter, or a custom Meta-ads workflow? Open an issue on the Issues tab of this Actor.