Home › Guides › Google Ads Transparency Scraper
Google Ads Transparency Center data: a competitor's ads, copy, reach and targeting as JSON
Google publishes the ads every advertiser runs — on Search, YouTube, Maps, Play and Shopping — in the public Ads Transparency Center. The Google Ads Transparency Scraper turns that library into one row per ad: the ad text (read from the ad's picture by OCR when Google keeps only a picture), the image or preview, first and last shown dates, per-country impressions and platforms for the EEA and Turkey, the audience-targeting approach, the topic and the advertiser's legal name. No Google account, no API key, no browser.
Who it's for
- Performance marketers and creative teams who want to see which messages, offers and formats a competitor keeps running, and which ones were short tests.
- E-commerce teams following the product titles, prices and merchants in competitors' Shopping ads.
- Analysts covering EU markets who need impression ranges per country and per platform.
- Agencies and B2B sales teams looking for companies that advertise, with the legal entity behind each advertiser account.
- Anyone who wants an alert when a competitor starts new ads, through a scheduled monitoring run.
What you get: one row per ad
| Group | Fields |
|---|---|
| Advertiser | Name, legal name, advertiser ID, country, D-U-N-S number (where Google publishes it) |
| Ad | Creative ID, format (text, image, video), first shown, last shown, days shown, image or preview URL, Transparency Center link |
| Ad copy | Text lines in order, call to action, display URL, landing URL, YouTube video ID, Shopping product title, price and merchant, app details of app-install ads |
| Reach (EEA + Turkey) | Impression range, impressions per platform, and per country: first and last shown, impression range, platform breakdown |
| Targeting | Demographics, location, contextual signals, customer lists, topics of interest — each marked included, excluded, both, or unused |
| Classification | Google's ad topic, product category (some Shopping ads), number of variations |
| Status | Where the copy came from (the preview, OCR, or an empty archive picture), OCR confidence 0–100, a "new" flag in monitoring mode |
A real row from a run on 2026-09-23 — query Decathlon, region France (trimmed):
{
"advertiserName": "Decathlon France SASU",
"advertiserLegalName": "Decathlon France SASU",
"advertiserId": "AR15666691663760195585",
"advertiserCountry": "FR",
"creativeId": "CR18395479902410244097",
"format": "TEXT",
"firstShown": "2026-01-21T16:26:15.000Z",
"lastShown": "2026-09-23T14:37:34.000Z",
"daysShown": 233,
"adTexts": ["DECATHLON - SUPPORT DE CADENAS DE CADRE DE VELO RING-LOCK - antivol - velo voyage - Decathlon"],
"displayUrl": "Decathlon.fr",
"isShoppingAd": true,
"targeting": { "demographics": "UNUSED", "geoLocation": "INCLUDED_AND_EXCLUDED", "contextualSignals": "INCLUDED_AND_EXCLUDED", "customerLists": "UNUSED", "topicsOfInterest": "UNUSED" },
"impressionsEeaTrLow": 6000,
"impressionsEeaTrHigh": 7000,
"regions": [
{ "countryCode": "FR", "countryName": "France", "firstShown": "2026-01-21", "lastShown": "2026-09-23", "impressionsLow": 6000, "impressionsHigh": 7000 }
],
"adCopyStatus": "ok"
}
Input: domains, brands or advertiser IDs
A query can be a domain (nike.com), a brand name (Nike), an advertiser ID (AR…) or a Transparency Center URL. Region, format, platform and dates are applied by Google itself, so a filtered run does not download ads it then throws away.
| Input | What it does |
|---|---|
queries | Domains, brand names, AR… advertiser IDs or Transparency Center URLs |
region | Only ads shown in this country (243 countries); default anywhere |
adFormat · platform | Text (includes Shopping product ads), image or video · Search, YouTube, Maps, Play or Shopping |
datePreset | Ads shown in the last 7, 30, 90 or 365 days, or a custom range |
maxAdsPerQuery | Stop after this many ads per query, up to 100,000 (default 100) |
includeDetails · includeAdCopy | Regions, impressions, platforms, targeting and topic · text lines, CTA, display URL, YouTube ID, Shopping title, price and merchant (one extra request per ad each) |
ocrImageAds | Read the text of ads Google keeps only as a picture (on by default; English, German, French, Spanish, Portuguese, Italian, Dutch, Polish, Turkish) |
onlyNewAds + monitorName | Monitoring: only ads this monitor has not returned before |
A brand's ads in France, with per-country reach:
{ "queries": ["Decathlon"], "region": "FR", "maxAdsPerQuery": 100 }
A weekly monitor of new ads from two competitors (schedule it weekly):
{ "queries": ["hubspot.com", "salesforce.com"], "onlyNewAds": true, "monitorName": "crm-competitors", "datePreset": "last7", "maxAdsPerQuery": 2000 }
Example use cases
- Competitor creative research. See which messages, offers and formats a competitor keeps running, with the image or preview of every ad and its text.
daysShownandlastShownseparate long-running ads from tests. - Shopping and offer tracking. Product titles, prices and merchants of Shopping ads, and the display URLs and text of search ads, show what is being pushed.
- EU reach analysis. Impression ranges per country and per platform for ads that have run in the EEA or Turkey for about three months or more.
- New-ad alerts. Schedule
onlyNewAdsdaily or weekly and connect the dataset to Slack, email or a sheet. New ads arrive without impression ranges; Google adds those later. - Prospecting. Find which companies advertise and on which platforms, with their legal name, to qualify marketing and agency leads.
Measured data quality
Share of ads with the field filled, measured on the Apify platform (runs of nike.com, Decathlon and hubspot.com, plus 50 YouTube video ads of nike.com). Several fields depend a lot on the advertiser:
| Field | Filled |
|---|---|
| Advertiser name and ID, creative ID, format, first / last shown, days shown, countries | 100% |
| Advertiser legal name | 99–100% (16% in the YouTube sample, where 40 of 50 ads ran through a media agency's account) |
| Impressions and platforms per country (EEA and Turkey) | 70–82% (ads running there for about three months or more: 99%; newer ads: 0%) |
| Targeting approach | 77–86% |
| Ad text lines, OCR on | 85% to 100 of 100, depending on the advertiser |
| YouTube video ID (YouTube video ads) | 88% |
| Topic | 38–55% |
| D-U-N-S number | 7–14% |
No test run returned a duplicate creativeId per query (3,100 ads checked). The five targeting categories and the Shopping and YouTube platform codes were cross-checked, ad by ad, against Google's public BigQuery dataset of the Transparency Center.
Honest limits
- Impressions appear about three months after an ad starts. Google publishes impression ranges only for the EEA and Turkey, and only for ads that have run there for roughly 90 days: none of 98 ads first shown in the EEA in the last 90 days had them, against 99% of 1,828 older ads. Other countries never have impression ranges.
- Many ads exist only as pictures. Google keeps a large share of search ads, and most image ads, only as a picture of the ad. OCR reads them: with it, hubspot.com ads with text went from 3.5% to 100 of 100 in a test run. In a review of 20 OCR'd ads, the headline and description came out right in all 10 search ads and in 8 of 9 display ads; text drawn inside the ad's graphic is sometimes missing or jumbled. OCR covers Latin-script languages only.
- A domain query returns every ad that leads to that domain, whoever runs it. For hubspot.com, 120 of 400 ads came from 74 other advertisers (partners, resellers, individuals). Query the
AR…advertiser ID to get one account only. - The advertiser is the paying account, often an agency. 40 of 50 nike.com YouTube ads ran through "Mediabrands Netherlands B.V.", which has no published legal name.
- Landing pages are rare. Landing page URL and call to action were filled for under 1% of ads in the mixed runs and 6% of YouTube video ads.
- D-U-N-S numbers come from a mapping Google publishes for about 6,500 advertiser accounts, so the field is empty for most advertisers.
Speed
On the Apify platform, 40 nike.com ads took 24 seconds and 600 ads of nike.com and Decathlon took 6.6 to 8 minutes. Advertisers whose ads are mostly pictures run at roughly 20 ads per minute with OCR (100 nike.com ads, 60 of them pictures, in 4.5 minutes); turning ocrImageAds off brings the speed back. With the default one-hour timeout and details and ad copy on, a run delivers roughly 4,000–5,000 ads. A proxy is not needed: if Google rate-limits the run, it switches to Apify residential proxy by itself.
Pricing
Pay per event: one ad event for every delivered ad, plus ad-detail when details were returned and ad-copy when text or other copy fields were read, from the preview or by OCR. Pictures with no readable text are not charged as ad copy, queries that return no ads and error rows are not charged, and an advertiser given twice in one run is run once. Current prices are on the actor's Pricing tab on Apify.
Try it on a competitor: paste a domain such as nike.com and get its ads with text, dates, EEA reach and targeting — exportable to JSON, CSV or Excel.
Batch scraper or real-time API?
This scraper is built for batch jobs, schedules and monitoring. When an app or an AI agent needs one lookup at a time, the same code runs as an always-on HTTP endpoint — see the Google Ads Transparency API guide. For advertising data beyond Google, the LinkedIn company data guide covers LinkedIn's public Ad Library, and the firmographics & competitive intelligence guide shows how to profile the companies behind the ads. All Google datasets are listed in the Google data section.
Frequently asked questions
Do I need a Google account or an API key?
No. The scraper reads the same public data as the Ads Transparency Center website, with no Google account, no API key and no browser. It is not affiliated with Google.
Why are impressions empty for some ads?
Google publishes impression ranges only for ads shown in the EEA and Turkey, and only once an ad has run there for about three months. US-only ads and new ads have none. Rows for countries outside the EEA and Turkey list the country and its last-shown date, with the impression range set to null.
Why do some ads have no text?
Google archives many ads only as a picture. With OCR on (the default), the text is read from the picture and the row is marked adCopyStatus: "ocr". Rows still without text are pictures that hold no ad (image-placeholder), pictures without readable text, or ads in non-Latin scripts.
Can I get only new ads?
Yes. Turn on onlyNewAds and give the monitor a name. Each run returns only ads that monitor has not returned before and remembers them, also when a run is aborted. A run checks up to 10,000 listed ads per query; pair it with a date preset such as last7.
Does the data contain personal data?
The data describes advertisers and their ads, not the people who saw them. Advertiser names are published by Google and can be the names of individuals such as sole traders; treat those as personal data where GDPR or similar laws apply.
Google Ads Transparency Scraper — pay per event, no Google account, no API key.
Get competitor ads on Apify →