What it does
Google's Ads Transparency Center shows the ads any advertiser runs, but browsing it one creative at a time does not scale past a couple of competitors. This actor reads the public ad library at adstransparency.google.com and returns one clean row per ad: advertiser name and ID, creative ID, format (text, image or video), first and last shown, days running, landing domain, image and video URLs, and a link to the ad's transparency page.
You can search by competitor domain (for example nike.com, which also returns agencies and resellers advertising that domain), by advertiser name such as HubSpot, or by advertiser ID, and filter by country, date range and format. Turn on includeDetails for one extra lookup per ad that adds countries shown, impression ranges and best-effort headline and description text.
The main job is monitoring. With onlyNewSinceLastRun on and a daily schedule, each run returns only ads that were not delivered before, and already-seen ads are never charged. It runs on plain HTTP at 256 MB with no browser, and costs $0.60 per 1,000 ads, plus $1 per 1,000 ads when details are switched on.
How it works
- It resolves each domain, advertiser name or advertiser ID using the same keyless JSON calls the public Transparency Center page makes.
- It reads ads newest first, up to
maxAdsPerAdvertiserper search andmaxResultsoverall, applying your region, date and format filters. - With
includeDetails, it makes one extra lookup per ad for countries, impression ranges, per-country dates and best-effort ad copy. - With
onlyNewSinceLastRun, every delivered ad is remembered in the key-value store ads-seen-<monitorName> and skipped on later runs at no charge. - Requests are paced (at most 2 at a time, 0.8-2 s apart). On a CAPTCHA or repeated 429/403 the run stops at once, keeps delivered ads and charges nothing for blocked requests.
Input example
A typical run input (JSON). Every field is also available as a form in the Apify console.
{
"domains": [
"nike.com"
],
"advertiserNames": [
"HubSpot"
],
"regions": [
"US",
"GB"
],
"formats": [],
"maxAdsPerAdvertiser": 20,
"maxResults": 200,
"includeDetails": false,
"onlyNewSinceLastRun": true,
"monitorName": "competitors-daily"
}All input fields
| Field | Type | Required | Default | What it does |
|---|---|---|---|---|
domains | array | no | Competitor websites, e.g. nike.com. Returns every ad Google shows for that domain, from the brand itself and from agencies or resellers advertising it. | |
advertiserNames | array | no | Company names as shown in the Ads Transparency Center, e.g. HubSpot, Argos Limited. Exact name matches are used (a brand's several legal entities are all kept); otherwise the closest advertiser with the most ads. | |
advertiserIds | array | no | [] | Google advertiser IDs (AR… from an adstransparency.google.com/advertiser/AR… link). |
regions | array | no | [] | Only ads shown in these countries, as two-letter codes (US, GB, DE, FR…). Empty = anywhere. |
dateFrom | string | no | Only ads shown on or after this date (YYYY-MM-DD). | |
dateTo | string | no | Only ads shown on or before this date (YYYY-MM-DD). | |
formats | array | no | [] | Only these formats. Empty = all. |
maxAdsPerAdvertiser | integer | no | 100 | How many ads to read for each domain, advertiser name or advertiser ID, newest first as the Transparency Center lists them. |
maxResults | integer | no | 1000 | Stop after this many ads across all searches. You pay per ad delivered ($0.60 per 1,000). |
includeDetails | boolean | no | false | One extra lookup per ad: countries shown, impression ranges and first/last shown per country, plus best-effort headline/description text. Charged as ad-detail ($1 per 1,000). |
onlyNewSinceLastRun | boolean | no | false | Remember every ad delivered in a named key-value store (ads-seen-<monitor name>) and return only ads not seen before. Schedule the actor daily to get a feed of competitors' new ads; already-seen ads are skipped and… |
monitorName | string | no | "default" | Name of the seen-ads memory used by 'Only new ads'. Use one name per schedule (e.g. uk-competitors) so separate watch lists don't share state. |
proxyConfiguration | object | no | {"useApifyProxy": false} | Not needed: the Transparency Center is public. Leave off unless you have your own reason to route requests through a proxy. The actor never rotates proxies to get around a block. |
Output example
Each row is a single ad creative, with the advertiser behind it, where it ran and a link back to its page in the Transparency Center:
| advertiserName | format | firstShown | lastShown | regions | landingDomain | previewUrl |
|---|---|---|---|---|---|---|
| Nike, Inc. | text | 2022-11-30 | 2026-10-19 | US | nike.com | https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR00144196208338927617 |
| INITIATIVE MEDIA B.V. | video | 2023-10-17 | 2026-10-19 | FR, BE, DE, IT, ES, … | nike.com | https://adstransparency.google.com/advertiser/AR11154049584043393025/creative/CR03397377851928870913 |
| Hubspot, Inc. | text | 2025-11-03 | 2026-10-19 | US, DE, FR, IN, BR, … | hubspot.com | https://adstransparency.google.com/advertiser/AR10072600183532683265/creative/… |
| Argos Limited | text | 2025-… | 2026-10-19 | GB | argos.co.uk | https://adstransparency.google.com/advertiser/AR08556219150266007553/creative/CR07375270183734083585 |
Pricing
Pay per event: you are charged only for the results you receive, with no subscription. Set a maximum total charge on any run and it stops cleanly at the cap.
| Charged for | When | Price | Per 1,000 | Worked example |
|---|---|---|---|---|
| Ad result | Charged per ad delivered | $0.0006 | $0.60 | 100 ads = $0.06; 1,000 ads = $0.60; a daily monitor returning ~20 new ads = $0.012 a day |
| Ad detail | Charged per ad, only when 'Include ad details' is on (one extra lookup: regions, impressions, ad copy) | $0.001 | $1 | 100 ads with details = $0.06 + $0.10 = $0.16 |
| Actor Start (platform start fee) | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.00005 | — | One run at 256 MB = $0.0000125 |
Prices are read from the live Apify Store listing when this page is built. The listing is always authoritative.
Try Google Ads Transparency Scraper on Apify. Pay only for the results you get.
Run on Apify →Use cases
Daily feed of competitors' new ads
Schedule a daily run with only-new mode for your main competitors' domains. Each run delivers just the creatives that appeared since the last one, which is an easy feed for a Slack channel or a weekly marketing review.
Creative and messaging research
Pull a competitor's recent image and video ads with their media URLs, and switch on details for headline and description text where Google publishes it. Use it to see which offers and formats a brand is putting money behind.
Market entry checks
Filter by region to see which advertisers are active in a country before launching there. Domain searches also reveal agencies and resellers advertising a brand, which helps map who else competes for the same clicks.
Agency pitch preparation
Export a prospect's ad history by advertiser name, with first and last shown dates and days running, to show how long campaigns stay live. It is quick to build a factual slide from the rows.
How it compares
| ActorForge Ads Transparency | Browsing the Transparency Center manually | Building your own scraper | |
|---|---|---|---|
| Search by domain, advertiser name or ID | Yes | Yes | You build it |
| Search by keyword in ad text | No, the Transparency Center has none | No | No |
| Structured export (JSON, CSV) | Yes | No | Yes, once built |
| Only new ads since last run | Built in, seen ads free | No | You build it |
| Ad copy for every text ad | Partial, many text ads are images only | Visible as a rendered image | Partial, same limitation |
| CAPTCHA handling | Stops cleanly, blocked requests free | You solve it yourself | Up to you |
| Cost | $0.60 per 1,000 ads, $1 per 1,000 with details | Free, your time | Free code, your time and servers |
For a one-off look at a single competitor, the Transparency Center website is free and shows the rendered ads directly. The actor earns its keep when you track several advertisers repeatedly and want the results as data.
Limits and honest notes
- No CAPTCHA solving, no protection bypass. If Google answers with a CAPTCHA or its "unusual traffic" page (or keeps answering 429/403), the actor stops the run at once, keeps the ads already delivered, and says so in the run's status message and RUN_SUMMARY. Blocked requests are never charged. Google can do this to automated traffic from busy IP ranges, so some runs may return partial results; re-run later.
- No proxy rotation and no browser imitation: requests use an honest user agent naming this actor. You can set your own proxy for your own reasons; the default is none.
- Data comes from the same keyless JSON calls the public Transparency Center page makes (its robots.txt has no rules). Requests are paced (at most 2 at a time, 0.8-2 s apart, backoff on errors).
- Ad copy (headline/description) needs 'Include ad details' and is best-effort: many Google text ads are published only as a rendered snapshot image (returned as previewImageUrl), and image ads have no text.
- There is no ad-text keyword search in the Transparency Center: search by domain, advertiser name or advertiser ID. A domain search returns ads from every advertiser that advertises that domain (agencies and resellers included).
- Advertiser country is filled for advertiser-name searches (from Google's advertiser search); domain and ID searches leave it empty.
- Advertisers are businesses. Where Google lists a verified individual as the advertiser, only the name Google itself publishes is returned. No other personal data is collected.
- 'Max ads per domain / advertiser' counts ads read, newest first, so a daily monitor stays fast and cheap. Already-seen ads (monitoring), filtered-out formats and errors are never charged.
- Respects your run budget: set a maximum total charge and the actor stops cleanly at the cap.
FAQ
Can I search Google Ads Transparency Center by keyword?
No. The Transparency Center has no ad-text keyword search, so this actor searches by domain, advertiser name or advertiser ID. A domain search returns ads from every advertiser that advertises that domain, including agencies and resellers.
Does it return the headline and description of text ads?
Only with includeDetails on, and only on a best-effort basis. Many Google text ads are published only as a rendered snapshot image, which the actor returns as previewImageUrl, and image ads have no text at all.
How do I get only new competitor ads each day?
Set onlyNewSinceLastRun to true, give the watch list a monitorName such as uk-competitors, and schedule the actor daily. Ads already delivered under that name are skipped and not charged.
Do I need a proxy to scrape Google Ads Transparency?
No. The Transparency Center is public and the default is no proxy. The actor never rotates proxies or solves CAPTCHAs; if Google blocks the run it stops, keeps the ads already delivered and reports it in the status message and RUN_SUMMARY.
How much does monitoring a competitor cost?
Ads cost $0.0006 each, so 1,000 ads are $0.60. Details add $0.001 per ad. A daily monitor returning around 20 new ads costs about $0.012 a day.
Use it from code
Run the actor through the Apify API with the input above.
cURL
curl -X POST "https://api.apify.com/v2/acts/actor-forge~ads-transparency/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domains": ["nike.com"], "advertiserNames": ["HubSpot"], "regions": ["US", "GB"], "formats": [], "maxAdsPerAdvertiser": 20, "maxResults": 200, "includeDetails": false, "onlyNewSinceLastRun": true, "monitorName": "competitors-daily"}'JavaScript (Node.js)
// Node.js 18+ (built-in fetch). Set APIFY_TOKEN in your environment.
const input = {
"domains": [
"nike.com"
],
"advertiserNames": [
"HubSpot"
],
"regions": [
"US",
"GB"
],
"formats": [],
"maxAdsPerAdvertiser": 20,
"maxResults": 200,
"includeDetails": false,
"onlyNewSinceLastRun": true,
"monitorName": "competitors-daily"
};
const res = await fetch(
"https://api.apify.com/v2/acts/actor-forge~ads-transparency/run-sync-get-dataset-items",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.APIFY_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify(input),
}
);
const items = await res.json();
console.log(items.length, items[0]);Python
# pip install apify-client (set APIFY_TOKEN in your environment)
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"domains": [
"nike.com"
],
"advertiserNames": [
"HubSpot"
],
"regions": [
"US",
"GB"
],
"formats": [],
"maxAdsPerAdvertiser": 20,
"maxResults": 200,
"includeDetails": False,
"onlyNewSinceLastRun": True,
"monitorName": "competitors-daily"
}
run = client.actor("actor-forge/ads-transparency").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)The run-sync-get-dataset-items endpoint waits for the run (up to 5 minutes) and returns the dataset rows directly. For longer runs, start the run asynchronously and read the dataset when it finishes, as the Python example does. Replace APIFY_TOKEN with your own token from the Apify console.
Step-by-step guides
How to Monitor Competitor Ads in Google Ads Transparency Center
List your competitors' domains or advertiser names, run the ActorForge Ads Transparency actor daily with only-new mode, and route the new ads into…
Related actors
Google Trends Scraper — Trending Now & Interest Over Time
Google Trends scraper and API: Trending Now searches for 125 countries from the official feed (traffic, start time, picture, news articles), plus…
$0.50 per 1,000 · trend resultKeyword Suggestions — Google, YouTube, Bing Autocomplete
Bulk keyword suggestions from Google, YouTube, Bing and Baidu autocomplete. Expand each seed with a-z, question words or prepositions for long-tail…
$0.30 per 1,000 · seed expandedSEO Audit Crawler — On-Page SEO Checker for Whole Sites
Crawl a whole website and audit every page for technical and on-page SEO: titles, meta descriptions, H1s, canonicals, noindex, duplicates, broken…
$6 per 1,000 · page auditedShopify Store Scraper — Products, Prices, Store Info
Scrape any Shopify store's products from its public products.json: title, vendor, type, tags, price range, compare-at price, stock, variants and…
$0.30 per 1,000 · product resultTry Google Ads Transparency Scraper on Apify. Pay only for the results you get.
Run on Apify →