Google Ads Monitor: Competitor Search Ads & Ad Copy Changes avatar

Google Ads Monitor: Competitor Search Ads & Ad Copy Changes

Pricing

from $6.30 / 1,000 google results page checkeds

Go to Apify Store
Google Ads Monitor: Competitor Search Ads & Ad Copy Changes

Google Ads Monitor: Competitor Search Ads & Ad Copy Changes

See which competitors run Google search ads on your keywords, in any country or city. Get headlines, descriptions, positions and sitelinks, and a monitor mode that reports new advertisers, new ad copy and advertisers that stopped.

Pricing

from $6.30 / 1,000 google results page checkeds

Rating

0.0

(0)

Developer

Southern Data

Southern Data

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

6 hours ago

Last modified

Security

Limited permissions

Share

See which competitors run Google search ads on your keywords, in any of 50 countries and in a city, region or postcode you choose. For each advertiser you get the headline, description, every ad text variant seen, display URL, position (top, middle or bottom of the page), sitelinks and phone number. Turn on changes mode, schedule it, and each run returns only what changed: new advertisers, new ad copy, advertisers that came back and advertisers that stopped.

Read this first: what it is and what it isn't

  • Google does not show ads on every page load. The same search can show 3 ads on one load and none on the next. In our tests before release, ads appeared on 33–58% of page loads country-wide and on 50–94% with a city set. That is why each keyword is loaded checks per keyword times (default 2) and the results are merged. A keyword with no ads in any check is listed in the KEYWORDS record. Add checks or a city rather than taking that as proof that nobody bids on it.
  • Ad texts rotate. Google assembles responsive search ads from up to 15 headlines and 4 descriptions, so the same advertiser reads differently on almost every load. You get one row per advertiser per keyword: the wording seen most often, plus every wording seen in headlinesSeen and descriptionsSeen.
  • It is a sample of what a searcher in that place sees right now, not Google's auction data. There are no bids, spend, impressions or click-through rates. Google personalises results and keeps changing them, so two runs a minute apart can differ.
  • Landing-page URLs are not returned. Ad links are Google click-tracking links; following them would bill the advertiser for a fake click, so the actor never outputs or opens them. You get the display URL and the advertiser's domain.
  • Ads only, not organic results or Shopping ads. It reads text search ads (top, middle and bottom). Shopping/product-listing carousels, Local Services Ads and Maps ads are not included.
  • It does not use the Google Ads Transparency Center. See Data source and compliance below.

Quick start

{
"keywords": ["emergency plumber", "blocked drains", "hot water repairs"],
"country": "au",
"location": "Sydney, NSW",
"checksPerKeyword": 3,
"competitorDomains": ["competitor-plumbing.com.au"],
"myDomain": "mybusiness.com.au",
"mode": "changes",
"monitorName": "sydney-plumbing"
}

Run it once to record the baseline, then schedule the saved task daily or weekly. Keep the same monitorName, because that is what it remembers between runs.

Input

FieldWhat it does
keywordsSearch terms, one per line. Up to 1,000 per run. Case and spacing duplicates are removed.
countryOne of 50 countries (two-letter code, e.g. us, au, gb, de). Sets the Google site, the proxy country and the default language.
locationOptional city, region or postcode, e.g. Sydney, NSW, Austin, TX, London, England, 2000,New South Wales,Australia. It is checked against Google's own list of places before any search, for free. Typos get suggestions ("Did you mean Sydney,New South Wales,Australia?"), and a place outside country is refused. Use English place names (Munich, not München).
languageOptional interface language code (en, de, pt-BR). Empty = the country's main language.
devicedesktop or mobile. Mobile can show different ads.
checksPerKeyword1–10, default 2. Each load is one paid check.
stopWhenAdsFoundCheaper: stop checking a keyword once a check shows ads. You may miss rotating advertisers.
competitorDomains, myDomainFlags rows with isCompetitor / isYou (subdomains count).
onlyCompetitorsReturn only competitor ads and your own. The ADVERTISERS record still lists everyone.
modeall_ads (every advertiser, each run) or changes (only what changed since the last run).
monitorName, includeUnchanged, goneAfterRunsChanges-mode memory name; also return unchanged rows; how many runs in a row an advertiser must be missing before advertiser_gone (default 3).

How changes mode works

For each keyword plus country, language, device and location, the actor remembers every advertiser and every headline part and description sentence it has seen.

  • baseline: the first run. Everything is recorded and returned once.
  • new_advertiser: a domain that hasn't shown an ad on this keyword before.
  • new_copy: an advertiser shows headline or description text that has never been seen before. newCopy lists the new texts and previousHeadline shows their last headline. Re-ordered texts are not a change. Because texts rotate, new copy is reported only after an advertiser has been seen on about 6 page loads; texts seen before that are learned silently.
  • advertiser_back: an advertiser that had been reported gone is showing again.
  • advertiser_gone: an advertiser has been missing for goneAfterRuns runs in a row on runs where the keyword showed other ads. Runs where Google showed no ads at all don't count. Each gone advertiser is reported once.
  • unchanged: returned only with includeUnchanged.

Memory is kept for 180 days in a named key-value store (ads-monitor-<name>).

Output: 28 columns, same order on every row

Unknown values are null or [], never guessed.

ColumnMeaning
keywordThe search term checked, as you typed it (spaces tidied)
countryCountry code of the Google site and proxy location used, e.g. us, au, gb
languageGoogle interface language (hl), e.g. en
devicedesktop
locationCity/region the search was localised to (Google place name), or null for the whole country
advertiserDomainAdvertiser website domain as Google shows it on the ad, e.g. booking.com. null only on rare ads without a visible domain
advertiserNameAdvertiser name as Google shows it above the ad (often the brand, sometimes the domain). null when Google shows none
headlineThe advertiser's ad headline as shown most often in this run (Google combines up to 3 headline texts with "
descriptionDescription shown with that headline (longest version seen; Google may cut it with "..."). null on advertiser_gone rows
headlinesSeenEvery distinct headline this advertiser showed for this keyword in this run (Google rotates ad texts between page loads). [] on advertiser_gone rows
descriptionsSeenEvery distinct description seen in this run. [] on advertiser_gone rows
displayUrlThe green display URL / breadcrumb, e.g. "https://www.ihg.com › sydney". Not a click link: the real landing page is hidden behind Google's ad-click redirect, which this Actor never opens
positiontop (above the results)
rankPlace within that position block, 1 = first ad (best seen across checks)
sitelinksExtra links shown under the ad (sitelink texts, max 8)
phoneCall extension phone number shown on the ad, if any
seenInChecksIn how many of this run's checks (page loads) of the keyword this ad appeared. 0 on advertiser_gone rows
checksHow many Google pages were loaded for this keyword in this run
isCompetitortrue if the advertiser domain is one of your competitorDomains (subdomains included); null when you gave none
isYoutrue if the advertiser domain is your myDomain; null when you gave none
changechanges mode: baseline (first run of this keyword)
newCopynew_copy rows: the headline parts / description sentences this advertiser had not shown before on this keyword
previousHeadlinechanges mode: the advertiser's most recent headline from an earlier run (for gone rows: their last ad)
firstSeenAtchanges mode: when this monitor first saw the advertiser on this keyword (ISO 8601 UTC). null in all_ads mode
lastSeenBeforechanges mode: when the advertiser was last seen on this keyword before this run (ISO 8601 UTC)
checkedAtWhen this run started (ISO 8601 UTC)
searchUrlThe Google search that was checked (open it to see the page yourself; results differ per person and load)
adKeyStable id of this advertiser on this keyword + country/language/device/location. Same advertiser in a later run = same adKey

The run also writes these key-value records:

  • ADVERTISERS: every advertiser seen, the keywords they bid on, their share of your keywords, their best position and their top-ad count. This is the quickest "who are my competitors" view.
  • KEYWORDS: per keyword, the pages loaded, pages with ads, ads found, the location Google applied and any errors.
  • RUN_SUMMARY: totals, ad fill rate, changes by type, charged events and settings.

The dataset has four views: Ads, Ad copy, Changes and All fields.

Pricing (pay per event)

EventPriceWhen
Google results page checked$0.007Per Google page loaded for one keyword. Ad rows are free. Pages that fail to load, automatic reloads, and runs with invalid input are free.

Store discount tiers: free-plan and Bronze users pay the price above. Silver gets 5% off and Gold (and higher) gets 10% off.

Examples:

  • 20 keywords × 2 checks = 40 checks = $0.28 per run, or about $8.40 a month run daily.
  • 5 local keywords × 3 checks, weekly = $0.105 per run.
  • stopWhenAdsFound lowers the cost on keywords that show ads early.
  • Invalid input (no keywords, an unknown place, a wrong language code) costs $0. The run ends with a message saying what to fix.
  • The self-test loads one live Google page and costs one check ($0.007).

Set the run's maximum cost to cap spending. The actor never starts a check it can't pay for, and it tells you how many checks it skipped.

Data source and compliance

  • Ads are read from normal Google Search result pages, fetched through Apify's own Google SERP proxy (the same route as Apify's Google Search Results Scraper). The actor does no captcha solving or anti-bot circumvention of its own.
  • It does not use the Google Ads Transparency Center. Its terms say its content may be used for information or research purposes only, and not sold or monetised.
  • It never opens ad-click links, so advertisers are never charged for clicks.
  • Only advertiser and ad information is collected. There is no personal data about searchers.
  • You are responsible for how you use the results, including Google's terms. See COMPLIANCE.md in the source for details.

Reliability

  • Before release, a final batch of 12 runs loaded 165 of 165 Google pages (100%). That included a 40-keyword US batch, changes mode on two runs, a mobile city search, competitor-only output and an unknown-location input. Every row passed the output schema.
  • A daily self-test checks the ad parser on saved Google pages and makes one live search to confirm Google applied the location. If Google changes its page layout, the self-test fails and the actor is fixed.

FAQ

Why did a keyword show no ads? Google showed none on the loads we made. Try 3+ checks, set a city, or run at another time of day. Some keywords (for example, some insurance and legal terms) are restricted or rarely served to new sessions.

Why don't top ads appear as often as when I search? Google decides ad placement per load. Bottom-of-page ads are common in these samples.

Can I get the advertiser's landing page? No. See above. Use the display URL and domain.

Can I track Shopping ads? Not yet.