Google Ads Transparency Scraper icon

SEO & ads intelligence · Automation · Lead generation

Google Ads Transparency Scraper — Advertiser Ad Library Export

Export every public ad creative Google logs for a brand — creative ID, format, landing domain, impression counts, first/last-seen dates, region, and preview image/video URLs — straight from the Google Ads Transparency Center to JSON, CSV, or Excel. Google ships no official API for this data; we replay its internal SearchService/SearchCreatives RPC with a real-browser TLS fingerprint and absorb the fingerprinting so you get clean rows.

Free Apify credit covers a first run. No credit card to try.

What this Actor scrapes

The Google Ads Transparency Center is Google's public registry of every ad campaign running on Search, YouTube, Display, Shopping, Maps, and Play. This Google Ads Transparency Scraper talks directly to Google's internal SearchService/SearchCreatives RPC — so it pulls fast, stable structured data without the overhead of a full browser session.

Google publishes no official API for this data. We reverse-engineered the RPC, replay it with a real-browser TLS fingerprint, and absorb all the reliability work so you get clean rows.

What we handle for you

  • 🛡️ Browser fingerprint rotation — every RPC call replays a real Firefox TLS+H2 handshake via curl-cffi, so Google's edge sees a browser, not a Python script.
  • 🌐 Apify Proxy support — sticky-session proxying keeps cookie continuity across a target's pagination run.
  • 🧱 Paced request cadence — a fixed gap between RPC pages keeps us under the SPA's own request rate.
  • 🧊 Clean, typed dataset rows — golden-file tested against four real creative shapes (static image, rich video, minimal, malformed) before every release.
  • 💰 Pay-per-result pricing — a small per-run fee, then you're charged only for ad rows that actually land in your dataset. No data, no charge.
  • 🧪 Batch input, deduplicated — scrape dozens of domains and advertiser IDs in a single run; overlapping creatives across targets are merged, not double-billed.
  • 🔍 Bulk domain ad-screening mode — check a list of brand domains for Google Ads activity in one run without paying per creative; a domain with zero ads still finishes as a clean, successful result.

Use cases

  • Competitor ad spend tracker — pull every Nike ad once a week and diff the creative set to see what launched; track competitor Google Ads spend without manually clicking through the Transparency Center UI.
  • Trademark enforcement — monitor advertisers running ads against your brand keyword; combine with your own takedown workflow.
  • Affiliate-fraud detection — flag advertisers whose landing domain doesn't match the advertiser name.
  • Political-ad monitoring — track which advertisers are active in an election cycle.
  • Brand-safety audits — for agencies, prove the ads currently live for a client before the QBR.
  • Market research — observe how saturated a vertical (crypto, sports betting, supplements) is with active creatives.
  • AI / RAG ingestion — feed creative metadata and image URLs into a vector store for image-grounded competitive analysis.
  • Bulk domain ad screening — feed in a prospect list or a portfolio of brand domains and get back a yes/no "is this domain running Google Ads" flag per domain, with a rough ad count — a lead-qualification or compliance-sweep pass before you invest in per-creative pulls.

Input

Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.

FieldTypeRequiredWhat it does
searchDomains array no List of advertiser landing-page domains to scrape. The scraper returns every ad pointing at each domain in the date window. Example: nike.com, adidas.com.
advertiserIds array no Optional Google advertiser IDs (e.g. AR0123456789) to scrape instead of, or alongside, brand domains. Use when you already know the exact advertiser.
region string no ISO-3166 alpha-2 country code or anywhere. Stored on each output row as metadata. Important: Google's SearchCreatives RPC ignores this on the server side — it does not narrow which ads come back. We expose it so you…
dateFrom string no Lower bound of the ad-activity window (YYYY-MM-DD). Leave empty to default to 365 days before Date to.
dateTo string no Upper bound of the ad-activity window (YYYY-MM-DD). Leave empty to default to today (UTC).
maxResults integer no Total dataset items to keep across all targets. 0 disables the cap. Defaults to 1000.
maxPages integer no Hard ceiling on RPC round-trips per domain/advertiser. Each page returns up to 40 creatives, so the default 25 covers up to 1 000 ads per target. Lift this only if a target trips the cap.
screeningMode boolean no When enabled, emit ONE row per input domain/advertiser instead of one row per creative — domain, has_ads_detected, ad_count, first_seen_ts, last_seen_ts, sample_creative_url. Aggregated over the same search, no extra…
{
  "searchDomains": [
    "nike.com",
    "adidas.com"
  ],
  "advertiserIds": [
    "AR03012025048987521025"
  ],
  "region": "US",
  "dateFrom": "2025-11-15",
  "dateTo": "2026-05-15",
  "maxResults": 5000,
  "maxPages": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}

Output

One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.

advertiser_idadvertiser_namecreative_idcreative_urllanding_domainformat_typefirst_shown_tslast_shown_tsimpressionspreview_image_urlpreview_content_js_urlregionscraped_at

{
  "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"
}

Pricing

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Ad creative scraped$0.0030Per result written to the dataset.

You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.

Limitations

  • Region is metadata, not a filter. Google's SearchCreatives RPC ignores the geo target — we confirmed this empirically (see scripts/recon/FINDINGS.md). The Transparency Center browser UI shows a region selector, but the server returns the same creative set regardless. We expose region so you can tag exports by intended locale, nothing more.
  • No region-only browsing. You must supply a searchDomain or advertiserId. There is no "all ads in country X" mode on the public RPC. If Google adds one we'll wire it in.
  • Video / rich creatives return a content.js URL, not an MP4. Rendering the actual video frame requires executing Google's JS bundle — out of scope for v1.
  • Date range is enforced by Google, not us. They retain roughly 12 months of history. Requesting older dates clips to that window.
  • Large advertisers hit pagination caps. Google's infrastructure stops responding past roughly 1 000 ads per query. Nike's library claims ~300 000 ads; the default maxPages=25 is intentionally conservative. Raise it for full-history pulls knowing you may hit the server-side ceiling.
  • Screening mode's ad_count is a floor, not an exact total. It counts creatives actually pulled within maxPages/maxResults, same ceiling as per-creative mode above — a domain flagged has_ads_detected: true with ad_count: 40 may run more than 40 ads; raise maxPages if you need a tighter count.

FAQ

Is this legal?
Yes. The Google Ads Transparency Center is a public registry Google operates under EU DSA and US regulatory pressure. We scrape only what the public UI exposes at a polite cadence, and we do not bypass authentication. We also do not collect personal data — only advertiser-level metadata.
Does Google have an official API for Ads Transparency data?
No. As of 2026, Google publishes no official API for the Transparency Center. We reverse-engineered the internal SearchCreatives RPC, replay it with a real-browser fingerprint, and keep the implementation current as the endpoint evolves. The "google ads transparency api" you may have searched for is exactly what this Actor provides.
Is this the same thing as a "Google Ads Library" scraper?
Effectively yes. Google doesn't officially brand it "Ads Library" the way Meta does — the product is the Google Ads Transparency Center — but that's the phrase people search for when they mean the same target. Same registry, same data, this Actor covers it either way.
Why replay an RPC instead of automating a browser against the UI?
Speed and stability. A browser-automation approach re-renders the Transparency Center page for every batch of creatives and re-parses whatever DOM structure Google shipped that week. Talking to the internal RPC directly returns ~40 structured creatives per round-trip and doesn't break when Google reshuffles frontend markup — see Why we replay the RPC above.
How do I scrape Google Ads Transparency Center data, step by step?
Paste a brand domain or advertiser ID into the input, run the Actor, and export. Under the hood we replay Google's internal SearchCreatives RPC instead of automating a browser against the public UI — see How to use it below for the exact steps.
Can I export Google Ads Transparency data to a spreadsheet or database?
Yes — this is a Google Ads Transparency data export tool at heart. Every run's dataset exports to JSON, CSV, Excel, or JSONL from the Storage tab, or pull it programmatically via the API (see Output above).
Why is the region selector marked "display only"?
Because we empirically confirmed the RPC ignores it. Other scrapers on the Store claim region filtering; we tested every plausible RPC body shape and none returned a region-narrowed result set. We would rather under-promise than ship broken filtering. If Google adds a server-side region filter, we will wire it in immediately.
Why isn't there a search-by-keyword mode?
Google's RPC does not expose one. You search by advertiser. For brand-keyword monitoring, give us the domain (e.g. nike.com) and the scraper returns every ad pointing at that domain — including those bought by competitors bidding on your name.

Ready to run it?

Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.

Related Actors

Teams that run this also run