# Google Ads Scraper: Google Ads Transparency Center (`plainrows/google-ads-transparency`) Actor

Get every Google ad a competitor runs, from a domain, brand name or advertiser ID: creative ID, format, preview image, first and last shown dates, days running. Filter by country, platform, format and dates. Only-new-ads mode for scheduled alerts. Pay per ad found plus a small fee per advertiser.

- **URL**: https://apify.com/plainrows/google-ads-transparency.md
- **Developed by:** [PlainRows](https://apify.com/plainrows) (community)
- **Categories:** Marketing, SEO tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 ads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Ads Scraper: Google Ads Transparency Center

See **every Google ad a competitor runs**, straight from the **Google Ads Transparency Center**: enter a domain (`nike.com`), a brand or advertiser name, or an advertiser ID, and get one clean row per ad with **advertiser, creative ID, format, preview image, first shown and last shown dates, days running** and a link to the ad.

It calls a commercial search data API instead of driving a browser: **results in seconds, no proxies, no blocked runs, no Google account.** **You only pay per ad found**, plus a small fixed fee per advertiser searched.

### Typical uses

- **Competitor ad monitoring**: which ads a competitor runs right now, since when, and in which format. Turn on **Only new ads** and schedule the run to get **only newly launched ads** each day or week.
- **Creative research**: collect text, image and video ads of a brand or a whole market, with preview images, to see what works (long-running ads are usually the winners: sort by `daysRunning`).
- **Agency prospecting (ad check)**: check which prospects advertise on Google, and how much (`totalAdsApprox`). Set `maxAdsPerTarget` to 1 for one row per advertiser.
- **Brand protection**: find other advertisers sending ads to your domain (resellers, affiliates, agencies).
- **Automations and AI agents**: feed n8n, Make, Zapier, Google Sheets or an MCP client with structured JSON.

### What you get for each ad

| Field | Description |
|---|---|
| `advertiserName`, `advertiserId`, `verified` | Advertiser as verified by Google, its ID (`AR...`) and verification status |
| `creativeId`, `format` | Google ID of the ad (`CR...`) and its format: `text`, `image` or `video` |
| `previewImageUrl`, `previewImageWidth`, `previewImageHeight` | Image of the ad when Google stores one (almost all text ads, some image ads) |
| `previewUrl` | Otherwise, Google's preview script URL for ads rendered by script (video and most image ads). It is not a web page: open `transparencyUrl` to see the ad |
| `transparencyUrl`, `advertiserUrl` | The ad's page and the advertiser's page in the Google Ads Transparency Center |
| `firstShown`, `lastShown`, `daysRunning` | First and last time the ad was shown (UTC) and the number of calendar days in between, both included |
| `totalAdsApprox` | Approximate number of ads matching your search in the Transparency Center (rounded by Google) |
| `rank` | Position in the Transparency Center results (most recently shown first) |
| `query`, `queryType`, `region`, `platformFilter`, `formatFilter`, `dateFrom`, `dateTo` | Your search and the filters used |
| `observedAt` | When the data was fetched (UTC) |

Missing values are always `null`, never guessed. Each ad appears once per advertiser searched. A domain or advertiser with no ad gets one free row with `found: false` and a `notFoundReason` (`no-ads` or `advertiser-not-found`).

### Input

```json
{
  "targets": ["nike.com", "Adidas", "AR16735076323512287233"],
  "maxAdsPerTarget": 40,
  "country": "US",
  "platform": "all",
  "format": "all",
  "dateFrom": "2026-01-01",
  "dateTo": "2026-10-07"
}
```

- **targets**: up to 1,000 per run, any mix of:
  - a **domain** or URL (`nike.com`, `https://www.nike.com/us/`): all ads pointing to that domain, from every advertiser (brand, agencies, resellers);
  - an **advertiser ID** (`AR...`) or a Transparency Center advertiser URL: that account only;
  - an **advertiser name** (`Nike` or `Nike, Inc.`): looked up in the Transparency Center and matched **exactly** (case, accents, punctuation and suffixes like Inc., LLC, GmbH are ignored). When several advertisers share the name, the one with the most ads is used. No exact match = a free `advertiser-not-found` row, never a guess. The match is listed in the run summary.
- **maxAdsPerTarget**: 1 to 120 ads per advertiser (default 40), most recently shown first.
- **country**: where the ads were shown. `ANY` (default) = all regions, like the Transparency Center; or US, GB, CA, AU, IE, IN, DE, AT, CH, FR, BE, ES, MX, IT, NL, PT, BR, PL, SE, JP.
- **platform**: `all`, `google_search`, `youtube`, `google_play`, `google_maps`, `google_shopping`.
- **format**: `all`, `text`, `image`, `video`.
- **dateFrom** / **dateTo** (optional): ads shown in that period, from 2018-05-31 to today. Set one and the other defaults to the archive start or today.
- **onlyNewAds** (optional, monitoring): return only ads never delivered to you before for the same advertiser, region, platform and format. See below.
- **monitorName** (optional): name of the key-value store in your account that remembers delivered ads (default `plainrows-ads-monitor`).

### Monitor competitors: get only new ads

Turn on **Only new ads** (`"onlyNewAds": true`) and add an Apify **schedule** (daily or weekly). The first run returns every ad and remembers their IDs in a key-value store of your own Apify account; each later run returns **and bills only ads it has never delivered**, so a quiet week costs just the advertiser fee. An advertiser with nothing new gets a free row with `notFoundReason: "no-new-ads"`.

- Each search checks the newest ads it fetches (whole pages of 40, so at least the 40 most recently shown) and returns up to `maxAdsPerTarget` new ones; ads left out by that limit or by your run budget stay "new" for the next run.
- History is kept per advertiser, region, platform and format (dates are ignored). Use a different **monitorName** per monitoring task to keep separate histories, or a new name to start over.
- Connect the schedule to Slack, e-mail or Google Sheets (n8n, Make, Zapier or Apify integrations) for a new-ads alert.

### Output example

Real row from a run on 2026-10-07 (target `nike.com`, region US):

```json
{
  "query": "nike.com",
  "queryType": "domain",
  "found": true,
  "rank": 1,
  "advertiserName": "Nike, Inc.",
  "advertiserId": "AR16735076323512287233",
  "verified": true,
  "creativeId": "CR13173014960004923393",
  "format": "text",
  "previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/8016077108567236529",
  "previewImageWidth": 348,
  "previewImageHeight": 477,
  "previewUrl": null,
  "transparencyUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR13173014960004923393?region=US",
  "advertiserUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233?region=US",
  "firstShown": "2022-11-30T14:47:55.000Z",
  "lastShown": "2026-10-07T12:55:00.000Z",
  "daysRunning": 1408,
  "totalAdsApprox": 9000,
  "region": "US",
  "platformFilter": "all",
  "formatFilter": "all",
  "dateFrom": null,
  "dateTo": null,
  "observedAt": "2026-10-07T13:16:57.854Z",
  "schemaVersion": "1.0"
}
```

### Pricing

Pay per use, no subscription, no proxy costs. See the **Pricing** tab for current prices. Two events:

- **Ad found** (`ad-result`): one per ad returned, cheaper on higher Apify plans. Preview image, dates and days running are included (no "details" add-on).
- **Advertiser searched** (`target-searched`): a fixed fee once per domain, name or advertiser ID searched, whether or not it has ads. It covers the Transparency Center lookup, which costs the same either way. For a typical search of 40 ads, it adds less than $0.0001 per ad (about $0.0002 from October 25, 2026).

Price change on October 25, 2026: advertiser searched goes from $0.003 to $0.0075 on all plans; ad found does not change.

Invalid inputs and duplicates cost nothing, and advertisers with no ad get a free `found: false` row (only the search fee applies). The run never spends more than the maximum cost you set: an advertiser is only searched when the budget left covers its fee and at least one ad.

**Free Apify plan:** each run searches up to 2 advertisers and returns up to 20 ads per advertiser, so you can check the output. A paid Apify plan removes these limits.

### Use it from code, automations or AI agents

**API (one call, results returned directly):**

```bash
curl -X POST "https://api.apify.com/v2/acts/plainrows~google-ads-transparency/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"targets": ["nike.com"], "country": "US", "maxAdsPerTarget": 40}'
```

**n8n, Make, Zapier:** use the Apify integration, pick `plainrows/google-ads-transparency`, and send the ads to Google Sheets, Airtable, Slack or your database. Schedule it weekly to track new competitor ads.

**AI agents (MCP):** add `https://mcp.apify.com?tools=plainrows/google-ads-transparency` to Claude, Cursor or any MCP client. The agent gets a typed tool and pays per result.

### What this is not

- **No ad copy text, landing page URL, impressions, spend or audience targeting.** The data source returns the ad's preview image and dates, not the text or reach figures shown on some ad pages. Open `transparencyUrl` for those.
- **No downloaded media files**: you get image and preview URLs, not stored copies.
- At most 120 ads per advertiser and search; split by format, platform or date range to get more.
- Not affiliated with Google.

### Run summary

Each run stores a summary in the key-value store (`OUTPUT`): advertisers searched, advertisers with no ad, ads billed, ads skipped as already delivered (`adsAlreadySeen`, monitoring only), how each advertiser name was matched (`nameLookups`), duplicates and invalid inputs, and anything skipped because of the free-plan or budget limit.

### FAQ

**How do I see the Google ads a competitor is running?**
Enter their website domain (for example `hubspot.com`) or advertiser name in **targets** and run: you get each ad with format, preview, first and last shown dates and a link to the Transparency Center.

**Can I see only YouTube or Search ads?**
Yes: set **platform** (`youtube`, `google_search`, `google_play`, `google_maps`, `google_shopping`) and **format** (`text`, `image`, `video`).

**Can I see ads shown in a specific country or period?**
Yes: set **country** (or `ANY` for all regions) and **dateFrom** / **dateTo** (ads shown since 2018-05-31).

**Does it show ad spend, impressions or targeting?**
No. It returns what the data source provides: preview image, format and dates. Open `transparencyUrl` for the details Google shows on the ad page.

**Can I get an alert when a competitor launches a new ad?**
Yes: turn on **Only new ads**, schedule the run (for example daily) and send the results to Slack, e-mail or a sheet. You only pay for new ads, plus the fixed fee per advertiser searched.

**How many ads per advertiser?**
Up to 120 per search, most recently shown first. Split by format, platform or date range to get more.

### More PlainRows tools

Same pay-per-result pricing, same clean JSON, built to chain together in n8n, Make, Zapier or AI agents.

- **SEO and keywords:** [Keyword Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) · [Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) · [Google Autocomplete & People Also Ask](https://apify.com/plainrows/google-autocomplete-questions) · [Google Trends Explorer](https://apify.com/plainrows/google-trends-explorer) · [Website Organic Traffic & Top Keywords](https://apify.com/plainrows/domain-seo-overview) · [Bulk Domain Authority Checker](https://apify.com/plainrows/domain-authority-checker) · [Backlink Checker](https://apify.com/plainrows/backlink-checker) · [Broken Link Checker](https://apify.com/plainrows/broken-link-checker) · [AI Search Visibility Tracker (ChatGPT, Gemini, AI Mode)](https://apify.com/plainrows/ai-search-brand-visibility) · [Google Maps Rank Tracker (Geo-Grid Local SEO)](https://apify.com/plainrows/google-maps-rank-tracker)
- **Leads and companies:** [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) · [Website Technology Checker](https://apify.com/plainrows/website-tech-stack) · [ATS Jobs Scraper (Workday, Greenhouse, Lever, Ashby)](https://apify.com/plainrows/ats-job-postings) · [Google Jobs Scraper](https://apify.com/plainrows/google-jobs-scraper) · [Company Registry Lookup (SIRENE, LEI, Brreg)](https://apify.com/plainrows/company-registry-lookup) · [Public Tenders Search (EU TED & UK)](https://apify.com/plainrows/public-tenders-search)
- **E-commerce and travel:** [Amazon Product Search Scraper](https://apify.com/plainrows/amazon-product-search) · [Google Shopping Prices Scraper](https://apify.com/plainrows/google-shopping-prices) · [Google Hotels Prices Scraper](https://apify.com/plainrows/google-hotels-prices) · [Tripadvisor Reviews Scraper](https://apify.com/plainrows/tripadvisor-reviews)
- **Content and media:** [Google News Scraper](https://apify.com/plainrows/google-news-scraper) · [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper) · [YouTube Comments Scraper](https://apify.com/plainrows/youtube-comments-scraper) · [Google Images Scraper](https://apify.com/plainrows/google-images-scraper) · [Website Screenshot API](https://apify.com/plainrows/website-screenshot) · [Google Maps Reviews Scraper](https://apify.com/plainrows/google-maps-reviews) · [App Store & Google Play Reviews Scraper](https://apify.com/plainrows/app-reviews-scraper)

**Compared with other APIs:** [Competitor Google ads as JSON](https://nadaho.github.io/plainrows/competitor-google-ads-json/)

### Support

Missing a field or found a bug? Open an issue on this page. Issues are read and answered.

# Actor input Schema

## `targets` (type: `array`):

One per line. A website domain ("nike.com"), an advertiser name as shown in the Google Ads Transparency Center ("Nike, Inc." or "Nike"), an advertiser ID ("AR16735076323512287233") or a Transparency Center advertiser URL. Domains and IDs are the most precise; names must match an advertiser exactly (case, punctuation and "Inc.", "LLC"... are ignored). Up to 1,000 per run.

## `maxAdsPerTarget` (type: `integer`):

1 to 120 ads per advertiser or domain, most recently shown first. Each ad returned is billed; see Pricing.

## `country` (type: `string`):

Country where the ads were shown. "All regions" matches the Transparency Center default (region: anywhere).

## `platform` (type: `string`):

Only ads shown on this Google platform.

## `format` (type: `string`):

Only text, image or video ads.

## `dateFrom` (type: `string`):

Only ads shown on or after this date (YYYY-MM-DD, earliest 2018-05-31). If you set only one date, the other defaults to the archive start or today.

## `dateTo` (type: `string`):

Only ads shown on or before this date (YYYY-MM-DD, at most today).

## `onlyNewAds` (type: `boolean`):

Return only ads this tool has never delivered to you for the same advertiser, region, platform and format. The first run returns every ad and remembers them; later runs (for example a daily schedule) return and bill only newly launched ads. The advertiser fee still applies to each search.

## `monitorName` (type: `string`):

Name of the key-value store in your Apify account that remembers delivered ads (default "plainrows-ads-monitor"). Use a different name per monitoring task to keep separate histories, or a new name to start over. Lowercase letters, digits and hyphens.

## Actor input object example

```json
{
  "targets": [
    "nike.com"
  ],
  "maxAdsPerTarget": 40,
  "country": "ANY",
  "platform": "all",
  "format": "all",
  "onlyNewAds": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "targets": [
        "nike.com"
    ],
    "country": "ANY"
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainrows/google-ads-transparency").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "targets": ["nike.com"],
    "country": "ANY",
}

# Run the Actor and wait for it to finish
run = client.actor("plainrows/google-ads-transparency").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "targets": [
    "nike.com"
  ],
  "country": "ANY"
}' |
apify call plainrows/google-ads-transparency --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,plainrows/google-ads-transparency"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/JIB4VAPpqD096yXwP/builds/R1eMofrOcBDRu21Yq/openapi.json
