DEV Community

ivanpetrus
ivanpetrus

Posted on Edited on

How to export competitors' Google Ads from the Ads Transparency Center (Python)

Google's Ads Transparency Center shows every ad an advertiser runs: text, image and video, by region, with dates. It's great for competitor research. But there's no official export button and no public API, so you end up clicking ad by ad.

I wanted that data as rows in a CSV, so I built an Apify actor for it: Google Ads Transparency Scraper & New Ads Monitor. Disclosure: I'm the author. Below is how to use it from Python in about 15 lines.

What you need

pip install apify-client
export APIFY_TOKEN=your_token
Enter fullscreen mode Exit fullscreen mode

Export all Google ads for a domain

import csv, os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("ivora/google-ads-transparency-monitor").call(run_input={
    "domains": ["nike.com"],
    "regions": ["US"],
    "maxAdsPerTarget": 10,
    "onlyNewAds": False,
    "includeSummary": True,
})

items = client.dataset(run["defaultDatasetId"]).iterate_items()
ads = [i for i in items if i.get("type") == "ad"]

fields = ["advertiserName", "format", "firstShown", "lastShown", "daysRunning", "transparencyUrl"]
with open("nike_us_ads.csv", "w", newline="") as f:
    w = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore")
    w.writeheader()
    w.writerows(ads)

print(len(ads), "ads saved")
Enter fullscreen mode Exit fullscreen mode

What one ad looks like

This is a real row from a test run (Shopify video ads in the UK), trimmed a bit:

{
  "type": "ad",
  "target": "shopify.com",
  "region": "GB",
  "advertiserName": "Shopify Inc.",
  "advertiserId": "AR01625195283841286145",
  "creativeId": "CR16201287557353308161",
  "format": "video",
  "firstShown": "2026-07-22T21:11:02+00:00",
  "lastShown": "2026-10-07T18:38:47+00:00",
  "daysRunning": 77,
  "youtubeUrl": "https://www.youtube.com/watch?v=oLX92a2CA0g",
  "transparencyUrl": "https://adstransparency.google.com/advertiser/AR01625195283841286145/creative/CR16201287557353308161",
  "isNew": true
}
Enter fullscreen mode Exit fullscreen mode

With includeSummary: true you also get one summary row per domain and region: ads fetched, count by format, the newest and oldest firstShown dates, and how many ads were active in the last 24 hours.

daysRunning is the field I find most useful. An ad that has run for months is probably one that works for them.

Compare competitors' video ads

Pass several domains and filter by format:

run_input = {
    "domains": ["shopify.com", "wix.com", "squarespace.com"],
    "regions": ["GB"],
    "formats": ["video"],
    "maxAdsPerTarget": 5,
    "onlyNewAds": False,
    "extractAdContent": True,
    "includeSummary": True,
}
Enter fullscreen mode Exit fullscreen mode

Each video ad comes with a youtubeUrl, so you can watch the creatives straight away.

Only the last 7 days

run_input = {
    "domains": ["hubspot.com"],
    "regions": ["US"],
    "lastDays": 7,
    "maxAdsPerTarget": 10,
    "onlyNewAds": False,
    "includeSummary": True,
}
Enter fullscreen mode Exit fullscreen mode

Run this weekly from cron or an Apify schedule. If you set onlyNewAds to true, the actor remembers what it has already seen and returns only new creatives on later runs, which turns it into a simple "competitor launched a new ad" alert.

Try it without code

Each of these inputs is a ready example on Apify, so you can open one, look at the output, and run it yourself:

The actor and ready-to-run examples are here: https://apify.com/ivora/google-ads-transparency-monitor/examples

Limits worth knowing

  • The Transparency Center shows ads, not spend, clicks or targeting, so this data doesn't include them either.
  • Ad text for image and video ads isn't always available. Some creatives are only a preview link.
  • Keep maxAdsPerTarget small while testing so runs stay cheap.

If you try it and something breaks or a field is missing, tell me in the comments. I maintain the actor and fix issues.

Top comments (0)