Google Ads Transparency Center Scraper: Ads, Text, EU Reach
Pricing
from $0.70 / 1,000 ads
Google Ads Transparency Center Scraper: Ads, Text, EU Reach
Every ad a brand runs on Google Search, YouTube, Shopping, Maps & Play. Search by brand, domain or advertiser ID. Ad copy (headline, description), YouTube IDs, EU impressions per country & platform, targeting, only-new-ads alerts. Hard spend limits, no login.
Pricing
from $0.70 / 1,000 ads
Rating
0.0
(0)
Developer
Nat | Data Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
See every ad a company runs on Google (Search, YouTube, Shopping, Maps and Play) as clean JSON, CSV or Excel. The data comes straight from Google's public Ads Transparency Center.
Search by brand name, website domain, advertiser ID or a pasted Transparency Center link and get:
- the ad's format, first and last shown dates, days served and image URL;
- with options switched on: the ad copy (headline, description, display URL), YouTube video ID or direct MP4 link, impressions per country and per platform (EU/EEA), targeting and every A/B variation.
No login, no cookies, no Google account.
You never pay for a failed, duplicate or empty result, and limits are hard limits. If you ask for 50 ads, you get and pay for at most 50 ads.
Why this Google Ads scraper
| This Actor | Typical Google Ads Transparency actors | |
|---|---|---|
| Ad copy | Headline, description and display URL of search text ads (read with built-in OCR from Google's archive), copy of HTML/local/Shopping ads, YouTube ID or MP4 URL of video ads | "Only metadata": a preview link, no text |
| Impressions | Per country and per platform (Search, YouTube, Maps…) wherever Google publishes them (EU/EEA under the DSA), plus totals. impressionsAvailable tells you when Google publishes none | Missing, or one total |
| Limits and spend | Per-target and total caps checked before an ad is fetched; the run's maximum cost is a hard cap; duplicates are never charged | "Overcharged despite setting ad limits" |
| Search | Brand, domain, advertiser ID, links, several countries or all of the EU in one go, platform, format and date filters | One query and one country per run, or links only |
| Ad check | One cheap row per company: runs Google Ads? how many? still active? which accounts advertise this domain? Rows without ads are free | $12 per 1,000 checks, or not offered |
| Monitoring | Only new ads since the last run, per monitor name. Known ads are skipped free, and scheduled checks cost a few requests | Re-download everything |
| Failed runs | Fail fast with a clear reason, not charged | "Succeed" with 0 results |
| Price | $1 per 1,000 ads, $1.50 with full details, $2.50 with ad text. No start fee, platform usage included | $1.50–5 per 1,000 + start fees |
| AI agents | Lenient input: "nike", "nike.com", "Germany", "eu", "last 30 days", "video" all work | Strict enums |
| Compatibility | Accepts the input field names of the popular Transparency Center actors (see Migrating) | — |
What you can do
- Competitor ad intelligence: every ad a competitor runs right now, on which Google platforms, since when, with the actual copy.
- Creative and messaging research: build a swipe file of headlines, descriptions and videos;
shownForDaysandnumServedDaysshow which ads keep running. - EU reach analysis: impressions ranges per country and per platform for any advertiser active in the EU/EEA.
- Lead generation / ad check: give 1,000 domains and find out which companies advertise on Google, how much, and whether they are active this week.
- Alerts: schedule a daily run with
onlyNewAdsand get a Slack or email message when a competitor launches a new ad. - AI agents: call it from Claude, ChatGPT or Cursor through Apify's AI integrations.
- Your own stack: run it from the Apify API, the Python or JavaScript client, Make, Zapier, n8n, Google Sheets, Slack, webhooks or a schedule; export JSON, CSV or Excel.
Quick start
1. All ads of a company in one country
{ "queries": ["nike.com"], "region": ["US"], "maxAdsPerSearch": 200 }
queries accepts brand names (Nike), domains (nike.com), advertiser IDs (AR16735076323512287233) and Transparency Center links. A domain returns every advertiser account whose ads point at that website. For a brand name, the Actor checks the matching advertiser accounts and the brand's own domain, and picks the one with the most ads.
2. Full intelligence: copy, impressions, targeting
{"advertiserIds": ["AR16735076323512287233"],"region": ["EU"],"platforms": ["YOUTUBE", "SEARCH"],"datePreset": "last30","includeDetails": true,"extractAdText": true,"maxAdsPerSearch": 100}
3. Video ads only, with video links
{ "queries": ["hellofresh.com"], "adFormat": "video", "extractAdText": true }
→ youtubeUrl for YouTube video ads, and videoUrl (direct MP4) and videoDurationSec for in-stream video ads.
4. Ad check for a list of companies
{ "resultType": "advertisers", "domains": ["hellofresh.com", "gousto.co.uk", "mindfulchef.com"], "region": ["GB"] }
→ One row per domain with hasAds, approxAdCountLow/High, latestAdLastShown, isActive, the formats seen and the advertiser accounts behind it. Rows without ads cost nothing.
5. Competitor monitoring (only new ads)
{ "queries": ["competitor.com"], "region": ["US", "GB"], "onlyNewAds": true, "monitorStoreName": "competitor-watch", "extractAdText": true }
Schedule it daily and connect a Slack, email or webhook integration:
- The first run delivers everything (up to your limits) and becomes the baseline.
- Each later run delivers only ads first shown since the previous run.
- Ads that are already known are skipped for free.
Migrating from other Transparency Center actors
Paste your existing input. The following field names all work:
queries,domains,advertiserIds,startUrls,resultType(ads/advertisers)region,platforms,adFormat,startDate,endDatemaxAdsPerSearch,maxAdvertisersPerQuery,includeDetails,onlyNewAds,monitorStoreName- the aliases
searchQuery,maxResults,resultsLimit,skipDetails,platform,format,dateFrom,dateTo,monitorStateName,fetchCreativeDetails,ocr
Output fields keep the familiar names:
creativeId,advertiserId,advertiserName,format,firstShown,lastShown,shownForDaysimageUrl,previewUrl,googleCreativeId,googleCustomerId,adGroupId,adUrl/adLibraryUrlvariations,regionsShown,regionStats[].impressions.lowerBound/upperBound,surfaceServingStats,targeting
Output
Ad (resultType: "ads", with includeDetails and extractAdText; example, shortened)
{"type": "ad","creativeId": "CR08027505669651300353","advertiserId": "AR16735076323512287233","advertiserName": "Nike, Inc.","format": "TEXT","firstShown": "2022-06-28T20:23:05.000Z","lastShown": "2026-06-23T17:58:30.000Z","shownForDays": 1456,"numServedDays": 1454,"lastShownDaysAgo": 115,"previewType": "image","imageUrl": "https://tpc.googlesyndication.com/archive/simgad/11154944259192068658","region": "DE","adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR08027505669651300353?region=DE","headline": "Nike Official Site - Worry Free Shopping","description": "Rock your game-ready look inspired by your favorite team. Explore new Nike fan gear now!","displayUrl": "www.nike.com/nike/soccer","adTextSource": "ocr","youtubeUrl": null,"videoUrl": null,"variationCount": 3,"variations": [{ "type": "image", "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/…", "width": 380, "height": 219 }],"regionStats": [{"regionCode": "DE","regionName": "Germany","firstShown": "2023-08-03","lastShown": "2023-10-06","impressions": { "lowerBound": 7000, "upperBound": 8000 },"surfaceServingStats": [{ "surfaceCode": "SEARCH", "surfaceName": "Google Search", "impressions": { "lowerBound": 4000, "upperBound": 5000 } },{ "surfaceCode": "YOUTUBE", "surfaceName": "YouTube", "impressions": { "lowerBound": 0, "upperBound": 1000 } }]}],"impressionsTotal": { "lowerBound": 50000, "upperBound": 60000 },"impressionsAvailable": true,"targeting": {"demographics": { "included": true, "excluded": true },"geography": { "included": true, "excluded": true },"contextual": { "included": true, "excluded": false },"customerLists": { "included": false, "excluded": true }},"dataStatus": { "details": "ok", "text": "ok" },"scrapedAt": "2026-10-17T10:21:16.720Z"}
Values of dataStatus.details and dataStatus.text:
| Value | Meaning |
|---|---|
ok | The data is there |
not-requested | The option was off |
unavailable | Nothing readable, e.g. a plain image banner. Not charged |
failed | Fetching it failed. Not charged |
free-plan-limit | The free-plan cap on ad text was reached |
Ad check row (resultType: "advertisers")
{"type": "domain-summary","domain": "hellofresh.com","region": "US","hasAds": true,"approxAdCountLow": 800,"approxAdCountHigh": 900,"latestAdLastShown": "2026-10-17T08:59:36.000Z","isActive": true,"formatsInSample": ["TEXT", "IMAGE", "VIDEO"],"advertisers": [{ "advertiserId": "AR00930880903813529601", "name": "Grocery Delivery E-Services USA Inc.", "adsInSample": 96 },{ "advertiserId": "AR17410177287600472065", "name": "HelloFresh SE", "adsInSample": 4 }],"searchUrl": "https://adstransparency.google.com/?domain=hellofresh.com®ion=US"}
Advertiser IDs give type: "advertiser-summary" rows instead. They add name, legalName, countryCode and verified.
Pricing
Pay per event. Platform usage and proxies are included: there is no start fee and no compute bill on top.
| Event | What it is | Price |
|---|---|---|
| Ad | One ad creative: format, dates, days served, media URL, IDs, links | $1.00 / 1,000 |
| Ad details | Adds variations, all countries with dates, EU impressions per country and platform, targeting | $0.50 / 1,000 |
| Ad text | Adds headline, description, display URL, CTA, landing page, YouTube ID or MP4 URL. Charged only when text or a video was found | $1.00 / 1,000 |
| Advertiser check | One advertiser or domain summary row that has ads | $2.00 / 1,000 |
Lower rates apply automatically on higher Apify plans (ads down to $0.70 / 1,000).
Never charged:
- failed or blocked targets;
- duplicates (the same ad found through two searches);
- ads already delivered by earlier monitoring runs;
- details or text that failed or found nothing;
- ad-check rows without ads.
Examples:
| Job | Cost |
|---|---|
| 1,000 ads of a competitor | $1.00 |
| The same 1,000 ads with copy, impressions and targeting | $2.50 |
| Ad check for 1,000 domains where 300 advertise | $0.60 |
| A daily monitor of 5 competitors that finds 10 new ads a day (with text) | about $0.60 per month |
The Actor checks your run's maximum cost before each ad and stops cleanly when it is reached, so you never pay more than you set.
Free Apify plan: up to 100 ads per run (25 of them with ad text) and 25 ad-check rows per run. This limit is set by the developer, not by Apify. Any paid plan removes it.
Good to know
- Impressions are published by Google only where the law requires it. That means EU/EEA countries (Digital Services Act), and political ads in some regions. For US-only ads
impressionsAvailableisfalse: Google publishes no numbers, it is not a scraping gap. - Platform filter works only for ads shown since 4 September 2023. Google did not record platforms before that.
- Search text ads are archived by Google as images, so their copy is read with OCR. It is very accurate on these clean renders (~95 % line confidence). Occasional stray characters can appear in seller-rating lines, which go to
extensions. Image banners are not OCR'd:dataStatus.text = "unavailable", not charged. The OCR model is English. Other Latin-script languages read well, but accents can be lost ("enthält" → "enthalt"), and non-Latin scripts are not supported yet. HTML, local, Shopping and video ads are not affected, because their copy is read from the preview, not from an image. - Speed: lists run at thousands of ads per minute. With
extractAdText, OCR takes about 2–4 s per text ad at the default 1 GB memory. For large text jobs set the run's memory to 2–4 GB: it is faster and the price stays the same. - Brand names are ambiguous. "Nike" matches dozens of accounts, including individuals called Nike. For exact results use the domain (
nike.com) or the advertiser ID.maxAdvertisersPerQuerycontrols how many accounts a brand name may expand to. - Counts are Google's approximate ranges (
approxAdCountLow/High,impressions.lowerBound/upperBound), passed through unchanged. - Age-restricted ads are hidden by Google from signed-out visitors, so they are not included.
- Media links:
imageUrl,youtubeUrlandvideoUrlare public Google CDN links.previewUrlis Google's preview script for HTML ads. Open theadUrlto see the ad rendered.
- Topic:
topicIdis Google's internal topic code, shown on the ad page as "Topic (labeled by Google)". Google does not publish a name table.
Is it legal to scrape the Google Ads Transparency Center?
The Ads Transparency Center is a public archive that Google publishes so that anyone can see who advertises and how. Regulators require parts of it, for example the EU Digital Services Act's ad repository.
This Actor:
- reads the same public data a signed-out visitor sees;
- does not log in and uses no cookies or accounts;
- never solves, bypasses or fakes CAPTCHAs or bot checks (when Google asks for one, the request is retried later from a different address, and if that keeps happening the run stops);
- paces its requests;
- respects robots.txt (adstransparency.google.com publishes none).
Most data is about businesses. Some advertisers are individuals (sole traders), so treat advertiser names as potentially personal data under the GDPR, and keep only what you need. Check Google's terms for your own use case, and consult a lawyer for commercial redistribution.
FAQ
Which Google platforms are covered? Search, YouTube, Shopping, Maps and Play. Filter with platforms, or leave it empty for all.
Can I search by keyword, e.g. "running shoes"? No. The Transparency Center itself is searchable only by advertiser or website, so no tool can do this honestly. Use domains or advertiser names.
Where do I find an advertiser ID? Open the advertiser on adstransparency.google.com: the URL contains /advertiser/AR…. You can also paste the whole URL into queries or startUrls.
Does it download images and videos? It returns direct links (imageUrl, videoUrl, youtubeUrl) rather than copies. That is faster and cheaper for you, and the links are permanent Google CDN URLs.
How is this different from SerpApi? SerpApi bills per search, at about $25–75 per 1,000 searches, and returns no ad copy. Here 1,000 ads cost $1–2.50 including copy and EU impressions.
Can I use it from Claude, ChatGPT or Cursor? Yes, through Apify's AI integrations. Inputs like "nike.com", "eu", "video" and "last 30 days" are understood.
What happens when Google changes something? Each record carries dataStatus, and failures are listed in the run's STATISTICS record. A run where Google answers nothing fails loudly instead of returning an empty "success". Open an issue in the Issues tab: it is answered within 24 hours.