# Google Ads Transparency Scraper - Competitor Reports & Alerts (`skydata/google-ads-transparency-scraper`) Actor

Spy on competitors' Google ads: ready reports with ads running now, new and stopped ads, likely winning ads, format mix, countries, side-by-side comparison, shareable HTML report and what-changed alerts. Plus every ad as data.

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

## Pricing

from $1.00 / 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.

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

### 🔍 What does Google Ads Transparency Scraper do?

**Google Ads Transparency Scraper** turns Google's public [Ads Transparency Center](https://adstransparency.google.com/) into a **ready competitor report**. Enter your competitors (websites, brand names or advertiser IDs) and get, for each one:

- 🟢 **Ads running right now** and how many **new ads** they launched this week and this month
- 🛑 **Ads they stopped**, and how long their ads usually run
- 🏆 **Likely winning ads**: ads live for 60+ days. Advertisers keep paying for ads that work, so these are the ones worth studying
- 🧩 **Format mix**: text vs image vs video
- 🌍 **Countries**: where each competitor is advertising (ad counts per country)
- 📈 **Launches per week**: spot campaign bursts and seasonality
- ⚖️ **Side-by-side comparison** of all competitors (share of running ads, new ads, winners, formats, countries)
- 🔔 **What changed since last run**: new ads, stopped ads, **new countries entered**. Schedule it weekly and get alerts
- 📄 **Shareable HTML report** you can send to your team or client
- 📋 **Every ad as data**: dates, format, status, image and preview links, link to the ad on Google

**💸 You only pay for competitors that have ads.** Competitors with no ads, names that can't be found, or failed lookups are always free.

No login, no Google account, no API key.

### 👥 Who is it for?

- **Marketing agencies**: monthly competitor ad reports for every client, in one run
- **PPC / performance marketers**: see which competitor ads survive (likely winners) before writing your own
- **E-commerce brands**: know when a competitor launches a new campaign or enters a new country
- **Analysts and AI agents**: clean, structured ad intelligence via API or MCP

### 🚀 How to use it

1. Add your **competitors**, one per line: `nike.com`, `Nike` or `AR06641858037806006273`. A website includes every advertiser account that runs ads for it.
2. Choose the **analysis window** (default 30 days) and optionally a **region**.
3. Click **Start**. Open **Shareable HTML report** in the Output tab, or download the data as Excel, CSV or JSON.
4. Want alerts? Turn on **Monitor changes** and add a **schedule** (for example every Monday).

💡 Want a head start? Open the **Example tasks** tab for ready-made setups (one click to run), e.g. common research jobs with the inputs already filled in.

### 📥 Input example

```json
{
  "competitors": ["allbirds.com", "hoka.com", "On Running"],
  "days": 30,
  "region": "anywhere",
  "countries": ["US", "GB", "CA", "AU", "IN", "DE", "FR", "BR"],
  "includeAds": true,
  "monitorChanges": true,
  "monitorName": "running-shoes"
}
```

### 📤 Output

Each competitor gets one **report** row:

```json
{
  "type": "report",
  "competitor": "allbirds.com",
  "status": "ok",
  "runningNow": 112,
  "newAdsInWindow": 37,
  "newAdsLast7Days": 9,
  "stoppedInWindow": 21,
  "avgDaysRunningOfStoppedAds": 18.4,
  "winningAdsCount": 14,
  "winningAds": [{ "creativeId": "CR...", "format": "image", "daysShown": 143, "imageUrl": "https://...", "adUrl": "https://adstransparency.google.com/..." }],
  "formatMix": { "text": {"ads": 40, "percent": 30.8}, "image": {"ads": 80, "percent": 61.5}, "video": {"ads": 10, "percent": 7.7} },
  "launchesByWeek": [{ "weekStarting": "2026-10-26", "newAds": 9 }],
  "countries": [{ "country": "US", "name": "United States", "adsMin": 100, "adsMax": 200 }],
  "activeCountries": ["US", "GB", "CA"],
  "insights": ["Running 112 ads right now.", "Launched 37 new ads in the last 30 days, 9 of them in the last 7 days.", "14 ads have been running for 60+ days and are still live (likely winners worth studying)."],
  "changes": { "since": "2026-10-26", "newAds": 9, "stoppedAds": 4, "newCountries": ["AU"], "notable": true }
}
```

Every ad is also a row (`"type": "ad"`) with `advertiserName`, `format`, `status` (running/stopped), `firstShown`, `lastShown`, `daysShown`, `isWinner`, `imageUrl`, `previewUrl` and `adUrl`. With 2+ competitors you also get a **comparison** row. Use the **Competitor reports**, **Ads** and **Side-by-side comparison** views to see each type alone.

### 💰 Pricing

Pay per event:

- **Competitor report**: one per competitor that has ads in the window
- **Ad**: one per ad row (turn off "Include every ad" if you only want the reports)

Competitors without ads, unknown names and failed lookups are **never charged**. Platform usage (servers and proxy) is included. See the **Pricing** tab for current prices. You can set a maximum cost per run and the Actor stops there.

### 🤖 Use it with AI agents

Works as a tool for AI agents (Claude, ChatGPT, Cursor and others) through the [Apify MCP server](https://mcp.apify.com), and with Zapier, Make, n8n and the Apify API.

### 🧰 More from SkyData Tools

- 📈 **[Google Trends Scraper](https://apify.com/skydata/google-trends-scraper)**: many keywords × many countries, insights, ONE scale for 50+ keywords, what's-new monitoring
- 🎬 **[YouTube Transcript Scraper](https://apify.com/skydata/youtube-transcript-scraper)**: channels, playlists and search, AI-ready chunks, phrase search
- ⭐ **[App Reviews Scraper](https://apify.com/skydata/app-reviews-scraper)**: App Store + Google Play reviews with complaint reports and alerts
- 📇 **[Website Contact & Company Info Scraper](https://apify.com/skydata/website-contact-company-scraper)**: emails, phones, social profiles and tech stack from any list of websites

### ❓ FAQ

**What is "running now"?** An ad shown on Google in the last 2 days.

**What is a "likely winner"?** An ad that is still running after 60+ days. Advertisers usually stop ads that don't pay off, so long-running ads are a strong signal.

**Why are country numbers ranges?** Google publishes approximate counts (for example 100–200). We report them as they are.

**Is this legal?** The Ads Transparency Center is a public tool Google made so anyone can see who advertises and which ads they run. This Actor only reads that public data, without logging in.

**Does it show ad spend or clicks?** No. Google does not publish spend or clicks in the Transparency Center (except for some political ads).

**Something is missing or broken?** Open an issue. We answer within 12 hours.

# Changelog

This Actor's version history is a separate document: https://apify.com/skydata/google-ads-transparency-scraper/changelog.md

# Actor input Schema

## `competitors` (type: `array`):

Websites (nike.com), brand names (Nike), advertiser IDs (AR0664...) or Ads Transparency Center links. One competitor per line. A website includes every advertiser account that runs ads for it.

## `days` (type: `integer`):

Look at ads shown in the last N days. 'New ads' = first shown in this window; 'running now' = shown in the last 2 days.

## `region` (type: `string`):

Only ads shown in this country (2-letter code like US, GB, IN). Leave 'anywhere' for all countries.

## `countries` (type: `array`):

For each competitor, how many ads were shown in each of these countries during the window (Google's approximate counts). Up to 30 codes. Empty list = skip.

## `adFormat` (type: `string`):

Only analyse ads of this format.

## `includeAds` (type: `boolean`):

Also output one row per ad (dates, format, status, image/preview links, link to Google). Turn off to get only the reports (cheaper).

## `maxAdsPerCompetitor` (type: `integer`):

How many of the most recently shown ads to analyse per competitor. Reports say when a competitor has more ads than this.

## `monitorChanges` (type: `boolean`):

Remember each competitor between runs and report new ads, stopped ads and new countries since the previous run. Schedule the Actor (for example weekly) to get alerts.

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

Keeps separate memories for different competitor lists (for example one per client).

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy works well here and is included in the price. If Google starts blocking, the Actor switches to residential proxy automatically (see below).

## `fallbackToResidential` (type: `boolean`):

If Google blocks the datacenter IPs twice in a row, continue the run through residential proxy. Included in the price.

## `pacingMs` (type: `integer`):

Average pause between requests to Google. Higher = slower but gentler.

## `maxAttempts` (type: `integer`):

Retries with a new IP when Google blocks a request.

## Actor input object example

```json
{
  "competitors": [
    "allbirds.com",
    "hoka.com"
  ],
  "days": 30,
  "region": "anywhere",
  "countries": [
    "US",
    "GB",
    "CA",
    "AU",
    "IN",
    "DE",
    "FR",
    "BR"
  ],
  "adFormat": "all",
  "includeAds": true,
  "maxAdsPerCompetitor": 1000,
  "monitorChanges": false,
  "monitorName": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "fallbackToResidential": true,
  "pacingMs": 700,
  "maxAttempts": 6
}
```

# Actor output Schema

## `htmlReport` (type: `string`):

Open in the browser and share with your team or client.

## `reports` (type: `string`):

One row per competitor with insights.

## `ads` (type: `string`):

One row per ad.

## `all` (type: `string`):

Reports, ads and the comparison together (field 'type').

## `changes` (type: `string`):

Only with monitoring: notable changes since the last run.

## `runSummary` (type: `string`):

What was charged and request statistics.

# 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 = {
    "competitors": [
        "allbirds.com",
        "hoka.com"
    ],
    "countries": [
        "US",
        "GB",
        "CA",
        "AU",
        "IN",
        "DE",
        "FR",
        "BR"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("skydata/google-ads-transparency-scraper").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 = {
    "competitors": [
        "allbirds.com",
        "hoka.com",
    ],
    "countries": [
        "US",
        "GB",
        "CA",
        "AU",
        "IN",
        "DE",
        "FR",
        "BR",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("skydata/google-ads-transparency-scraper").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 '{
  "competitors": [
    "allbirds.com",
    "hoka.com"
  ],
  "countries": [
    "US",
    "GB",
    "CA",
    "AU",
    "IN",
    "DE",
    "FR",
    "BR"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call skydata/google-ads-transparency-scraper --silent --output-dataset

```

## MCP server setup

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

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/B9hEahKPLwm5zJ4To/builds/Wf7BbxnWqfeSIxwXN/openapi.json
