Google Ads Transparency Checker: Is a Domain Running Ads?
Pricing
from $2.28 / 1,000 advertiser founds
Google Ads Transparency Checker: Is a Domain Running Ads?
Check if a company runs Google Ads by domain or brand, straight from Google's own Ads Transparency Center. One row per advertiser: identity, verified status, ad counts by format and recency, sample links. Monitor competitors: flag ads started or stopped since the last run. Never charged for a miss.
Pricing
from $2.28 / 1,000 advertiser founds
Rating
0.0
(0)
Developer
Adrian Voss
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Google Ads Presence Lookup: Google Ads Transparency Checker
Paste a list of company domains (or brand names). Get back one row per company telling you whether it's running Google Ads right now — with the advertiser's verified identity, how many ads are in Google's library, how many ran in the last 30 days, the format mix (image / text / video), first and last seen dates, and links to sample ads. Data comes straight from Google's own Ads Transparency Center, the public register of every ad shown by verified Google advertisers.
Who it's for
- Outbound and RevOps teams enriching a lead list: "does this prospect spend on Google Ads?" is a buying-intent and budget signal you can filter on in Clay, n8n, or a spreadsheet.
- Agencies prospecting for ad clients: find companies that are already advertising (they have budget) or not yet advertising (they need you).
- Competitor and market analysts who want a quick per-company read — active ad program or not, how heavy, which formats — without scraping thousands of creatives.
- AI agents that need a single structured answer per company, callable over plain HTTP.
Why this one
Every other Google Ads actor on Apify is a bulk creative scraper: you give it a query, it downloads hundreds or thousands of individual ads, and you pay per ad. That's the right tool for building a creative-intelligence archive — and the wrong tool for enriching a 5,000-row lead list, where you'd pay for 500 ads from one company just to learn "yes, they advertise."
This actor asks the opposite question: one input company → one output row, sized and priced as an enrichment column.
- One row per company, not one per ad. Predictable output, predictable cost.
- Never charged for a miss. A company with no ads in the Transparency Center costs you nothing.
- Domains beat brand names. A domain (
acme.com) is matched against ads that actually link to it — the strongest possible signal. Brand names are matched against Google's advertiser register with exact-name ranking (a search for "nike" on Google's own site ranks a small Kenyan advertiser named "Nike" above Nike, Inc. — this actor corrects for that). - Verified identity included. Google's advertiser verification status, legal name, and country come from the advertiser's own Transparency page.
What you get
One dataset row per input, with these columns (all included by default; select fewer with the columns input):
| Column | Meaning |
|---|---|
advertiserName / advertiserId | The top advertiser behind this domain's ads (or the matched advertiser for a brand-name query) and its stable AR… Transparency Center ID |
verified | Whether the advertiser passed Google's identity verification |
legalName | The advertiser's legal name on file with Google |
advertiserCountry | Advertiser's registered country (ISO code) |
creativeCount / creativeCountLowerBound | Estimated ads in Google's library — Google reports a range; creativeCount is the upper estimate its own UI displays ("~9K ads"), exact for small advertisers |
creativesLast30d / activeLast30d | Estimated ads shown in the last 30 days, and the yes/no flag most lists filter on |
imageAds / textAds / videoAds | Estimated ad counts by format — "are they running video?" in one column |
firstSeenAt / lastSeenAt | Earliest and latest ad-shown dates among the sampled creatives |
advertiserCount / advertisersSeen | Distinct advertisers observed running ads to this domain (agencies, resellers, and regional entities show up here) |
sampleCreativeUrls | Up to 5 direct links to real ads in the Transparency Center |
transparencyUrl | The advertiser's public Transparency Center page |
inputType / region | Whether the input matched as a domain or brand, and the region scope (anywhere) |
isNew / changeType / changePct | Monitoring only (empty otherwise): whether the advertiser's ad presence changed since the last report, how (started, stopped, scaled-up, scaled-down, none), and by what percent |
monitorFirstSeenAt | Monitoring only: when this watchlist first recorded the advertiser |
Run it on a schedule
Point this actor at the same queries list on a cadence with Only return advertisers whose ad presence changed since the last run (deltaMode: true) turned on, and it becomes a competitor Google Ads monitor: each run reports only the advertisers whose ad presence changed since the last one, not the whole list every time. Give the watchlist a deltaName if you plan to edit the domain list later without resetting the baseline.
Schedule it in Apify (Schedules > Create) or trigger it from n8n/Make; the delta state lives in a named key-value store, so every schedule run bills only new rows.
How to use Google Ads Presence Lookup — Is This Domain Running Ads?
- In the Apify Console. Open the actor page and click Start — the
queriesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~google-ads-presence-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"queries":["nike.com","booking.com"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Bulk example. A 27-domain input spanning retail, travel, SaaS, and consumer apps:
{"queries": ["nike.com", "booking.com", "stripe.com", "shopify.com", "airbnb.com","spotify.com", "netflix.com", "salesforce.com", "hubspot.com", "mailchimp.com","walmart.com", "target.com", "ebay.com", "zendesk.com", "dropbox.com","slack.com", "zoom.us", "adobe.com", "samsung.com", "sony.com","ikea.com", "hm.com", "zara.com", "uber.com", "lyft.com","doordash.com", "instacart.com"]}
27 domains ≈ $0.081 if every one is found ($0.003 per found row, plus the $0.00005
actor-start charge) — misses (found:false) are never billed.
Input
{"queries": ["nike.com","booking.com"]}
One brand name or company domain per line. Domains match more reliably than brand names. Accepted formats: nike.com, https://www.nike.com/gb/, Nike, Inc..
Sample output
| query | found | status | advertiserName | advertiserId | verified | legalName | advertiserCountry | creativeCount | creativeCountLowerBound | creativesLast30d | activeLast30d | imageAds | textAds | videoAds | firstSeenAt | lastSeenAt | advertiserCount | advertisersSeen | sampleCreativeUrls | transparencyUrl | inputType | region | isNew | changeType | changePct | monitorFirstSeenAt | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| nike.com | true | OK | Nike Retail BV | AR18378488041124659201 | true | Nike Retail BV | NL | 200000 | 100000 | 30000 | true | 100000 | 8000 | 6000 | 2021-10-25 | 2026-09-21 | 3 | [{"advertiserId":"AR18378488041124659201","advertiserName":"Nike Retail BV"},{"advertiserId":"AR16735076323512287233","advertiserName":"Nike, Inc."},{"advertiserId":"AR01266454498310619137","advertiserName":"유한회사 나이키코리아"}] | ["https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR07919558237966303233?region=anywhere","https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR15660319375401943041?region=anywhere","https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR03316943164698263553?region=anywhere","https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR11041192669731618817?region=anywhere","https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR13949476001227472897?region=anywhere"] | https://adstransparency.google.com/advertiser/AR18378488041124659201?region=anywhere | domain | anywhere | 2026-09-21T06:10:15.697Z |
Monitoring: only presence changes
Turn on Only return advertisers whose ad presence changed since the last run and this actor becomes a competitor ad alert. Each advertiser is compared with the numbers it last reported, and it is returned and billed only when it started or stopped running Google ads, or when its ads shown in the last 30 days or its total ads moved by more than Minimum change (%) (default 25). changeType says how (started, stopped, scaled-up, scaled-down) and changePct says how much. An advertiser that did not change comes back as an uncharged UNCHANGED row.
The first run has nothing to compare against, so it reports every advertiser and stores its numbers as the baseline. This watches presence and volume, not individual new ads.
To turn that into an alert:
- Save your competitor list as a task with the checkbox on and Hide rows with no result on.
- Add a Schedule to that task, daily or weekly.
- Add a webhook on Run succeeded, pointing at Slack, n8n, Make or Zapier.
Baselines live in a named key-value store, google-ads-presence-lookup-delta, one record per watchlist and advertiser.
Pricing
$3 per 1,000 brands or domains, plus a $0.00005 start fee. Misses (found:false) are never charged.
Compare: assembling the same answer from a bulk creative scraper at ~$0.80 per 1,000 ads means paying for every ad a big advertiser runs just to learn that they advertise — a single Nike-sized company can cost more than this actor's entire 1,000-company run. Clay's own enrichment credits run $0.08–0.40 per row.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~google-ads-presence-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"queries":["nike.com","booking.com"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~google-ads-presence-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"queries":["nike.com","booking.com"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~google-ads-presence-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"queries":["{{brand or domain}}"]}, mapping the row's brand or domain into the queries array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Google Ads Transparency Checker by Domain | Apify" — the agent will find and run this actor.
Tips
- Prefer domains over brand names.
acme.commatches ads by their landing-page domain — unambiguous. "Acme" has to go through advertiser-name search, which can hit same-named companies in other countries. TheinputTypecolumn tells you which path each row took. activeLast30dis the enrichment flag.creativeCountincludes historical ads; a company can have thousands in the library and none running this month.- Counts are Google's own estimates. For large advertisers Google reports order-of-magnitude ranges (8,000–9,000 for Nike, Inc. — the UI shows "~9K"); for small advertisers they're exact.
creativeCountis the upper bound,creativeCountLowerBoundthe lower. firstSeenAtis sampled, not global. It's the earliest first-shown date among the sampled creatives (newest-first ordering), so treat it as "advertising since at least…", not the advertiser's true first-ever ad date. It is unrelated tomonitorFirstSeenAt, which is when your monitoring watchlist first recorded the advertiser.- Multiple advertisers per domain is normal. Large brands advertise through regional entities and agencies (
nike.comshows Nike Retail BV, Nike, Inc., WPP Media, and more).advertisersSeenlists what was observed; the row's identity fields describe the most frequent one. - Keep the RESIDENTIAL proxy default. Google serves these endpoints happily to residential IPs; shared datacenter IPs are much more likely to be rate-limited mid-run.
FAQ
What does "no ads found" (found: false) actually mean?
No advertiser in Google's Transparency Center currently has (or recently had) ads linking to that domain, or no advertiser register entry matched your brand name. It does not distinguish "never advertised" from "ads aged out of the library". Misses are never charged.
How fresh is the data?
It's read live from Google's Transparency Center at run time — the same data Google shows the public, including ads shown the same day (lastSeenAt is often today's date for active advertisers).
Which regions are covered?
The lookup runs with Google's "Anywhere" region scope — ads shown in any country count. Per-country breakdowns aren't included; advertiserCountry is the advertiser's registered home country, not where its ads run.
Are the ad counts exact? Exact for small advertisers; Google-reported estimate ranges for large ones (the same "~9K ads" its own UI shows). Date filtering (the 30-day count) uses Google's Pacific-time day boundaries.
Does this download the actual ad creatives? No — that's deliberate. You get up to 5 sample ad links plus counts by format. If you need every creative's text and media, use a bulk creative scraper; this actor is the cheap per-company presence check that tells you which companies are worth that deeper pull.
Can I look up an advertiser by their AR… ID?
Not directly in this version — input a domain or brand name. The row gives you the advertiserId and transparencyUrl for any deeper manual digging.
Rate limits / getting blocked?
The actor uses Apify RESIDENTIAL proxies by default and retries transient failures. If a run reports BLOCKED rows, lower maxConcurrency (5 by default) — Google rate-limits bursts, not sustained modest traffic.
Is this legal? The Ads Transparency Center is Google's own public transparency register, built so anyone can inspect who advertises what. This actor reads only that public data — no login, no personal data.
Related actors
- Ads Presence Unified Lookup — checks Google, LinkedIn, and Meta ad presence for a company in one row, when you need the multi-channel picture instead of Google alone.
- Tech Stack Lookup — what a website is built on (CMS, analytics, payments), another per-domain enrichment column.
- Company Domain Enrichment — RDAP, DNS, email route, tech and hiring signals for a domain in one call.
- Email Deliverability Check — MX/provider verification for outbound lists.
If this saved you a scrape, a rating on the Store page helps other buyers find it.