Facebook Ads Library Monitor avatar

Facebook Ads Library Monitor

Pricing

from $0.30 / 1,000 ad scrapeds

Go to Apify Store
Facebook Ads Library Monitor

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

Samir Zerrouki

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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 set monitorKey. 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 ended
against the previous run. No Meta access token is required.
Don't use it when: I need targeting/demographics, the official ads_archive API, hosted
video 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 a
stable 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 not
charged. 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 ended
ads. 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"
}
FieldTypeDefaultNotes
searchQueriesarray of stringsKeywords in the public Ad Library.
pageUrlsarray of stringsAdvertiser Facebook Page URLs.
adsLibraryUrlsarray of stringsFull URLs copied from facebook.com/ads/library. Country and filters already in the URL are kept.
countrystringUSISO country code for keyword and Page searches. Ignored when a pasted library URL already has a country.
activeStatusstringactiveactive, inactive, or all.
mediaTypestringallKeyword and Page searches only. all, image, video, meme, image_and_meme, or none. Pasted library URLs keep the filter already in the URL.
maxAdsinteger50Safety cap per task (each keyword, Page, or library URL). Maximum 1000.
monitorKeystringOptional. 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):

FieldDescription
adArchiveId, adLibraryUrlLibrary identity and a link back to the public ad
collationId, collationCountMeta’s grouping of near-duplicate creatives
pageId, pageName, pageUrl, pageLikeCount, pageProfilePictureUrlAdvertiser Page
isActive, startDate, endDate, daysRunningDelivery window
platforms, categories, targetedCountries, entityTypeWhere and how the library classifies the ad
containsDigitalCreatedMedia, isAaaEligibleAI-media flag and EU AAA eligibility when present
bodyText, title, ctaText, ctaType, caption, linkUrl, linkDescription, byline, displayFormatCreative
imageUrls, videoUrls, cardsMedia addresses and carousel cards
extraLinks, extraTextsExtra creative links/text when the library sends them
spend, impressions, reachEstimate, currencyPresent only when the library shows them
aaaInfo, fevInfoEU/political transparency blobs when present
watchStatus, firstSeenAt, lastSeenAtFilled when monitorKey is set
query, countryWhich search produced the row
errorSet 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 dumpThis Actor
One-shot keyword scrapeYesYes
daysRunning on every rowRare / expensiveAlways
new / ongoing / ended on a scheduleRareWhen monitorKey is set
Meta access tokenSometimesNever
Empty searchOften fails the runError row, not charged

Pricing

Pay-per-event. There is no start fee.

EventFree tierCharged
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

  1. The Actor opens the public Ad Library the way a person does (keyword, Page, or a URL you pasted).
  2. It reads the ad records the page already renders and paginates until maxAds.
  3. Rows are normalised to the dataset schema. daysRunning is computed from the library dates.
  4. If monitorKey is 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.
  • maxAds is a cap, not a guarantee the library has that many ads.

Support

Report problems through the Issues tab on the Actor page.

License

MIT