Facebook Ads Library Scraper avatar

Facebook Ads Library Scraper

Pricing

from $3.99 / 1,000 results

Go to Apify Store
Facebook Ads Library Scraper

Facebook Ads Library Scraper

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

ScraperX

ScraperX

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

0

Monthly active users

4 hours ago

Last modified

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 IDPage name, ID and profile URLEU spend range & currency
Headline, body text, captionPage categories & like countImpressions range with index
CTA text and CTA typePage "about" text (optional)Reach estimate
Landing-page / link URLRelated pagesTotal active time
Images (original & resized)Page transparency infoTargeted / reached countries
Videos (SD, HD, watermarked)Confirmed page ownerRegional regulation data
Carousel cards, each with its own copy & linkPage targeting insightAd categories & disclaimers
Start / end dates, active flagDeleted-page flagPublisher 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 limit and period, 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. onlyTotal returns 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 urls and limitPerSource inputs 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 analysislinkUrl on 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

  1. You list sources — Facebook Page URLs, Ad Library search URLs, or both.
  2. 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.
  3. Results are paged through the Ad Library's own interface until your resultsLimit is reached across the whole run.
  4. Each ad is normalised into a flat, predictable record with a nested snapshot holding the creative and a pageInfo object holding advertiser context.
  5. Optional enrichment runs an additional per-ad lookup for fuller metadata, and optional page "about" text is attached for page sources.
  6. Rows stream into the dataset as they are collected.

Quick start

  1. Open the Actor and paste a Facebook Page URL into Pages or Ad Library links — e.g. https://www.facebook.com/SHEINOFFICIAL.
  2. Set Maximum ads — start with 20 to see the shape of the data.
  3. (Optional) Choose a country and set Ad activity to active for currently running ads only.
  4. 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

FieldTypeDefaultDescription
startUrlsarrayFacebook Page URLs and/or Ad Library links, one per entry. Accepts plain strings or objects: { "url": "…", "label": "…", "limit": 100, "period": "…" }.

Volume & depth

FieldTypeDefaultDescription
resultsLimitinteger10Maximum ads returned across all sources in the run.
onlyTotalbooleanfalseReturn one summary row per source with a total ad count, instead of individual ads.
isDetailsPerAdbooleantrueRun an extra lookup per ad for richer metadata. Turn off for faster, lighter runs.
includeAboutPagebooleanfalseFor Page sources, attach the page's public title/description text.

Filters & time

FieldTypeDefaultDescription
countryCodestringALLRegion used for Page sources. 62 country codes supported (US, GB, DE, FR, BR, IN, AE, …). Ad Library URLs usually carry their own country.
periodstringOptional 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.
activeStatusstringallall, active or inactive. Applies to Page sources, or when your Ad Library link leaves it unspecified.

Network

FieldTypeDefaultDescription
proxyConfigurationobjectoffOptional. If you enable Apify Proxy, the whole run uses residential traffic only. Requires proxy access on your Apify plan.

Legacy inputs: urls and limitPerSource are still accepted and merged into startUrls / resultsLimit automatically — existing integrations keep working.


Output data

One row per ad (or one row per source when onlyTotal is on).

Top level

FieldDescription
adArchiveID / adArchiveId / adIdMeta Ad Library identifiers for the ad.
pageID / pageId, pageNameThe advertiser page behind the ad.
inputUrlThe Ad Library URL this ad was collected from.
isActiveWhether the ad is currently running.
startDate, endDateRaw timestamps.
startDateFormatted, endDateFormattedISO-formatted dates.
totalActiveTimeHow long the ad has been running.
publisherPlatformFACEBOOK, INSTAGRAM, MESSENGER, AUDIENCE_NETWORK, THREADS.
spend, currencySpend range and currency, where Meta publishes it.
impressionsWithIndexImpressions range plus its index.
reachEstimateEstimated reach, where available.
targetedOrReachedCountriesCountries the ad targeted or reached.
categories, gatedType, stateMediaRunLabelAd classification labels.
regionalRegulationDataRegulatory disclosure data by region.
collationCount, collationIdHow many near-identical variants Meta groups with this ad.
containsSensitiveContent, containsDigitalCreatedMedia, isAaaEligibleContent flags.
hasUserReported, reportCount, hideDataStatusReporting signals.
pageIsDeletedWhether the advertiser page no longer exists.
aboutPagePage 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 ApifyClient
client = 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

  • resultsLimit is a run-wide total, not per source — unless you set a per-entry limit in startUrls.
  • 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.
  • collationCount tells 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.


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.