Google Ads Transparency Scraper & Competitor Ad Monitor avatar

Google Ads Transparency Scraper & Competitor Ad Monitor

Pricing

from $2.00 / 1,000 ad scrapeds

Go to Apify Store
Google Ads Transparency Scraper & Competitor Ad Monitor

Google Ads Transparency Scraper & Competitor Ad Monitor

Scrape any advertiser's Google ads by domain or advertiser ID: text-ad headlines, descriptions and sitelinks (OCR), format, first and last shown dates. Monitor mode flags ads that started or stopped running since the last run, with webhook alerts. Pay per ad.

Pricing

from $2.00 / 1,000 ad scrapeds

Rating

0.0

(0)

Developer

Yushi Homma

Yushi Homma

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

See every ad a competitor runs on Google, from the public Google Ads Transparency Center, and get told when they launch or pull one. Enter a domain (nike.com) or advertiser ID. Each ad comes back as a flat row: format, first and last shown dates, days running, media links and, for search ads, the headline, description, display URL and sitelinks. The Transparency Center shows these only as images, so the Actor reads them with OCR.

  • Text-ad copy included: headlines, descriptions, display URLs and sitelinks are read from the ad preview with PP-OCRv6, which handles 50 languages, including Japanese, Chinese and European languages. Each ad is read once and remembered, so repeat runs don't pay to read it again.
  • Competitor monitoring built in: every row says whether the ad is newSinceLastRun or stoppedSinceLastRun. Turn on Only new and stopped ads to get (and pay for) only the changes, and add a webhook to be alerted about each one (to Slack, email or a spreadsheet via Zapier, Make or n8n).
  • Every format: text (search) ads with their copy, Shopping ads with product title, merchant and image, product-feed display ads with the product photo, video ads with their YouTube link, and image ads with the creative's image URL. Optional country and format filters.
  • API and AI agent tool: ask "what ads is this advertiser running?" in one API call, or let an AI agent call it as a tool through the Apify MCP server.
  • No browser, no login, no proxy needed: plain HTTP requests.

Use cases

  • Watch competitors' Google Ads: get a Slack message the day they launch a new campaign or stop an old one.
  • Collect competitors' search ad copy (headlines, descriptions, sitelinks) to benchmark messaging and offers.
  • Track how long ads run (firstShown, lastShown, daysShown) to spot the ones that work.
  • Feed ad copy into an LLM for analysis, or give an AI agent a "what is X advertising?" tool.

How to use it

  1. Add Advertisers: a domain (nike.com), a website URL, a Google advertiser ID (AR16735076323512287233) or an Ads Transparency Center link. A domain returns every advertiser account that runs ads for it.
  2. Optionally set a Region (US, GB, DE…) and an Ad format.
  3. Choose Max ads per advertiser (default 50, most recently shown first).
  4. For monitoring, turn on Only new and stopped ads, optionally set an Alert webhook URL, and run the Actor on a schedule, for example daily. The first run returns everything and becomes the baseline; later runs return only ads that started or stopped running.

The Actor stores which ads it has seen, and their text, per advertiser in your account's key-value store google-ads-transparency-monitor-state.

Tutorial: get a Slack message when a competitor launches or stops a Google ad

  1. In Zapier, Make or n8n, create a scenario that starts with a webhook trigger ("Catch Hook" in Zapier, "Custom webhook" in Make, "Webhook" node in n8n) and copy its URL.
  2. Add a Slack → Send message step. Map item.advertiserName, item.format, item.headline, item.description and item.adUrl into the message, and use item.newSinceLastRun / item.stoppedSinceLastRun to say whether the ad started or stopped.
  3. In this Actor, enter your competitors' domains under Advertisers (e.g. hubspot.com), set a Region if you only care about one country, turn on Only new and stopped ads, and paste the webhook URL into Alert webhook URL.
  4. Run it once. That run records the ads already live as the baseline and sends no alerts.
  5. Open Schedules in Apify Console and run the Actor daily with the same input. Each launched or stopped ad then becomes one Slack message, and you pay only for those ads.

To keep a history of every competitor ad instead, connect the Actor's dataset to Google Sheets with Apify's Google Sheets integration and turn Only new and stopped ads off.

Input

{
"advertisers": ["nike.com", "AR16735076323512287233"],
"region": "US",
"adFormat": "all",
"maxAdsPerAdvertiser": 50,
"extractAdText": true,
"onlyChanges": true,
"alertWebhookUrl": "https://hooks.example.com/google-ads"
}
FieldRequiredDescription
advertisersyesDomains, website URLs, advertiser IDs (AR…) or Ads Transparency Center links.
regionnoTwo-letter country code, or anywhere (default). A region in a Transparency Center link takes priority.
adFormatnoall (default), text, image or video.
maxAdsPerAdvertiserno1 to 5,000 ads per advertiser (default 50), most recently shown first.
extractAdTextnoRead text-ad copy with OCR (default true; included in the price).
onlyChangesnoReturn only ads that started or stopped running since the previous run (default false).
alertWebhookUrlnoReceives a POST for every ad that started or stopped running since the previous run.
proxyConfigurationnoLeave empty: Google is fetched directly, falling back to Apify datacenter and then residential proxies only if it rate-limits the run.

Output

One dataset item per ad:

{
"adId": "CR03473167961525583873",
"advertiserId": "AR16735076323512287233",
"advertiserName": "Nike, Inc.",
"adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR03473167961525583873?region=US",
"format": "text",
"headline": "Nike® Official Site - Browse Kids Tops",
"description": "Let them feel comfortable and confident in what they wear. Pullovers made for them…",
"displayUrl": "www.nike.com/shop/pullovers",
"sitelinks": [{ "title": "Kids' Price In Cart", "description": "Shop select kids' styles & see new prices when added to your cart." }],
"adText": "Nike\nwww.nike.com/shop/pullovers\nNike® Official Site - Browse Kids Tops\n…",
"firstShown": "2023-11-17T04:15:01.000Z",
"lastShown": "2026-10-25T17:31:16.000Z",
"daysShown": 1073,
"isRunning": true,
"region": "US",
"imageUrl": "https://tpc.googlesyndication.com/archive/simgad/…",
"videoUrl": null,
"previewUrl": null,
"newSinceLastRun": false,
"stoppedSinceLastRun": false,
"source": "https://adstransparency.google.com/?domain=nike.com&region=US",
"scrapedAt": "2026-10-25T18:01:12.511Z"
}
  • isRunning is true when Google showed the ad in the last 48 hours. stoppedSinceLastRun is true when it was running at the previous run and no longer is. An ad that drops out of the newest-ads window is still re-checked by ID, so stopped ads are caught even when many new ads push them down the list.
  • Shopping ads put the product title in headline and the merchant in displayUrl. Video ads carry videoUrl (YouTube) when the video is on YouTube. Image ads carry the creative in imageUrl.
  • Text fields are null for plain image and video ads, and for local (map) ads that have no headline. adText always holds everything that was read.
  • previewUrl is Google's preview script for the creative.

The webhook body is { "actor": "google-ads-transparency-monitor", "item": { ...same fields... }, "detectedAt": "<ISO time>" }.

API and AI agents

Run it and get the results in one call:

curl -X POST "https://api.apify.com/v2/acts/yushi3~google-ads-transparency-monitor/run-sync-get-dataset-items" \
-H "Authorization: Bearer <APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"advertisers": ["nike.com"]}'

It returns the dataset items as a JSON array. AI agents can call the Actor as a tool through the Apify MCP server.

Pricing

EventPrice
Ad returned (text-ad copy included)$0.002
Ad change alert delivered to your webhook$0.002

With Only new and stopped ads on, ads you already received are neither returned nor charged, so a daily competitor monitor costs only for real changes. Nothing is charged for an advertiser that fails, and failed webhook deliveries are not billed.

Limitations

  • Only what the Ads Transparency Center shows publicly. It doesn't show spend, impressions (except for EU political ads), targeting or keywords.
  • Text-ad copy comes from OCR. Clean English and CJK previews read almost perfectly. Previews that put a product photo next to the text can pick up a few stray characters.
  • Video ads hosted outside YouTube come with an image but no video link.
  • Some display ads (HTML5 and rich media) appear in the Transparency Center only as a blank placeholder. They come with no image.

When an advertiser fails

Every advertiser is processed even if one fails. Failures are listed in the run's key-value store under FAILED_TARGETS with the reason, such as a Google rate limit. The run fails outright only when Google changed its data format in a way the Actor can no longer read (it is re-tested against the live site every 12 hours) or when every advertiser failed.

Questions and issues

Open an issue on the Actor's Issues tab.