Competitor Ad Monitor — Google Ads Change Tracker & Alerts
Pricing
from $1.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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
- Set the competitor.
Watch by=domain,queries=["yourcompetitor.com"](or use an advertiser ID / keyword — see below). Optionally set aregion. - Run it once. The first run saves a baseline and returns every ad the competitor is currently
running, each flagged
changeType: first_run_baseline. - 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
changeType | Meaning |
|---|---|
first_run_baseline | First run for this competitor — a full snapshot of their current live ads. |
new | A creative that appeared since the last run (a fresh ad launched). |
changed | A creative still live but a watched field moved — see changedFields (e.g. it was refreshed, or variantCount scaled up/down). |
removed | A 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
| Field | Description |
|---|---|
changeType | new / changed / removed / first_run_baseline / unchanged |
changedFields | On changed rows: which fields moved, with from / to |
advertiserName | The advertiser (company / organisation) |
advertiserDomain | The advertiser's verified domain (domain-mode watches; null otherwise) |
advertiserId / creativeId | Stable Google IDs (AR... / CR...) |
adFormat | text, image, or video |
variantCount | Relative 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 / lastShown | Active-window start / end (ISO 8601 UTC); *Ts twins are unix-seconds keys |
previewUrl / imageUrl | Direct creative URL / direct image URL (image ads) |
adLibraryUrl | Deep link back to the ad on Google's Transparency Center |
watchTarget / watchMode / watchRegion | Which watch produced the row |
monitoredAt | When 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)
domain(default) — a brand / domain, e.g.["nike.com"]. Simplest for most competitors.advertiser— exact advertiser IDs (AR...) for the tightest, most exhaustive watch, e.g.["AR16735076323512287233"].keyword— a keyword; the actor resolves the top advertisers Google associates with it and monitors each one, e.g.["running shoes"]. Tune withmaxAdvertisersPerKeyword.
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
changeTotalsinRUN_SUMMARY;changedFieldson 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
removedevent 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).
keywordmode depends on Google's own advertiser suggestions; for an exact competitor, usedomainoradvertisermode.- 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.
changeTypeis filterable — ask fornewandchangedonly, and ignoreremoved/first_run_baseline.- Small default run (20 ads per watch) so a scheduled agent stays cheap.
- Flat output, one level deep, no decode logic.
Related ad-intelligence actors
- Google Ads Transparency Scraper — the full snapshot this monitor diffs against; use it for the initial deep pull.
- Competitor Ad Intel — All Platforms — Google and Bing in one normalized dataset.
- Bing Ads Library Scraper — the Microsoft/Bing Ads Library (EEA scope).
- YouTube Ads Scraper — video ads with real YouTube video IDs and watch URLs.
- Winning Ad Creatives — ranks a competitor's ads by how long they have survived, so you get the proven creatives instead of the full list.
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.