Google Ads Scraper — Competitor Ads & Change Monitor
Pricing
from $0.90 / 1,000 google ad results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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
- Open the Actor page in Apify.
- Click Try for free if you are on the Store page. This opens the Input tab.
- Under 🎯 Workflow, select ⚡ Quick Scan.
- Under 🏢 Companies, domains, or advertiser URLs, remove the example and enter a real company domain, for example
example-brand.test. - Leave 🌍 Region set to Anywhere for the broadest search.
- Enter
10under 💯 Ads per target for a small first run. - Leave the optional enrichment switches off for now.
- Click Start.
- Wait until the run status becomes Succeeded.
- 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 enter | Example | When to use it |
|---|---|---|
| Domain — recommended | example-brand.test | Best option for a normal competitor search |
| Company name | Example Brand | Discovery when you do not know the domain or advertiser ID |
| Advertiser ID | AR12345678901234567 | Exact advertiser identity; avoids similarly named companies |
| Transparency Center URL | https://adstransparency.google.com/advertiser/AR12345678901234567 | Exact 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, orvideo; - 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
- Select 🔔 Monitor & Compare.
- Enter the competitors you want to watch.
- Enter a recognizable Monitor name, for example
weekly-competitors. - Set a result limit high enough to collect the complete advertiser result set.
- 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:
| Status | Meaning |
|---|---|
BASELINE | First saved snapshot |
NEW | Creative was not present in the previous snapshot |
CHANGED | The same creative ID changed; inspect changedFields |
STOPPED | Creative disappeared from a complete result set |
UNCHANGED | Creative 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
- After a successful baseline run, click Save as a new task.
- Give the task a clear name.
- In the left Apify menu, open Schedules.
- Click Create new.
- Choose how often the check should run.
- Click Add → Actor task and select the task you saved.
- 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 example2026-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:
emailandemails;websitePhoneandwebsitePhones;websiteandcontactPageUrls;- 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:
| Status | Meaning |
|---|---|
exactDomain | Domain and business name match confidently |
strongName | Strong business-name match |
lowConfidence | Candidate was found but its data was not attached |
ambiguousMultipleLocations | Several plausible locations exist; no random branch was selected |
notFound | No suitable business candidate was found |
📊 Where are my results?
After a run finishes, open Output. Four ready-made views are available:
| Output tab | What you see |
|---|---|
| Ads overview | Preview, advertiser, format, dates, status, and source link |
| Creative intelligence | Copy, assets, landing pages, impression ranges, and regions |
| Monitor changes | New, changed, stopped, baseline, and unchanged ads |
| Contacts & reviews | Public contacts and confidence-checked business information |
The Storage → Dataset page contains the same rows with every available field.
Export to CSV, Excel, or JSON
- Open the run.
- Open Output or Storage → Dataset.
- Click Export results.
- Choose CSV, Excel, JSON, XML, or another available format.
- Download the file.
📦 Important output fields
Identity and source
| Field | Meaning |
|---|---|
target | Value you entered |
advertiserId | Google's AR... advertiser identifier |
advertiserName | Advertiser name returned by Google |
advertiserCountry | Advertiser country when exposed |
domain | Advertised domain when exposed |
creativeId | Google's CR... creative identifier |
transparencyUrl | Direct link to this ad in Google Ads Transparency Center |
advertiserUrl | Direct link to the advertiser page |
Ad and delivery
| Field | Meaning |
|---|---|
format | text, image, video, or unknown |
firstShown / lastShown | First and last source timestamps from the search result |
previewImageUrl | Best preview image when exposed |
imageUrls / assetUrls | Media URLs found in the creative |
previewUrls | Interactive creative-preview URLs |
globalImpressionsLower / globalImpressionsUpper | Source-provided impression range |
globalFirstShown / globalLastShown | Global delivery dates from creative details |
regionsCount / regionCriteriaIds | Delivery footprint reported by Google |
Data confidence
| Field | Meaning |
|---|---|
detailStatus | Whether creative detail loading completed |
coverageStatus | Whether the requested result set was complete |
matchedLowerBound / matchedUpperBound | Google's result estimate when exposed |
businessMatchStatus | Confidence result for optional business enrichment |
🧭 Coverage statuses
| Status | Meaning |
|---|---|
complete | Every available result was traversed |
limitReached | More ads exist than the requested maximum |
partial | Some usable ads were saved, but a request failed |
noAds | The target resolved but no matching ads were found |
failed | The 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
- Check the spelling.
- Use the company's domain instead of its name.
- Set the region to Anywhere.
- Remove date and format filters.
- 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.