Google Ads Transparency Scraper - Competitor Ad Creatives avatar

Google Ads Transparency Scraper - Competitor Ad Creatives

Pricing

$1.00 / 1,000 ad creative scrapeds

Go to Apify Store
Google Ads Transparency Scraper - Competitor Ad Creatives

Google Ads Transparency Scraper - Competitor Ad Creatives

Scrape every ad creative an advertiser runs on Google Search, YouTube, Shopping, Maps and Play. Search by domain, advertiser ID or brand name. Each ad ships with its format, first/last shown dates, days shown, every country it ran in, impression ranges and the creative image. No API key.

Pricing

$1.00 / 1,000 ad creative scrapeds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

πŸ”Ž Google Ads Transparency Scraper β€” every ad creative a competitor is running

Pull an advertiser's entire live and archived ad library out of the Google Ads Transparency Center β€” the ads they run on Google Search, YouTube, Shopping, Maps and Google Play β€” as clean, structured rows.

Give it a domain (nike.com), a Google advertiser ID (AR16735076323512287233) or just a brand name (Progressive Insurance). You get one row per creative, with the dates it ran, how many days it ran, every country it ran in, the impression range, the platform split and the ad asset itself.


🎯 What does this Actor do?

Google publishes an ad-transparency record for every advertiser it has verified. It is the single best free source of competitor ad intelligence β€” and it is close to unusable by hand: no export, no bulk view, one creative at a time.

This Actor turns it into a dataset.

  • 🏷️ By domain β€” nike.com returns every verified advertiser entity pointing at that site.
  • πŸ†” By advertiser ID β€” exact, when one domain is shared by several legal entities.
  • πŸ”€ By brand name β€” resolved to real advertiser IDs through Google's own suggestion endpoint.
  • 🌍 Country filter, server-side β€” US, GB, DE… so a narrow scrape is genuinely cheaper.
  • 🎬 Format filter β€” text/search ads, image/display ads, or video (YouTube) ads.
  • πŸ“… Ran-when β€” first shown, last shown, and Google's own days-shown counter.
  • πŸ“ˆ Reach β€” impression range, plus the Google Search / Shopping / YouTube / Maps / Play split.
  • πŸ–ΌοΈ The creative itself β€” the archived image (for text ads this is a rendered screenshot of the ad, headline, description and sitelinks included), plus every rendition Google kept.
  • ✍️ Ad copy β€” headline, description, display URL and sitelinks, decoded out of the live preview where Google still serves one.

One site, one job: ad creatives. No fluff, no half-scraped side products.


πŸ“Š What you actually get β€” measured, not promised

Field-fill measured on 932 unique creatives pulled live on 2026-09-02 across five different targets (nike.com, hubspot.com, progressive.com, one advertiser ID, and a US-filtered booking.com). These are the real numbers, including the fields that are often empty:

FieldFillWhat it is
creativeId, advertiserId, advertiserName100%Identity of the ad and who runs it
creativeUrl100%The ad's own page on adstransparency.google.com
format / formatId100%TEXT, IMAGE or VIDEO
firstShownAt, lastShownAt100%ISO 8601 timestamps
daysShown100%Google's run-days counter
countries, countryCount, regionStats100%Every country the ad ran in, with per-country first/last shown dates
advertiserDomain78.5%Set on domain searches and wherever Google returns it
creativeImageUrl (+ creativeWidth/Height)79.5%The archived creative image
previewUrl, previewUrls27.9%Google's live rendering of the creative
platforms19.6%Search / Shopping / YouTube / Maps / Play split
impressionsMax / impressionsMin19.5% / 13.8%Google's banded impression range
adCategoryId / adCategory29.0% / 3.5%Google's own category id, and its label where published
adHeadline, adDescription, adDisplayUrl2.9%Ad copy, where a live preview still exists
adExtensions0.5%Sitelinks / callouts on search ads

In that sample: 97 distinct countries, format mix 871 TEXT / 43 IMAGE / 18 VIDEO, and platform hits of Search 182, Shopping 73, YouTube 59, Maps 32.

Read the low numbers honestly. adHeadline is 2.9% because Google only keeps a live, decodable preview for a small slice of ads; for the other 97% the ad's wording is baked into creativeImageUrl as a rendered picture of the ad. Impression ranges and the platform split are published by Google only for ads above a reach threshold and mostly in the EU β€” they are a bonus on the ads that have them, not a promise on every row. regionStats, which is the field most competitor-research work actually turns on, is 100%.

Example row (trimmed)

{
"creativeId": "CR01843149584029712385",
"advertiserId": "AR06365026152670560257",
"advertiserName": "WPP MEDIA MANAGEMENT",
"advertiserDomain": "nike.com",
"format": "TEXT",
"firstShownAt": "2023-10-14T04:51:05.000Z",
"lastShownAt": "2026-09-02T04:14:45.000Z",
"daysShown": 992,
"creativeUrl": "https://adstransparency.google.com/advertiser/AR06365026152670560257/creative/CR01843149584029712385",
"creativeImageUrl": "https://tpc.googlesyndication.com/archive/simgad/2824011479213509032",
"creativeWidth": 380,
"creativeHeight": 341,
"variantCount": 3,
"countries": ["BE", "CA", "US", "GT", "PE", "ES", "CL", "IE", "AR", "IT", "DE", "NL", "MX", "PT", "CO", "AT", "PL", "FR"],
"countryCount": 18,
"impressionsMin": 4000,
"impressionsMax": 5000,
"platforms": ["YouTube", "Google Shopping", "Google Search", "Google Maps"],
"regionStats": [
{
"regionCode": 2056,
"country": "BE",
"countryName": "Belgium",
"firstShownDate": "2023-10-14",
"lastShownDate": "2026-08-16",
"impressionsMin": null,
"impressionsMax": 1000,
"platforms": [
{ "platform": "Google Search", "platformId": 3, "impressionsMin": null, "impressionsMax": 1000 }
]
}
]
}

πŸš€ Input

{
"domains": ["nike.com"],
"countries": ["US"],
"format": "any",
"includeDetails": true,
"maxItems": 200
}
InputDefaultNotes
domains[]Advertiser websites. https://, www. and paths are stripped for you.
advertiserIds[]AR… ids. All of them are queried in one request.
advertiserNames[]Brand names, resolved to advertiser ids via Google's suggestion endpoint.
countries[]ISO 3166-1 alpha-2. Server-side filter.
formatanyTEXT, IMAGE or VIDEO. Google accepts only one at a time.
includeDetailstrueThe enrichment call. Off is ~2x faster and much thinner.
maxItems200Total cap. 0 = unlimited.
maxItemsPerTarget0Stops one giant advertiser eating the whole run.
maxAdvertisersPerName3How far each brand name expands.
detailConcurrency6Parallel detail requests.
residentialFallbacktrueAuto-escalate when Google rate-limits datacenter IPs.
proxyConfigurationApify Proxy onLeave it on β€” see below.

If you send an empty input, the Actor runs the documented nike.com demo instead of failing.


πŸ’° Pricing

Pay per event β€” $0.001 per ad creative delivered. One event, no start fee, no per-page charge.

This ActorTypical alternative
Per ad$0.001$0.0015 – $0.002
Per ad with country/impression/platform detail$0.001 (included)$0.002 + $0.003 = $0.005

1,000 creatives, fully enriched, cost $1.00.

Rows are charged as they are pushed (Actor.pushData(items, 'creative-scraped')), so delivered always equals billed β€” if you set a spend cap, the run stops at it instead of handing you rows you already paid for or rows you did not.


🌐 Proxies and rate limits β€” the honest version

Google rate-limits this endpoint per IP, and Apify's datacenter pool is shared across every user on the platform. Measured on 2026-09-02, within the same minute and with an identical request:

ExitResult
Apify Proxy auto (datacenter)HTTP 429 Γ— 3
groups-auto + sessionHTTP 429 Γ— 3
BUYPROXIES94952 + sessionHTTP 429 Γ— 3
RESIDENTIAL, country-USHTTP 200 Γ— 3, 40 rows each

So the Actor defaults to cheap datacenter proxies and, after 2 consecutive 429s, switches itself to residential IPs for the rest of the run β€” with a fresh retry budget on the new transport, so the escalation actually rescues the request that triggered it. It says so in the log and the run status.

Proof under load: five runs fired simultaneously, each pulling 300 creatives from a different advertiser. Every one hit rate limits (5, 6, 8, 8 and 16 refusals), every one escalated, and every one finished SUCCEEDED with 300/300 creatives and 300/300 detail enrichment in 124–158 s. Delivered equalled billed on all five.

If every single request is refused, the run does not pretend the advertiser has no ads β€” and it does not end FAILED either. It exits cleanly with a status message that starts BLOCKED, not empty: and gives you the exact request counts and the fix. A blocked page is never reported as an empty page.

❓ FAQ

Q: Do I need a Google account or API key? No. The Ads Transparency Center is public and this Actor uses no credentials, cookies or login.

Q: How do I find an advertiser ID? Open the advertiser on adstransparency.google.com; the AR… segment of the URL is the ID. Or skip it and pass the domain or brand name.

Q: Why do two advertisers come back for one domain? Large brands verify one advertiser entity per market or per agency (Nike Retail BV, NIKE GLOBAL TRADING B.V. SINGAPORE BRANCH, WPP MEDIA MANAGEMENT). All of them are returned so you see the whole picture; group by advertiserId if you want them separated.

Q: What exactly is daysShown? Google's own counter of days the creative was shown. Measured against the first/last-shown span on 240 creatives: equal on 76, lower on 161 (the ad did not run every day), and higher by at most one day on 3. Treat it as run-days, not the calendar gap.

Q: Why is adHeadline empty on most rows? Google keeps a decodable live preview for only some creatives. For the rest, the ad's wording is rendered into creativeImageUrl β€” a picture of the ad, sitelinks and all. Sorting by format = TEXT and reading the images is how you see the copy for the other 97%.

Q: Are impressions exact numbers? No, and nobody's are. Google publishes banded ranges (impressionsMin … impressionsMax) and only for ads above a reach threshold, largely in the EU under the DSA. 19.5% of the measured sample carried a range.

Q: What are the platform values? Google Search, Google Shopping, YouTube, Google Maps, Google Play β€” taken from Google's own frontend enum, not guessed.

Q: How far back does it go? As far as Google's archive does. The measured sample includes creatives first shown in 2021.

Q: Can I filter by date? Not server-side β€” Google's endpoint no longer exposes a date filter. Filter firstShownAt / lastShownAt in the dataset, or use the per-country dates in regionStats.

Q: Can I get more than 100 ads? Yes. 100 is Google's page ceiling; the Actor pages through with a cursor until it hits maxItems. Cursor pagination was verified over 1,000 rows across five targets with zero duplicates.

Q: Does a run ever return fewer rows than I asked for? Yes, when the advertiser simply has fewer ads, or when a country/format filter is narrower than their activity. The run status message tells you which of the two happened.

Q: What happens at my spend cap? The run stops delivering. Because rows are billed on push, you never receive unpaid rows or pay for rows you did not receive.


The Google Ads Transparency Center is a public transparency disclosure that Google publishes to meet regulatory obligations (the EU Digital Services Act among them). This Actor reads only the public, unauthenticated data those pages already serve to any visitor: advertiser names, ad creatives, and the run metadata Google itself chose to publish. It uses no credentials, bypasses no login, and collects no personal data about consumers.

Use it for competitor and market research, ad-creative analysis, brand-safety monitoring and compliance work. You are responsible for how you use the output, including any downstream use of the creative images, which remain the property of their advertisers.


πŸ”§ Output fields

creativeId Β· advertiserId Β· advertiserName Β· advertiserDomain Β· format Β· formatId Β· firstShownAt Β· lastShownAt Β· daysShown Β· creativeUrl Β· adHeadline Β· adDescription Β· adDisplayUrl Β· adExtensions Β· creativeImageUrl Β· creativeWidth Β· creativeHeight Β· previewUrl Β· imageUrls Β· previewUrls Β· variantCount Β· countries Β· countryCount Β· impressionsMin Β· impressionsMax Β· platforms Β· regionStats Β· adCategory Β· adCategoryId Β· searchedBy Β· searchedValue Β· scrapedAt