Facebook Ad Library Scraper Monitoring Mode Meta Instagram Ads avatar

Facebook Ad Library Scraper Monitoring Mode Meta Instagram Ads

Pricing

$0.50 / 1,000 ad scrapeds

Go to Apify Store
Facebook Ad Library Scraper Monitoring Mode Meta Instagram Ads

Facebook Ad Library Scraper Monitoring Mode Meta Instagram Ads

Scrape Facebook, Instagram & Meta ads from the public Meta Ad Library by keyword, Facebook Page, or URL. Get ad copy, creatives, videos, CTA, links, dates & advertiser data — 50+ fields per ad, no login. Monitoring mode returns only NEW ads since your last run. Export JSON, CSV or Excel.

Pricing

$0.50 / 1,000 ad scrapeds

Rating

0.0

(0)

Developer

Scrape Sage

Scrape Sage

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

4

Monthly active users

a day ago

Last modified

Share

Facebook Ad Library Scraper - Meta & Instagram Ads, No Login

Scrape Facebook, Instagram & Meta ads from the public Meta Ad Library by keyword, Facebook Page, or URL — ad copy, all creatives (images, videos, carousel cards), CTA, destination links, run dates, platforms, and advertiser data, with 50+ structured fields per ad. No login / no cookies.

Why this ad-library scraper?

Meta runs one ad library for its whole network, so a single search covers ads across Facebook, Instagram, Messenger, Threads, Audience Network, and WhatsApp.

Typical scrapersThis actor
Return page name + ad text + one imageCaptures all images, all videos (HD/SD/preview URLs), and carousel cards plus extra creatives
One way in (keyword only)Search by keyword, Facebook Page URL/ID, or a full Ad Library URL
Re-download every ad each runMonitoring mode returns only NEW ads since your last run
Skip transparency dataSurfaces spend, impressions, reach & demographics for political/issue, housing, employment & credit ads
Need a login or cookiesReads only the public Ad Library — no account, password, or cookies
Dump a raw JSON blobFlattens every creative, link & advertiser detail into clean columns

Use cases

  • Competitor ad research — pull every ad a brand is running and study their angles, offers, and creative across Facebook and Instagram.
  • Ad inspiration & swipe files — collect winning copy and creatives across a whole niche by keyword.
  • Market & trend monitoring — track which advertisers are live in a country and what they're pushing, and get only new ads via Monitoring mode.
  • Political / issue ad transparency — capture the extra disclosures Meta provides for transparency categories (audience estimates, spend, and reach where available).
  • Creative & format analysis — compare display formats, CTAs, platforms, and media types across advertisers at scale.

How to use

  1. Sign up for Apify — the free plan is enough to try this actor.
  2. Open the Facebook Ad Library Scraper, fill in the inputs you need, and click Start.
  3. Watch results stream into the dataset table as each record is parsed.
  4. Export as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the Apify API.

Input

Provide any combination of search terms, Facebook Page URLs/IDs, or full Ad Library URLs, then refine with filters.

{
"searchTerms": ["nike"],
"pageUrls": [],
"startUrls": [],
"country": "US",
"adActiveStatus": "ALL",
"adType": "ALL",
"mediaType": "ALL",
"publisherPlatforms": [],
"languages": [],
"maxResults": 100,
"monitoringMode": false,
"pageDelaySeconds": 3,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
  • searchTerms — keywords to search the Ad Library for (e.g. nike, electric scooter). Each term runs as its own search.
  • pageUrls — Facebook Page URLs (e.g. https://www.facebook.com/nike) or numeric page IDs. A numeric ID or profile.php?id=… gives exact page targeting; a vanity slug falls back to an advertiser-name search.
  • startUrls — full Meta Ad Library URLs (https://www.facebook.com/ads/library/?...). Every filter encoded in the URL is preserved — the best way to target an exact page or a complex filter combination.
  • country — country whose Ad Library to query (US, GB, DE, … or ALL for every country at once). Default US.
  • adActiveStatusALL, ACTIVE, or INACTIVE. Default ALL.
  • adTypeALL, or a transparency category (POLITICAL_AND_ISSUE_ADS, HOUSING_ADS, EMPLOYMENT_ADS, CREDIT_ADS) that surfaces extra disclosures. Default ALL.
  • mediaType — restrict by creative format: ALL, IMAGE, VIDEO, MEME, or NONE (text only). Default ALL.
  • publisherPlatforms — only include ads that ran on chosen Meta surfaces (FACEBOOK, INSTAGRAM, MESSENGER, AUDIENCE_NETWORK, THREADS, WHATSAPP). Leave empty for all.
  • languages — only include ads whose creative is in one of these languages (en, es, fr, …). Leave empty for any.
  • dateFrom / dateTo — only include ads that first ran on or after / on or before these dates.
  • maxResults — cap on total ads collected across every source. 0 = unlimited. In monitoring mode, this caps how many ads are scanned per run (cost control), not how many are output. Default 100.
  • monitoringMode / monitorId — see Monitoring.
  • pageDelaySeconds — seconds to wait between each pagination request (default 3; raise to 810 if a run stops early on a rate-limit).
  • proxyConfigurationrequired. Leave on Residential (see Tips).

Output

Each ad becomes one clean row. Creatives, links, and advertiser details are flattened into columns rather than dumped as a raw blob.

{
"adArchiveId": "1234567890123456",
"adLibraryUrl": "https://www.facebook.com/ads/library/?id=1234567890123456",
"pageName": "Nike",
"pageId": "15087023444",
"pageLikeCount": 39000000,
"pageVerified": true,
"isActive": true,
"status": "ACTIVE",
"startDate": "2026-03-17T00:00:00.000Z",
"endDate": null,
"publisherPlatforms": ["FACEBOOK", "INSTAGRAM", "MESSENGER"],
"displayFormat": "DPA",
"title": "Just Do It",
"bodyText": "Celebra tu cumpleaños con Nike y obtén acceso a productos exclusivos.",
"ctaText": "Shop Now",
"ctaType": "SHOP_NOW",
"linkUrl": "https://www.nike.com/",
"images": [],
"videos": [],
"cards": [{ "title": "Air Max", "linkUrl": "https://…", "imageUrl": "https://…" }],
"countryIsoCode": "US",
"spend": null,
"impressions": null,
"isPoliticalOrIssueAd": false,
"sourceInputType": "search",
"sourceQuery": "nike",
"scrapedAt": "2026-06-14T10:00:00.000Z"
}

Notes:

  • Most fields are nullable — fields like endDate, byline, caption, disclaimerLabel, and brandedContentPartner are populated only when the ad has them.
  • spend, impressions, estimatedAudienceSize, regionsReached, and demographics are populated only for transparency categories (political/issue, housing, employment, credit). Meta doesn't publish them for ordinary commercial ads, so they're null there (expected, not an error).
  • For DPA/carousel ads the primary images array is often empty and the creative lives in cards.
  • Business/advertiser data only — never personal contact details.
  • If a search returns nothing, the run still succeeds and the status message explains the likely reason.

Monitoring — get only new ads

Turn on monitoringMode and the run remembers every ad it has returned before and outputs only ads it has not seen in a previous run — perfect for scheduled runs answering "what new ads has this advertiser launched since I last checked?"

  • The first run returns everything (your baseline). Every run after returns only the new ads.
  • In this mode, maxResults caps how many ads are scanned per run (cost control), not how many are output. You only pay for genuinely new ads.
  • Set monitorId (e.g. nike-us) to tie runs together into one monitor: runs sharing a Monitor ID share the same memory of seen ads. Leave it blank to auto-derive one from your input — but set it explicitly if you want the monitor to survive small input changes, or to run several independent monitors.
  • Pair it with Apify Schedules for hands-off competitor alerts.

Automate & schedule

Run this actor on autopilot and pull results into your own stack:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('scrapesage/facebook-ad-library-scraper').call({
searchTerms: ['nike'],
country: 'US',
adActiveStatus: 'ACTIVE',
maxResults: 100,
proxyConfiguration: { useApifyProxy: true, apifyProxyGroups: ['RESIDENTIAL'] },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} records`);

Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

  • Make — multi-step automation scenarios.
  • Zapier — push new records straight into your CRM or sheet.
  • Slack — get notified when a run finds something new.
  • Google Drive / Sheets — auto-export every run to a spreadsheet.
  • Airbyte — pipe results into your data warehouse.
  • GitHub — trigger runs from commits or releases.

Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the Apify MCP server — ask your assistant to "find every active Facebook and Instagram ad Nike is running in the US and summarize their offers and CTAs" and let it run this scraper for you.

Agent-ready: autonomous payments (x402 & Skyfire)

This actor is agent-ready — AI agents can discover it, run it, and pay for it autonomously, with no Apify account and no human in the loop. It uses pay-per-event pricing and limited permissions, so it qualifies for Apify's agentic-payment standards:

  • x402 — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the Apify MCP server — no account, no API key.
  • Skyfire — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

More scrapers from scrapesage

Need data from elsewhere? Try these scrapesage actors:

Tips

  • Keep the proxy on Residential. Meta blocks datacenter IPs at the network level, so the scraper must reach the Ad Library through Apify Residential proxy. It rotates to a fresh residential IP automatically if Meta rate-limits one.
  • For exact page targeting, paste the Ad Library "view all ads" URL into startUrls, or use a numeric page ID / profile.php?id=… in pageUrls. A vanity slug falls back to an advertiser-name search.
  • If a large run stops early with a rate-limit message, raise pageDelaySeconds to 810. Higher is slower but more reliable for big pulls.
  • Control your spend with maxResults — you're billed per ad returned, so it caps cost. Use 0 only when you truly want everything.
  • Set a monitorId when using monitoring mode so your monitor survives small input tweaks and you can run several independent monitors side by side.

FAQ

  • Do I need to log in? No. It reads only the public Ad Library — no Facebook account, password, or cookies.
  • Do I need a proxy? Yes — Residential proxy is required and on by default. Meta blocks datacenter IPs, so datacenter proxies and no-proxy runs will be blocked.
  • Is scraping the Ad Library legal? The Ad Library is public and this tool collects business/advertiser data only — never personal contact details. Your results can still contain personal data, which is protected by the GDPR in the EU and similar laws elsewhere; scrape personal data only with a legitimate reason, and consult a lawyer if unsure.
  • Why are spend and impressions empty? Meta only publishes those for transparency categories (political/issue, housing, employment, credit). For ordinary commercial ads they're null by design.
  • What happens if a search returns no ads? The run still succeeds and the status message explains the likely reason (wrong country, active-only with no live ads, different ad language, etc.).
  • How can I export the data? As JSON, CSV, Excel, XML, or RSS from the dataset, or programmatically via the Apify API.

Need help?

Open an issue on the actor's Issues tab, or visit the Apify help center. Feature requests are welcome — this actor is actively maintained.