Facebook Ads Library Scraper: Creative & Ad Text Details
Pricing
Pay per usage
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
Maintained by CommunityActor stats
0
Bookmarked
22
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Facebook Ads Library Scraper — Ad Copy, Creative and CTA Links
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:
| Field | Example Value | Use Case |
|---|---|---|
pageName | "Nike" | Identify which advertiser/brand the ad belongs to |
formatType | "VIDEO" | Filter or sort ads by creative type (video/image/carousel/text) |
daysRunning | 142 | Spot long-running "proven winner" creatives worth modeling |
longevityBucket | "91-180 days" | Bucket ads into a longevity band without writing custom logic |
isActive | true | Separate ads still delivering from retired ones |
startDateFormatted | "2024-11-02T00:00:00.000Z" | Track exactly when an ad started running |
endDateFormatted | null | See 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.
| Feature | Meta Ad Library API | This Scraper |
|---|---|---|
| Non-EU commercial ads | Political/social-issue only | Any public ad, any category |
| Access requirement | Developer app + access token | No login, API key, or app |
| Search input | country param + term (≤100 chars) or page ID | Plain page URL or Ad Library link |
| Derived analytics | Raw ArchivedAd list only | daysRunning, longevityBucket, formatType, advertiser roll-ups |
| Creative in every row | EU/political-ad restriction applies | Body copy, headline, CTA, media for every ad |
| Output handling | Raw JSON; you handle pagination | Ready 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.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
watchlist | No | array | Competitor 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"] |
extraCompetitorPages | No | array | Extra pages/Ad Library links merged into watchlist and deduplicated. | ["https://www.facebook.com/SHEINOFFICIAL"] |
maxAdsPerCompetitor | No | integer | Upper bound on ads returned across the whole watchlist this run (1–50,000). Leave empty for the default of 10. | 40 |
sortBy | No | string (enum) | Order results: most_recent (default), oldest, longest_running, shortest_running, advertiser. | "longest_running" |
formatFilter | No | string (enum) | Keep only one creative type: all (default), video, image, carousel. | "video" |
platformFilter | No | string (enum) | Keep only one Meta surface: all (default), facebook, instagram, messenger, audience_network, whatsapp. | "instagram" |
activeSince | No | string (date) | Keep only ads whose delivery started on/after this absolute date or relative span. Empty = no filter. | "90 days" |
adStatus | No | string (enum) | Delivery state to track: all, active, inactive. | "active" |
dedupeByCollation | No | boolean | Collapse creative variations sharing a collationId into one row each. Default false. | true |
lookbackWindow | No | string (date) | Library-side date scope passed to the Ad Library itself when a URL doesn't specify one — separate from activeSince. | "7 days" |
market | No | string (enum) | Country/region for page targets (an Ad Library link's own country wins). | "GB" |
listingOnlyMode | No | boolean | Skip the per-ad detail fetch for a faster, lighter listing-only export. Default off (deep-fetch on). | false |
includePageProfile | No | boolean | Attach a lightweight public "about" title/description for page targets. | true |
countsOnlyAudit | No | boolean | Return one total-ad-count row per target instead of per-ad rows. | false |
proxyConfiguration | No | object | Optional 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 Name | What it extracts |
|---|---|
| Facebook Page Posts & Comments Scraper | Page posts plus each post's full comment thread and replies |
| Facebook Posts Scraper: Performance Analyzer | Multi-page benchmarking — engagement averages, share-of-voice, growth deltas |
| Facebook Comments Scraper: Sentiment & Toxicity Analysis | Comment threads enriched with language, moderation flags, and optional AI sentiment/toxicity |
| Facebook Photos Scraper & High-Res Photo Export | Every resolution variant of a profile/page's public photos, with optional download |
| Facebook Marketplace: Listing Location Details Scraper | Marketplace listings geo-tagged with latitude, longitude, city, state, and distance |
| Facebook Groups Search Scraper With Group Profile Details | Discovers 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 ApifyClientclient = 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.
Is it legal to scrape the Facebook Ads Library?
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.