Google Ads Transparency Scraper - Ad Spy API avatar

Google Ads Transparency Scraper - Ad Spy API

Pricing

from $0.60 / 1,000 google ad results

Go to Apify Store
Google Ads Transparency Scraper - Ad Spy API

Google Ads Transparency Scraper - Ad Spy API

See every ad a competitor runs on Google. Give it a domain, advertiser name or ID and get the creatives: format, first and last shown dates, country count, landing domain, previews and optional per-country impressions. $0.60 per 1,000 ads plus $0.001 per run start, flat on every Apify plan.

Pricing

from $0.60 / 1,000 google ad results

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Share

Google Ads Transparency Scraper (Ad Spy API)

Pulls ads out of Google's Ads Transparency Center — the public archive Google is required to publish of every ad running through its network.

Give it a domain, an advertiser name, or an advertiser ID. You get back the creatives that advertiser is running: the format, when the ad was first and last seen, how many countries it ran in, the landing domain, and a link you can open to view the ad itself.

$0.60 per 1,000 ads ($0.0006 each), plus $0.001 each time a run starts. Flat rate on every Apify plan — no volume tiers, no plan gates, and the same number on your first run as on your millionth. Most Google Ads Transparency scrapers cost more than this on a free plan.

What it is good for

  • Seeing what a competitor is spending money on right now, and for how long each ad has been live.
  • Working out which creatives are working — an ad that has been running for two years is an ad that pays for itself.
  • Finding an advertiser's other brand entities. nike.com returns ads from Nike, Inc., Nike Retail BV and 株式会社ナイキジャパン, because they all point at the same domain.
  • Country-level reach: which markets an ad actually ran in, and roughly how many impressions it got.

Input

Fill in at least one of the first four.

FieldWhat it does
advertiserDomainsLanding-page domains, e.g. ["nike.com"]. Easiest way in — catches every advertiser account pointing at that domain.
advertiserNamesNames as Google verified them, e.g. ["Nike, Inc."]. Resolved to an advertiser ID, then scraped.
advertiserIdsIDs like AR16735076323512287233, straight off an Ads Transparency URL.
startUrlsPaste https://adstransparency.google.com/advertiser/AR.../creative/CR... links.
regionTwo-letter country code (US, GB, DE, BR…) or anywhere. Default anywhere.
adFormatany, IMAGE, TEXT or VIDEO.
maxItemsRow cap across all targets. Default 100.
listAdvertisersOnlyWith advertiserNames, return the matching advertisers instead of their ads. Use it to find an ID.
includeRegionStatsPer-country impression bands, first/last shown dates and surface split. One extra request per ad.
includeAdvertiserDetailsAdds the advertiser's verified legal name and country.

Run it with empty input and you get one clearly-labelled sample row, free of charge, so you can see the shape of the output before you spend anything.

Output

One row per ad creative:

{
"resultType": "creative",
"advertiserId": "AR16735076323512287233",
"advertiserName": "Nike, Inc.",
"creativeId": "CR05684861671248494593",
"adFormat": "TEXT",
"firstShownAt": "2026-06-05T07:00:00.000Z",
"lastShownAt": "2026-08-08T04:04:49.145Z",
"regionsShownCount": 64,
"landingDomain": "nike.com",
"previewImageUrl": null,
"previewIframeUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?...",
"creativeUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR05684861671248494593?region=anywhere",
"advertiserUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233?region=anywhere",
"region": "anywhere",
"position": 1,
"scrapedAt": "2026-08-08T04:40:36.900Z"
}

Image ads carry previewImageUrl (a direct tpc.googlesyndication.com archive URL). Text and video ads carry previewIframeUrl instead, which is the renderer Google's own site embeds.

With includeRegionStats on, each row also gets:

"regionStats": [
{ "regionCode": "CZ", "regionName": "Czechia", "regionCriterionId": 2203,
"impressionsLower": null, "impressionsUpper": 1000,
"firstShownDate": "2023-03-09", "lastShownDate": "2026-08-04",
"surfaces": [{ "surface": "DISPLAY", "impressionsLower": null, "impressionsUpper": 1000 }] }
]

With listAdvertisersOnly, rows look like this instead:

{ "resultType": "advertiser", "advertiserId": "AR16735076323512287233",
"advertiserName": "Nike, Inc.", "advertiserCountry": "US",
"adCountLower": 9000, "adCountUpper": 10000 }

Speed, measured

Real runs on the platform, August 2026:

RunRowsWall clock
nike.com, 5 ads54 s
Nike, Inc. in the UK178 s
Nike, Inc. in the US25025 s
Nike, Inc. in the US1,00061 s
100 ads with full per-country stats10082 s

What this does not do

  • No spend or budget figures. Google does not publish them. Impressions come as wide bands (≤1000, 2000–3000), not exact counts, and only for ads that carry them — plenty do not.
  • No political-ad targeting criteria. Election ads in the EU and US expose extra targeting data in the UI; this actor returns the same creative fields for them as for any other ad.
  • No ad text extraction for video and rich-media ads. You get the renderer URL, not a transcript. Text ads that ship as plain HTML do give you previewText.
  • regionsShownCount counts Google's geo criteria, not countries. It includes cities and regions, which is why the number can be 1,735 for an ad that ran in ~30 countries. Use includeRegionStats if you need the real country list.
  • It cannot find an advertiser that has never advertised on Google. An empty result is a real answer, and it is not charged.

Cost

  • $0.001 per run start.
  • $0.0006 per row returned — $0.60 per 1,000 ads.
  • Sample rows, empty results, bad input and rate-limit failures are not charged. You pay for rows that actually came back.

Scraping 1,000 of an advertiser's ads costs $0.60, flat, on every Apify plan. The established alternatives are tiered, so what you pay depends on your plan. Checked against the Apify Store on 10 August 2026:

ActorMonthly usersFree planCheapest tier
solidcode/ads-transparency-scraper447$1.50 / 1k$0.80 / 1k
silva95gustavo/google-ads-scraper300$1.90 / 1k$0.90 / 1k
scrapesage/google-ads-transparency-scraper292$2.00 / 1k$2.00 / 1k
lexis-solutions/google-ads-scraper234$1.90 / 1k$0.99 / 1k

FAQ

What is the Google Ads Transparency Center? A public archive Google publishes of the ads running through Google Ads, YouTube, Display, Search, Shopping and Maps. Every verified advertiser has a page listing their live and recent creatives. This actor reads that archive through the same JSON endpoint the site itself calls.

Do I need a Google account or an API key? No. Nothing to sign in to, no key to paste, no cookies. The data is public.

Can I scrape all of a competitor's Google ads? Yes, up to maxItems. Large advertisers have a lot: Nike, Inc. shows 8,000–9,000 ads in the US alone. Set maxItems to what you actually need — you are billed per row.

How do I find an advertiser ID? Put the company name in advertiserNames and switch on listAdvertisersOnly. You get every matching advertiser with its ID, verified country and rough ad count, so you can pick the right entity before you spend anything on creatives.

Why do I get several advertisers back for one domain? Big companies run separate Google Ads accounts per market or per legal entity, and Google verifies each one separately. Searching by domain catches all of them. Searching by advertiser ID pins you to one.

Can I filter by country? Yes — set region to a two-letter country code. It changes the result set, not just the labels: Nike, Inc. returns 8,000+ ads for US and 17 for GB.

What do "first shown" and "last shown" mean? The first and last time Google observed the creative serving. lastShownAt within the last day or two means the ad is live right now. An ad first shown in 2021 and last shown today has been running for five years, which usually means it converts.

Does it get rate limited? Google throttles this endpoint per IP address — a single address gets roughly 25 requests before it starts answering HTTP 429. The actor rotates across Apify's datacenter pool, then a static ISP pool, then a direct connection, so normal runs never see it. If every route is throttled you get an uncharged diagnostic row telling you to retry, not a silent empty dataset.

Can I use my own proxies? Yes. Put them in proxyConfiguration.proxyUrls and they take priority over everything else.

Is scraping this legal? The Ads Transparency Center is published deliberately, for public inspection, under advertising transparency rules. This actor reads only that public data — no logins, no personal data, no paywall. How you use the output is on you.

Notes on how it works

The Ads Transparency Center is a Flutter app. If you fetch the page HTML you get a couple of megabytes of Dart bootstrap and zero ad data, which looks like a dead end and is not: every screen is driven by JSON POSTs to adstransparency.google.com/anji/_/rpc/…. This actor calls those endpoints directly. No browser, no headless Chrome, which is why a 1,000-row run finishes in about a minute.