Google Ads Transparency Scraper & Competitor Ad Monitor avatar

Google Ads Transparency Scraper & Competitor Ad Monitor

Pricing

from $0.12 / 1,000 creative scanneds

Go to Apify Store
Google Ads Transparency Scraper & Competitor Ad Monitor

Google Ads Transparency Scraper & Competitor Ad Monitor

Scrape the Google Ads Transparency Center for exact advertiser accounts and track what changed in a competitor's creative library. Export current ad creatives, formats, impression ranges, and start dates, then detect new, stopped, resumed, and changed ads in webhook-ready JSON.

Pricing

from $0.12 / 1,000 creative scanneds

Rating

0.0

(0)

Developer

Kamer Ozkan

Kamer Ozkan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Categories

Share

Track what changed in a verified competitor's Google Ads creative library.

This Actor scrapes current creatives from exact Google Ads Transparency advertiser accounts and tracks new, stopped, resumed, and changed creatives across later runs. It is designed for competitor research, swipe-file exports, scheduled monitoring, agency reporting, and webhook automation.

You do not need a Google Ads account, cookies, or a Google Ads API key.

What problem does it solve?

A normal Google Ads scraper downloads the same creative rows every day. Your workflow still has to decide what is actually new, what disappeared, and whether a failed or partial scrape created a false alarm.

This Actor keeps monitor history and returns a clean change feed:

  • NEW: a creative appeared after the baseline
  • DISCOVERED: Google returned a previously unseen creative whose own first-shown date predates the last accepted scan
  • MISSING_ONCE: one tentative absence, available only when requested
  • STOPPED_CONFIRMED: absent from two consecutive complete scans
  • RESUMED: a previously stopped creative returned
  • ASSET_CHANGED: the same creative ID returned with different creative content

The first successful run creates the monitoring baseline. The default ALL_CHECKED output returns every current creative as a CURRENT row, while keeping existing ads out of the NEW event stream. Scheduled users can switch to CHANGES_ONLY.

Google can occasionally return an older creative that was absent from an earlier snapshot. The Actor labels that record DISCOVERED, not NEW. A NEW event requires the source's own firstShown date to be on or after the previous accepted scan date.

Why use this Actor?

Exact advertiser isolation

The input accepts native Google advertiser IDs such as AR13568824525935607809. Domain searches can mix official brand accounts, agencies, affiliates, and unrelated advertisers. Exact IDs keep each monitor tied to the account you selected.

Safer stopped-ad detection

A creative is not marked stopped after one absence. STOPPED_CONFIRMED requires:

  1. Two consecutive successful source runs
  2. Complete pagination in both runs
  3. The creative missing from both complete snapshots
  4. At least six hours between the first absence and confirmation

Failed, blocked, timed-out, or capped scans do not advance the stopped-ad counter. Immediate retries cannot confirm a stopped creative.

Google preview-container parameters can rotate without the creative changing. Those volatile parameters are excluded from asset identity. Direct media changes and stable creative fields can still produce ASSET_CHANGED. When Google switches the same creative between an opaque preview container and a direct media URL, the Actor updates its evidence without claiming that the ad changed.

Automatic large-account protection

AUTO mode chooses the safest behavior for every advertiser:

  • Complete scan: full lifecycle monitoring
  • Result or page cap reached: new-launch feed only

The Actor never claims that an ad stopped when the account was only partially scanned.

Changes-only output

Use CHANGES_ONLY for scheduled runs. The dataset stays empty when nothing changed, making it easy to connect the Actor to Slack, Discord, Make, Zapier, n8n, or your own webhook.

Quick start

Use one exact advertiser ID for the first test:

{
"advertiserIds": ["AR13568824525935607809"],
"region": "US",
"monitorName": "competitor-watch",
"mode": "AUTO",
"lookbackDays": 7,
"maxCreativesPerAdvertiser": 1000,
"outputMode": "ALL_CHECKED"
}

The first run returns the current creatives and creates the baseline. Run it again with the same monitorName, advertiser IDs, region, and activity window to receive verified changes.

Example change

{
"recordType": "CHANGE",
"status": "NEW",
"eventId": "evt_2cad1f37712f32ad1af8a9a71f827452",
"eventType": "NEW",
"monitorName": "competitor-watch",
"modeUsed": "FULL_LIFECYCLE",
"region": "US",
"advertiserId": "AR13568824525935607809",
"advertiserName": "Linear Orbit, Inc.",
"creativeId": "CR_EXAMPLE",
"format": "VIDEO",
"firstShown": "2026-07-23",
"primaryAssetUrl": "https://tpc.googlesyndication.com/example-creative.mp4",
"sourceUrl": "https://adstransparency.google.com/advertiser/AR13568824525935607809/creative/CR_EXAMPLE?region=US",
"evidence": {
"baseline": false,
"runId": "competitor-watch:AR13568824525935607809:US:7d:2026-07-23T08:00:00.000Z"
},
"detectedAt": "2026-07-23T08:00:00.000Z",
"schemaVersion": "1.0"
}

Example current creative

{
"recordType": "CURRENT",
"status": "CURRENT",
"eventId": null,
"eventType": null,
"advertiserName": "Linear Orbit, Inc.",
"creativeId": "CR_EXAMPLE",
"format": "IMAGE",
"region": "US",
"firstShown": "2026-07-20",
"primaryAssetUrl": "https://tpc.googlesyndication.com/example-creative.png",
"sourceUrl": "https://adstransparency.google.com/advertiser/AR13568824525935607809/creative/CR_EXAMPLE?region=US"
}

Input fields

FieldDescriptionDefault
advertiserIds1-20 native AR... IDs or advertiser URLsRequired
regionCountry where the ads were shownUS
monitorNameStable history name for one watchlistcompetitor-watch
modeAUTO, FULL_LIFECYCLE, or NEW_LAUNCH_FEEDAUTO
lookbackDaysRolling activity window from 1 to 90 days7
maxCreativesPerAdvertiserPer-advertiser result and billing safety cap1000
outputModeCurrent creatives plus changes, or changes onlyALL_CHECKED
includeBaselineIn changes-only mode, label first-run creatives as NEWfalse
includeTentativeInclude internal MISSING_ONCE eventsfalse

Monitoring modes

Auto

Recommended for most users. Full lifecycle is used only when all source pages finish. Large accounts automatically fall back to a safe new-launch feed.

Full lifecycle

Requires a complete advertiser scan. If the configured cap is reached, the target is reported as INCOMPLETE, history is not advanced, and no verified creative checks are billed for that target.

New launch feed

Tracks previously seen creative IDs and emits only new ones. This mode can operate on a capped recent window because it never produces stopped-ad claims.

Output modes

Changes only

Returns only lifecycle events. Use this for schedules, webhooks, Slack, Discord, Make, Zapier, and n8n. The first baseline produces zero rows because existing ads are not new launches.

Changes and all checked creatives

The default mode. Adds one CURRENT row per verified creative and includes any verified change events. Use it for the first run, one-time exports, audits, and swipe-file workflows.

Supported countries

The Actor currently supports 33 major Google Ads markets:

AE, AT, AU, BE, BR, CA, CH, CZ, DE, DK, ES, FI, FR, GB, GR, HU, IE, IN, IT, JP, KR, MX, NL, NO, NZ, PL, PT, RO, SE, SG, TR, US, ZA.

Country criteria use active Google geo target constants.

How to find the advertiser ID

  1. Open Google Ads Transparency Center.
  2. Search for the advertiser.
  3. Open the advertiser page.
  4. Copy the AR... value from the URL.

Example:

https://adstransparency.google.com/advertiser/AR13568824525935607809

You can paste either the full URL or only the advertiser ID into the Actor input.

Scheduling and webhooks

For daily monitoring:

  1. Save the Actor input as an Apify Task.
  2. Keep the same monitorName and scope settings.
  3. Add an Apify Schedule.
  4. Add a webhook for ACTOR.RUN.SUCCEEDED.
  5. Read the default dataset. Zero rows means no confirmed change was emitted.

Every change includes a deterministic eventId. Use it as the idempotency key when a webhook or downstream workflow retries delivery.

Changing monitorName, advertiser ID, region, or lookbackDays creates a different history scope.

Billing

The Actor charges per successfully verified creative check. A check can be billed even when an unchanged row is hidden by CHANGES_ONLY, because the source request, advertiser isolation, and history comparison were completed.

  • Creatives scanned: $0.15 per 1,000
  • Verified changes: $5.00 per 1,000 — never charged on a monitor's first run
  • Actor start: $0.005 per GB of run memory
  • Platform usage and proxies: included

You pay a low rate for looking, and only pay the higher rate when something actually changed. A full-dump scraper charges you the same amount every single day whether the library moved or not.

What daily monitoring actually costs

One advertiser, 1,000 creatives, checked daily for 30 days, with a typical five changes a day:

This ActorFull-dump scraper at $0.80 / 1K
Day 1 (baseline, no change fee)$0.15$0.80
Each later day$0.175$0.80
30-day total$5.23$24.00

That is 4.6x cheaper for the same coverage — and the output is already reduced to what changed, so nothing downstream has to diff it again.

A one-off export is cheaper too: 1,000 creatives in a single run costs $0.15 against $0.80.

The default 1,000-creative cap limits scan charges to $0.15 per advertiser. With 20 advertisers at the full default cap, the maximum scan charge is $3.00 plus changes and the Actor start. Most advertisers return fewer rows and cost less.

Dataset rows are not a separate billable event, so ALL_CHECKED does not create a second result charge.

These cases are not billed as verified creative checks:

  • Advertiser lookup failure
  • Source request failure
  • Advertiser contamination
  • Explicit FULL_LIFECYCLE run that cannot finish pagination
  • Suspicious empty snapshot after a previously active library
  • Records beyond the run's maximum charge limit

The OUTPUT record contains the exact billed check count and a per-advertiser accounting summary.

Reliability evidence

The pre-launch benchmark on July 22-23, 2026 included:

  • 25/25 successful source targets across the United States and Germany
  • 820 source records with zero duplicate creative IDs
  • 100% native creative ID, asset, and date coverage on non-empty targets
  • 8 verified advertiser accounts with full pagination
  • 1,072 creatives per complete canary round
  • Two consecutive complete rounds with zero false lifecycle events
  • Direct HTTP rate-limit detection with a browser-session fallback
  • A separate live United Kingdom smoke test with complete pagination

Automated tests cover baseline behavior, duplicate handling, incomplete-run safety, two-run stopped confirmation, resume detection, asset fingerprint stability, billing limits, account isolation, and state persistence.

Important limitations

  • Google Ads Transparency Center is a public transparency source, not the Google Ads performance API.
  • The Actor does not provide spend, conversions, ROAS, exact impressions, or campaign performance.
  • A missing transparency record does not prove that a campaign was deleted inside Google Ads.
  • A complete but empty snapshot cannot erase a previously active library. The target is flagged as SUSPICIOUS_EMPTY, history is preserved, and no stopped events are emitted.
  • Creative links and media availability depend on what Google exposes publicly.
  • Very large advertisers may use NEW_LAUNCH_FEED in Auto mode rather than full stopped-ad detection.
  • The Actor monitors one delivery country per run. Create separate tasks for separate countries.
  • Avoid overlapping runs that use the same monitor name and scope. Schedule the next run after the previous run finishes. Every change includes a deterministic eventId so downstream systems can safely deduplicate retried delivery.
  • Google reports source dates at day-level granularity. A NEW event means the source date is on or after the previous accepted scan date, not that the exact launch minute is known.

FAQ

Can I enter a domain such as nike.com?

Not in this Actor. Domain searches can mix multiple advertiser accounts. Use an exact advertiser ID to preserve account isolation.

Why was my first dataset empty?

You selected CHANGES_ONLY, so the first successful run created a silent baseline. Use the default ALL_CHECKED mode when you want the current creative snapshot on the first run.

Why did Auto mode use New Launch Feed?

The advertiser had more creatives than the configured cap. Auto mode refused to make stopped-ad claims from a partial snapshot.

Does a stopped event require two days?

It requires two consecutive complete scheduled runs, not a fixed number of days. With a daily schedule, confirmation normally takes two daily absences.

Can I monitor several competitors?

Yes. Add up to 20 advertiser IDs. Every advertiser receives an independent state and completeness decision.

Is this affiliated with Google?

No. This Actor is not affiliated with or endorsed by Google. Users are responsible for using public data lawfully and in accordance with applicable rules.