Google Ads Transparency Scraper, Checker & Competitor Monitor avatar

Google Ads Transparency Scraper, Checker & Competitor Monitor

Pricing

from $1.50 / 1,000 ad returneds

Go to Apify Store
Google Ads Transparency Scraper, Checker & Competitor Monitor

Google Ads Transparency Scraper, Checker & Competitor Monitor

Google Ads checker and ad library scraper: check if a company or domain is running Google Ads (yes/no per domain), export competitor Search, YouTube and Display ads, or get only NEW ads since your last run. No login. Pay per result.

Pricing

from $1.50 / 1,000 ad returneds

Rating

0.0

(0)

Developer

Signal Grid

Signal Grid

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Google Ads Transparency Monitor: new competitor ads only, as diff alerts

Get an alert-ready list of the Google ads your competitors launched since your last check, and pay only for what's new. Most Google Ads Transparency Center scrapers re-download and re-bill every ad on every run. This Actor remembers what you've already seen. Schedule it with onlyNewAds: true, and each run returns only new creatives, plus one summary row per advertiser with new, dropped and active counts. On quiet weeks a run costs a few cents.

It covers Search text, Display/image and YouTube video ads from the public Google Ads Transparency Center. No login, no cookies, no proxies. By Signalgrid.

30-second start (diff alerts)

{"targets": ["hubspot.com", "salesforce.com", "Notion Labs"], "region": "US",
"maxAdsPerTarget": 100, "onlyNewAds": true, "monitorId": "my-competitors"}

Save it as a Task and add a weekly Schedule. Connect the dataset to Slack, Sheets, email or a webhook. The first run sets the baseline. After that, every run is a "new ads this week" diff.

New in 0.5

  • Bulk domain list plus ad activity tier. Paste up to 200 prospect or competitor domains into domainList and set activityTierOnly: true. You get one row per advertiser with active ads, ad count, oldest and latest shown dates, the longest-running ad and a adActivityTier of none, low, medium or high. You pay only $0.003 per advertiser and nothing per ad. It helps you qualify which prospects actually spend on Google Ads before a sales call.
  • No silent zeros. When Google returns an empty response or 0 ads for a resolved advertiser, you get an explicit, free error row (empty-upstream-response or no-ads-returned) instead of a misleading "0 ads" summary. You're never charged for it.

Three ready-made tasks (copy the input, save as a Task)

1. Weekly new-competitor-ads alert. Only ads launched since last week; schedule weekly.

{"targets": ["hubspot.com", "salesforce.com", "pipedrive.com"], "region": "US", "maxAdsPerTarget": 100, "onlyNewAds": true, "monitorId": "crm-competitors"}

2. Bulk ad export (one-off library pull). Every recent ad for a few brands, with previews.

{"targets": ["Notion Labs", "asana.com"], "region": "ANY", "maxAdsPerTarget": 500}

3. Google Ads checker for a prospect list (is this company running Google Ads?). One flat row per domain, $0.003 each, no per-ad charge.

{"domainList": "hubspot.com\nmonday.com\nexample-local-plumber.com", "activityTierOnly": true, "region": "US"}

Each domain returns runsGoogleAds (true / false / null = unknown, retry), adActivityTier, activeAdsNow and transparencyUrl (a link to check by hand). Domains with no advertiser come back as free rows with runsGoogleAds: false. Temporary failures have retryable: true and are never reported as "no ads".

Use it from AI agents (Claude, MCP, scripts)

The output is small, predictable JSON with stable field names, so it works well as an agent tool.

  • Apify MCP server: add signalgrid/google-ads-transparency-monitor as a tool in the Apify MCP server (mcp.apify.com) and ask Claude: "Check which of these 30 domains are running Google ads and rank them by ad activity tier." Or: "What new ads did hubspot.com launch since last week?"
  • One HTTP call:
curl -X POST "https://api.apify.com/v2/acts/signalgrid~google-ads-transparency-monitor/run-sync-get-dataset-items?token=$APIFY_TOKEN&maxTotalChargeUsd=0.50" \
-H 'Content-Type: application/json' \
-d '{"domainList":"hubspot.com\nmonday.com\nasana.com","activityTierOnly":true,"region":"US"}'
  • Agent tips: filter rows by type (ad, advertiser-summary or error). Always pass maxTotalChargeUsd. Reuse one monitorId per watchlist, so the diff memory persists. A SKILL.md for agent frameworks is included in the source.

Input

FieldExampleNotes
targets["hubspot.com", "Notion Labs", "AR10072600183532683265"]Domain, brand name or advertiser ID
domainList"a.com\nb.com\nc.com"Bulk paste, one per line. Merged with targets (max 200 total)
activityTierOnlytrueSummary rows only, with no per-ad charges
regionUSANY, US, GB, CA, AU, DE, FR, IN, BR, ES, IT, NL, MX, JP
maxAdsPerTarget100Newest first. You pay per ad returned
onlyNewAdstrueRepeat runs return only ads you haven't seen
monitorIdcompetitors-q4Runs with the same ID share "seen" memory

Output

Ad row

{"type":"ad","advertiserName":"monday.com LTD","format":"VIDEO","firstShown":"2026-10-13T20:24:53Z",
"lastShown":"2026-10-20T03:30:11Z","daysShown":7,"isActive":true,"isNewSinceLastRun":true,
"adUrl":"https://adstransparency.google.com/advertiser/AR15972262369074085889/creative/CR04944652816883908609?region=US",
"advertiserId":"AR15972262369074085889","creativeId":"CR04944652816883908609","region":"US"}

Advertiser summary row (one per advertiser per run)

{"type":"advertiser-summary","input":"hubspot.com","advertiserName":"Hubspot, Inc.","adsFetched":200,
"activeNow":187,"startedLast7Days":12,"newSinceLastRun":12,"noLongerReturnedSinceLastRun":4,
"adActivityTier":"high","activeAdsNow":187,"oldestFirstShown":"2021-10-25T07:00:00Z",
"latestLastShown":"2026-10-20T16:14:32Z","longestRunningAdDays":1822,"formatMix":{"TEXT":120,"IMAGE":50,"VIDEO":30}}

Error row (free)

{"type":"error","input":"example.com","errorType":"empty-upstream-response","error":"... This is NOT the same as 'no ads'; retry later. You were not charged for this advertiser."}

Pricing (pay per event)

  • $1.50 per 1,000 ads returned
  • $0.003 per advertiser summary
  • Error rows are free

Two examples:

  • A weekly diff on 10 competitors that finds 40 new ads costs 10 × $0.003 + 40 × $0.0015 = $0.09.
  • A ad-activity-tier check of 100 prospect domains costs $0.30.

Fair charging

  • Hit your max charge per run? The Actor stops cleanly, and undelivered new ads stay unseen, so they come back on the next run.
  • Unknown advertiser, outage or empty upstream response: you get a free error row. If every target fails upstream, the run fails and you're charged nothing.
  • Ad-activity-tier runs don't consume your "new ads" memory.

Monitor vs. one-shot scraper

Typical scraperThis monitor
Repeat runsRe-return and re-bill all adsOnly new ads
Per-advertiser diffNoNew, dropped, active, last 7 days
Bulk domain ad-activity checkNoYes, summary-only pricing
Empty or blocked upstreamOften a silent "0 results"Explicit free error row

FAQ

How do I get alerts when a competitor launches new Google ads? Create a Task with onlyNewAds: true and a fixed monitorId, schedule it, and connect it to Slack or a webhook.

Can I see ad spend? No. Google doesn't publish spend for commercial ads. adActivityTier counts public ads only (rule: none = 0 ads; high = 20+ active or 200+ ads; medium = 5+ active or 40+ ads; else low). It is not a spend estimate. The old budgetSignal field and budgetSignalOnly input still work as aliases.

How do I track several clients separately? Use one monitorId per client.

Limits

  • Data covers only what Google publishes. Coverage varies by region.
  • A domain resolves to the advertiser that owns most of the ads pointing at it. Other advertisers are listed in otherAdvertisersOnDomain.
  • Not affiliated with Google.

Changelog

  • 0.7 (Oct 20 2026): flat per-domain answer (runsGoogleAds, transparencyUrl), retryable on error rows, three example tasks.
  • 0.6 (Oct 20 2026): renamed budget signal to adActivityTier with its rule documented (old names still work); fuller dataset schema for agents.
  • 0.5 (Oct 20 2026): bulk domainList, activityTierOnly mode with ad-activity-tier fields, explicit free error rows for empty upstream responses, agent/MCP docs and SKILL.md.
  • 0.4 (Oct 2026): output schema and listing updates.
  • 0.2 (Oct 2026): budget-safe charging, free error rows, input dedupe.
  • 0.1 (Oct 2026): first version.