Facebook Ads Library Scraper: Creative & Ad Text Details avatar

Facebook Ads Library Scraper: Creative & Ad Text Details

Pricing

Pay per usage

Go to Apify Store
Facebook Ads Library Scraper: Creative & Ad Text Details

Facebook Ads Library Scraper: Creative & Ad Text Details

Facebook Ads Library Scraper extracts ads from the Facebook Ads Library, capturing ad creatives, texts, impressions, spend ranges, regions, advertiser info, start/end dates, and transparency data. Ideal for competitor research, ad monitoring, political ad tracking, and automated marketing insights.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

22

Total users

0

Monthly active users

2 days ago

Last modified

Share

This Facebook Ads Library Scraper pulls every public ad Meta runs for the pages on your watchlist and returns each ad's real creative — body copy, headline, call-to-action, format (video/image/carousel), publisher platforms, and delivery dates — as clean JSON, plus derived daysRunning, longevityBucket, and per-advertiser roll-ups. Built for media buyers, competitive researchers, and agencies who need to read the actual ad copy and spot long-running winning creatives, not just a headline count. Point it at any Facebook page or Ad Library link and start monitoring in minutes.

What is Facebook Ads Library Scraper: Creative & Ad Text Details?

Facebook Ads Library Scraper: Creative & Ad Text Details is an Apify Actor that reads Meta's public Ad Library for one or more Facebook pages (or direct Ad Library search links) and returns every matching ad as a structured dataset row — creative text, format, dates, and monitoring analytics included. It runs fully logged out: there is no Facebook login field in the input, and the Actor warms up its own guest session against the public Ad Library rather than using a Facebook account or Meta API key.

  • Add any number of competitor pages or Ad Library links to a single watchlist and collect them all in one run
  • Extracts the real ad creative: body copy, headline/title, CTA text and type, link URL, images, videos, and carousel cards
  • Computes monitoring analytics per ad (daysRunning, longevityBucket, formatType) and per advertiser (advertiserAggregates)
  • Filters by creative format, publisher platform, active/inactive status, and start date
  • Dedupes near-identical creative variations sharing the same collationId
  • Exports to Apify's standard dataset formats (JSON, CSV, Excel, and more) from every run

What data can I extract with Facebook Ads Library Scraper: Creative & Ad Text Details?

Each ad comes back as one dataset row combining Ad Library metadata with derived monitoring analytics. The default dataset view surfaces these columns:

FieldExample ValueUse Case
pageName"Nike"Identify which advertiser/brand the ad belongs to
formatType"VIDEO"Filter or sort ads by creative type (video/image/carousel/text)
daysRunning142Spot long-running "proven winner" creatives worth modeling
longevityBucket"91-180 days"Bucket ads into a longevity band without writing custom logic
isActivetrueSeparate ads still delivering from retired ones
startDateFormatted"2024-11-02T00:00:00.000Z"Track exactly when an ad started running
endDateFormattednullSee when a retired ad stopped (null while still active)
adArchiveID"1234567890123"Unique ad ID — links back to the ad on facebook.com/ads/library
inputUrl"https://www.facebook.com/ads/library/?...view_all_page_id=15087023444"Deep link back into the live Ad Library for this ad/advertiser

Ad creative and ad copy data

Beyond that summary view, every collected ad's full JSON record carries a snapshot object with the actual creative behind the ad: body.text is the ad's body copy, title is the headline, ctaText/ctaType is the button copy and action (e.g. SHOP_NOW), and linkUrl/linkDescription point at the landing page. cards[] holds the same fields per card for carousel ads, alongside images[] and videos[] media arrays. This creative payload comes straight from Meta's own Ad Library response, both in the fast listing pass and in the per-ad detail fetch that runs by default — so the actual wording and assets in the ad are available for every row, not just metadata like dates and format.

Platform and targeting data

publisherPlatform reports which Meta surfaces (FACEBOOK, INSTAGRAM, MESSENGER, AUDIENCE_NETWORK, WHATSAPP) carry the ad, while snapshot.countryIsoCode and the market input track the advertiser's country for page targets. collationId/collationCount group near-identical creative variants together so you can see how many versions of one creative a page is running. The run-level formatFilter, platformFilter, and adStatus filters let you narrow a competitor's ad set down to one platform, one creative format, or one delivery state before a single row ever reaches your dataset, cutting review time on large watchlists.

How does Facebook Ads Library Scraper: Creative & Ad Text Details differ from the official Meta Ad Library API?

Meta's own Graph API exposes the Ad Library through the ads_archive endpoint, but its documentation states plainly: "ads that did not reach any location in the EU will only return if they are about social issues, elections or politics" (developers.facebook.com/docs/graph-api/reference/ads_archive/, checked 2026-07-26) — the hardest limit for ordinary commercial competitor research at scale.

FeatureMeta Ad Library APIThis Scraper
Non-EU commercial adsPolitical/social-issue onlyAny public ad, any category
Access requirementDeveloper app + access tokenNo login, API key, or app
Search inputcountry param + term (≤100 chars) or page IDPlain page URL or Ad Library link
Derived analyticsRaw ArchivedAd list onlydaysRunning, longevityBucket, formatType, advertiser roll-ups
Creative in every rowEU/political-ad restriction appliesBody copy, headline, CTA, media for every ad
Output handlingRaw JSON; you handle paginationReady dataset — JSON, CSV, Excel

Why doesn't the official API return every commercial ad?

Meta's own ads_archive documentation restricts the endpoint: a purely commercial campaign — a sneaker ad, a fashion promo — that never reached the EU and isn't about politics, elections, or social issues won't come back, even though the same ad is fully visible to anyone browsing facebook.com/ads/library in a browser. This Actor reads that same public-facing search and detail surface instead of the gated endpoint, returning the creative — body copy, headline, CTA, media — for ordinary commercial ads too, not only the narrower EU/political subset the official API is limited to.

The official API is the right tool if you're already building inside Meta's developer ecosystem and only need EU or political/issue ad transparency data under its terms. This Actor is the practical route when you want the creative and copy for ordinary competitor and brand advertising, delivered as a ready dataset without managing API access.

How to use data extracted from Facebook Ads Library?

Competitive ad research and marketers

Add a competitor's page (or several) to watchlist, set sortBy to longest_running and optionally formatFilter to the creative type you care about, then run. The output gives you snapshot.body.text, title, and ctaText for every ad that's been running the longest — Meta's own signal that a creative is converting well enough to keep spending on. Media buyers and performance marketers use this to build a swipe file of proven hooks, headlines, and CTAs before briefing their own creative team, without opening a single ad in a browser or manually screenshotting a competitor's Ad Library page. Re-running the same watchlist weekly also shows which creatives a brand keeps rotating back in, versus which ones get retired after a short test.

Agencies auditing client vs. competitor accounts

Agencies running repeated competitive audits add both the client's page and every relevant competitor to one watchlist, then re-run the same job weekly or monthly. Because advertiserAggregates rolls up activeAdsCount, avgDaysRunning, and formatMix per advertiser automatically, an account manager can drop that block straight into a client report to show how a competitor's ad volume and creative mix are trending, without rebuilding the aggregation by hand each cycle. Pairing dedupeByCollation with countsOnlyAudit first also gives a quick, low-cost read on how many distinct creatives a new competitor is running before committing to a full detailed pull for the deck.

Market research and intelligence

Point the watchlist at every major player in a vertical and compare formatMix and longevityBucket distributions across advertisers to see whether a category is shifting toward video, or which brands are running the most long-lived (proven) creative. Setting market per run also lets you repeat the same category scan across different countries to spot regional creative and format differences — for example, whether carousel ads dominate one market while video dominates another, or whether one brand's longest-running ad in the US differs from its longest-running ad in the UK, all from the same watchlist structure.

AI agents and automated pipelines

An agent framework can call this Actor as a tool with a watchlist array and read back snapshot.body.text and ctaText as real, current ad-copy examples — useful as few-shot grounding for an ad-copy generator, or as fresh context in a RAG pipeline that tracks how a set of competitors' messaging changes over time, without a human opening the Ad Library first. Because the schema is stable across runs, a pipeline can diff today's adArchiveID list against yesterday's to flag newly launched creative automatically.

🔼 Input sample

All 15 input parameters are optional — nothing is required to start a run.

ParameterRequiredTypeDescriptionExample Value
watchlistNoarrayCompetitor Facebook page URLs or Ad Library links to monitor, one per line. Plain URLs, or objects with url (+ optional label, limit, period).["https://www.facebook.com/nike"]
extraCompetitorPagesNoarrayExtra pages/Ad Library links merged into watchlist and deduplicated.["https://www.facebook.com/SHEINOFFICIAL"]
maxAdsPerCompetitorNointegerUpper bound on ads returned across the whole watchlist this run (1–50,000). Leave empty for the default of 10.40
sortByNostring (enum)Order results: most_recent (default), oldest, longest_running, shortest_running, advertiser."longest_running"
formatFilterNostring (enum)Keep only one creative type: all (default), video, image, carousel."video"
platformFilterNostring (enum)Keep only one Meta surface: all (default), facebook, instagram, messenger, audience_network, whatsapp."instagram"
activeSinceNostring (date)Keep only ads whose delivery started on/after this absolute date or relative span. Empty = no filter."90 days"
adStatusNostring (enum)Delivery state to track: all, active, inactive."active"
dedupeByCollationNobooleanCollapse creative variations sharing a collationId into one row each. Default false.true
lookbackWindowNostring (date)Library-side date scope passed to the Ad Library itself when a URL doesn't specify one — separate from activeSince."7 days"
marketNostring (enum)Country/region for page targets (an Ad Library link's own country wins)."GB"
listingOnlyModeNobooleanSkip the per-ad detail fetch for a faster, lighter listing-only export. Default off (deep-fetch on).false
includePageProfileNobooleanAttach a lightweight public "about" title/description for page targets.true
countsOnlyAuditNobooleanReturn one total-ad-count row per target instead of per-ad rows.false
proxyConfigurationNoobjectOptional Apify Proxy; residential-only traffic for the whole run when enabled.{"useApifyProxy": false}
{
"watchlist": [
"https://www.facebook.com/nike",
"https://www.facebook.com/SHEINOFFICIAL"
],
"maxAdsPerCompetitor": 40,
"sortBy": "longest_running",
"formatFilter": "video",
"platformFilter": "instagram",
"activeSince": "90 days",
"dedupeByCollation": true
}

Common pitfall: activeSince and lookbackWindow are two different date filters, not one. activeSince is enforced client-side against the ads already collected ("only keep ads that started on/after X"); lookbackWindow is passed to the Ad Library itself as its own server-side date scope, and only applies when your watchlist entry is a plain page URL rather than an Ad Library link that already carries a date range. Setting only one of the two — or expecting lookbackWindow to behave like a hard cutoff on an Ad Library link that already has its own date range — is the most common mismatch.

🔽 Output sample

Each ad is one JSON row, and every run exports through Apify's standard dataset formats (JSON, CSV, Excel, and more). The default Console table view shows the nine summary columns above; the full record for every row also carries the ad's actual creative inside snapshot, plus the per-advertiser roll-up:

{
"adArchiveID": "1234567890123",
"pageID": "15087023444",
"pageName": "Nike",
"isActive": true,
"startDate": 1730505600,
"startDateFormatted": "2024-11-02T00:00:00.000Z",
"endDate": null,
"endDateFormatted": null,
"publisherPlatform": ["FACEBOOK", "INSTAGRAM"],
"formatType": "VIDEO",
"daysRunning": 142,
"longevityBucket": "91-180 days",
"collationId": "c_abc123",
"collationCount": 3,
"inputUrl": "https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=ALL&is_targeted_country=false&media_type=all&search_type=page&sort_data[direction]=desc&sort_data[mode]=total_impressions&view_all_page_id=15087023444",
"snapshot": {
"title": "Nike",
"body": { "text": "Just Do It. New season, new speed. Shop the latest running collection." },
"ctaText": "Shop now",
"ctaType": "SHOP_NOW",
"linkUrl": "https://www.nike.com/launch",
"linkDescription": "Free shipping on orders over $50.",
"displayFormat": "VIDEO",
"images": [],
"videos": [{ "video_hd_url": "https://video.fxxx.fbcdn.net/nike_ad.mp4" }],
"cards": [],
"pageCategories": ["Sporting Goods Store"],
"pageLikeCount": 38500000,
"countryIsoCode": "ALL"
},
"advertiserAggregates": {
"pageId": "15087023444",
"pageName": "Nike",
"totalAdsInRun": 18,
"activeAdsCount": 12,
"avgDaysRunning": 63.4,
"formatMix": { "VIDEO": 11, "IMAGE": 5, "CAROUSEL": 2 },
"firstSeenDate": "2024-11-02",
"lastSeenDate": "2025-06-30"
}
}

How do you filter and target specific ads?

Four real controls narrow a run from "every ad this page has ever run" down to exactly the subset you want. First, choose your source type: a plain Facebook page URL scrapes everything the Actor can see for that advertiser, while pasting a direct Ad Library search link (carrying its own q, country, or active_status query parameters) lets that link's own scope carry straight through, so a saved search you already trust in a browser behaves the same way here. Second, control scope precision with activeSince (a client-side start-date floor applied after collection), lookbackWindow (a server-side date scope sent to the Ad Library itself for plain page targets), market (the advertiser's country/region), and adStatus (active vs. inactive delivery). Third, apply quality and format thresholds: formatFilter and platformFilter keep only the creative type and Meta surface you actually care about, while dedupeByCollation collapses near-identical creative variants sharing a collationId into one row per genuinely unique creative, instead of one row per near-duplicate. Fourth, use volume controls: maxAdsPerCompetitor caps total ads returned across the whole watchlist for the run (default 10, up to 50,000), and countsOnlyAudit swaps the full per-ad pull for a single count row per target — a cheap way to size a new competitor's ad volume before committing to a full, detailed run.

{ "watchlist": ["https://www.facebook.com/nike"], "formatFilter": "video", "platformFilter": "instagram", "sortBy": "longest_running", "activeSince": "90 days" }
{ "watchlist": ["https://www.facebook.com/SHEINOFFICIAL"], "market": "GB", "adStatus": "active", "dedupeByCollation": true }
{ "watchlist": ["https://www.facebook.com/nike", "https://www.facebook.com/SHEINOFFICIAL"], "countsOnlyAudit": true }

▶️ Want to try other Facebook scrapers?

Scraper NameWhat it extracts
Facebook Page Posts & Comments ScraperPage posts plus each post's full comment thread and replies
Facebook Posts Scraper: Performance AnalyzerMulti-page benchmarking — engagement averages, share-of-voice, growth deltas
Facebook Comments Scraper: Sentiment & Toxicity AnalysisComment threads enriched with language, moderation flags, and optional AI sentiment/toxicity
Facebook Photos Scraper & High-Res Photo ExportEvery resolution variant of a profile/page's public photos, with optional download
Facebook Marketplace: Listing Location Details ScraperMarketplace listings geo-tagged with latitude, longitude, city, state, and distance
Facebook Groups Search Scraper With Group Profile DetailsDiscovers groups by keyword and profiles each one's public About-page details

How to extract Facebook Ads Library data programmatically

This Actor runs like any other Apify Actor: one API call starts the run, one call reads the finished dataset back as structured JSON — no browser and no Facebook login required on your end either.

Python example

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("SimpleAPI/facebook-ads-library-scraper-creative-ad-text-details").call(
run_input={
"watchlist": ["https://www.facebook.com/nike"],
"sortBy": "longest_running",
"formatFilter": "video",
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["pageName"], item["daysRunning"], item["snapshot"]["body"]["text"])

MCP for AI agents

The Actor can be registered as an MCP tool through Apify's hosted MCP server without any custom code:

$apify mcp install claude-code --tools SimpleAPI/facebook-ads-library-scraper-creative-ad-text-details

An agent can then call it directly with a watchlist argument and read back real ad copy (snapshot.body.text, ctaText) as grounding for a competitor-messaging assistant. Compatible clients include Claude Desktop, Claude Code, Cursor, VS Code, and Codex CLI.

Export to spreadsheets or CRM

Every run's dataset exports to CSV or Excel directly from the Apify Console (Dataset → Export). Map pageName to an Advertiser column, snapshot.body.text to Ad Copy, ctaText to CTA, daysRunning/longevityBucket to a Longevity column, and inputUrl to a clickable Source Link when importing into a spreadsheet or CRM.

Yes. Meta operates the Ad Library specifically as a public ad-transparency tool that anyone can browse without logging in, and maintaining a searchable public ad repository is itself a legal requirement for large platforms under the EU's Digital Services Act. The records this Actor returns — advertiser page name, ad creative, delivery dates, format — are business and advertising data, not personal data about private individuals, so this sits under standard website-terms and database-rights considerations rather than GDPR. If your specific use also captures personal data (for example, from an includePageProfile lookup on a personal-profile-style page), handle that data under the applicable GDPR/CCPA lawful-basis rules. Consult legal counsel for commercial applications involving bulk storage of any personal data.

❓ FAQ

Does this extract the actual ad creative and copy, not just metadata?

Yes. Every returned ad's snapshot object includes the real body copy (body.text), headline (title), CTA (ctaText/ctaType), landing-page link (linkUrl), and media (images/videos/cards) — pulled from Meta's own Ad Library response, not just delivery dates and format flags.

How do I know when an ad has stopped running?

Check isActive and endDateFormatted on each row — an ended ad has isActive: false and a real endDateFormatted, while a live ad has isActive: true and endDateFormatted: null. Set adStatus to inactive to track only retired ads.

How accurate is the spend, impressions, and reach data?

It's exactly what Meta itself discloses at request time. Meta only publishes detailed spend, impression, and reach figures for ads about social issues, elections, or politics, or for ads served in the EU — so those fields are commonly empty for ordinary commercial ads, while the creative and delivery-date fields are populated for every ad regardless of category.

How many ads can I get per run?

maxAdsPerCompetitor caps the total across the entire watchlist for that run, from 1 up to 50,000; leave it empty and the default is 10. There's no separate hidden per-page cap beyond this setting.

How do I surface only the longest-running "proven winner" ads?

Set sortBy to longest_running — the output is ordered by daysRunning descending, so the ads a brand has kept running the longest (Meta's own signal that a creative is performing) appear first.

What's the difference between activeSince and lookbackWindow?

activeSince filters the ads you already collected, client-side, to those that started on/after a given date. lookbackWindow is a separate server-side date scope sent to the Ad Library itself, and only applies to plain page targets — it's overridden whenever your watchlist entry is an Ad Library link that already carries its own date range.

Does this work with Claude, ChatGPT, and other AI agent frameworks?

Yes — it's reachable through Apify's hosted MCP server (apify mcp install claude-code --tools SimpleAPI/facebook-ads-library-scraper-creative-ad-text-details) for MCP-native clients, and callable as a standard HTTP/API call via apify-client from any other agent framework.

Can I use this without a Facebook API key, developer account, or login?

Yes. The Actor needs only an Apify account to run — no Meta developer app, access token, or Facebook login is required anywhere in its input.

How does this compare to other Ad Library scrapers?

Within this catalogue, this is the only Actor focused specifically on Ad Library creative and ad-text monitoring; a general comparison against outside tools isn't included here since no verifiable, current competitor listing data was available at the time of writing.

Conclusion

Facebook Ads Library Scraper: Creative & Ad Text Details turns Meta's public Ad Library into a structured feed of real ad copy, creative, and monitoring analytics for any page you add to a watchlist. It's built for media buyers, agencies, and researchers who need to read the actual headline, body copy, and CTA behind a competitor's ads — not just count them — and who want days-running and per-advertiser roll-ups computed automatically instead of built by hand. Add your watchlist, choose your tracking filters, and run it directly from the Apify Console or via the API to get your first competitor ad export in one pass.