Google Ads Transparency Scraper avatar

Google Ads Transparency Scraper

Pricing

$1.50 / 1,000 ad scrapeds

Go to Apify Store
Google Ads Transparency Scraper

Google Ads Transparency Scraper

Scrape every ad a brand runs on Google - just type a brand name or domain, no advertiser ID needed. Creatives, video and image previews, formats, dates and per-country breakdown. Free advertiser lookup. Pay only per ad returned.

Pricing

$1.50 / 1,000 ad scrapeds

Rating

0.0

(0)

Developer

Jamel HAMLAOUI

Jamel HAMLAOUI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Categories

Share

Scrape every ad a brand runs on Google, straight from the Google Ads Transparency Center.

Just type a brand name or a domain. No advertiser IDs to hunt down, no login.

Get ad creatives, image and video previews, formats, how long each ad has been running, and which of your target countries served it — as JSON, CSV or Excel.

Why this one

  • Search by brand or domain — type Nike or nike.com and go
  • Free advertiser lookup — find every advertiser behind a brand without being charged a cent
  • Per-country breakdown — ask for several countries and each ad tells you which ones served it, at no extra cost
  • Landing pages — see where each ad actually sends people, free
  • No start fee — you pay per ad returned, and nothing at all for a run that returns nothing
  • Fast — about 150 ads per second
  • 249 countries supported with ordinary ISO codes (FR, US, GB…)

Quick start

{
"queries": ["nike.com"],
"maxAdsPerTarget": 100
}

That's it. To narrow it down:

{
"queries": ["Nike", "adidas.com"],
"adFormat": "VIDEO",
"regions": ["FR", "DE"],
"shownAfter": "2026-01-01",
"maxAdsPerTarget": 500
}

Input

FieldWhat it does
queriesBrand names or domains — Nike, nike.com
advertiserIdsOptional exact advertiser IDs (AR…) or full URLs
searchModeads (default) or advertisers for a free lookup
adFormatALL, IMAGE, TEXT or VIDEO
regionsCountry codes, e.g. ["FR","US"]. Empty = worldwide. List several and each ad reports which ones served it
shownAfter / shownBeforeDate window, YYYY-MM-DD
platformsYOUTUBE, PLAY, or a raw numeric platform code
includeCreativeDetailsAdds landing page, display domain, size and on-creative text. Slower, not charged extra
maxAdsPerTarget0 for everything. Big brands have 20,000+ ads

Free advertiser lookup

Not sure which advertiser you want? Ask first — it costs nothing:

{ "queries": ["decathlon"], "searchMode": "advertisers" }
{ "kind": "advertiser", "advertiserName": "DECATHLON FRANCE",
"advertiserId": "AR12956355609636110337", "country": "FR",
"verified": true, "approxAdsMin": 6, "approxAdsMax": 6 }

Output

FieldDescription
advertiserIdGoogle advertiser ID
advertiserNameVerified legal name of the advertiser
adIdCreative ID
format / formatCodeIMAGE, TEXT or VIDEO
firstShown / lastShownUnix timestamps
daysShownHow long the ad has been running
previewUrlDirect link to the creative image or preview
adUrlLink to the ad on Ads Transparency Center
matchedByWhich query or advertiser produced this row
regions *Which of your selected countries served this ad
destinationUrl **Where the ad sends people
adServerUrl **Feed vendor that built the creative (Criteo, Yteo…)
displayDomain **Domain shown on the creative
creativeSize / width / height **Creative dimensions
creativeText **Text found on the creative

* only when you ask for specific countries ** only with includeCreativeDetails

How often do the starred fields fill? It depends on the kind of ad the brand runs, so here are two real measurements, 120 ads each:

BrandSizeDisplay domainCreative textAny URL
decathlon.fr (feed/shopping ads)83%81%37%36%
nike.com (mostly plain images)20%12%20%3%

Plain image ads carry no data bundle at all, so they return nothing extra. That is a property of the advertiser, not a fault in the scraper. We publish these numbers rather than implying every ad is fully enriched.

Landing pages are split honestly: destinationUrl is the advertiser's own link when it is present in the creative, and adServerUrl is the feed vendor that assembled the ad. Many shopping ads only contain the vendor's URL, and calling that the landing page would be wrong.

{
"advertiserId": "AR01614014350098432001",
"advertiserName": "lululemon athletica canada inc.",
"adId": "CR12967419969376616449",
"format": "IMAGE",
"firstShown": 1772749674,
"lastShown": 1789916412,
"daysShown": 200,
"regions": ["FR", "US"],
"previewUrl": "https://tpc.googlesyndication.com/archive/simgad/5316596228252826860",
"adUrl": "https://adstransparency.google.com/advertiser/AR01614014350098432001/creative/CR12967419969376616449",
"matchedBy": "lululemon.com"
}

What you can do with it

  • Spy on competitor ads — every creative a rival is running right now
  • Find their winnersdaysShown shows which creatives survive for years
  • Track launches — new firstShown dates reveal fresh campaigns
  • Compare by country — see which markets get which creatives
  • Creative research — pull thousands of real ad images
  • Agency reporting — show clients what their competitors advertise

Pricing

Pay per ad returned. Runs that return nothing cost nothing, duplicates are removed before billing, advertiser lookups are free, and the per-country breakdown carries no surcharge.

Proxy

Google rate-limits a single IP after roughly 60-80 requests (~2,500 ads) and then serves a block page. Backing off does not clear it - only a different IP does - so this Actor rotates to a fresh IP mid-run when it gets blocked, and keeps everything it had already collected instead of failing the whole job. Apify Proxy is on by default. Turn it off only for small test runs.

FAQ

Is this legal? It collects only what Google publishes publicly to anyone, with no login. Ads are commercial content advertisers chose to run. No personal data.

Do I need an advertiser ID? No. Type the brand name or domain. IDs still work if you have them.

Why don't you return ad headline and body text? Google does not expose ad copy through the public data source — it only ships a rendered creative. Rather than return empty columns, we give you the creative preview so you can see the real ad. An honest limitation, not an oversight.

Why is creativeText not called "headline"? Because Google does not label it. The text is recovered from the creative's own render bundle, and its order there is not the order a viewer sees. Calling it a headline would be a guess, so we hand you the text and let you judge.

How does the per-country breakdown work? Google's per-ad country endpoint requires a signed-in Google session, which a scraper cannot have. So when you list several countries we search each one and report which of them actually served each ad. Real data, public endpoint only.

Which platform codes work? YOUTUBE and PLAY are verified against Google's own interface. The remaining codes get clamped rather than filtered, so Search / Shopping / Maps cannot be told apart reliably - we let you pass raw numbers rather than ship labels we have not proven.

What if the output breaks? Google can change this source without warning. An automated contract test catches shape changes. Report an issue and it will be fixed.