How to scrape the Google Ads Transparency Center
Last updated
To see every ad a competitor runs on Google, enter its brand name, domain, or AR advertiser ID into Datapika's Google Ads Transparency scraper on Apify. Each run returns up to 2,000 ads per advertiser as JSON rows: format (text, image, or video), first and last shown dates, days active, image or video URLs, the advertiser's legal entity, and per-country impression ranges where Google discloses them. Coverage spans 230+ countries and every Google surface: Search, YouTube, Display, Shopping, and Maps. Pricing is $0.001 per result with no run-start fee, so 100 ads with full reach data cost about $0.10.
What does the Google Ads Transparency scraper return for each ad?
Every ad becomes one JSON row, so you can filter, sort, and diff results without parsing HTML. The row carries the advertiser identity (AR advertiser ID, display name, and, with full details on, the registered legal entity), the creative identity (CR creative ID and a permalink that opens the live ad), and the format. Dates arrive as first_shown and last_shown, and the actor computes days_active from them so a 1,747-day banner stands out from a test launched last week.
Media is included rather than just referenced. Image ads return the banner URL, text ads return a rendered screenshot, and video ads return a renderable preview plus a direct video link whenever Google exposes one. Keep fetchAdDetails on (the default) to add variation_count, total_reach_low and total_reach_high, and a region_stats array with one entry per country the ad ran in.
- advertiser_id, advertiser_name, legal_name: verified identity, for example AR0293… and Booking.com B.V.
- creative_id and ad_url: a permalink into the Transparency Center that opens the live ad
- format: TEXT, IMAGE, or VIDEO, filterable at input time so unwanted formats are never billed
- first_shown, last_shown, days_active: run window and longevity for each creative
- image_url, preview_url, video_url: real media, including rendered screenshots for text ads
- variation_count, total_reach_low, total_reach_high, region_stats: A/B variants and impression ranges
How do I look up an advertiser by brand, domain, or advertiser ID?
The queries input takes brand names, website domains, AR advertiser IDs, and full Transparency Center URLs mixed in one list, and the actor detects the type of each line. Domains are the most reliable input because they resolve directly to the one verified advertiser that owns the site. Advertiser IDs and URLs also resolve to exactly one advertiser.
Brand-name queries go through Google's suggestion search, which can return up to 20 advertisers sharing a name. The advertisersPerQuery setting (default 3, maximum 20) caps how many you keep, so a search for a common word does not pull in unrelated small businesses. Each matched advertiser is then paged newest-first in batches of 40 ads until maxAdsPerAdvertiser is reached, with a ceiling of 2,000 ads per advertiser per run. Results cover every Google surface, including Search, YouTube, Display, Shopping, and Maps.
- Mix inputs freely: nike, booking.com, and AR02934798844673654785 can sit in the same queries list
- Domains, IDs, and URLs resolve to one verified advertiser; brand names may match up to 20
- advertisersPerQuery defaults to 3 and caps at 20 for name searches
- maxAdsPerAdvertiser defaults to 50 and caps at 2,000, fetched newest-first in pages of 40
- formats keeps only TEXT, IMAGE, or VIDEO ads; region limits results to one ISO country code
Which countries does a competitor advertise in, and for how long?
The region_stats array is the part most Transparency Center scrapers skip. For every country an ad ran in, you get the ISO code and name, a reach_low and reach_high impression range, that country's own first_shown and last_shown dates, and a surfaces list that splits the reach by surface code. Summed across ads, this shows where an advertiser concentrates budget and which creatives it scales into new markets.
Google only publishes impression ranges where regulation requires it, mainly for ads shown in the EU, so reach fields can come back null for ads shown only in the US. Dates and days_active are populated regardless of region. Coverage spans 230+ countries, and the region input filters a run to a single country, which is also the practical way to segment advertisers whose inventory exceeds the 2,000 ads per run cap.
- region_stats per country: code, name, reach_low, reach_high, first_shown, last_shown, surfaces
- total_reach_low and total_reach_high give the ad-wide impression range where disclosed
- days_active separates evergreen winners running for hundreds of days from creatives launched this week
- Reach ranges are populated mainly for EU-shown ads; elsewhere they return null
- Set region to DE, FR, or any 2-letter ISO code to pull one market at a time
How much does it cost to scrape the Google Ads Transparency Center?
Datapika charges one event: $0.001 per result, where a result is one dataset row, either an ad or an advertiser record (Apify Store, August 2026). Reach data, creatives, dates, and the legal entity are included in that price, there is no run-start fee, and ads dropped by the formats filter are never billed. Hint and error rows are free.
Worked examples from the actor's documentation: one advertiser with 100 ads and full reach data is 101 results, or $0.10. Screening 500 domains with fetchAds set to false produces 500 advertiser records for $0.50. For comparison, as of August 2026 the automation-lab Google Ads Scraper on Apify lists $0.001 per ad plus $0.005 per run start, and the whoareyouanas Google Ads Transparency Scraper starts at $5.00 per 1,000 ads with a full mode near $0.015 per ad. The per-ad rate here matches the cheapest of those while including per-country reach.
- $0.001 per result flat, no actor-start fee, no separate detail upcharge
- 100 ads plus 1 advertiser record: $0.10
- 500-domain screening run with fetchAds off: $0.50
- Ads filtered out by formats are not charged; hints and errors are free
- Competitor listing prices verified August 2026: $0.001 per ad plus $0.005 per run start; from $5.00 per 1,000 ads
How do I run it on a schedule or from an AI agent without getting blocked?
The Transparency Center rate-limits a single IP after roughly 25 requests, which is why home-grown scripts stall partway through a large advertiser. The actor defaults to Apify residential proxies and rotates IPs proactively during the run, retrying failed pages automatically, so a 2,000-ad pull completes without babysitting. No Google login, cookies, or API keys are involved because the source is the public Transparency Center.
For monitoring, schedule a daily run on Apify with your competitor domains in queries and diff the dataset against yesterday's: new creative_ids are fresh tests, and rising days_active marks the winners. Agents can call the same actor through the Apify API or the MCP endpoint, passing a domain and reading back structured rows, which turns "list every ad this company is running" into a single tool call. Exports go to JSON, CSV, Excel, Google Sheets, Make, Zapier, or LangChain like any other Apify actor.
- Residential proxy on by default; the platform throttles a single IP after about 25 requests
- Automatic IP rotation and retries; no login, cookies, or API keys required
- Schedule daily runs and diff creative_id sets to catch new tests the day they launch
- MCP endpoint: https://mcp.apify.com/?tools=fetch-actor-details,openclawai/google-ads-transparency-scraper
- Exports: JSON, CSV, Excel, Google Sheets, Make, Zapier, LangChain
| Field | Example | What it tells you |
|---|---|---|
| advertiser_id / advertiser_name | AR02934798844673654785 / Booking.com | Verified advertiser identity; a stable key for diffing runs |
| legal_name | Booking.com B.V. | Registered entity behind the ads, for brand-protection and impersonation checks |
| creative_id / ad_url | CR0917… / Transparency Center permalink | Unique creative key; the link opens the live ad |
| format | TEXT, IMAGE, or VIDEO | Split creative analysis by format; filterable at input |
| first_shown / last_shown | 2021-11-04 / 2026-08-15 | Run window for the creative |
| days_active | 1747 | Longevity signal: long-running winners versus fresh tests |
| image_url | https://tpc.googlesyndication.com/… | Banner image, or a rendered screenshot for text ads |
| preview_url / video_url | renderable preview / direct video link | Creative review and swipe files |
| variation_count | 2 | Number of A/B variations grouped under the creative |
| total_reach_low / total_reach_high | 15000 / 20000 | Impression range where Google discloses it |
| region_stats | [{region: DE, reach_low: 1000, reach_high: 2000, surfaces: [...]}] | Per-country reach, dates, and surface breakdown |
How to do it
- 1.Open https://apify.com/openclawai/google-ads-transparency-scraper and add your targets to queries: a brand name such as nike, a domain such as booking.com, or an AR advertiser ID.
- 2.Set maxAdsPerAdvertiser (default 50, up to 2,000), keep fetchAdDetails on for reach and legal entity data, and optionally restrict formats to VIDEO or region to a single ISO code such as DE.
- 3.Run it and read the dataset: one row per ad with format, first_shown, last_shown, days_active, media URLs, and region_stats. Export as JSON or CSV, or pull rows through the Apify API.
- 4.For agents, connect the MCP endpoint at https://mcp.apify.com/?tools=fetch-actor-details,openclawai/google-ads-transparency-scraper and call the actor with a domain to get the same rows back as structured output.
Questions, answered
Does Google offer an official Ads Transparency Center API?
No. Google publishes no API for the general Ads Transparency Center. The only official feed is the google_political_ads public dataset on BigQuery, which covers political advertising only and reports spend and impression ranges plus creative metadata rather than the ads themselves (Google's political ads transparency announcement and adlibrary.com's overview, checked August 2026). Commercial advertisers such as Nike or Booking.com are absent from it. Datapika reads the public Transparency Center pages instead and returns the creatives, dates, and reach ranges a person would see in the browser.
Why are total_reach and region_stats null for some ads?
Google discloses impression ranges only where regulation requires it, mainly for ads shown in the EU. An ad that ran only in the US or another non-EU market still returns its format, first_shown, last_shown, days_active, and media URLs, but reach_low and reach_high stay null. If reach is what you need, set region to an EU country code such as DE or FR so the run focuses on ads where the ranges are published.
Why did a brand-name search return advertisers I did not expect?
Brand-name queries use Google's suggestion search, which can list up to 20 advertisers sharing a name, including small businesses with similar names. Keep advertisersPerQuery low (the default is 3) to stay focused, or switch to the domain form of the query, for example nike.com instead of nike. Domains, AR advertiser IDs, and Transparency Center URLs each resolve to exactly one verified advertiser, so they avoid the ambiguity entirely.
Can I pull every ad from an advertiser with tens of thousands of creatives?
A single run returns up to 2,000 ads per advertiser, fetched newest-first in pages of 40. For larger inventories, split the work with the region filter and run one country per job, or run repeatedly and dedupe on creative_id. Advertiser rows also carry declared_ad_count, Google's own total for that advertiser, so you can see how much of the inventory a run captured. Each ad is billed once at $0.001.
Why does a video ad have a preview URL but no video URL?
Google serves some video creatives only as renderable previews rather than as direct media files. When a direct video link is exposed, the actor includes it in video_url; when it is not, you still get preview_url, which renders the ad, plus the format, dates, days_active, and reach fields. Text ads are handled differently: they return a rendered screenshot in image_url so the copy is captured as an image.
Is scraping the Google Ads Transparency Center legal?
The actor only reads data Google publishes for transparency purposes, available to anyone without a login, and it does not touch private Google Ads accounts or cookies. That said, how you use ad data depends on your jurisdiction and purpose, so review your own compliance requirements before storing or redistributing creatives. The output includes the advertiser's legal entity name, which helps when you need to attribute an ad correctly in a report.
Keep reading
Scrape guides
Google Maps scraper API: 1,000 places for $3.00
Scrape guides
Google Flights scraper API: $0.0015 per itinerary
Use cases
Cross-platform trend analysis: 13+ platforms, one report
Use cases
Web scraping API for AI agents (pay per result)
Use cases
Competitor hiring tracker: weekly scans of named companies