Google Ads Transparency Center Scraper: Competitor Ads
Pricing
from $1.50 / 1,000 ad scrapeds
Google Ads Transparency Center Scraper: Competitor Ads
Google ad library scraper for competitor research. Export every ad a brand runs on Search, YouTube, Shopping, Maps and Play from the Google Ads Transparency Center by name, domain or advertiser ID. Dates, days active, countries, EU impressions, creatives. No login.
Pricing
from $1.50 / 1,000 ad scrapeds
Rating
0.0
(0)
Developer
PulseData
Maintained by CommunityActor stats
1
Bookmarked
108
Total users
31
Monthly active users
18 hours ago
Last modified
Categories
Features
Share
This actor exports the ads any advertiser runs or has run on Google (Search, YouTube, Shopping, Maps, Google Play and image/display placements) from the public Google Ads Transparency Center. Enter a brand name, a domain such as nike.com, an advertiser ID or a Transparency Center URL, and get one JSON item per ad with format, first and last shown dates, days shown, countries, EU impression ranges, targeting flags, YouTube video IDs and creative images. A second mode tells you whether a company runs Google Ads, under which advertiser accounts, and roughly how many ads.
No Google account, login or cookies are needed. PulseData is not affiliated with Google.
Quick start
{ "queries": ["nike.com"], "maxAdsPerQuery": 100 }
You get up to 100 ads that point to nike.com, across all advertiser accounts that run them.
Features
- Scrape all Google ads of a competitor by domain, name, advertiser ID (
AR…) or Transparency Center URL, and export them to CSV, Excel or JSON. - Find a brand's YouTube video ads with the YouTube video ID and watch URL.
- Filter Google ads by country, format, platform and date.
- Get EU ad impressions per country and platform, as published under the Digital Services Act.
- Monitor a competitor's new Google ads with scheduled runs that return only unseen ads.
- Check if a company runs Google Ads and look up its advertiser ID, legal name, country and verification status.
- Use it as a Google Ads Transparency API over HTTP (see the FAQ).
Use cases
- Competitor ad research: every creative a competitor runs, how long it has been live and where. A high
daysShownusually marks an ad the advertiser keeps paying for. - Lead generation lists: split prospect domains into companies that advertise on Google and companies that do not.
- Brand protection: watch who advertises pointing to your domain.
Input
{"queries": ["nike.com", "Zalando", "AR16735076323512287233"],"region": "DE","format": "VIDEO","platform": "ALL","maxAdsPerQuery": 500}
| Field | Type | Default | Meaning |
|---|---|---|---|
queries | array | empty | Names, domains, AR… IDs or Transparency Center URLs, one per line |
domains | array | empty | Exact domains such as nike.com: every ad pointing to the domain, from any advertiser |
advertiserIds | array | empty | IDs starting with AR: all ads of that account |
startUrls | array | empty | adstransparency.google.com advertiser, domain search or creative pages |
resultType | select | ads | ads or advertisers (one summary row per account, see below) |
maxAdvertisersPerQuery | integer | 10 | Summary mode only: most accounts per domain or name. 0 means no limit |
region | string | anywhere | anywhere or an ISO country code (US, DE) |
format | select | ALL | ALL, TEXT, IMAGE, VIDEO |
platform | select | ALL | ALL, SEARCH, YOUTUBE, MAPS, PLAY, SHOPPING |
startDate, endDate | date | empty | Only ads shown in this range (YYYY-MM-DD) |
maxAdsPerQuery | integer | 100 | 0 means no limit |
advertiserMatch | select | best | For names: best takes the largest match, all scrapes every match |
includeDetails | boolean | true | Per-ad regions, EU impressions, targeting (one extra request per ad) |
enrichPreviews | boolean | true | YouTube ID and image assets from image/video previews |
proxyConfiguration | object | Apify residential | Google blocks datacenter IPs quickly, so keep residential |
onlyNewAds | boolean | false | Monitor mode: output and charge only ads not delivered before |
monitorStoreName | string | empty | Key-value store that remembers delivered ads |
Fill at least one of queries, domains, advertiserIds and startUrls. An advertiser that two entries point to is scraped and charged once. A creative URL returns that single ad and ignores the filters.
Monitor new ads of a competitor
{ "domains": ["nike.com"], "maxAdsPerQuery": 0, "onlyNewAds": true }
The actor stores the creative ID of every delivered ad in a named key-value store in your account. Ads already in the store are neither output nor charged. The first run returns every ad up to maxAdsPerQuery. Save the input as a task with an Apify schedule and an integration (email, Slack, a webhook), and each run's dataset holds only the new ads.
- An empty
monitorStoreNamegives each different input its own history. maxAdsPerQuerycounts ads already seen, so0is the usual monitor setting.- Schedule one run per store; parallel runs can deliver the same ad twice.
- Monitor mode does not apply to advertiser summaries.
Check if a company runs Google Ads (advertiser summary mode)
Set resultType to advertisers to get one row per advertiser account behind each target instead of the ads.
{ "resultType": "advertisers", "domains": ["nike.com", "hellofresh.com", "example-shop.com"] }
A domain returns the accounts behind up to 120 ads pointing to it, sorted by adsPointingToDomain. Domains are more reliable than names, because brands often advertise through a parent company, regional entity or agency. A target with no ads still gets a row with runsGoogleAds: false. The filters apply to the ad counts.
Output from a real run with "queries": ["Nike", "hellofresh.com"] (two of six rows):
[{"query": "Nike","matchedVia": "advertiser name","matchedDomain": null,"runsGoogleAds": true,"advertiserId": "AR16735076323512287233","advertiserName": "Nike, Inc.","advertiserLegalName": "Nike, Inc.","advertiserCountry": "US","advertiserVerified": true,"adCountLow": 8000,"adCountHigh": 9000,"adsPointingToDomain": null,"region": "anywhere","advertiserUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233?region=anywhere","scrapedAt": "2026-11-07T08:39:22.794Z"},{"query": "hellofresh.com","matchedVia": "website","matchedDomain": "hellofresh.com","runsGoogleAds": true,"advertiserId": "AR17410177287600472065","advertiserName": "HelloFresh SE","advertiserLegalName": "HelloFresh SE","advertiserCountry": "DE","advertiserVerified": true,"adCountLow": 9000,"adCountHigh": 10000,"adsPointingToDomain": 25,"region": "anywhere","advertiserUrl": "https://adstransparency.google.com/advertiser/AR17410177287600472065?region=anywhere","scrapedAt": "2026-11-07T08:39:34.701Z"}]
adCountLow and adCountHigh are Google's approximate range for the whole account.
Output
In the default ads mode you get one item per ad:
{"query": "Zalando SE","advertiserId": "AR15589870916631265281","advertiserName": "Zalando SE","advertiserCountry": "DE","advertiserLegalName": "Zalando SE","advertiserVerified": true,"creativeId": "CR02366714687346704385","url": "https://adstransparency.google.com/advertiser/AR15589870916631265281/creative/CR02366714687346704385?region=anywhere","advertiserUrl": "https://adstransparency.google.com/advertiser/AR15589870916631265281?region=anywhere","format": "TEXT","firstShown": "2024-06-13T14:01:09.029Z","lastShown": "2026-08-19T12:02:07.405Z","daysShown": 788,"previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/13004201952535908299","imageUrls": ["https://tpc.googlesyndication.com/archive/simgad/13004201952535908299"],"youtubeVideoId": null,"destinationUrl": null,"regionsShownIn": "BE, NL","regions": [{ "regionCode": "BE", "regionName": "Belgium", "impressionsLow": 15000, "impressionsHigh": 20000,"firstShown": "2024-06-13", "lastShown": "2026-08-19","platforms": [{ "platform": "GOOGLE_SEARCH", "impressionsLow": 15000, "impressionsHigh": 20000 }] }],"euTotals": { "impressionsLow": 15000, "impressionsHigh": 20000, "firstShown": "2024-06-13", "lastShown": "2026-08-19", "platforms": [] },"targeting": { "demographic": { "included": true, "excluded": false },"geographic": { "included": true, "excluded": true }, "contextual": { "included": true, "excluded": false } },"variationsCount": 1,"scrapedAt": "2026-09-25T08:00:00.000Z"}
Items also carry previewUrl, previewHtml, youtubeUrl, appId, topicId and detailLastShown. Advertiser country, legal name and verification are filled for name and ID queries only.
Pricing
Pay per event. Details and preview enrichment are included.
| Event | Price | Per 1,000 |
|---|---|---|
ad-scraped (one ad returned) | $0.0015 | $1.50 |
advertiser-summary (one advertiser summary row, from 2026-11-21) | $0.003 | $3.00 |
apify-actor-start (once per run) | $0.01 |
Worked example: 200 ads of one mid-size advertiser cost 200 x $0.0015 + $0.01 = $0.31.
In monitor mode only new ads are charged. A daily run that finds 5 new ads costs 5 x $0.0015 + $0.01 = $0.0175.
Advertiser summary rows are free until 20 November 2026; from 21 November 2026 each row costs $0.003, including runsGoogleAds: false rows. Example: 100 prospect domains, where 30 advertise through one account, 10 through three accounts and 60 run no Google ads, return 30 + 30 + 60 = 120 rows: 120 x $0.003 + $0.01 = $0.37.
FAQ
Why do I get fewer ads than the Transparency Center shows?
maxAdsPerQuery defaults to 100. Set it to 0 for everything, and split large advertisers by region, format, platform or dates.
A name matched the wrong advertiser. What now?
Use the AR… ID from its URL, or set advertiserMatch to all.
How do I find a company's advertiser ID?
Run its domain with resultType set to advertisers and pass the returned advertiserId to advertiserIds.
Why are impressions and targeting empty for some ads? Google discloses them only for ads shown in the EU.
Which proxies work? Apify residential, the default. The Google SERP and Unblocker groups do not reach this endpoint; the actor swaps them for residential.
Is there a Google Ads Transparency Center API?
Google offers no official REST API for it. POST https://api.apify.com/v2/acts/pulsedata~google-ads-transparency-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN> with the input JSON as the body returns the ads.
Is it legal? It reads only what Google publishes for transparency and collects no personal data. Follow Google's terms and applicable law.
Use it from Claude, ChatGPT or Cursor (Apify MCP server)
Add the Apify MCP server to any MCP client with this URL, which loads only this actor as a tool:
https://mcp.apify.com?tools=pulsedata/google-ads-transparency-scraper
Then ask, for example, "list the YouTube video ads Zalando showed in Germany this year and sort them by days shown". Billing is the same as a normal run.
Paying from an AI agent without an Apify account (x402 and Skyfire)
An agent can buy a prepaid, spend-capped Apify token at Apify AGI, paid in USDC through x402 or from a Skyfire wallet, and use it for both the API and the MCP server. This actor runs with limited permissions, so it works with these tokens. The smallest token is $1, tokens expire 14 days after purchase, and Apify marks agentic payments as experimental.
Ready-made report
We used this actor for State of Google Advertising: DTC & Ecommerce 2026, a PDF report with CSV data on about 100 consumer brands.
Example pages
- See every Google ad a competitor is running
- Find a brand's YouTube video ads
- Scrape Google ads shown in Germany
- Monitor a store's Google Shopping ads
- Export an advertiser's Google Search text ads
- See all Google ads Nike is running
- See all Google ads Amazon is running
- See all Google ads Shopify is running
- Check which companies run Google Ads
- Find the Google Ads advertiser ID of a company
Related actors
- Google Ads Scraper by domain: the same ads with a domain-only input. $1.90 per 1,000 ads and no per-run fee.
- YouTube Ads Scraper: only the YouTube video ads of a brand.
- LinkedIn Ad Library Scraper: the same competitor view for LinkedIn.
- TikTok Ad Library Scraper: TikTok video ads shown in Europe.
- Website Tech Stack Detector: ad and analytics tags on an advertiser's site.
- YouTube Scraper: views and details for the videos behind YouTube ads.