Competitor Ad Monitor — Google Ads Change Tracker & Alerts avatar

Competitor Ad Monitor — Google Ads Change Tracker & Alerts

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Competitor Ad Monitor — Google Ads Change Tracker & Alerts

Competitor Ad Monitor — Google Ads Change Tracker & Alerts

Monitor a competitor's Google ads and get only what's NEW or CHANGED since the last run — new creatives, refreshed/scaled creatives, removed ads — as a clean change-feed. Google Ads change detection, competitor ad tracking & monitoring alerts. Schedule daily; company-level only.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

mochi

mochi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Stop re-scraping. Get only what changed. Point this at a competitor and every run reports just the new, changed, and removed Google ads since the last run — a clean change-feed, not another full dump you have to diff by hand. Built for competitor ad monitoring, Google Ads change detection, ad tracking, and ad-change alerts across Google Search, Shopping, Display & YouTube.

Schedule it and forget it. Run it daily (or hourly) with Apify's native scheduler; each run compares the competitor's current ads against the snapshot it saved last time and pushes only the differences. The first run gives you a full baseline of their live ads, so you get value immediately.

Monitor a competitor daily — 3 steps

  1. Set the competitor. Watch by = domain, queries = ["yourcompetitor.com"] (or use an advertiser ID / keyword — see below). Optionally set a region.
  2. Run it once. The first run saves a baseline and returns every ad the competitor is currently running, each flagged changeType: first_run_baseline.
  3. Schedule it. In the actor's Schedules tab, add a daily (or hourly) schedule with the same input. From then on, each run's dataset contains only what's new / changed / removed since the previous run.

What each row tells you: changeType

changeTypeMeaning
first_run_baselineFirst run for this competitor — a full snapshot of their current live ads.
newA creative that appeared since the last run (a fresh ad launched).
changedA creative still live but a watched field moved — see changedFields (e.g. it was refreshed, or variantCount scaled up/down).
removedA creative that was in the last snapshot but is gone now (paused / expired).
unchanged(only if includeUnchanged is on) — a still-live, unchanged ad, for a full daily snapshot.

changed rows include a changedFields array — [{ field, from, to }] — so you (or an LLM / alert step) can see exactly what moved without comparing rows yourself.

What you get per ad

FieldDescription
changeTypenew / changed / removed / first_run_baseline / unchanged
changedFieldsOn changed rows: which fields moved, with from / to
advertiserNameThe advertiser (company / organisation)
advertiserDomainThe advertiser's verified domain (domain-mode watches; null otherwise)
advertiserId / creativeIdStable Google IDs (AR... / CR...)
adFormattext, image, or video
variantCountRelative breadth signal — how many served variants/placements Google reports for the creative. A breadth proxy to rank which ads they're running hardest — not impressions or spend (the public Center exposes neither).
firstShown / lastShownActive-window start / end (ISO 8601 UTC); *Ts twins are unix-seconds keys
previewUrl / imageUrlDirect creative URL / direct image URL (image ads)
adLibraryUrlDeep link back to the ad on Google's Transparency Center
watchTarget / watchMode / watchRegionWhich watch produced the row
monitoredAtWhen this run checked

All data is company / advertiser-level only — no personal data (PDPA / GDPR-friendly by design).

Each run also writes a RUN_SUMMARY to the key-value store (eventsPushed, changeTotals per type, errors) so you can wire an alert ("email me when changeTotals.new > 0") off a single value.

Three ways to identify a competitor (Watch by)

  1. domain (default) — a brand / domain, e.g. ["nike.com"]. Simplest for most competitors.
  2. advertiser — exact advertiser IDs (AR...) for the tightest, most exhaustive watch, e.g. ["AR16735076323512287233"].
  3. keyword — a keyword; the actor resolves the top advertisers Google associates with it and monitors each one, e.g. ["running shoes"]. Tune with maxAdvertisersPerKeyword.

Each competitor (advertiser / domain) is snapshotted separately, and region is part of a watch's identity — so watching the same competitor in US and UK gives you two independent feeds. Tip: one schedule per competitor keeps each change-feed clean and easy to alert on.

Example — watch a competitor's US ads daily

Input:

{
"searchMode": "domain",
"queries": ["nike.com"],
"region": "US",
"maxAdsPerWatch": 20
}

Run 1 returns Nike's current US ads flagged first_run_baseline. Scheduled daily, later runs return only new creatives, changed creatives (with changedFields), and any that dropped off — e.g.:

{
"changeType": "changed",
"advertiserName": "Nike, Inc.",
"creativeId": "CR03002423070389436417",
"adFormat": "image",
"variantCount": 512,
"changedFields": [
{ "field": "variantCount", "from": 466, "to": 512 },
{ "field": "lastShownTs", "from": 1779663267, "to": 1779749667 }
],
"watchTarget": "nike.com",
"watchRegion": "US",
"monitoredAt": "2026-07-27T06:00:00.000Z"
}

Why this actor

  • Change-feed, not a re-scrape — only new / changed / removed ads each run; no manual diffing.
  • Immediate value on run 1 — full baseline of the competitor's live ads.
  • Schedule-native — designed for Apify's scheduler; snapshots persist across runs automatically.
  • Alert-ready — per-type changeTotals in RUN_SUMMARY; changedFields on every changed row.
  • Reliable at scale — automatic retries with backoff and residential proxy IP rotation.
  • Company-level only — safe to use, no personal data.

Pricing

Pay per result — $0.001 per change event returned, plus a $0.00005 actor-start event. No subscription.

You pay for changes, not for re-reading the same ad list every day. A competitor that launched 5 new creatives costs about half a cent; on a quiet day with nothing new the run returns zero rows and costs essentially only the start event. Watching one competitor daily for a month typically lands in cents, not dollars.

Notes & limits

  • Only ads currently surfaced by Google's public Ads Transparency Center are considered (Google shows ads active within roughly the last year for most regions).
  • A removed event means the ad is no longer surfaced by Google — usually paused/expired.
  • To avoid false "removed" signals, if a run's fetch errors for a competitor, that watch is skipped and its snapshot is preserved (no destructive diff on a transient failure).
  • keyword mode depends on Google's own advertiser suggestions; for an exact competitor, use domain or advertiser mode.
  • Reads only public, advertiser-level transparency data; use responsibly and per Google's terms.

Use with AI agents (MCP)

This actor is available to any MCP-compatible agent (Claude, ChatGPT, Cursor, LangChain) via the hosted Apify MCP server — connect once, then ask the agent to run mochiboo/competitor-ad-monitor-google.

Want only this actor as a tool, with no store search in the way? Point the agent at https://mcp.apify.com/?actors=mochiboo/competitor-ad-monitor-google and it loads as a single named tool — the agent calls it directly instead of searching for it and possibly picking someone else.

It is a natural fit for autonomous monitoring loops:

  • Returns only the delta — an agent re-reading the same full ad list every day wastes its context; this returns just what changed.
  • changeType is filterable — ask for new and changed only, and ignore removed / first_run_baseline.
  • Small default run (20 ads per watch) so a scheduled agent stays cheap.
  • Flat output, one level deep, no decode logic.

FAQ

What happens on the very first run? There is nothing to compare against yet, so every ad comes back as first_run_baseline. That run establishes the snapshot; from the second run onward you get only real changes.

How often should I schedule it? Daily is the usual choice for creative-refresh tracking. Use the Apify scheduler — no code needed. Weekly is fine for slower niches.

How do I get alerted instead of checking the dataset? Attach a webhook or integration to the run — Slack, email, Zapier, Make, or your own endpoint — so a run with changes pushes straight to you.

Do I need a Google account? No. It reads the public Google Ads Transparency Center — no login, no cookies.

Does this collect personal data? No. Output is advertiser/company-level only (PDPA / GDPR-friendly by design).

Support & feedback

Found a bug or a missing field? Open an issue on the actor's Issues tab — this actor is actively maintained. If it saved you time, an honest review on the Apify Store helps other people find it.