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
- Python 3.9+
- A free Apify account and API token (Console → Settings → Integrations)
pip install apify-client
export APIFY_TOKEN=your_token
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")
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
}
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,
}
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,
}
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:
- Nike's Google ads in the US
- Shopify vs Wix vs Squarespace video ads in the UK
- A competitor's Google ads from the last 7 days
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
maxAdsPerTargetsmall 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)