Facebook Ads Library Scraper
Pricing
from $3.99 / 1,000 results
Facebook Ads Library Scraper
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
ScraperX
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
0
Monthly active users
4 hours ago
Last modified
Categories
Share
Facebook Ads Library Scraper — Extract Meta & Instagram Ads, Creatives, Spend & Reach
Pull competitor advertising data straight out of the Meta Ad Library. 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 the advertiser's page details, run dates, platforms, and (where Meta publishes it) spend, impressions and reach estimates.
Built for competitor research, ad creative swipe files, media-buying intelligence, brand monitoring and political-ad transparency work. No Facebook login, no Meta developer app, no access token.
What you get
| 🧾 Ad & creative | 🏢 Advertiser / page | 📊 Reach & transparency |
|---|---|---|
| Ad archive ID & ad ID | Page name, ID and profile URL | EU spend range & currency |
| Headline, body text, caption | Page categories & like count | Impressions range with index |
| CTA text and CTA type | Page "about" text (optional) | Reach estimate |
| Landing-page / link URL | Related pages | Total active time |
| Images (original & resized) | Page transparency info | Targeted / reached countries |
| Videos (SD, HD, watermarked) | Confirmed page owner | Regional regulation data |
| Carousel cards, each with its own copy & link | Page targeting insight | Ad categories & disclaimers |
| Start / end dates, active flag | Deleted-page flag | Publisher platforms (Facebook, Instagram, Messenger, Audience Network) |
Key features
- Two kinds of input, one dataset. Paste a Facebook Page URL to get everything that page is running, or an Ad Library search URL (keyword, advertiser, country, category filters already applied) to run exactly the search you built in the browser. Mix both in one run.
- Per-source overrides. Each entry can be a plain URL or an object with its own
limitandperiod, so you can pull 50 ads from one brand and 500 from another in the same run. - Complete creative capture. Not just the ad text — image URLs at original and resized sizes, SD/HD/watermarked video URLs, video preview frames, and every carousel card with its own title, body, link and CTA.
- Detail enrichment. With Enrich each ad with extra fields enabled (the default), each ad gets an extra lookup for richer metadata. Turn it off for a much faster, listing-only export.
- Count-only audit mode.
onlyTotalreturns a single summary row per source with the total number of ads instead of the ads themselves — a cheap way to answer "how many ads is this brand running right now?" across hundreds of pages. - Active / inactive filtering. Look only at live campaigns, only at retired ones, or everything.
- 62 country codes + time-range control. Set a default country and period for page sources; Ad Library links keep whatever is already encoded in the URL.
- Transparency data included. Where Meta publishes it (EU ads, political and social-issue ads), you get spend ranges, impressions, reach estimates, disclaimers, bylines and regional regulation data.
- Backwards compatible. Legacy
urlsandlimitPerSourceinputs still work and are merged automatically.
Use cases
- Competitor ad intelligence — see exactly which creatives a competitor is running, on which platforms, and for how long.
- Creative swipe files — build a searchable library of headlines, hooks, CTAs and video URLs in your niche.
- Media-buying research — identify long-running ads (ads that keep running are usually the ads that work) before committing budget.
- Landing-page & funnel analysis —
linkUrlon every ad and card reveals the exact pages competitors send traffic to. - Brand & trademark monitoring — search the Ad Library for your brand name and find who is advertising against it.
- Political & issue-ad transparency — pull disclaimers, bylines, spend ranges and reach estimates for regulated ads.
- Agency reporting & pitching — show a prospect what their competitors are doing, with real creatives attached.
- E-commerce product research — spot which products are being pushed hardest right now.
How it works
- You list sources — Facebook Page URLs, Ad Library search URLs, or both.
- Each source is classified. Page URLs are turned into an Ad Library query for that page using your country, period and activity filters. Ad Library URLs keep their own query parameters.
- Results are paged through the Ad Library's own interface until your
resultsLimitis reached across the whole run. - Each ad is normalised into a flat, predictable record with a nested
snapshotholding the creative and apageInfoobject holding advertiser context. - Optional enrichment runs an additional per-ad lookup for fuller metadata, and optional page "about" text is attached for page sources.
- Rows stream into the dataset as they are collected.
Quick start
- Open the Actor and paste a Facebook Page URL into Pages or Ad Library links — e.g.
https://www.facebook.com/SHEINOFFICIAL. - Set Maximum ads — start with 20 to see the shape of the data.
- (Optional) Choose a country and set Ad activity to
activefor currently running ads only. - Click Start, then export the Output tab as JSON, CSV or Excel.
Minimal input
{"startUrls": ["https://www.facebook.com/SHEINOFFICIAL"],"resultsLimit": 20,"activeStatus": "active"}
Input configuration
Sources
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | — | Facebook Page URLs and/or Ad Library links, one per entry. Accepts plain strings or objects: { "url": "…", "label": "…", "limit": 100, "period": "…" }. |
Volume & depth
| Field | Type | Default | Description |
|---|---|---|---|
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. |
Filters & time
| Field | Type | Default | Description |
|---|---|---|---|
countryCode | string | ALL | Region used for Page sources. 62 country codes supported (US, GB, DE, FR, BR, IN, AE, …). Ad Library URLs usually carry their own country. |
period | string | — | Optional time window when the URL does not already specify one. Accepts a calendar date or a relative span (e.g. 7 days); the value is passed through as provided. |
activeStatus | string | all | all, active or inactive. Applies to Page sources, or when your Ad Library link leaves it unspecified. |
Network
| Field | Type | Default | Description |
|---|---|---|---|
proxyConfiguration | object | off | Optional. If you enable Apify Proxy, the whole run uses residential traffic only. Requires proxy access on your Apify plan. |
Legacy inputs:
urlsandlimitPerSourceare still accepted and merged intostartUrls/resultsLimitautomatically — existing integrations keep working.
Output data
One row per ad (or one row per source when onlyTotal is on).
Top level
| Field | Description |
|---|---|
adArchiveID / adArchiveId / adId | Meta Ad Library identifiers for the ad. |
pageID / pageId, pageName | The advertiser page behind the ad. |
inputUrl | The Ad Library URL this ad was collected from. |
isActive | Whether the ad is currently running. |
startDate, endDate | Raw timestamps. |
startDateFormatted, endDateFormatted | ISO-formatted dates. |
totalActiveTime | How long the ad has been running. |
publisherPlatform | FACEBOOK, INSTAGRAM, MESSENGER, AUDIENCE_NETWORK, THREADS. |
spend, currency | Spend range and currency, where Meta publishes it. |
impressionsWithIndex | Impressions range plus its index. |
reachEstimate | Estimated reach, where available. |
targetedOrReachedCountries | Countries the ad targeted or reached. |
categories, gatedType, stateMediaRunLabel | Ad classification labels. |
regionalRegulationData | Regulatory disclosure data by region. |
collationCount, collationId | How many near-identical variants Meta groups with this ad. |
containsSensitiveContent, containsDigitalCreatedMedia, isAaaEligible | Content flags. |
hasUserReported, reportCount, hideDataStatus | Reporting signals. |
pageIsDeleted | Whether the advertiser page no longer exists. |
aboutPage | Page about text, when includeAboutPage is on. |
snapshot — the creative
body, title, caption, linkUrl, linkDescription, ctaText, ctaType, displayFormat, images, originalImageUrl, resizedImageUrl, watermarkedResizedImageUrl, imageCrops, videos, videoSdUrl, videoHdUrl, watermarkedVideoSdUrl, watermarkedVideoHdUrl, videoPreviewImageUrl, cards[] (each carousel card with its own body, title, CTA and link), extraLinks, extraTexts, extraImages, extraVideos, pageName, pageProfileUri, pageProfilePictureUrl, pageCategories, pageLikeCount, byline, disclaimerLabel, brandedContent, isReshared, rootResharedPost, event, countryIsoCode, additionalInfo.
pageInfo — the advertiser
page.name, page.id, page.url, page.about.text, page.confirmedPageOwner, page.pagesTransparencyInfo, page.adLibraryPageTargetingInsight, adLibraryPageInfo.pageInfo.relatedPages, hiddenAds, hasBlankAds, adLibrarySystemStatus.
Example output (trimmed)
{"adArchiveID": "1234567890123456","pageID": "100064123456789","pageName": "Example Brand","isActive": true,"startDateFormatted": "2026-07-02T00:00:00Z","endDateFormatted": null,"publisherPlatform": ["FACEBOOK", "INSTAGRAM"],"currency": "EUR","spend": { "lower_bound": "1000", "upper_bound": "1499" },"impressionsWithIndex": { "impressionsText": "100K - 200K", "impressionsIndex": 4 },"targetedOrReachedCountries": ["DE", "AT"],"collationCount": 6,"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.
Usage examples
Everything a competitor is running right now
{"startUrls": ["https://www.facebook.com/examplebrand"],"activeStatus": "active","resultsLimit": 500,"countryCode": "US"}
A keyword search you built in the Ad Library
Set up the search on facebook.com/ads/library, copy the URL, then:
{"startUrls": ["https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=GB&q=protein%20powder"],"resultsLimit": 300}
Different limits per brand in one run
{"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}
Fast 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"}
Lightweight, high-volume export
{"startUrls": ["https://www.facebook.com/examplebrand"],"resultsLimit": 2000,"isDetailsPerAd": false}
Run it from your own code
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("scraperx/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('scraperx/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);
cURL
curl -X POST "https://api.apify.com/v2/acts/scraperx~facebook-ads-library-scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"startUrls":["https://www.facebook.com/examplebrand"],"resultsLimit":100}'
Integrations
Send ads to Google Sheets, Airtable, Slack, Make, Zapier, Google Drive or your own endpoint via webhooks. Attach a Schedule to snapshot a competitor's ad set daily and track when creatives launch and retire.
Pricing
Pay-per-event: a small Actor-start charge plus a charge per ad row delivered to your dataset. You pay for results, not run time. Current rates are on the Pricing tab of this Actor's page, and Apify shows an estimate before and during every run.
Cost tips: use onlyTotal for cheap audits, turn isDetailsPerAd off when you only need ad copy and links, and cap resultsLimit while you are still exploring.
Limits & good to know
resultsLimitis a run-wide total, not per source — unless you set a per-entrylimitinstartUrls.- Spend, impressions and reach are only published for some ads. Meta discloses them mainly for political / social-issue ads and for ads in the EU. Commercial ads elsewhere return
null— that is Meta's policy, not a gap in the Actor. collationCounttells you how many near-duplicate variants Meta grouped together; one row can represent several near-identical ads.- Media URLs point to Meta's CDN and expire. Download the assets promptly if you need to keep them.
- Ad Library coverage and filters vary by country and ad category.
- Enrichment (
isDetailsPerAd) makes runs noticeably slower — it is one extra request per ad. - Default run options are 4 GB memory and a 1-hour timeout.
FAQ
Do I need a Facebook account, login or Meta API access token? No. The Meta Ad Library is public, and this Actor reads it without authentication.
Can I search by keyword instead of by page?
Yes — build the search on facebook.com/ads/library, copy the URL, and paste it as a source.
Does it get Instagram ads too?
Yes. Ads are returned with a publisherPlatform array; Instagram, Messenger and Audience Network placements are included when Meta lists them.
Why is spend empty?
Meta only publishes spend for regulated ad categories and EU ads. Most commercial ads have no public spend.
Can I download the ad videos and images? The Actor returns direct media URLs (including HD and watermarked video variants). Fetch the files from those URLs.
How do I find long-running ads?
Sort your export by totalActiveTime, or compare startDateFormatted against today. Long-running ads are usually the best performers.
What is the cheapest way to monitor many brands?
Run with onlyTotal: true on a schedule to watch ad counts, then run a full extraction only when a count jumps.
Which export formats are available? JSON, CSV, Excel (XLSX), XML and RSS. JSON is recommended because the creative lives in nested objects.
Legal & responsible use
The Meta Ad Library is a public transparency database published by Meta itself. This Actor reads only what it publishes — no login, no private data, no protected content. Ad creatives remain the property of their advertisers; use them for research and analysis, and comply with Meta's terms, copyright and applicable law when reusing anything.
Support
Need an extra field, a different filter, or a custom Meta-ads workflow? Open an issue on the Issues tab.