Google Ads Scraper — Competitor Ads & Change Monitor avatar

Google Ads Scraper — Competitor Ads & Change Monitor

Pricing

from $0.90 / 1,000 google ad results

Go to Apify Store
Google Ads Scraper — Competitor Ads & Change Monitor

Google Ads Scraper — Competitor Ads & Change Monitor

Discover Google ads by company, domain, or advertiser ID. Export creatives, copy, dates, impressions, landing pages, emails, phones, and reviews. Monitor NEW, CHANGED, and STOPPED competitor ads.

Pricing

from $0.90 / 1,000 google ad results

Rating

0.0

(0)

Developer

Kelopr

Kelopr

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Google Ads Competitor Intelligence & Change Monitor

See which Google ads a competitor is running, inspect the creative details, and monitor what appears, changes, or disappears.

You do not need to know anything about scraping or APIs. Paste a company domain, choose a mode, and click Start.

🚀 Your first run — click by click

  1. Open the Actor page in Apify.
  2. Click Try for free if you are on the Store page. This opens the Input tab.
  3. Under 🎯 Workflow, select ⚡ Quick Scan.
  4. Under 🏢 Companies, domains, or advertiser URLs, remove the example and enter a real company domain, for example example-brand.test.
  5. Leave 🌍 Region set to Anywhere for the broadest search.
  6. Enter 10 under 💯 Ads per target for a small first run.
  7. Leave the optional enrichment switches off for now.
  8. Click Start.
  9. Wait until the run status becomes Succeeded.
  10. Open the Output tab and choose Ads overview.

Each row is one ad. Click Open ad to verify it in Google Ads Transparency Center.

If the run succeeds but finds nothing, check the spelling, use the company's domain instead of its name, and set the region to Anywhere.

🏢 What should I enter?

You can add one or many targets. Enter one target per line.

What you enterExampleWhen to use it
Domain — recommendedexample-brand.testBest option for a normal competitor search
Company nameExample BrandDiscovery when you do not know the domain or advertiser ID
Advertiser IDAR12345678901234567Exact advertiser identity; avoids similarly named companies
Transparency Center URLhttps://adstransparency.google.com/advertiser/AR12345678901234567Exact advertiser copied from Google

A company-name search can return several legal advertiser entities. This is normal. Use a domain, advertiser ID, or advertiser URL when you need one exact identity.

🎯 Choose the right workflow

⚡ Quick Scan

Choose this for a fast overview or a large list of competitors.

It returns:

  • advertiser name, ID, and domain;
  • creative ID;
  • ad format: text, image, or video;
  • first and last shown timestamps;
  • preview image or interactive preview when Google exposes one;
  • direct advertiser and ad links;
  • coverage status for the search.

Recommended first input:

{
"workflow": "quick_scan",
"targets": ["example-brand.test"],
"region": "anywhere",
"maxResultsPerTarget": 10,
"adFormat": "all"
}

🔬 Deep Creative

Choose this when you need more than a list of ads. The Actor opens each creative and saves every extra field Google makes available.

It can add:

  • headline, description, call to action, and combined creative text;
  • landing page and visible URL;
  • image, asset, and interactive preview URLs;
  • creative variant count;
  • global impression range;
  • global and selected-region delivery dates;
  • region IDs, region count, and delivery-surface codes.

Deep Creative makes extra requests, so it is slower than Quick Scan. Start with 10–25 ads before requesting hundreds.

{
"workflow": "deep_creative",
"targets": ["example-brand.test"],
"region": "US",
"maxResultsPerTarget": 25
}

Some creatives expose only rendered media. Empty headline, landing-page, or impression fields mean Google did not expose that value; the Actor does not invent it.

🔔 Monitor & Compare

Choose this when you want recurring competitor alerts.

First monitor run

  1. Select 🔔 Monitor & Compare.
  2. Enter the competitors you want to watch.
  3. Enter a recognizable Monitor name, for example weekly-competitors.
  4. Set a result limit high enough to collect the complete advertiser result set.
  5. Click Start.

The first run creates a baseline. Its rows are marked BASELINE.

Second and later monitor runs

Run the Actor again with the same:

  • monitorName;
  • targets;
  • region;
  • format and date filters.

The result can contain:

StatusMeaning
BASELINEFirst saved snapshot
NEWCreative was not present in the previous snapshot
CHANGEDThe same creative ID changed; inspect changedFields
STOPPEDCreative disappeared from a complete result set
UNCHANGEDCreative is still the same; returned only when requested

The Actor does not claim that an ad stopped when the requested result limit was reached or the source was processed only partially.

Schedule the monitor

  1. After a successful baseline run, click Save as a new task.
  2. Give the task a clear name.
  3. In the left Apify menu, open Schedules.
  4. Click Create new.
  5. Choose how often the check should run.
  6. Click Add → Actor task and select the task you saved.
  7. Enable the schedule.

Keep the task input stable. Changing the monitor name creates a separate history.

🎨 Filter by format, date, or region

  • Ad format: choose all formats, text, image, or video.
  • Region: choose where the ads were shown. Anywhere provides the broadest discovery.
  • Active on or after (dateFrom): keeps ads whose last-shown date reaches this date.
  • Started on or before (dateTo): keeps ads whose first-shown date is not later than this date.
  • Dates must use YYYY-MM-DD, for example 2026-08-01.

dateFrom cannot be later than dateTo. If it is, the run summary tells you exactly what to correct.

📇 Add public contacts

Turn on 📇 Public website contacts to inspect each unique advertiser website.

Possible fields:

  • email and emails;
  • websitePhone and websitePhones;
  • website and contactPageUrls;
  • LinkedIn, Instagram, Facebook, YouTube, TikTok, and X/Twitter links when found.

Contacts are extracted only from public pages. A missing email or phone means the inspected website pages did not expose one.

📍 Add business details and reviews

Turn on 📍 Business profile to request a confidence-checked Google Maps match.

For a strong, unambiguous match, the Actor can add:

  • business name;
  • address and phone;
  • official website and Maps URL;
  • rating and review count when exposed by the source;
  • up to five public review texts and ratings.

To include review text, set ⭐ Review texts per advertiser from 1 to 5.

Large brands can have hundreds of stores using the same domain. The Actor rejects a weak or arbitrary location instead of presenting one branch's phone and reviews as information about the whole brand. Check businessMatchStatus:

StatusMeaning
exactDomainDomain and business name match confidently
strongNameStrong business-name match
lowConfidenceCandidate was found but its data was not attached
ambiguousMultipleLocationsSeveral plausible locations exist; no random branch was selected
notFoundNo suitable business candidate was found

📊 Where are my results?

After a run finishes, open Output. Four ready-made views are available:

Output tabWhat you see
Ads overviewPreview, advertiser, format, dates, status, and source link
Creative intelligenceCopy, assets, landing pages, impression ranges, and regions
Monitor changesNew, changed, stopped, baseline, and unchanged ads
Contacts & reviewsPublic contacts and confidence-checked business information

The Storage → Dataset page contains the same rows with every available field.

Export to CSV, Excel, or JSON

  1. Open the run.
  2. Open Output or Storage → Dataset.
  3. Click Export results.
  4. Choose CSV, Excel, JSON, XML, or another available format.
  5. Download the file.

📦 Important output fields

Identity and source

FieldMeaning
targetValue you entered
advertiserIdGoogle's AR... advertiser identifier
advertiserNameAdvertiser name returned by Google
advertiserCountryAdvertiser country when exposed
domainAdvertised domain when exposed
creativeIdGoogle's CR... creative identifier
transparencyUrlDirect link to this ad in Google Ads Transparency Center
advertiserUrlDirect link to the advertiser page

Ad and delivery

FieldMeaning
formattext, image, video, or unknown
firstShown / lastShownFirst and last source timestamps from the search result
previewImageUrlBest preview image when exposed
imageUrls / assetUrlsMedia URLs found in the creative
previewUrlsInteractive creative-preview URLs
globalImpressionsLower / globalImpressionsUpperSource-provided impression range
globalFirstShown / globalLastShownGlobal delivery dates from creative details
regionsCount / regionCriteriaIdsDelivery footprint reported by Google

Data confidence

FieldMeaning
detailStatusWhether creative detail loading completed
coverageStatusWhether the requested result set was complete
matchedLowerBound / matchedUpperBoundGoogle's result estimate when exposed
businessMatchStatusConfidence result for optional business enrichment

🧭 Coverage statuses

StatusMeaning
completeEvery available result was traversed
limitReachedMore ads exist than the requested maximum
partialSome usable ads were saved, but a request failed
noAdsThe target resolved but no matching ads were found
failedThe target could not be processed

matchedLowerBound and matchedUpperBound are source-provided ranges, not guessed exact totals.

📦 Fictional example row

The following values are examples only. They do not represent a real company or person.

{
"recordType": "ad",
"target": "example-brand.test",
"workflow": "deep_creative",
"advertiserId": "AR12345678901234567",
"advertiserName": "Example Brand Ltd.",
"domain": "example-brand.test",
"creativeId": "CR98765432109876543",
"format": "image",
"firstShown": "2026-08-01T10:00:00Z",
"lastShown": "2026-08-18T18:30:00Z",
"previewImageUrl": "https://cdn.example-brand.test/example-preview.png",
"globalImpressionsLower": 1000,
"globalImpressionsUpper": 2000,
"coverageStatus": "limitReached",
"changeStatus": "CURRENT",
"transparencyUrl": "https://adstransparency.google.com/advertiser/AR12345678901234567/creative/CR98765432109876543?region=anywhere"
}

🔌 Run through the API

Replace YOUR_APIFY_TOKEN with your own Apify API token.

curl -X POST \
"https://api.apify.com/v2/acts/trakk~google-ads-competitor-intelligence/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"workflow": "quick_scan",
"targets": ["example-brand.test"],
"region": "anywhere",
"maxResultsPerTarget": 10
}'

The run's default Dataset contains the ad rows. The OUTPUT record contains a short summary, target coverage, duration, enrichment counts, and monitor counts. ADVERTISER_SUMMARIES contains one rollup per advertiser.

❓ Troubleshooting

The run succeeded but returned zero rows

  1. Check the spelling.
  2. Use the company's domain instead of its name.
  3. Set the region to Anywhere.
  4. Remove date and format filters.
  5. Open Google Ads Transparency Center and confirm that the advertiser currently has visible ads.

I entered an invalid value

The Actor finishes safely with INPUT_NEEDS_ATTENTION instead of crashing. Open Output → Input help to see what is wrong, how to fix it, and a working example Input. Correct the value and run again.

The Actor returned fewer ads than expected

Check coverageStatus. limitReached means you should increase Ads per target. A date or format filter can also reduce the result count.

Some headline or landing-page fields are empty

Google does not expose identical fields for every creative format. The Actor keeps unavailable values empty instead of guessing them.

The preview column is empty for a video

Some ads expose an interactive previewUrls entry instead of a static image.

I received several advertisers for one company name

The brand may use multiple legal entities. Copy the correct advertiser's AR... ID and use that as the next target.

I enabled reviews but received none

Review text is attached only when one business is a confident match. A global brand, marketplace, or multi-location chain is intentionally rejected when one exact location cannot be identified safely.

What should I use for regular monitoring?

Save a successful Monitor & Compare input as an Apify Task, schedule that task, and keep the monitor name and filters unchanged.