Google Ads Transparency Scraper - Competitor Ad Creatives
Pricing
$1.00 / 1,000 ad creative scrapeds
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
Maintained by CommunityActor 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.comreturns 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:
| Field | Fill | What it is |
|---|---|---|
creativeId, advertiserId, advertiserName | 100% | Identity of the ad and who runs it |
creativeUrl | 100% | The ad's own page on adstransparency.google.com |
format / formatId | 100% | TEXT, IMAGE or VIDEO |
firstShownAt, lastShownAt | 100% | ISO 8601 timestamps |
daysShown | 100% | Google's run-days counter |
countries, countryCount, regionStats | 100% | Every country the ad ran in, with per-country first/last shown dates |
advertiserDomain | 78.5% | Set on domain searches and wherever Google returns it |
creativeImageUrl (+ creativeWidth/Height) | 79.5% | The archived creative image |
previewUrl, previewUrls | 27.9% | Google's live rendering of the creative |
platforms | 19.6% | Search / Shopping / YouTube / Maps / Play split |
impressionsMax / impressionsMin | 19.5% / 13.8% | Google's banded impression range |
adCategoryId / adCategory | 29.0% / 3.5% | Google's own category id, and its label where published |
adHeadline, adDescription, adDisplayUrl | 2.9% | Ad copy, where a live preview still exists |
adExtensions | 0.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}
| Input | Default | Notes |
|---|---|---|
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. |
format | any | TEXT, IMAGE or VIDEO. Google accepts only one at a time. |
includeDetails | true | The enrichment call. Off is ~2x faster and much thinner. |
maxItems | 200 | Total cap. 0 = unlimited. |
maxItemsPerTarget | 0 | Stops one giant advertiser eating the whole run. |
maxAdvertisersPerName | 3 | How far each brand name expands. |
detailConcurrency | 6 | Parallel detail requests. |
residentialFallback | true | Auto-escalate when Google rate-limits datacenter IPs. |
proxyConfiguration | Apify Proxy on | Leave 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 Actor | Typical 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:
| Exit | Result |
|---|---|
Apify Proxy auto (datacenter) | HTTP 429 Γ 3 |
groups-auto + session | HTTP 429 Γ 3 |
BUYPROXIES94952 + session | HTTP 429 Γ 3 |
RESIDENTIAL, country-US | HTTP 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.
βοΈ Legal and fair use
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