Facebook Ads Library Scraper · Meta Page Ads, Creatives & Reach avatar

Facebook Ads Library Scraper · Meta Page Ads, Creatives & Reach

Pricing

from $4.99 / 1,000 results

Go to Apify Store
Facebook Ads Library Scraper · Meta Page Ads, Creatives & Reach

Facebook Ads Library Scraper · Meta Page Ads, Creatives & Reach

Scrape public ads from the Meta (Facebook) Ads Library by Page URL: creatives, copy, CTAs, placements, and reach/spend when Meta discloses them. JSON/CSV export for competitor intel, creative research, and media audits. Contact: corentin@outreacher.fr

Pricing

from $4.99 / 1,000 results

Rating

0.0

(0)

Developer

Corentin Robert

Corentin Robert

Maintained by Community

Actor stats

1

Bookmarked

23

Total users

3

Monthly active users

10 days

Issues response

10 days ago

Last modified

Share

Facebook Ads Library Scraper

See every public ad a Facebook Page runs — creatives, copy, placements, and transparency metrics — in one export you can plug into analysis, CRM, or reporting.

Stop manually clicking through the Meta Ads Library. This Actor resolves your page, opens a real browser session to obtain valid library tokens, lists ads the same way Meta’s UI does, then enriches rows with reach and spend when Meta discloses them. You get structured JSON (and CSV locally) instead of screenshots and copy-paste.

Built for: Competitive intelligence · Creative & messaging research · Media buying audits · Brand compliance & benchmarking

Important: Numeric reach / spend appear when Meta exposes them (often for ads under EU transparency rules). Outside those cases, you still get creatives and copy; numbers may be null. Apify Residential Proxy improves reliability against blocks but is billed per GB — use it when you need it, not by default on every run.


What does it extract?

CategoryWhat you get
IdentityAd archive ID, permalink to the Ad Library, page ID & name, profile URL, which page you searched vs which page paid for the ad
CreativeImages (URLs + copy), videos (HD/SD/preview), titles, body text, CTA label & type, landing URL
DeliveryActive status, start/end dates, publisher platforms (Facebook, Instagram, Messenger, Threads, …)
PerformanceImpressions/reach and spend as integers when disclosed; demographic/geo breakdowns when present in Meta’s payload

Scope: Only ads published under the page you search are kept — partner or “other brand” ads that appear on that page are skipped so your export reflects that page’s own spend, not every card shown in the UI.

Output: Rows in the Apify Dataset (JSON, CSV, Excel, HTML from the console). Locally, a UTF-8 output.csv (with BOM for Excel) is written next to your input. Use the Ads — Overview view for a reporting-focused column set.


Why teams use it

  • One run = full visibility on what a competitor (or your brand) is running in the public library, sorted for analysis.
  • Ready for spreadsheets & BI — stable field names, null where Meta hides numbers (not silent zeros).
  • Progress in the Run log — listing and “reach & spend” phases show status and ETA on large pages.
  • Scales from a quick test (few ads) to deep dives (hundreds of ads) within your timeout and memory limits.

Quick start (about 3 minutes)

  1. Open the Actor Input tab on Apify.
  2. Add at least one Facebook Page URL (one per row in the list field), e.g. https://www.facebook.com/yourpage.
  3. Optionally set Country and Max ads — or leave defaults / omit for broader runs (see below).
  4. Click Run.
  5. Open the Dataset tab when the run finishes and download JSON or CSV.

Input — what to put in

Primary: Facebook Page URL(s)

Paste normal profile URLs or Ads Library URLs that already contain view_all_page_id:

{
"url": ["https://www.facebook.com/staycationparis"]
}

Single URL as a string is also accepted when passed via API:

{
"url": "https://www.facebook.com/staycationparis"
}

Tip: If a profile URL sometimes returns a login wall to automated fetches, use an Ads Library link with view_all_page_id=… or pass a numeric page ID via advanced input (see API section below).

Filters (form + API)

ParameterDefaultDescription
urlRequired. One or more Page URLs or Ads Library URLs (string or string[] depending on client).
countryOmit / ALLMarket filter in the library. Use All countries (or omit) for worldwide scope. Internal GraphQL may still use a fallback ISO code for stable listing.
maxAds0 = unlimitedCap how many ads to collect per page. 0 or omit = no cap (within memory/timeout).
proxyConfigurationOmit = directEnable Apify Proxy (e.g. residential) if Meta rate-limits or blocks your runs. Residential = per-GB pricing.

Advanced (API / raw JSON only)

The Actor also supports, depending on version: pageIds, urls, pageId, libraryUrl, adType, mediaType, sortData, speed (safe / normal / fast), metricsBatchSize, verboseLogs, etc. See the repository input_schema.json and src/main.js for the full list.


How it works (short)

  1. Resolve the Facebook Page ID (from URL or Ads Library link).
  2. List public ads via Meta’s GraphQL (same data the library UI uses), with pacing to reduce rate limits.
  3. Enrich each ad with detail requests for reach/spend and richer creatives when needed.
  4. Push validated rows to the dataset (schema-aligned so exports don’t break).

A headless browser is used to obtain session tokens — runs use more memory than a plain HTTP Actor.


Output sample

{
"adArchiveId": "906876921871660",
"adLibraryUrl": "https://www.facebook.com/ads/library/?id=906876921871660",
"pageId": "1135060673240590",
"searchedPageId": "1135060673240590",
"isFromSearchedPage": true,
"pageName": "Example Page",
"pageProfileUri": "https://www.facebook.com/...",
"isActive": true,
"startDate": "2025-01-15T00:00:00.000Z",
"publisherPlatform": ["FACEBOOK", "INSTAGRAM"],
"linkUrl": "https://example.com/landing",
"ctaText": "Book now",
"adDescription": "Primary text from the creative…",
"impressions": 1250000,
"spend": null,
"impressionsBreakdown": {
"targetsEu": true,
"totalReach": 1250000,
"genderAudience": "All"
},
"images": [
{
"original": "https://scontent.xx.fbcdn.net/...",
"resized": null,
"title": "",
"body": "",
"ctaText": "Book now",
"ctaType": "LEARN_MORE",
"linkUrl": "https://example.com/landing"
}
],
"videos": []
}

Download from the Dataset tab as JSON, CSV, Excel, or HTML.


Transparency fields & null

TopicBehavior
impressions / spendAlways present on each row. Integer when Meta discloses; null when not (not the same as zero).
EU vs restReach/spend appear most often for ads covered by EU-style transparency; other regions may return creatives without numbers.
genderAudienceNormalized to English labels when Meta returns localized strings.
resized / video sdnull when the URL matched original / hd and was deduplicated.
CDN URLsImage/video URLs point to Meta CDNs; tokens expire — archive assets soon if you need permanent files.

Performance & cost

FactorNotes
ComputeBrowser + many GraphQL calls — use timeout and memory from actor.json or raise them for huge pages.
ProxyDefault product behavior can be direct (no proxy). Residential proxy reduces blocks but adds per-GB cost — disable when not needed.
Rate limitsMeta may return HTTP 429; the Actor backs off and retries. Very large listings take longer.
Apify pricingCharged in platform units (e.g. CU) + proxy traffic if enabled — see Apify pricing.

Tip: Start with a low maxAds to validate output, then remove the cap or raise it for full exports.


Tips & best practices

Start small. Use maxAds: 1050 on the first run, then scale up.

Proxy when blocked. If you see repeated failures or empty sessions from Apify IPs, enable Apify Proxy (residential is strongest; datacenter is cheaper).

Country. Match the market you care about for filtering in the library UI; “all countries” is supported for broad research.

Schedule. Use Apify Schedules to refresh competitor snapshots weekly or monthly.

Local runs. From the project folder, with input.json at the root: npm start (see your Dockerfile / package.json). Dataset files land under storage/; output.csv is written for quick Excel checks.


Use cases

GoalSuggested input
Monitor one competitor’s creativesSingle url, optional maxAds for tests
Full ad history for a pageurl, omit maxAds (watch timeout)
Focused marketSet country to match your GEO
Stable runs from the cloudEnable proxyConfiguration if direct egress is flaky

FAQ

Is this affiliated with Meta?
No. It automates access to public Ads Library data. You must comply with Meta’s terms and applicable laws.

Why are reach/spend sometimes empty?
Meta only discloses them in certain jurisdictions and conditions. The Actor returns null instead of guessing.

Does it include political ads only?
The Actor targets standard commercial library results unless you pass advanced options (e.g. adType) via API — see input_schema.json / code for your deployed version.

Can I scrape many pages in one run?
Yes — pass multiple URLs in url when supported by your input form, or use bulk fields (urls, pageIds) via API if exposed in your Actor version.

Why did my run slow down mid-way?
Listing and detail phases are paced; rate limits (429) trigger automatic waits. Large inventories take time.


This tool helps collect publicly visible Ads Library information for analysis. You are responsible for complying with Meta’s terms of service, privacy and advertising rules, and your organisation’s policies. Not affiliated with or endorsed by Meta.


Support

Questions, custom fields, or higher-volume setups: corentin@outreacher.fr

Ready? Add your Page URL(s), set country and caps if needed, and hit Run.