# Google Ads Transparency Center Scraper (`signalmole/google-ads-transparency-scraper`) Actor

Get every Google ad a company runs: search, display and YouTube ads with headlines, images, video links, first/last shown dates and countries. Search by domain, advertiser name or advertiser ID. No login.

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

## Pricing

$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

![Every Google ad a competitor runs](https://gat-assets.pages.dev/hero.png)

## Google Ads Transparency Center Scraper

See every Google ad a company is running — **search, display and YouTube** — straight from the public [Google Ads Transparency Center](https://adstransparency.google.com). Type a domain, an advertiser name or an advertiser ID and get a clean table of ads with dates, countries, the company that paid, headlines, images and video links.

No login, no cookies, no browser. **$1 per 1,000 ads.**

### ✨ Why this scraper?

| Feature | What you get |
| :--- | :--- |
| 🔎 **Flexible search** | Domain, advertiser name **or** advertiser ID — mix them in one run |
| 🌍 **Every country** | Each country the ad ran in, with the last date it was shown there |
| 💳 **Who paid** | `paidBy` — the agency or company paying for the ad |
| ▶️ **YouTube links** | Direct `youtubeUrl` for video ads |
| 🖼️ **HTML5 ads** | Backup image plus the HTML5 bundle link |
| ⚡ **Fast** | ~1,000 ads with full details in 3–4 minutes |
| 💰 **Simple price** | $1 per 1,000 ads, platform usage included |

### 🎯 Use cases

- **Competitor ad monitoring** — run it on a schedule and spot new creatives the day they launch.
- **Creative research** — collect headlines, images and YouTube videos across a whole industry.
- **Agency prospecting** — `paidBy` reveals which agency manages a brand's Google Ads.
- **Market entry checks** — `regions` shows which countries a competitor is spending in.
- **AI agents** — call it through the Apify MCP server: *"What ads is acme.com running in Germany?"*

### 🚀 How to use

1. Add one or more **queries**: `acme.com`, `Acme Inc` or `AR13289988016354361345`.
2. Optional: pick a **country** (`US`, `GB`, `DE`…) and **ad formats**.
3. Click **Start**. Download the results as JSON, CSV, Excel, or pull them via API.

```json
{
  "queries": ["notion.so", "Canva Pty Ltd"],
  "region": "US",
  "maxAdsPerQuery": 100,
  "formats": ["IMAGE", "VIDEO"],
  "includeDetails": true
}
```

| Input | What it does |
| :--- | :--- |
| `queries` | Domains, advertiser names or advertiser IDs (`AR…`). A **domain** returns ads from every advertiser that links to it — resellers, affiliates and agencies included. |
| `region` | Two-letter country code, or `anywhere` (default). |
| `maxAdsPerQuery` | Stop after this many ads per query. `0` = no limit. |
| `formats` | `TEXT` (search), `IMAGE` (display), `VIDEO` (YouTube). Empty = all. |
| `includeDetails` | Countries, payer, text, images and video links. Turn off for a faster, bare list. |

### 📦 Output

One item per ad. Real example:

```json
{
  "advertiserName": "Notion Labs, Inc",
  "advertiserId": "AR13309761427309854721",
  "creativeId": "CR07023225844923367425",
  "format": "IMAGE",
  "firstShown": "2026-07-30T05:04:00+00:00",
  "lastShown": "2026-10-22T12:18:29+00:00",
  "regions": [
    { "region": "DE", "lastShown": "2026-10-22" },
    { "region": "AT", "lastShown": "2026-10-22" }
  ],
  "paidBy": "Notion Labs, Inc",
  "headline": "Get Your Team Started With Notion",
  "displayName": "Notion",
  "imageUrl": "https://tpc.googlesyndication.com/simgad/6530833606288067833",
  "variantCount": 1,
  "transparencyUrl": "https://adstransparency.google.com/advertiser/AR13309761427309854721/creative/CR07023225844923367425",
  "query": "Notion Labs"
}
```

| Field | Description |
| :--- | :--- |
| `advertiserName`, `advertiserId` | Verified advertiser |
| `format` | `TEXT`, `IMAGE` or `VIDEO` |
| `firstShown`, `lastShown` | When the ad first and last ran (UTC) |
| `regions` | Every country it ran in, with the last date shown there |
| `paidBy` | Company or agency paying for the ad |
| `headline`, `body`, `callToAction`, `displayName` | Ad text (display and video ads) |
| `imageUrl`, `logoUrl`, `html5Url` | Creative, logo, HTML5 bundle |
| `youtubeVideoId`, `youtubeUrl` | For video ads |
| `targetDomain`, `transparencyUrl` | Landing domain and the ad's public page |

> Search (text) ads are archived by Google as screenshots, so they come with `imageUrl` but no `headline` / `body`.

### 💰 How much does it cost?

You pay **$0.001 per ad** ($1 per 1,000). Platform usage is included — no hidden compute or proxy costs.

| Ads | Cost |
| :--- | ---: |
| 100 | $0.10 |
| 1,000 | $1.00 |
| 10,000 | $10.00 |

Apify's free plan includes $5 of monthly credit — enough for about 5,000 ads.

### 🔁 Monitoring: get only new ads

Schedule the Actor daily (Apify **Schedules**) and keep the previous run's `creativeId`s. Anything new is a fresh creative. Sort by `firstShown` to see what launched most recently.

### 🔌 Integrations

- **API / SDKs** — start runs and fetch results from Python, JavaScript or any HTTP client.
- **Zapier, Make, n8n, Google Sheets, Slack** — via Apify integrations.
- **MCP** — add the [Apify MCP server](https://mcp.apify.com) to Claude, Cursor or any MCP client and call this Actor as a tool.

### ❓ FAQ

**Do I need a Google account or cookies?**
No. Everything comes from the public Transparency Center.

**Why is `paidBy` different from `advertiserName`?**
Agencies often pay on behalf of a brand. `paidBy` is the payer Google shows on the ad page.

**Some ads have no image.**
A few HTML5 ads have no backup image, and some video variants don't expose a thumbnail. You still get the `transparencyUrl` to view the ad.

**How fresh is the data?**
Live from Google at run time. `lastShown` updates roughly daily.

**Can I export to CSV or Excel?**
Yes — every Apify dataset downloads as JSON, CSV, Excel, XML or HTML.

### ⚖️ Is this legal?

The Ads Transparency Center is a public archive that Google publishes so anyone can see who is advertising. This Actor only reads publicly visible data and does not log in. You are responsible for how you use the data; check the rules that apply to you.

### 💬 Need help?

Open an issue on the **Issues** tab — feature requests welcome.

# Actor input Schema

## `queries` (type: `array`):

One per line. Examples: canva.com, Canva Pty Ltd, AR13289988016354361345. A domain returns every ad that points to it, from any advertiser.

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

Two-letter country code (US, GB, DE, TW…) to only get ads shown there, or "anywhere".

## `maxAdsPerQuery` (type: `integer`):

Stop after this many ads for each query. 0 means no limit.

## `formats` (type: `array`):

Only keep these formats. Leave empty for all.

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

Also fetch countries, the paying company, headline/body text, images and YouTube links. Slower; turn off if you only need the ad list.

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

Google rate-limits datacenter IPs quickly. Residential proxy is recommended; only small API responses go through it.

## Actor input object example

```json
{
  "queries": [
    "canva.com"
  ],
  "region": "anywhere",
  "maxAdsPerQuery": 100,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One item per ad: advertiser, format, first/last shown dates, countries, payer, headline/body, image and YouTube links.

# 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 = {
    "queries": [
        "canva.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalmole/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 = { "queries": ["canva.com"] }

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

```

## MCP server setup

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