Facebook Ads Library Scraper [$0.13/1K💰] | Meta & IG Ad Spy avatar

Facebook Ads Library Scraper [$0.13/1K💰] | Meta & IG Ad Spy

Pricing

from $0.11 / 1,000 results

Go to Apify Store
Facebook Ads Library Scraper [$0.13/1K💰] | Meta & IG Ad Spy

Facebook Ads Library Scraper [$0.13/1K💰] | Meta & IG Ad Spy

Spy on any brand's Facebook & Instagram ads with no login or Meta API token. Scrape ad copy, creatives, CTA, landing pages, run dates and EU reach into 46-field JSON rows — and track new, edited and ended ads on a schedule.

Pricing

from $0.11 / 1,000 results

Rating

0.0

(0)

Developer

Ahmed Jasarevic

Ahmed Jasarevic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

2

Monthly active users

a day ago

Last modified

Categories

Share

Facebook Ads Library Scraper — Meta & Instagram Ads Without A Login

Extract every ad a brand runs on Facebook and Instagram from the public Meta Ad Library into 50+ field JSON rows — ad copy, creatives, CTA, landing URL, run dates and EU/UK/BR reach — with no Meta API token, no login and no browser. At $0.13 per 1,000 ads it is the lowest per-ad price among the Meta Ad Library scrapers on the Apify Store, and it tracks new, edited and ended ads across scheduled runs.

Main Use Cases: Competitor Ad Spying, Creative Research And Ad Monitoring

  • Facebook ad spy / competitor ad analysis — pull every active ad an advertiser is running, then read the copy, creative, CTA and landing page to reverse-engineer their angles.
  • Creative swipe file — the raw image_urls, video_urls and carousel_cards let you download the winning creatives in bulk instead of screenshotting them one by one.
  • Ad running-days intelligence — running_days / total_active_time show which creatives a brand keeps spending on; long-running ads are the strongest available proxy for a proven winner.
  • Competitor ad monitoring on a schedule — a watchlistId remembers every ad already delivered, so daily runs return only the ads that are new, edited or ended.
  • Dropshipping and e-commerce product research — search by keyword across a whole niche (e.g. "weight loss", "black friday") and export the full Meta Ad Library result set to CSV or Excel.
  • EU / UK / Brazil transparency and reach data — for regulated categories the rows carry Meta's own data_reach, impressions_with_index and transparency_by_location breakdowns (age, gender, region).

How It Works

How the Meta Ads Library Scraper works: public ad searches become creative rows with copy, media, run dates and transparency data.

The Actor bootstraps the public Ad Library page to obtain the current session parameters, parses the server-rendered first page, then follows the same paginated GraphQL query the web app uses. Requests run through residential proxies with backoff and proxy rotation when Meta throttles; optional detail queries enrich individual ads.

Each row is one ad with 50+ top-level fields depending on format and detail mode, including advertiser identity, ad copy, CTA, landing URL, image/video/carousel assets, run dates, platforms, reach, spend and transparency objects. Search is by advertiser, keyword or Ad Library URL; no Meta login or official API token is required.

Extract Facebook & Instagram Ads Without A Meta API Token

The official Meta Ad Library API is built for transparency, not research: it returns political and social-issue ads worldwide plus all ad types only for the EU and the UK (the last 12 months), requires Facebook Developer credentials and app review, and expires its access token every 60 days. For commercial ads outside the EU/UK it returns nothing.

This actor reads Meta's own public Ad Library response instead, so it returns commercial ads from every country you name with no account, no app review and no token. Two things you should know before you scale it up:

  • Country (searchCountries) controls the result set, not the proxy exit country.
  • Pagination needs a residential-class proxy — Meta returns page 1 to any IP but serves the GraphQL pages only from high-quality IPs (Rate limit exceeded, code 1675004). The actor defaults to Apify Residential and rotates on throttle; pass proxy only to bring your own.
  • Meta only exposes reach/impression figures for the transparency categories (political/issue, housing, employment, credit). For everything else those fields are absent in Meta's own response — this actor does not invent them.

Meta Ad Library scrapers compared (verified, 2026-10-09)

ActorPrice per 1,000 ads (BRONZE)Notes
This actor$0.13Cheapest verified; watchlist change tracking; no login
jmlp/meta-ad-library-scraper$0.15
solidcode/meta-ads-library-scraper$0.40
memo23/facebook-ads-library-scraper-cheerio$0.45 (+ $1/1K details)Very close input schema
igolaizola/facebook-ad-library-scraper$0.50
automation-lab/facebook-ads-library$0.50
azzouzana/meta-facebook-instagram-ads-library$0.50
scrapesage/facebook-ad-library-scraper$0.75
dltik/facebook-ads-scraper$3.00Ad-spy positioning, AI add-ons
brilliant_gum/facebook-ads-library-scraper$15.00
apify/facebook-ads-scraper$5.00 + $3.20 e-commerce add-onOfficial Apify, largest in the cluster

Facebook Ads Library Scraper Input Parameters

FieldTypeRequiredDefaultNotes
startUrlsarrayOne of*Ad Library "nike" URLFull Meta Ad Library URLs (all filters honoured) or Facebook Page URLs.
advertisersarrayOne of*[]Facebook Page IDs, Ad Library URLs with view_all_page_id=…, or Page URLs — every ad of each advertiser is returned in full.
searchTermsarrayOne of*[]Keywords/brand names, one search per term per country.
searchCountriesarrayNo["US"]ISO‑2 country codes or ALL; each country is queried per term.
adDetailIdsarrayNo[]Re-fetch specific ads by archive id or ?id=… link.
adActiveStatusstringNoactiveactive, inactive or all.
mediaTypestringNoallall, image or video.
adTypestringNoallall or a regulated category: political_and_issue_ads, housing_ads, employment_ads, credit_ads, financial_products_and_services_ads.
publisherPlatformsarrayNo[]facebook, instagram, messenger, audience_network.
contentLanguagesarrayNo[]ISO 639‑1 creative languages (en, de, …).
searchModestringNokeyword_unorderedkeyword_exact_phrase for phrase matching.
sortBystringNo""total_impressions for most-impressions-first.
startDateMinstringNo""YYYY-MM-DD lower bound on the ad start date.
startDateMaxstringNo""YYYY-MM-DD upper bound on the ad start date.
categoriesarrayNo[]Keep only ads whose Meta category matches (case-insensitive).
includeAdReachbooleanNofalseKeep data_reach, reach_estimate and impression fields on every row.
scrapeAdDetailsbooleanNofalseOne extra GraphQL query per ad → advertiser, aaa_info and full transparency_by_location. Bills the additional_data event.
includeTotalActiveAdsbooleanNofalseAsk Meta for the advertiser's total active ad count.
filterDuplicatePageIdsbooleanNofalseKeep only the first ad per page_id.
watchlistIdstringNo""Named memory of which ad_archive_ids this run already delivered. Letters, numbers, -, _.
newAdsOnlybooleanNofalseDrop already-seen ads (they are not billed). Requires watchlistId.
trackChangesbooleanNofalseAdd change_type (new/edited/unchanged/ended). Requires watchlistId.
emitEndedAdsbooleanNofalseAlso emit rows for ended ads. Combine with trackChanges.
rawbooleanNofalseEmit only Meta's untouched ad node.
maxItemsintegerNo10000Hard cap on ads per run. Free Apify plan caps at 30 ads + 1 search target.
detailsConcurrencyintegerNo15Parallel per-ad detail queries when scrapeAdDetails is on.
minDelaynumberNo0Lower bound of the randomized pause after each GraphQL page.
maxDelaynumberNo1Upper bound of that pause.
maxConcurrencyintegerNo10Search targets processed at once.
maxRequestRetriesintegerNo8Retries with exponential backoff; throttled requests also rotate the proxy.
proxyobjectNo(empty)Leave empty — Apify Residential is used by default; set only for your own proxies.
debugbooleanNofalseEmit session tokens, chosen doc_ids and pagination progress.

* The schema requires no field formally, but a run needs at least one target: startUrls, advertisers, searchTerms or adDetailIds.

Main Ad Fields Returned By The Facebook Ad Library Scraper

One dataset row per ad (50+ possible fields; recent samples expose 52 top-level keys, depending on ad format and detail mode). The dataset ships four views — Overview, Creatives, Transparency and Changes — and exports as JSON, CSV or Excel.

Ad identity (9) — ad_archive_id (row key for dedup and change tracking), page_id, page_name, Company Name, FB AD Link, ad_library_url, url, FB Link, Website.

Creative (10) — display_format, ad_body, ad_title, cta_text, cta_type, link_url, image_urls, video_urls, carousel_cards, and the raw snapshot (Meta's untouched creative object).

Run dates (7) — start_date, end_date (unix seconds), start_date_formatted, end_date_formatted (ISO 8601), running_days, total_active_time, is_active.

Delivery & transparency (10) — publisher_platform, categories, spend, currency, impressions_with_index, reach_estimate, data_reach, targeted_or_reached_countries, is_aaa_eligible, plus the detail-only advertiser, aaa_info, transparency_by_location, verified_voice_context, contains_digital_created_media, contains_sensitive_content.

Search context (5) — position, total, query, scraped_at, plus change_type when a watchlist is active. Raw fields such as snapshot, collation_count, collation_id, menu_items, regional_regulation_data, fev_info and the transparency objects are passed through when Meta returns them.

Example Input And Output: Facebook Ad Library Rows

Example input — an ad spy sweep over one brand keyword in two countries, with watchlist tracking:

{
"searchTerms": ["nike"],
"searchCountries": ["US", "GB"],
"adActiveStatus": "active",
"mediaType": "all",
"sortBy": "total_impressions",
"includeAdReach": true,
"scrapeAdDetails": true,
"watchlistId": "nike-daily",
"trackChanges": true,
"maxItems": 500,
"proxy": {}
}

Example output (one dataset row, values illustrative):

{
"ad_archive_id": "1550534860016399",
"page_id": "115939511520844",
"page_name": "Depop",
"Company Name": "Depop",
"FB AD Link": "https://www.facebook.com/ads/library/?id=1550534860016399",
"url": "https://www.facebook.com/ads/library/?id=1550534860016399",
"FB Link": "https://www.facebook.com/depop/",
"Website": "play.google.com",
"display_format": "IMAGE",
"ad_body": "Free Depop Shipping just dropped. Go find something you love.",
"ad_title": "Super hot widgets app!",
"cta_text": "Install now",
"cta_type": "INSTALL_MOBILE_APP",
"link_url": "http://play.google.com/store/apps/details?id=com.example.app",
"image_urls": ["https://scontent.xx.fbcdn.net/v/t39.35426-6/728226168_n.jpg"],
"video_urls": [],
"carousel_cards": [],
"start_date": 1779174000,
"end_date": 1791442800,
"start_date_formatted": "2026-05-19T07:00:00Z",
"end_date_formatted": "2026-10-08T07:00:00Z",
"running_days": 142,
"total_active_time": 12268800,
"is_active": true,
"publisher_platform": ["FACEBOOK", "INSTAGRAM"],
"categories": ["UNKNOWN"],
"targeted_or_reached_countries": ["US"],
"position": 1,
"total": 23836,
"query": "nike",
"change_type": "new",
"scraped_at": "2026-10-08T14:02:33.300201Z"
}

Competitor Ad Monitoring With Scheduled Watchlist Runs

The watchlist is the actor's change-tracking memory. It lives in the actor's key-value store under watchlist:<id> and survives across runs — point a schedule at one watchlistId and only new/changed ads are billed.

  • newAdsOnly — already-seen ads are dropped from the dataset (and not billed); the search still runs in full. Requires watchlistId.
  • trackChanges — every row gains change_type: new, edited, unchanged, plus ended for ads that stopped running.
  • emitEndedAds — also emit rows for ended ads (combine with trackChanges).

ended is produced only for a search that was scanned to completion in that run. If a run stops early (maxItems reached, or Meta throttles), nothing is marked ended — so a partial crawl can never mass-close ads. A recommended setup is a daily schedule on a competitor's Page ID or a keyword, with trackChanges: true, feeding a Slack or Sheets webhook.

Integrations & Automation

  • Apify API — start runs, poll status and pull dataset items as JSON; the output ads field links to the default dataset items endpoint. Export JSON, CSV or Excel from the console.
  • Webhooks — fire on run success/failure to push only the new/edited rows into a pipeline, Slack channel or Google Sheet.
  • Zapier and Make — trigger workflows on new dataset items (append to Sheets, create CRM/Airtable records, alert on a competitor's new creative).
  • Schedules — for competitor ad monitoring, run daily or weekly against the same watchlistId; recurring runs also feed the Apify Store recommendation signals that surface the actor in searches.

FAQ

What is the Meta Ad Library?

The Meta Ad Library (facebook.com/ads/library) is Meta's free, public transparency database. It shows all active ads running across Facebook, Instagram, Messenger and the Audience Network. Political and social-issue ads are archived for 7 years with spend and reach data; ads that reached the EU are archived for one year. This actor reads that public Ad Library and turns it into structured JSON.

Is there a Meta Ad Library API?

Yes, but it is narrow: Meta's official Ad Library API returns political/social-issue ads worldwide and all ad types only for the EU and UK (last 12 months). It requires Facebook Developer credentials, app review and a token that expires every 60 days — and returns no commercial ads outside the EU/UK. This actor is the alternative that returns commercial ads from any country without a token.

What are the limitations of the Meta Ad Library API?

Documented limits (2026): political/EU-only content scope, bucketed spend ranges rather than exact figures, strict per-hour call limits, mandatory app review, and 60-day token expiry. There is no official API for commercial ads outside the EU/UK — which is the gap this actor fills by reading the public Ad Library directly.

Do I need a Meta login or API token to use this actor?

No. It runs against the public Ad Library with no account, no API key and no browser. The only requirement is that large paginated runs use a residential-class proxy (the actor defaults to Apify Residential, which is already configured) because Meta serves its GraphQL pages only to IPs of that quality.

Does this actor return Instagram ads?

Yes. The Meta Ad Library covers Facebook, Instagram, Messenger and the Audience Network; every row reports publisher_platform, and you can narrow a run with the publisherPlatforms input (e.g. ["instagram"]).

How do I download all ads from the Meta Ad Library?

Give the actor a searchTerms keyword, an advertisers Page ID, or a full startUrls Ad Library URL. It paginates the entire result set automatically (raise maxItems for a complete crawl) and writes one row per ad, which you can export as JSON, CSV or Excel — including the image_urls and video_urls creative assets.

Why is my run returning only a few ads?

Two common reasons: (1) on a free Apify plan a run is capped at 30 ads and one search target — paid plans remove both caps; (2) Meta throttled pagination, in which case the actor rotates to a fresh residential IP and reports an empty page rather than silently stopping. Watch the run log (debug: true) and raise maxItems for a full crawl.

What are the alternatives to this actor?

Other Meta Ad Library scrapers on the Apify Store include apify/facebook-ads-scraper (official, multi-platform), igolaizola/facebook-ad-library-scraper, memo23/facebook-ads-library-scraper-cheerio, automation-lab/facebook-ads-library, solidcode/meta-ads-library-scraper and jmlp/meta-ad-library-scraper. Beyond Apify, paid ad-spy tools (Minea, BigSpy, Foreplay, AdSpy) add multi-platform coverage and saved swipe files on subscription, while this actor gives you the raw Meta rows on a pay-per-ad basis.

How do I track when a competitor changes their ads?

Set a watchlistId and turn on trackChanges (add emitEndedAds to also receive ads that stopped). Every subsequent run labels each ad new, edited, unchanged or ended, so you can detect a rewritten creative or a launched campaign without diffing exports by hand.

SEO Keywords

facebook ads library scraper, meta ad library scraper, facebook ads library api, meta ad library api, facebook ad spy, ad spy tool, competitor ads analysis, download facebook ads, scrape facebook ads without login, facebook ads library download, facebook ads library search, competitor ad tracking, ad library api, instagram ad library, meta ads library scraper, facebook ads scraper, dropshipping ad spy, ecommerce competitor ads, facebook ads transparency, political ads api, eu ad transparency data, facebook ads library bulk download, ad creative research, ad library alternative

For AI Agents & LLM Apps

Purpose: return structured Meta Ad Library ads (one JSON object per ad, 50+ fields) for a keyword, advertiser Page ID or Ad Library URL, without a login, token or browser.

Minimal working input:

{ "searchTerms": ["nike"], "searchCountries": ["US"], "maxItems": 100 }

Variant — ad spy by advertiser Page ID with change tracking:

{ "advertisers": ["15087023444"], "searchCountries": ["US"], "watchlistId": "nike-daily", "trackChanges": true, "maxItems": 200 }

Output fields (one dataset object per ad): ad_archive_id, page_id, page_name, Company Name, FB AD Link, ad_library_url, url, FB Link, Website, display_format, ad_body, ad_title, cta_text, cta_type, link_url, image_urls, video_urls, carousel_cards, snapshot, start_date, end_date, start_date_formatted, end_date_formatted, running_days, total_active_time, is_active, publisher_platform, categories, spend, currency, impressions_with_index, reach_estimate, data_reach, targeted_or_reached_countries, advertiser, aaa_info, transparency_by_location, verified_voice_context, is_aaa_eligible, contains_digital_created_media, contains_sensitive_content, position, total, query, change_type, scraped_at, plus raw collation, menu, regulation and transparency objects when present.

Behaviors an agent should know:

  • At least one target is needed: startUrls, advertisers, searchTerms or adDetailIds. A run with none produces no rows.
  • searchCountries controls the result set; the proxy exit country is separate and does not filter results.
  • scrapeAdDetails: true issues one extra billed additional_data query per ad and implies includeAdReach; includeTotalActiveAds adds another request per advertiser.
  • newAdsOnly, trackChanges and emitEndedAds require watchlistId; without it they do nothing. Already-seen ads skipped by newAdsOnly are not billed.
  • ended is only emitted for a search scanned to completion in that run — a run cut short by maxItems or throttling marks nothing as ended. Default maxItems is 10000; on a free Apify plan a run is capped at 30 ads and one search target.
  • Pagination requires residential-class IPs; leave proxy empty to use the built-in Apify Residential rotation (minDelay/maxDelay pace GraphQL calls; maxConcurrency caps targets at 10 by default).
  • Data is emitted only for ads Meta actually returns — reach/impression fields exist only for the transparency categories (political/housing/employment/credit) and EU/UK/BR delivery.

Billing: pay-per-event — apify-actor-start ($0.00005), result ($0.00013 per emitted ad on FREE/BRONZE, lower on higher tiers), additional_data ($0.0004 per scrapeAdDetails query). Ads filtered out by newAdsOnly/filterDuplicatePageIds are not billed.

  • This is an independent third-party tool. It is not affiliated with, endorsed by, sponsored by or connected to Meta Platforms, Inc., Facebook or Instagram.
  • The actor reads only publicly available Ad Library data (Meta's server-rendered search page and the same GraphQL queries the public Ad Library web app issues). It does not log in, bypass authentication, defeat CAPTCHAs or access private data.
  • You are solely responsible for ensuring your runs and your use of the output comply with Meta's Terms of Service and applicable data-protection law. Because rows can include EU/UK ad transparency data, GDPR obligations may apply to how you store and process that data.
  • The output describes advertisers and their creatives. Do not use it for unlawful targeting or for unsolicited commercial outreach that violates applicable law.
  • Data is provided as-is with no warranty of completeness or accuracy; the Ad Library changes constantly and Meta may throttle or alter its responses at any time.