Quick answer: The and parallel US pressure, it indexes every ad campaign currently running on Search, YouTube, Display, Shopping, Maps, and Play — keyed by advertiser. Google's own counter lists 300,000+ active creatives for a brand like Nike. For your nearest competitor, it's usually 50–500.
The catch: there's no download button. Just an interactive UI that paginates 40 creatives at a time. If you want this as a CSV — for a competitor sweep, a trademark audit, or a RAG corpus — you have to extract it yourself. Here's what that actually takes, and how I shortened it to one API call.
What is the Google Ads Transparency Center? 🔎
The Google Ads Transparency Center is a public, Google-operated registry that shows the ad creatives any verified advertiser is running, the date range each ad was shown, and roughly where. Google built it to comply with ad-disclosure regulation, so the data is public by design — you're reading the same registry a regulator would.
What it gives you per advertiser:
- Every ad creative currently or recently live (text, image, video)
- The landing domain each ad clicks through to
First-shown / last-shown timestamps and a rough impression count
- A deep link to each creative inside the Transparency Center
What it does not give you: a search-by-keyword mode, region-filtered results from the server, or — crucially — an API.
Does the Google Ads Transparency Center have an API?
No. As of 2026 Google publishes no official API or bulk export for the Ads Transparency Center. The only programmatic surface is the internal
SearchService/SearchCreativesRPC that the website itself calls. That endpoint is undocumented, returns a positional protobuf-style array (not labeled JSON), and inspects your TLS fingerprint before it answers. Scraping it reliably is the whole job — which is why a hosted Actor exists instead of a three-line snippet.
What the data looks like
Each ad creative comes back as one flat, typed row. Concrete beats abstract, so here's a real one:
CODE{
"advertiser_id": "AR18378488041124659201",
"advertiser_name": "Nike Retail BV",
"creative_id": "CR15771942603307614209",
"creative_url": "https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR15771942603307614209?region=anywhere",
"landing_domain": "nike.com",
"format_type": 1,
"first_shown_ts": 1761145807,
"last_shown_ts": 1778871417,
"impressions": 205,
"preview_image_url": "https://tpc.googlesyndication.com/archive/simgad/12774179880874022668",
"preview_content_js_url": null,
"region": "anywhere",
"scraped_at": "2026-05-15T19:17:59+00:00"
}
Thirteen fields, the same shape every time, validated with Pydantic before it's written. It drops straight into Pandas, BigQuery, or a vector store — no positional-array wrangling on your side.
The naive approach (and why it falls apart)
The first thing every scraper-aware person tries:
- Open Chrome DevTools, find the XHR call to
SearchCreatives
- Replay it with
requests.post()
- Parse the JSON, paginate, done
It breaks on the first request. Three reasons, and they're the reasons a hosted Actor earns its keep:
1. TLS fingerprinting. Google's endpoint inspects the JA3/JA4 signature of your TLS handshake. Python's stdlib SSL doesn't match any real browser, so the server returns
403before it even reads your payload. We get around it by impersonating a real Firefox 147 TLS + HTTP/2 fingerprint viacurl-cffi— so the handshake looks like a browser, because functionally it is one.
2. Cookie continuity across pagination. The pagination cursor is bound to a session cookie. Rotate IPs naively between pages and the server invalidates your cursor mid-scrape. We thread Apify residential proxies with sticky sessions so each advertiser's pagination keeps one stable exit IP and cookie jar, and we pace requests at ~1/sec to stay polite.
3. A positional, protobuf-flavored response. The reply isn't keyed JSON — it's nested arrays where meaning depends on position. One Google A/B rotation and a naive parser silently emits garbage. We pin the parser against four captured creative shapes (still image, rich video, minimal, malformed) and run live wire-validation to catch contract drift before it reaches your dataset. On
408/429/5xxwe retry with exponential backoff and fail loud on partial success rather than handing you a half-empty file.
None of that is glamorous. All of it is the difference between a script that worked once on your laptop and a feed that survives Google's quarterly cipher rotation.
The Actor
I packaged the result as an Apify Actor: .
Free $5 trial credit, no credit card. Run it on
nike.comand you'll have ~1,000 creatives in your dataset in under a minute. Find a use case I missed, or a field you wish it returned? Drop it in the comments — I ship based on what people actually need.
Built by Devil Scrapes — Apify Actors with attitude. Pay-per-event, transparent pricing, no junk fields. 😈
↗ Original-Artikel auf dev.to lesenVollständiger Original-BerichtAusführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf dev.to.
Google Ads Transparency Scraper: pull any competitor's ads for $1.20/1K
- ▸ What is the Google Ads Transparency Center? 🔎
- ▸ Does the Google Ads Transparency Center have an API?
- ▸ What the data looks like
- ▸ The naive approach (and why it falls apart)
- ▸ The Actor
- ▸ What you'd actually use this for
- ▸ Pricing — exact numbers 💰
- ▸ The part other scrapers won't tell you
- ▸ Limitations (the honest list)
- ▸ FAQ
- ▸ Try it
SOCIAL SHARE CARD GENERATOR