Google Ads Transparency Scraper (cached) avatar

Google Ads Transparency Scraper (cached)

Pricing

from $2.80 / 1,000 ads

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

from $2.80 / 1,000 ads

Rating

0.0

(0)

Developer

Leo Nguyen

Leo Nguyen

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 months 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])"