# Google Ads Transparency Scraper - Competitor Ads, Reach, Dates (`centorprat/google-ads-transparency-scraper`) Actor

Get every Google ad a competitor runs (Search, YouTube, Shopping, Maps, Play) from the Ads Transparency Center by domain or name: format, image, first/last shown, days running, countries, impressions by country and platform. No login.

- **URL**: https://apify.com/centorprat/google-ads-transparency-scraper.md
- **Developed by:** [Centor Prat](https://apify.com/centorprat) (community)
- **Categories:** Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.28 / 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 Transparency Scraper - Competitor Ads, Reach, Dates

**See every ad a competitor runs on Google**, from Google's own **Ads Transparency Center**: Search text ads, image /
display ads, YouTube video ads, Shopping, Maps and Play. Give a **website domain** (`allbirds.com`), an **advertiser
name** (`Duolingo`) or an advertiser ID, and get one row per ad: format (text / image / video), image URL or preview URL,
**first shown**, **last shown**, **days running**, link to the ad in the Transparency Center, and with details: the
ad's **topic**, every **country** it ran in (with dates), and **impressions** in total, per country and **per Google
platform** (Search, YouTube, Shopping, Maps, Play) where Google publishes them (ads shown in the EU).

Free with every advertiser: a **summary row**: total ads Google shows for them, ads active in the last 7 / 30 days,
format mix, newest and oldest ad, top countries, platforms and topics. Domain searches also reveal **agencies and
resellers** running ads for the brand (other advertiser accounts on the same domain).

### 📥 Input

| Field | Meaning |
|---|---|
| `advertisers` | domains, names or AR... IDs, one per line |
| `maxAdsPerAdvertiser` | newest ads first |
| `region`, `format`, `platform`, `dateFrom`, `dateTo` | Transparency Center filters |
| `activeWithinDays` | e.g. `7` = ads running right now |
| `includeDetails`, `advertiserSummary` | options |

```json
{ "advertisers": ["allbirds.com", "Duolingo", "hellofresh.com"], "region": "US", "format": "video", "activeWithinDays": 30, "maxAdsPerAdvertiser": 200 }
```

### 📤 Output

Ad:

```json
{ "type": "ad", "advertiserName": "Allbirds Inc", "format": "image", "domain": "allbirds.com",
  "firstShown": "2026-09-17T19:58:48+00:00", "lastShown": "2026-10-23T04:43:35+00:00", "daysShown": 36,
  "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/...", "countries": [{"country": "US", "lastShown": "2026-10-22"}],
  "adUrl": "https://adstransparency.google.com/advertiser/AR.../creative/CR..." }
```

EU ad with reach:

```json
{ "format": "video", "impressionsTotal": {"min": 2000000, "max": 2250000},
  "platforms": {"YouTube": {"min": 1750000, "max": 2000000}, "Google Search": {"min": 80000, "max": 90000}},
  "countries": [{"country": "FR", "impressions": {"min": 1000, "max": 2000}, "firstShown": "2025-10-30", "lastShown": "2026-10-20"}] }
```

Summary:

```json
{ "type": "advertiserSummary", "target": "allbirds.com", "totalAdsMin": 800, "totalAdsMax": 900, "activeLast7Days": 112,
  "formats": {"text": 120, "image": 60, "video": 20}, "topCountries": [{"country": "US", "ads": 190}] }
```

### 💡 Uses

- **Competitor ad research**: what they run, since when, which formats and where; long-running ads = winners.
- **Agencies and media buyers**: creative inspiration and pitch decks for prospects.
- **Lead generation**: brands actively advertising (and spending) right now.
- **Brand protection**: who else runs ads on your domain.

### 💰 Pricing

Pay per ad returned (`ad` event), details included. Summaries are free. Unknown advertisers are free.

### 🤖 API / agents

```bash
curl -X POST "https://api.apify.com/v2/acts/centorprat~google-ads-transparency-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
     -H "Content-Type: application/json" -d '{"advertisers": ["notion.so"], "maxAdsPerAdvertiser": 20}'
```

MCP: `https://mcp.apify.com/?tools=actors,docs,centorprat/google-ads-transparency-scraper`

### ❓ FAQ

- **Login needed?** No. It reads Google's public Ads Transparency Center.
- **Why are impressions empty for some ads?** Google publishes impressions and platform splits for ads shown in the EU (Digital Services Act); other ads still get countries, dates and format.
- **Ad text?** Text ads are archived by Google as images (`imageUrl`); other formats come with a preview URL.

# Actor input Schema

## `advertisers` (type: `array`):

Website domains (e.g. "allbirds.com"), advertiser names (e.g. "Duolingo") or Ads Transparency advertiser IDs / URLs (AR...). One advertiser per line.

## `maxAdsPerAdvertiser` (type: `integer`):

Newest ads first.

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

Only ads shown in this country (ISO code). "anywhere" = all countries.

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

Only ads of this format.

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

Only ads shown on this platform.

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

Only ads shown on or after this date (YYYY-MM-DD).

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

Only ads shown on or before this date (YYYY-MM-DD).

## `activeWithinDays` (type: `integer`):

Keep ads last shown within the last N days (e.g. 7 = currently running).

## `includeDetails` (type: `boolean`):

Per ad: topic, countries shown with dates, and impressions per country and platform (published for ads shown in the EU).

## `maxAdvertisersPerName` (type: `integer`):

When you give a name, how many matching advertiser accounts to include (best matches first).

## `advertiserSummary` (type: `boolean`):

Free summary per advertiser: total ads, active ads, formats, top countries, platforms, topics.

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

For very large runs: route through Apify Proxy if Google starts rate-limiting.

## Actor input object example

```json
{
  "advertisers": [
    "allbirds.com"
  ],
  "maxAdsPerAdvertiser": 20,
  "region": "anywhere",
  "format": "any",
  "platform": "any",
  "includeDetails": true,
  "maxAdvertisersPerName": 1,
  "advertiserSummary": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `rows` (type: `string`):

One row per ad (format, image/preview, first/last shown, days shown, countries, impressions by country and platform, topic) plus one advertiserSummary row per advertiser.

# 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 = {
    "advertisers": [
        "allbirds.com"
    ],
    "maxAdsPerAdvertiser": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("centorprat/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 = {
    "advertisers": ["allbirds.com"],
    "maxAdsPerAdvertiser": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("centorprat/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 '{
  "advertisers": [
    "allbirds.com"
  ],
  "maxAdsPerAdvertiser": 20
}' |
apify call centorprat/google-ads-transparency-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,centorprat/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/XeimLir6RdgsNpwg0/builds/EBloVQFaru1Am3sNi/openapi.json
