Google Ads Transparency Scraper
Scrape Google Ads Transparency Center by domain, advertiser name or advertiser ID. Ad creatives, formats, first/last shown dates, countries and previews.
Ad Intelligence & Competitor Research
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
advertiserDomains,advertiserNames,advertiserIds(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0006 per Google ad result = $0.6 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Google ad result | One real row returned from Google Ads Transparency Center — an ad creative, or an advertiser when you use "List advertisers only". Sample rows, empty results and errors are never charged. | $0.0006 |
| Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.001 |
Pay-per-event pricing: you are billed per result, not per subscription — a run that returns nothing costs nothing beyond the start fee. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-08, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
advertiserDomains | Landing-page domains to look up, for example nike.com. This is the easiest way in: you get every Google ad whose landing page sits on that domain, across all advertiser accounts. | array |
advertiserNames | Advertiser names as they appear in Google's verification records, for example "Nike, Inc.". Each name is resolved to its advertiser ID and then scraped. Turn on "List advertisers only" to get the matching advertisers instead of their ads. | array |
advertiserIds | Google advertiser IDs such as AR16735076323512287233. You can read one off any adstransparency.google.com URL. | array |
startUrls | Paste advertiser or creative permalinks, e.g. https://adstransparency.google.com/advertiser/AR16735076323512287233?region=US | array |
region | Two-letter country code to restrict the ads to (US, GB, DE, BR, IN ...), or "anywhere" for every country. Regional filtering changes both the result set and the ad counts Google reports. | string |
adFormat | Keep only one creative format. | string |
maxItems | Stop after this many rows in total, across every target. Only real rows count. | integer |
listAdvertisersOnly | With "Advertiser names" filled in, return the matching advertisers (ID, name, verified country, ad-count band) instead of their creatives. Useful when you need to find an advertiser ID first. | boolean |
includeRegionStats | Fetch each creative's full country breakdown: impression band, first/last shown date and surface split (Search, YouTube, Display, Maps, Shopping, Play) per country. Adds one request per ad. | boolean |
includeAdvertiserDetails | Look up the advertiser's verified legal name and country once per advertiser. | boolean |
egressMode | Advanced. "auto" rotates Apify datacenter addresses first and falls back to the static pool and then to a direct connection. | string |
What you get
A structured dataset — each result includes fields like:
advertiserNameadvertiserIdcreativeIdadFormatfirstShownAtlastShownAtregionsShownCountlandingDomainpreviewImageUrlcreativeUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Ad Intelligence & Competitor Research
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Meta Ad Library Scraper
Scrape Facebook and Instagram Ad Library ads by keyword, advertiser Page ID or URL. No login, no Meta API token. Ad copy, creatives, dates, platforms, spend.
TikTok Trending Hashtags
Get official TikTok Creative Center hashtag rankings by country and period: rank, posts, views, popularity curves, industries and top creators.
SaaS Competitor Monitor: Pricing, Changelog & Positioning
Track competitor SaaS pricing, changelogs, and positioning changes on a schedule. Get structured deltas and Slack alerts for only what changed.
G2 Reviews Scraper
Scrape G2 software reviews at $1.70 per 1,000: rating, title, full text, reviewer, date and URL. Any product slug. No G2 account or API key needed.
Google Trends Scraper
Google Trends data with no API key: keyword interest over time, interest by region or city, top and rising related queries, and Trending Now by country.
Yandex Search Engine Scraper (SERP API)
Scrape Yandex search results by keyword or URL. Rank, title, URL, domain, snippet, ads and SERP features, with region targeting. No API key.
Where this tool sits
- Categories
- Ad Intelligence & Competitor Research
- Platforms
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.comreturns ads fromNike, 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.
| Field | What it does |
|---|---|
advertiserDomains | Landing-page domains, e.g. ["nike.com"]. Easiest way in — catches every advertiser account pointing at that domain. |
advertiserNames | Names as Google verified them, e.g. ["Nike, Inc."]. Resolved to an advertiser ID, then scraped. |
advertiserIds | IDs like AR16735076323512287233, straight off an Ads Transparency URL. |
startUrls | Paste https://adstransparency.google.com/advertiser/AR.../creative/CR... links. |
region | Two-letter country code (US, GB, DE, BR…) or anywhere. Default anywhere. |
adFormat | any, IMAGE, TEXT or VIDEO. |
maxItems | Row cap across all targets. Default 100. |
listAdvertisersOnly | With advertiserNames, return the matching advertisers instead of their ads. Use it to find an ID. |
includeRegionStats | Per-country impression bands, first/last shown dates and surface split. One extra request per ad. |
includeAdvertiserDetails | Adds 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:
| Run | Rows | Wall clock |
|---|---|---|
nike.com, 5 ads | 5 | 4 s |
| Nike, Inc. in the UK | 17 | 8 s |
| Nike, Inc. in the US | 250 | 25 s |
| Nike, Inc. in the US | 1,000 | 61 s |
| 100 ads with full per-country stats | 100 | 82 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.
regionsShownCountcounts 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.001per run start.$0.0006per 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:
| Actor | Monthly users | Free plan | Cheapest tier |
|---|---|---|---|
solidcode/ads-transparency-scraper | 447 | $1.50 / 1k | $0.80 / 1k |
silva95gustavo/google-ads-scraper | 300 | $1.90 / 1k | $0.90 / 1k |
scrapesage/google-ads-transparency-scraper | 292 | $2.00 / 1k | $2.00 / 1k |
lexis-solutions/google-ads-scraper | 234 | $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.