Google's Ads Transparency Center lists the ads that advertisers run on Google Search, YouTube, Shopping, Play and Maps, with the dates each ad was first and last shown. For media buyers, agencies and B2B sales teams, that is a goldmine: what are my competitors running right now, since when, and in which format?
Getting it into a pipeline is the annoying part. Some tools ask you to open the Transparency Center, find the advertiser by hand and paste its URL. That is fine for one brand. It is not fine for 50 competitors or a list of 1,000 prospects.
So I built a small tool that takes plain domains (nike.com, adidas.com) and returns the ads as JSON.
What it does
The Google Ads Transparency Scraper runs on Apify:
- Domains in, ads out. No advertiser IDs, no copy-pasting Google URLs.
- No browser, no proxies. It reads the data through an API backend, so runs take seconds.
-
Two output modes:
adsreturns one record per ad, for swipe files and monitoring.summaryreturns one compact record per domain (does it advertise, how many ads, which formats, latest ad), for lead lists, Clay tables and AI agents. -
"Only new ads" monitoring: schedule it daily or weekly with
only_new_ads: true, and each run returns only ads you have not seen before. -
Every advertiser behind a domain: results include every advertiser whose ads lead to the domain, not only the brand itself. When I looked up
adidas.com, the advertisers included "Adidas America, Inc", the media agency "MediaCom L.L.C" and an individual advertiser name I did not recognize. That is useful for brand protection too.
1. Quick start with cURL
curl -X POST "https://api.apify.com/v2/acts/hirepulse~google-ads-transparency-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "domains": ["nike.com"], "country": "US", "max_ads_per_domain": 5 }'
2. Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("hirepulse/google-ads-transparency-scraper").call(run_input={
"domains": ["gusto.com", "rippling.com"],
"country": "US",
"platform": "google_search", # all, google_search, youtube, google_shopping, google_play, google_maps
"format": "all", # all, text, image, video
"max_ads_per_domain": 40, # up to 120
"mode": "ads",
})
for ad in client.dataset(run["defaultDatasetId"]).iterate_items():
if ad.get("ad_id"):
print(ad["domain"], ad["advertiser_name"], ad["format"], ad["days_running"], "days", ad["transparency_url"])
3. n8n: weekly "new competitor ads" alert
- Schedule Trigger: every Monday at 09:00.
-
HTTP Request (POST) to the
run-sync-get-dataset-itemsURL above, with:
{ "domains": ["competitor1.com", "competitor2.com"], "only_new_ads": true, "max_ads_per_domain": 40 }
-
IF
ad_idis not empty (records withoutad_idare notes, such as "No new ads since the last run"). -
Slack or email: post the advertiser, format and
transparency_urlof each new ad.
What the output looks like
Ads mode (a real record from a test run on 14.10.2026):
{
"domain": "nike.com",
"advertiser_name": "Nike, Inc.",
"advertiser_id": "AR16735076323512287233",
"advertiser_verified": true,
"ad_id": "CR05432776185081757697",
"format": "text",
"first_shown": "2023-11-16T21:51:37Z",
"last_shown": "2026-10-14T15:10:53Z",
"days_running": 1062,
"last_shown_days_ago": 0,
"preview_image_url": "https://tpc.googlesyndication.com/archive/simgad/8151844300521207182",
"preview_image_width": 348,
"preview_image_height": 557,
"transparency_url": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR05432776185081757697?region=US",
"country": "US"
}
Yes, that text ad has been running for almost three years.
Summary mode (real, adidas.com, all countries):
{
"domain": "adidas.com",
"runs_google_ads": true,
"total_ads": 6000,
"ads_sampled": 40,
"text_ads": 33,
"image_ads": 3,
"video_ads": 4,
"latest_ad_shown": "2026-10-14T15:29:10Z"
}
Pricing
Pay per use, no subscription:
- $0.005 per domain checked. Also when the domain runs no ads, because "this company does not advertise on Google" is an answer too.
- $0.0015 per ad returned ($1.50 per 1,000 ads). Summary mode is charged per domain only.
- Higher Apify plans get volume discounts.
- Free Apify plan: try one domain with up to 5 ads.
| Job | Mode | Cost |
|---|---|---|
| 1 competitor, 40 ads | ads | $0.065 |
| 5 competitors, 200 ads | ads | $0.325 |
| 1,000 prospect domains | summary | $5.00 |
Honest limitations
- No spend or impression numbers. Google does not publish them for commercial ads, so no tool can give you real numbers.
-
No separate ad text field. Google renders text ads as images. You get the image (
preview_image_url), which shows the full ad copy. - Videos: you get Google's preview link, not an MP4 file.
- Up to 120 recent ads per domain per run.
Try it
👉 Google Ads Transparency Scraper on Apify
Using an AI agent? Connect it through Apify's MCP server: https://mcp.apify.com/?tools=hirepulse/google-ads-transparency-scraper
Disclosure: I built this tool.
Top comments (0)