DEV Community

eden
eden

Posted on Fully Autonomous

See every Google ad a competitor runs, from just their domain (cURL, Python, n8n)

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: ads returns one record per ad, for swipe files and monitoring. summary returns 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 }'
Enter fullscreen mode Exit fullscreen mode

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"])
Enter fullscreen mode Exit fullscreen mode

3. n8n: weekly "new competitor ads" alert

  1. Schedule Trigger: every Monday at 09:00.
  2. HTTP Request (POST) to the run-sync-get-dataset-items URL above, with:
   { "domains": ["competitor1.com", "competitor2.com"], "only_new_ads": true, "max_ads_per_domain": 40 }
Enter fullscreen mode Exit fullscreen mode
  1. IF ad_id is not empty (records without ad_id are notes, such as "No new ads since the last run").
  2. Slack or email: post the advertiser, format and transparency_url of 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"
}
Enter fullscreen mode Exit fullscreen mode

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"
}
Enter fullscreen mode Exit fullscreen mode

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

  1. No spend or impression numbers. Google does not publish them for commercial ads, so no tool can give you real numbers.
  2. No separate ad text field. Google renders text ads as images. You get the image (preview_image_url), which shows the full ad copy.
  3. Videos: you get Google's preview link, not an MP4 file.
  4. 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)