Google Ads Transparency Monitor
Pricing
from $1.70 / 1,000 ad founds
Google Ads Transparency Monitor
See every Google ad a company runs. Enter a domain or advertiser name and get one row per ad from the Ads Transparency Center: format, first and last shown dates, creative link, and permalink, plus a company summary row with the total ad count band. Batch domains, export to CSV or Clay.
Pricing
from $1.70 / 1,000 ad founds
Rating
0.0
(0)
Developer
Mamba Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
See every Google ad a company runs. Enter a company domain or an advertiser name and get one row per ad from Google's Ads Transparency Center, with the format, first and last shown dates, a creative link, and the ad's permalink. Each input also gets one company summary row that answers the question most teams actually ask: does this company run Google ads, how many, and in which formats.
Rows are flat and snake_case, so they load straight into a spreadsheet, a CRM, or a Clay table.
✨ Features
- Company keyed. A domain such as
stripe.comin, the ads Google lists for that domain out. No advertiser ID lookup needed. - Advertiser names too. Enter a name such as
HubSpot, Inc.and the actor finds the matching verified advertisers, up to 5, and says on every row whether the match was exact or the closest suggestion. - A company summary row. Ads returned, Google's own ad count band (for example 8,000 to 9,000), formats seen, and the first and last dates seen.
- Filters that run on Google's side. Region by country code, and format (text, image, or video).
- Last shown window. Keep only ads shown in the last N days, 90 by default.
- Safe when Google changes its page. The actor checks the shape of every response. If Google changes it, you get a free
source_changedrow instead of empty rows that look real. - Reads robots.txt on every run and stops with a free
blockedrow if Google ever disallows the pages it reads. - Batch input. Up to 500 domains or advertiser names per run.
📥 Input
| Field | Type | Description |
|---|---|---|
company_domain | string | A company domain, for example stripe.com |
advertiser_name | string | An advertiser name, for example Stripe, Inc. |
domains | list | Several domains, one per line |
advertiser_names | list | Several advertiser names, one per line |
region | string | anywhere (default) or a two letter country code |
formats | list | text, image, video; empty means all |
max_ads | string | Ad rows per input, 1 to 1,000, default 50 |
since_days | string | Only ads last shown in this many days, default 90; 0 for all |
include_summary | string | true (default) or false |
max_charge_usd | string | Optional cost cap for the run |
skipCache | string | true to skip the 24 hour cache |
proxy_mode | string | auto (default): direct, then the Apify proxy default pool if Google refuses a request; direct: proxy off, never use a proxy, so a refused request returns a free blocked row; or residential: the Apify residential proxy from the start. Proxy use adds nothing to your price |
Supported region codes: US, CA, MX, BR, AR, CL, CO, PE, GB, IE, DE, FR, ES, IT, PT, NL, BE, LU, CH, AT, DK, SE, NO, FI, IS, PL, CZ, SK, HU, RO, BG, GR, HR, SI, RS, UA, EE, LV, LT, CY, MT, TR, IL, AE, SA, QA, EG, ZA, NG, KE, MA, IN, PK, BD, SG, MY, ID, TH, VN, PH, JP, KR, TW, HK, AU, NZ.
Example:
{ "company_domain": "stripe.com", "max_ads": "20", "since_days": "90" }
📤 Output
One row per ad (row_type ad) and one summary row per input (row_type summary). Every row carries every field; a field that does not apply is null.
| Field | Example | Notes |
|---|---|---|
row_type | ad | ad or summary |
company_domain | stripe.com | |
advertiser_id | AR16951989901585285121 | Google advertiser ID |
advertiser_name | Stripe, Inc. | Verified advertiser name |
ad_id | CR17494586812444704769 | Google creative ID |
format | image | text, image, video, or unknown |
first_shown, last_shown | 2024-08-13T02:39:41Z | UTC |
days_running | 798 | First to last shown, inclusive |
creative_url | link | Creative image, or Google's preview script for text and video ads |
ad_url | link | The ad's page on the Ads Transparency Center |
advertiser_url | link | The advertiser's page |
ads_returned | 20 | Summary row |
total_ads_min, total_ads_max | 8000, 9000 | Summary row: Google's ad count band for the input and filters |
advertisers_count, advertisers_json | 2 | Summary row. A domain can be advertised by resellers and agencies too |
formats_seen | ["image","text"] | Summary row |
first_seen_any, last_seen_any | dates | Summary row |
runs_google_ads | true | Summary row: Google lists at least one ad for the input and filters |
row_status | ok | ok, no_ads, blocked, source_changed, error |
error_reason | null | Why a row is not ok |
billable_events_json | {"ad-found":1} | What the row was billed as; {} is free |
from_cache, source, checked_at |
💵 Pricing
Pay per event. You pay for ad rows returned and for a summary row when ads were found, plus a small start fee per run.
| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
Ad found (ad-found), per ad row | $0.00200 ($2.00 per 1,000) | $0.00190 ($1.90 per 1,000) | $0.00180 ($1.80 per 1,000) | $0.00170 ($1.70 per 1,000) |
Company summary (company-summary), per input with ads | $0.00300 ($3.00 per 1,000) | $0.00285 ($2.85 per 1,000) | $0.00270 ($2.70 per 1,000) | $0.00255 ($2.55 per 1,000) |
Actor start (apify-actor-start), per run | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
- Free rows:
no_ads,blocked,source_changed, anderrorrows cost nothing, and so do rows served from the 24 hour cache. - A run stops at the maximum cost per run you set in Apify, and at
max_charge_usdif you set it. - Free Apify plan: 1.50 USD of evaluation a month, which is 750 ad rows at the free plan price. Any paid Apify plan removes the cap.
max_adscaps the ad rows, and so the cost, per input. 20 ads plus a summary costs $0.0435 on the free plan price, start fee included.- Proxy traffic is included. You pay only the events above: Mamba Labs pays the platform costs of your run, Apify proxy traffic included.
proxy_modeis a reliability setting. In the defaultautomode a run that Google refuses switches to the Apify proxy and keeps going;directnever uses a proxy, so a refused input returns a freeblockedrow instead.
🚀 Usage examples
Console or API. POST https://api.apify.com/v2/acts/mambalabs~google-ads-transparency-monitor/runs with the input above, then read the default dataset.
Batch of accounts.
{ "domains": ["stripe.com", "hubspot.com", "notion.so"], "max_ads": "10", "region": "US" }
Video ads only, by advertiser name.
{ "advertiser_name": "Nike, Inc.", "formats": ["video"], "max_ads": "25" }
Clay. Call the actor from a Clay column with the domain column mapped to company_domain. Clay sends every field as a string, which this actor expects. Set include_summary to true and max_ads to 1 for a cheap "runs Google ads" column.
MCP. The @mambalabsdev/mcp-google-ads-transparency-monitor server exposes the tool get_google_ads to AI agents.
⚠️ Error handling
| Situation | What you get |
|---|---|
| Google lists no ads | One free summary row, row_status no_ads, runs_google_ads false |
Ads exist but none in the since_days window | One free summary row, no_ads, runs_google_ads true |
| No advertiser matches the name | One free summary row, no_ads |
| Google refuses a request (HTTP 429, a challenge page, or its sorry page) | In auto mode the run switches to the Apify proxy default pool and tries twice more; if that is refused too, one free blocked row, and ads already read are kept |
| robots.txt disallows the pages read, or cannot be read | One free blocked row per input; no request is made |
| Google changes its response shape | One free source_changed row naming the missing piece |
| Anything else | One free error row with the reason |
⚠️ Limitations
- The data comes from Google's own public page, which is not a documented API. When Google changes it, this actor reports
source_changeduntil it is updated. - The ad count is Google's band (for example 8,000 to 9,000), not an exact number.
- A domain search returns every advertiser Google lists for that domain, which can include resellers and agencies.
advertisers_jsonshows who ran what. - Text ads are shown as Google's rendered preview image or preview script, not as plain headline text.
- One format filter runs on Google's side. Choosing two formats filters on the actor's side, so the count band then covers all formats.
- Google rate limits bursts from one address. In
automode the run moves to the Apify proxy default pool when that happens, at no extra cost to you. - No login, no key, and no personal data: the rows describe advertisers and ads.
🧩 Want other GTM data?
Mamba Labs builds custom actors for B2B go-to-market teams. The public versions of that work live here on the Store.
Every actor in the suite takes a domain or a company and returns flat rows, so they stack in the same table without reshaping anything.
🛠️ Need something custom built? Talk to Mamba Labs.
🆘 Support
Found a bug? Open an issue on the Issues tab. Response time is typically within 48 hours.
ℹ️ Sourcing. Ads come from Google's public Ads Transparency Center at adstransparency.google.com. No login is used and robots.txt is read on every run. You are responsible for how you use the output.
Built by Mamba Labs.