Google Ads Transparency Scraper
Pricing
from $18.00 / 1,000 results
Google Ads Transparency Scraper
Designed for marketers, researchers, and business intelligence teams, this efficient tool scans a provided list of websites/domains to determine which ones have ever run Google Ads—whether in the past or currently—by leveraging data from the Google Ads Transparency Center.
Pricing
from $18.00 / 1,000 results
Rating
0.0
(0)
Developer
Alkausari M
Maintained by CommunityActor stats
5
Bookmarked
360
Total users
46
Monthly active users
0.5 hours
Issues response
an hour ago
Last modified
Categories
Share
Overview
This Apify Actor quickly checks a list of website domains to determine whether they have ever run Google Ads — either currently active or at any point in the past.
It uses publicly available data from the official Google Ads Transparency Center → https://adstransparency.google.com/
Simple three-tier pricing — the price is set by your proxy choice, nothing else:
| Proxy setting | Price / 1,000 domains | Recommended for |
|---|---|---|
| No proxy (default) | $12.00 | Most users |
| Apify datacenter proxy | $14.00 | Extra IP diversity |
| Apify residential proxy | $24.00 | When residential IPs are specifically required |
You pay once per domain, whether ads are found or not — a domain that fails with an error is never billed a proxy surcharge. The default no-proxy setting is the cheapest and works well for most runs. See Proxy below for why proxy runs show up as two line items on your invoice.
Primary use cases
- Competitor advertising intelligence
- Lead generation for digital marketing agencies
- Market & trend analysis
- High-volume domain screening
Performance
- 99.5% of runs succeed — and every domain gets a result: Yes, No, or an explicit error
- Interrupted runs resume where they left off — no lost work, no duplicate results
- Large lists can be split across several runs to finish sooner
- Predictable pricing — the price per domain is set by your proxy choice alone, never by the results
Key Features
- Processes lists of any size — from one domain to thousands per run
- Clear yes/no result + optional metadata per domain
- Ad count, last shown date, ad format, and direct link per domain
- Structured output (JSON, CSV, Excel compatible)
- Automatic retries and error handling
- Runs with or without a proxy — your choice sets the price, and the cheapest option is already the default
- Reads only public data, with no authentication
How to Run the Actor
- Go to your Apify Console → find or open this Actor
- Click Try for free or Run
- Switch to the Input tab
- Paste your JSON configuration (see examples below)
- Click Start
- Monitor progress in the run log
- When finished → go to Storage → Dataset → download results
Input Configuration
Provide input as a JSON object or paste a list of domains.
Minimal working example
Any mix of bare domains and full website URLs is accepted — each entry is reduced to its domain automatically:
{"domains": ["apple.com","www.tesla.com","https://shopify.com/","https://www.kars4kids.org/donate?utm_source=newsletter","columbusfoundation.org"]}
Region
By default the Actor reports ads from Anywhere (all regions combined). To check a specific country, set the region field — it's a dropdown of every region Google's Transparency Center supports, selected by name in the Console:
{"domains": ["apple.com"],"region": "US"}
Ad counts, the last-shown date, and the ad format can differ from one region to another, so pick the market you care about. Leave it as anywhere for a global view.
adsPageLoadDelay Tuning Guide
If ad details such as last run date or format are missing from the output, the results page may not have finished rendering before the scraper read it. If ad details such as last-shown date or format are missing from the output, raise this value.
| Connection | Recommended Value |
|---|---|
| Fast | 1500 – 2000 ms |
| Stable | 2000 – 3000 ms |
Proxy
Your proxy choice sets the price per domain — nothing else does.
Start with no proxy. It's the default, the cheapest tier, and the right choice for most runs. If you see repeated errors, switch to datacenter proxy. Use residential only when residential IPs are specifically required — residential bandwidth is significantly more expensive, which is why the rate is higher. In our 200-domain benchmark, the default and residential configurations returned the same answers.
Why proxy runs show two charges per domain. Every domain is billed a Domain checked charge ($12.00 / 1,000). Choosing a proxy adds one more charge on top — Datacenter proxy surcharge (+$2.00 / 1,000) or Residential proxy surcharge (+$12.00 / 1,000) — so your invoice shows two line items per domain on proxy runs, not one combined total. Added together they equal the price shown in the table above; this is expected, not a double charge.
Domain Input Notes
- Full website URLs work too — paste
https://www.example.com/any/page?x=1and the Actor extractsexample.comautomatically, so you can feed exported link lists as-is. - Domains are case-insensitive —
Kars4kids.Organdkars4kids.orgare treated identically. - Leading
www.is stripped before matching, sowww.example.comandexample.comresolve to the same entry. - Duplicate domains are checked only once. If your list contains the same domain twice (or both
www.example.comandexample.com), the output contains a single row for it — so the results can have fewer rows than your input list. - If Google's autocomplete returns no suggestions for a domain, or no suggestion exactly matches the input domain, the domain is recorded as
ads_ever: "No"and processing moves on.
Output
Results are saved to the default Apify Dataset, one record per domain. The dataset can be exported as JSON, CSV, Excel, or XML from the Apify Console.
Output preview (dataset view)
| Domain | Ads? | Count | Last shown | Format | Ads link |
|---|---|---|---|---|---|
| apple.com | Yes | ~70K | Jun 9, 2026 | Text | …/advertiser/AR1836… |
| tesla.com | Yes | ~2K | Jun 9, 2026 | Video | …/advertiser/AR1782… |
| shopify.com | Yes | ~10K | Jun 9, 2026 | Text | …/advertiser/AR0162… |
| kars4kids.org | Yes | ~500 | Jun 9, 2026 | Text | …/advertiser/AR1546… |
| unknowndomain.com | No | — | — | — | — |
Ads links are shortened here for width — the dataset stores the full, clickable Transparency Center URL. The
errorcolumn is omitted; see the JSON example below.
Output (JSON view)
[{"domain": "apple.com","ads_ever": "Yes","adsCount": "~300K","date_of_last_running": "Apr 24, 2026","type_of_ad": "Video","ads_link": "https://adstransparency.google.com/advertiser/AR12345678/creative/CR98765432?authuser=0®ion=anywhere","error": null},{"domain": "unknowndomain.com","ads_ever": "No","adsCount": null,"date_of_last_running": null,"type_of_ad": null,"ads_link": null,"error": null}]
Data Fields
| Field | Description |
|---|---|
domain | The input domain that was checked. |
ads_ever | "Yes" if the domain has run Google Ads, "No" if confirmed none, null if the run errored. |
adsCount | Ad count as shown on the site (e.g."~300K", "1,432"). null if none. |
date_of_last_running | When the most recent ad was last shown (e.g."Apr 24, 2026"). |
type_of_ad | Format of the most recent ad (e.g."Video", "Image", "Text"). |
ads_link | Direct URL to the domain's ad detail on the Transparency Center. |
error | Error message if the domain could not be scraped, otherwisenull. |
Understanding the results
"Yes" — the Transparency Center returned advertising information for the domain.
"No" — no matching advertiser was found for that domain. This means nothing matched the search; it isn't an absolute guarantee that the business has never advertised on Google under some other advertiser identity. If a domain you know advertises comes back No, check region first, then re-run that domain on its own.
null — the domain couldn't be checked. See the error field.
Processing Large Lists
A single run processes its domains one at a time — this keeps the scraper stable and avoids triggering Google's CAPTCHA. To check a very large list faster, don't put everything in one run; instead split the work across multiple runs that execute in parallel using Apify Tasks. No code required.
How to set it up
- Split your list into batches — e.g. 6,000 domains into 3 batches of 2,000 (smaller batches finish sooner and are easier to retry).
- Create a Task per batch — on the Actor page click Create task (or Actor → ⋮ → Create task). In each task's Input tab, paste that batch's domains, pick the
region, and Save. - Start them together — open each task and click Start (or start them via the API/Console). They run as independent, concurrent runs.
- Collect the results — each run writes to its own dataset. Download and merge them, or use the API to push all runs into a single named dataset.
Tips
- Test first. Run one task with a small
maxDomainsPerRunto gauge speed and cost before launching all batches. - Mind your plan's limits. How many runs execute at once is bounded by your Apify plan's max concurrent runs and available memory. Start with a few parallel tasks and scale up.
- Schedule recurring work. For an ongoing workload (e.g. 10,000/month), give each task a Schedule (daily/weekly) so batches run automatically without manual starts.
- Keep batches reliably sized. A few hundred to ~1,000 domains per task is a good balance between throughput and run stability.
- Set your run timeout. The 1-hour default covers a few hundred domains. Raise it before starting a larger batch. If a run does time out, click Resurrect — it continues from the first unchecked domain.
📮 Support
Bugs, feature requests, or custom scraping work — open an issue on Apify or email alkausarimujahid@gmail.com.