Google Ads Transparency Scraper (cached) avatar

Google Ads Transparency Scraper (cached)

Pricing

Pay per event

Go to Apify Store
Google Ads Transparency Scraper (cached)

Google Ads Transparency Scraper (cached)

Every ad an advertiser is running, from Google's Ads Transparency Center — creative id, format, preview URL, first/last shown date. Search by advertiser name or AR… id. No API key, no browser.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Leo Nguyen

Leo Nguyen

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

Every ad an advertiser is running, straight from Google's Ads Transparency Center — creative id, format, preview URL, and the first/last date each ad was shown. Search advertisers by name, or go straight to an AR… id. No API key, no browser.

What you get

Advertiser rows (from keywords):

FieldExample
advertiserNameNIKE SRL
advertiserIdAR17365672681860497409
advertiserCountryIT
declaredAdCount17 — Google's own count
advertiserUrllink to the Transparency Center page

Ad rows (one per creative):

FieldExample
creativeIdCR18300947740944760833
formatimage or rendered_preview
previewUrldirect image URL, or Google's rendered-preview URL
imageHtmlthe <img> snippet Google returns, for image ads
firstShownAt, lastShownAtISO 8601
creativeUrllink to the ad in the Transparency Center
fromCachewhether this came from cache or a live fetch

How it behaves

Measured against the live endpoints on 2026-08-06:

  • Zero ads is a real answer, not a failure. Google keeps advertisers whose ads have stopped running and still reports a count for them — 3 of 20 advertisers tested returned no creatives for that reason. Those come back as an explicit row with adCount: 0 and declaredAdCount beside it, so you can see the difference. A scraper that returned silence here would look broken.
  • An advertiser that fails does not fail the run. It comes back as a row with error, so a 20-advertiser job returns the other 19.
  • Pagination stops when the advertiser runs out, not when a page counter says so. Asking for 100 ads from an advertiser with 9 returns 9 and spends nothing extra.
  • Google rate-limits this endpoint per IP — about 25 requests from a single address was enough to earn a 429 in testing. So this Actor paces itself, caches every result, and rotates to a fresh proxy IP instead of sleeping through a limit. Two runs asking for the same advertiser within the cache window cost one request to Google, not two.

Limits — read before buying

  • region is Google's internal enum, not a country code, and a wrong value returns zero ads with no error. Leave it empty (the default) to get ads from all regions. This Actor will not guess a value for you, because guessing would silently look like "this advertiser has no ads".
  • format is reported from the ad content actually present. formatCode passes Google's raw code through untouched — the full enum is not published, and inventing labels for unseen values would be a guess dressed up as data.
  • The Transparency Center covers ads Google chooses to disclose. It is not a complete record of an advertiser's spend, and it carries no impression or budget figures.
  • Ads Transparency has no official public API and Google's Terms of Service restrict automated access. You are responsible for how you use the output.
  • No personal data is collected — advertiser and creative records only.

Input

{
"keywords": ["nike"],
"advertisersPerKeyword": 5,
"maxAdsPerAdvertiser": 100
}

Already know the advertiser? Skip the lookup:

{
"advertisers": ["https://adstransparency.google.com/advertiser/AR13536189912721653761"],
"maxAdsPerAdvertiser": 40
}

Only need the ids, not the ads (much cheaper):

{ "keywords": ["nike", "adidas"], "fetchAds": false }

Development

pip install -r requirements.txt
mkdir -p storage/key_value_stores/default
echo '{"keywords":["nike"],"useApifyProxy":false}' > storage/key_value_stores/default/INPUT.json
python -m src

src/ads.py is plain standard library and can be exercised without the Apify SDK — useful when checking whether Google changed the request shape:

$python -c "from src.ads import AdsClient; c=AdsClient(); print(c.search_advertisers('nike')[:3])"