Facebook Ads Library Monitor
Pricing
from $0.30 / 1,000 ad scrapeds
Facebook Ads Library Monitor
Scrape the public Meta Ad Library and watch competitor ads over time. Every row includes daysRunning. On scheduled re-runs, ads are labelled new, ongoing, or ended. No Meta token.
Pricing
from $0.30 / 1,000 ad scrapeds
Rating
0.0
(0)
Developer
Samir Zerrouki
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
A competitor-ad monitor for the public Meta Ad Library, priced like a dump.
Every ad row includes daysRunning. On a scheduled re-run with the same monitorKey,
each ad is labelled new, ongoing, or ended. No Meta token. No official API.
That combination is the point: you can watch a competitor’s ads week after week without paying a luxury SKU for a field the library already shows.
What you get
One flat dataset row per ad:
{"adArchiveId": "1234567890","pageName": "Example Brand","isActive": true,"startDate": "2026-01-15","daysRunning": 48,"bodyText": "Free shipping this week.","ctaText": "Shop now","imageUrls": ["https://..."],"watchStatus": "ongoing","firstSeenAt": "2026-03-01T12:00:00Z","lastSeenAt": "2026-04-12T12:00:00Z"}
daysRunning— days from the library start date to today (or to the end date if the ad has stopped).watchStatus— only when you setmonitorKey. Compare this run to the previous snapshot for that key.- Media URLs — image and video addresses the library already publishes. This Actor does not host files.
- Spend / impressions — included when the public library shows them. Many ads omit them.
Empty searches and blocked loads write an error row and the run still succeeds. They are not charged.
🤖 Use with AI agents
Connected to the Apify MCP server? Ask for this Actor by name:
zerrouki-samir/facebook-ads-library
Copy this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want to monitor competitor ads in Meta's public Ad Library using the Apify Actor`zerrouki-samir/facebook-ads-library`.Use it when I need: a cheap dump of currently running (or stopped) ads for a keyword,Facebook Page, or pasted Ad Library URL, plus how long each ad has been running.On a schedule, pass the same monitorKey so each ad is labelled new, ongoing, or endedagainst the previous run. No Meta access token is required.Don't use it when: I need targeting/demographics, the official ads_archive API, hostedvideo files, or a crawl of the landing page HTML.How to call it: pass searchQueries (keywords), and/or pageUrls, and/or adsLibraryUrls.Set country to a two-letter ISO code (default US), activeStatus to active / inactive / all,optional mediaType (all / image / video / meme / image_and_meme / none),and maxAds as a safety cap per task (default 50, max 1000). Optional monitorKey is astable string per watch, e.g. nike-us-weekly.Each successful ad is one dataset row with adArchiveId, page name, copy, media URLs,daysRunning, and optional watchStatus. Empty searches return an error row and are notcharged. Residential proxies are required on the Apify platform.Start with this input:{"searchQueries": ["running shoes"],"country": "US","activeStatus": "active","maxAds": 50,"monitorKey": "running-shoes-us-weekly"}Ask me which brands or keywords to watch, then run the Actor and summarise new vs endedads. If I asked for creatives, show bodyText, ctaText, and the image/video URLs.
Things to ask your agent for:
- Which of this competitor’s ads are new since last week, and how long has each been running?
- Dump active ads for this Page URL and give me the copy plus image URLs.
- Watch this keyword in the US every Monday and tell me what stopped.
A machine-readable description of this Actor is published at apify.com/zerrouki-samir/facebook-ads-library.md once the Actor is live on the Store.
Input
Provide at least one of searchQueries, pageUrls, or adsLibraryUrls.
{"searchQueries": ["running shoes"],"pageUrls": ["https://www.facebook.com/examplebrand"],"adsLibraryUrls": [],"country": "US","activeStatus": "active","maxAds": 50,"monitorKey": "running-shoes-us-weekly"}
| Field | Type | Default | Notes |
|---|---|---|---|
searchQueries | array of strings | — | Keywords in the public Ad Library. |
pageUrls | array of strings | — | Advertiser Facebook Page URLs. |
adsLibraryUrls | array of strings | — | Full URLs copied from facebook.com/ads/library. Country and filters already in the URL are kept. |
country | string | US | ISO country code for keyword and Page searches. Ignored when a pasted library URL already has a country. |
activeStatus | string | active | active, inactive, or all. |
mediaType | string | all | Keyword and Page searches only. all, image, video, meme, image_and_meme, or none. Pasted library URLs keep the filter already in the URL. |
maxAds | integer | 50 | Safety cap per task (each keyword, Page, or library URL). Maximum 1000. |
monitorKey | string | — | Optional. Same key on scheduled re-runs labels ads new / ongoing / ended. |
Output
Dataset — one flat row per ad (or one error row per failed/empty task):
| Field | Description |
|---|---|
adArchiveId, adLibraryUrl | Library identity and a link back to the public ad |
collationId, collationCount | Meta’s grouping of near-duplicate creatives |
pageId, pageName, pageUrl, pageLikeCount, pageProfilePictureUrl | Advertiser Page |
isActive, startDate, endDate, daysRunning | Delivery window |
platforms, categories, targetedCountries, entityType | Where and how the library classifies the ad |
containsDigitalCreatedMedia, isAaaEligible | AI-media flag and EU AAA eligibility when present |
bodyText, title, ctaText, ctaType, caption, linkUrl, linkDescription, byline, displayFormat | Creative |
imageUrls, videoUrls, cards | Media addresses and carousel cards |
extraLinks, extraTexts | Extra creative links/text when the library sends them |
spend, impressions, reachEstimate, currency | Present only when the library shows them |
aaaInfo, fevInfo | EU/political transparency blobs when present |
watchStatus, firstSeenAt, lastSeenAt | Filled when monitorKey is set |
query, country | Which search produced the row |
error | Set on empty searches and task failures; the run still succeeds |
Key-value store (named fb-ads-monitor) — when monitorKey is set, a snapshot under
snapshot-<monitorKey> so the next run can diff. The run-default store does not survive
schedules; this named store does.
Why a monitor, not another dump
The public Ad Library is already scraped by several Store Actors. This one is built for re-runs:
| Typical dump | This Actor | |
|---|---|---|
| One-shot keyword scrape | Yes | Yes |
daysRunning on every row | Rare / expensive | Always |
new / ongoing / ended on a schedule | Rare | When monitorKey is set |
| Meta access token | Sometimes | Never |
| Empty search | Often fails the run | Error row, not charged |
Pricing
Pay-per-event. There is no start fee.
| Event | Free tier | Charged |
|---|---|---|
ad-scraped | $0.0005 ($0.50 / 1k) | Once per successfully stored ad |
Gold is about $0.0003 per ad. Error rows, empty searches, duplicates, and ended rows
inferred from a previous snapshot are not charged.
Residential proxy and compute are billed by Apify on top of PPE. A 200-ad platform run used about 3 MB of residential traffic and finished in under two minutes.
How it works
- The Actor opens the public Ad Library the way a person does (keyword, Page, or a URL you pasted).
- It reads the ad records the page already renders and paginates until
maxAds. - Rows are normalised to the dataset schema.
daysRunningis computed from the library dates. - If
monitorKeyis set, this run is compared to the last snapshot for that key.
No login. No official Graph ads_archive API. Residential proxies are required on the
Apify platform; local runs can hit the library directly.
Limitations
- The public library page changes. This is a maintenance product, not a one-shot scrape.
- Spend, impressions, and some creatives are missing for many ads — that is how the library publishes them.
- Video files are not downloaded or hosted; you get URLs only.
- Demographics / targeting breakdowns are out of scope.
- Landing-page HTML is not crawled.
maxAdsis a cap, not a guarantee the library has that many ads.
Support
Report problems through the Issues tab on the Actor page.
License
MIT