Google Ads Transparency Center Scraper: Competitor Ads avatar

Google Ads Transparency Center Scraper: Competitor Ads

Pricing

from $1.50 / 1,000 ad scrapeds

Go to Apify Store
Google Ads Transparency Center Scraper: Competitor Ads

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

PulseData

Maintained by Community

Actor stats

1

Bookmarked

108

Total users

31

Monthly active users

18 hours ago

Last modified

Features

Limited permissions

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 daysShown usually 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
}
FieldTypeDefaultMeaning
queriesarrayemptyNames, domains, AR… IDs or Transparency Center URLs, one per line
domainsarrayemptyExact domains such as nike.com: every ad pointing to the domain, from any advertiser
advertiserIdsarrayemptyIDs starting with AR: all ads of that account
startUrlsarrayemptyadstransparency.google.com advertiser, domain search or creative pages
resultTypeselectadsads or advertisers (one summary row per account, see below)
maxAdvertisersPerQueryinteger10Summary mode only: most accounts per domain or name. 0 means no limit
regionstringanywhereanywhere or an ISO country code (US, DE)
formatselectALLALL, TEXT, IMAGE, VIDEO
platformselectALLALL, SEARCH, YOUTUBE, MAPS, PLAY, SHOPPING
startDate, endDatedateemptyOnly ads shown in this range (YYYY-MM-DD)
maxAdsPerQueryinteger1000 means no limit
advertiserMatchselectbestFor names: best takes the largest match, all scrapes every match
includeDetailsbooleantruePer-ad regions, EU impressions, targeting (one extra request per ad)
enrichPreviewsbooleantrueYouTube ID and image assets from image/video previews
proxyConfigurationobjectApify residentialGoogle blocks datacenter IPs quickly, so keep residential
onlyNewAdsbooleanfalseMonitor mode: output and charge only ads not delivered before
monitorStoreNamestringemptyKey-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 monitorStoreName gives each different input its own history.
  • maxAdsPerQuery counts ads already seen, so 0 is 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.

EventPricePer 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