Competitor Ads Monitor — New Google & Meta Ads, No Login avatar

Competitor Ads Monitor — New Google & Meta Ads, No Login

Pricing

from $10.00 / 1,000 changed ads

Go to Apify Store
Competitor Ads Monitor — New Google & Meta Ads, No Login

Competitor Ads Monitor — New Google & Meta Ads, No Login

Watch competitor domains or advertisers on Google Ads Transparency (and Meta Ad Library where reachable) and get only NEW ad creatives since the last run, with format, first/last shown dates, days running and preview link. Daily schedule. No login. MCP-ready. $10 per 1,000 alerts.

Pricing

from $10.00 / 1,000 changed ads

Rating

0.0

(0)

Developer

Khrystyna Skotte

Khrystyna Skotte

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Competitor Ads Monitor (Google + Meta)

Tell me when my competitors launch new ads. This actor checks the Google Ads Transparency Center and the Meta Ad Library (Facebook, Instagram, Messenger, Audience Network, Threads) for a list of competitors and outputs only the creatives that are new since the last run. It keeps a per-monitor memory of every ad it has already reported, so a scheduled run gives you a clean diff instead of the same thousand ads every day.

No login, no API key, no browser. Both platforms are read from their public ad-library endpoints over plain HTTP.

Meta Ad Library support is experimental. From Apify's cloud, Meta currently answers anonymous requests with a rate limit (datacenter IPs) or a 403 challenge (residential IPs), so a Meta watch logs a warning and the run continues with Google results. Add "meta" to platforms to try it; the recipe works from residential home connections and may start working from the cloud again.

What you get per changed ad

FieldDescription
platformgoogle or meta
competitorThe competitor exactly as you entered it
advertiserId, advertiserNameGoogle advertiser ID (AR…) / Meta page ID and the resolved name
creativeIdGoogle creative ID (CR…) / Meta ad archive ID
adFormatText, Image, Video (Google) or Image, Video, Carousel, Dpa… (Meta)
headline, bodyAd copy when the platform exposes it
imageUrl, previewUrl, videoUrlCreative media
landingUrl, ctaTextClick-through URL and call to action (Meta; Google text ads carry landingUrl)
publisherPlatformsMeta placements (FACEBOOK, INSTAGRAM, …)
firstShownDate, lastShownDate, daysRunningRun dates
regionsRegions in which the ad was found
adUrlPermalink to the ad in the platform's library
changeTypenew (never reported before) or reactivated (an ad that had been idle for 30+ days and is showing again)
firstSeenAt, monitorIdWhen this monitor first reported the ad

Input

FieldDefaultNotes
competitors["nike.com", "adidas.com"]Domains, brand names, Google advertiser IDs (AR…) or Meta page IDs (numeric). Domains work best on Google; brand names are resolved to the verified Meta page with the most likes.
platforms["google", "meta"]Either or both.
regions["US"]ISO country codes. ALL = worldwide. Each extra region costs one extra scan per competitor.
maxNewAdsPerCompetitor5Stop scanning a competitor/platform once this many changed ads are found.
firstRunModeemitAllSee Baseline below.
webhookUrl""Optional POST target, see Webhook.
monitorIddefaultName of the watch list. State lives in the named key-value store ads-monitor-<hash of monitorId>.
maxItems10Hard cap on output per run.
proxyConfigurationoffNot needed normally. Switch on Apify residential proxy only if a platform starts blocking.

Scheduling a monitor

  1. Create a Task from this actor with your competitors, regions, a monitorId such as running-shoes and firstRunMode: "baseline".
  2. Run it once. It records every current ad as already-seen and outputs nothing.
  3. Add a Schedule (daily is plenty; ad libraries update once a day). Every later run outputs only the ads whose first-shown date is on or after the previous run (with a 7-day safety lookback) and that the monitor has not reported before.
  4. Read the dataset of each run, or point webhookUrl at Slack, Zapier, Make, n8n or your own endpoint.

Keep the same monitorId on every run. A new monitorId starts a fresh baseline. To reset a monitor, delete the ads-monitor-<hash> key-value store (or its STATE record) from Storage.

Baseline vs emitAll

  • emitAll (default): the first time a competitor is seen, its current ads are output (up to the caps). Good for a one-off look and for testing.
  • baseline: the first time a competitor is seen, its current ads are silently recorded. Nothing is output until something genuinely new appears. Use this for scheduled monitors.

After the first run both modes behave identically. Adding a competitor to an existing monitor treats only that competitor as a first run.

Change types

  • new: the ad ID was never reported by this monitor and its first-shown date is at or after the last run (minus 7 days). Older ads that the monitor simply never scanned before are absorbed into the baseline silently.
  • reactivated: an ad that was already known but whose last-shown date jumped by more than 30 days since the monitor last saw it, i.e. the competitor revived a paused creative.

Webhook payload

If webhookUrl is set, the actor sends one POST per run (even when nothing changed) with Content-Type: application/json:

{
"monitorId": "running-shoes",
"runId": "abc123",
"newCount": 3,
"ads": [ { "platform": "meta", "competitor": "nike.com", "changeType": "new", "headline": "…", "adUrl": "…", "...": "..." } ]
}

ads holds the first 50 changed ads; the full list is always in the run's dataset.

Platform coverage and limits

Google Ads Transparency Center

  • Resolves domains through Google's domain index and names through advertiser suggestions. Pass an AR… advertiser ID to skip resolution.
  • Google has no first-shown-date filter, so each run scans the advertiser's creatives ordered by last-shown date, up to 160 per competitor per region, and filters by first-shown date client-side. Very large advertisers that launch more than ~160 creatives between runs will have the overflow picked up on later runs.
  • Google exposes text, image and video creatives with first/last shown dates and days running. Headline/body text is only present for text ads; image ads return the rendered image.

Meta Ad Library

  • Resolves brand names and domains to a Facebook page through the Ad Library typeahead (exact name match, then verified page with the most likes). Pass a numeric page ID for full control. The page ID is cached in the monitor state after the first run.
  • Only active ads are scanned, newest collations first, up to 160 per competitor per region. The Ad Library's own start-date filter is not used because it silently drops ads it should return; recency is decided from each ad's start date instead.
  • Meta hides spend and impression ranges for non-political ads; those are not included.
  • The Ad Library front door serves a JavaScript verification challenge; the actor replays it automatically. If Meta starts rejecting Apify's datacenter IPs, enable the residential proxy option. When Meta cannot be reached in a run, the run continues with Google and logs an error rather than failing.

General

  • Up to 160 creatives are scanned per competitor, platform and region per run.
  • State (seen ad IDs, per-competitor watermarks, resolved advertiser IDs) lives in a named key-value store so it survives across runs and Tasks.
  • Pricing: a small start fee plus a per-record fee for each changed ad reported. Runs that find nothing new cost only the start fee.