# Google Ads Transparency Scraper: Ads, Text, Video IDs & Reach (`cleandata-labs/google-ads-transparency-explorer`) Actor

Scrape Google Ads Transparency Center without login: every ad by brand, domain or advertiser ID, with ad text, YouTube video IDs, EU reach and audience data, multi-country filters, and new-ad monitoring. Pay only for delivered ads.

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

## Pricing

from $1.50 / 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

## Google Ads Transparency Scraper – Ads, Ad Text, YouTube Video IDs & EU Reach

### What does Google Ads Transparency Scraper do?

This Actor is a **Google Ads Transparency Center scraper and API**. It lets you see and export **competitor ads on Google** – the ads an advertiser runs on Search, YouTube, Shopping, Maps and Play – as structured data, for ad research, competitor monitoring and creative inspiration.

Export the ads any company runs on Google (**Search, YouTube, Shopping, Maps and Play**) from the public **Google Ads Transparency Center**. Search by **brand name, website, advertiser ID or pasted URL**. Filter by **one or several countries**, platform, format and dates. Optionally add **ad text, YouTube video IDs, EU reach ("times shown") and audience data**. No login, no cookies, no Google account.

You **only pay for ads delivered** to your dataset. Targets with no ads, blocked requests and errors are reported but never charged.

### What you get

- **Every ad creative** with advertiser, domain, format, first/last shown, days shown, image URL or Google preview link, and Google's internal creative / customer / ad-group IDs.
- **Advertiser identity on every row (free)**: country, legal name, verified status, EU-only flag.
- **Ad text and YouTube video ID (add-on)**: the visible text of rendered ads (Shopping product titles, local ads, text ads with a rendered preview), **the YouTube video ID and link of video ads**, and product images.
- **Full details (add-on)**: every A/B variation, every country with first/last shown dates, **times-shown ranges per country and per platform** (EU ads), **audience selection** (demographics, locations, contextual signals, topics of interest, customer lists), and the **advertiser-declared topic** (e.g. "Electronics").
- **Advertiser mode**: one row per advertiser account with approximate ad counts. Use it to check which companies advertise, or who runs the ads for a website.
- **Monitor mode**: return only ads not seen in previous runs. Schedule it daily to get alerts when a competitor launches new ads.

### How to use Google Ads Transparency Scraper

1. Open the Actor in Apify Console (click **Try for free** on this page) and sign in or create a free Apify account.
2. Tell it whose ads to get: **Brand names or websites**, **Domains**, **Advertiser IDs**, or paste **Ads Transparency Center URLs**. Choose **Result type** `ads` or `advertisers`.
3. Filter with **Regions (countries)**, **Platforms**, **Ad format** and the dates **Shown on or after** / **Shown on or before**, and set **Max ads per target**.
4. Optional add-ons: **Add ad text, YouTube video ID and product data** and **Add full ad details (EU reach, audience, all countries, variations, topic)**. For alerts, turn on **Monitor mode: only new ads**.
5. Click **Start**. When the run finishes, open the **Output** tab and download the results as **JSON, CSV, Excel** or HTML.
6. Create a **Schedule** (e.g. daily, with Monitor mode) to track competitors, or call the Actor via the Apify API.

### How it compares

| | This Actor | Typical alternatives |
|---|---|---|
| Price per ad | **$0.0015** | $0.0015 – $0.002 |
| Full details add-on | **+$0.0015** | +$0.003 |
| Ad text add-on | **+$0.001, charged only when text is found** | not available, or +$0.002 |
| YouTube video ID of video ads | **yes** | usually only a preview link |
| Several countries in one search | **yes** | usually one region per run |
| Errors / no-result targets charged | **never** | varies |

### Input example

```json
{
  "queries": ["HelloFresh"],
  "domains": ["nike.com"],
  "regions": ["US", "GB"],
  "platforms": ["YOUTUBE"],
  "adFormat": "VIDEO",
  "startDate": "2026-06-01",
  "maxAdsPerTarget": 200,
  "includeAdText": true,
  "includeDetails": false
}
```

- `queries`: brand names (matched to advertiser accounts, exact name first, then by ad count) or websites.
- `domains`: every ad pointing to the website, from any advertiser account (including resellers and agencies).
- `advertiserIds`: IDs starting with `AR` from an advertiser page URL.
- `startUrls`: advertiser, creative or domain-search URLs from adstransparency.google.com. Their filters are applied.
- `resultType`: `ads` (default) or `advertisers`.

### Output example (ad with add-ons)

```json
{
  "type": "ad",
  "advertiserName": "SC DANTE INTERNATIONAL SA",
  "advertiserId": "AR09040091694841724929",
  "creativeId": "CR15732726098741428225",
  "domain": "emag.ro",
  "format": "IMAGE",
  "firstShown": "2021-10-25T07:00:00Z",
  "lastShown": "2026-10-27T19:06:16Z",
  "shownForDays": 1829,
  "adText": "Kit de îmbunătățire a luminii CORSAIR VENGEANCE 2x RGB, alb, set | eMAG",
  "youtubeVideoId": null,
  "topic": "Electronics",
  "impressionsMin": 20000,
  "impressionsMax": 25000,
  "platformImpressions": [{ "platform": "SEARCH", "impressionsMin": 10000, "impressionsMax": 15000 }],
  "audienceSelection": { "demographicInfo": "included", "geographicLocations": "included", "contextualSignals": "included and excluded", "topicsOfInterest": null, "customerLists": "included" },
  "advertiserCountry": "RO",
  "advertiserVerified": true,
  "adUrl": "https://adstransparency.google.com/advertiser/AR09040091694841724929/creative/CR15732726098741428225?region=RO"
}
```

Other row types: `advertiser` (in advertisers mode), `noResults` (free) and `error` (free).

### How much does it cost?

The Actor uses **pay-per-event pricing**, so you pay only for what is delivered – no separate compute or proxy costs:

- **Ad**: $0.0015 per ad creative delivered.
- **Ad details** (only with *includeDetails*): +$0.0015 per ad.
- **Ad text** (only with *includeAdText*): +$0.001 per ad **where text or a YouTube video ID was found**.
- **Advertiser** (advertisers mode): $0.002 per advertiser row.
- The only other charge is Apify's standard Actor start event ($0.00005 per run).
- Set a *maximum cost per run* and the Actor stops cleanly when it is reached.
- Targets with no ads, blocked requests and errors are **free**.

Example: 1,000 ads cost $1.50 without add-ons. Apify's free plan includes **$5 of platform credit every month**, which is enough to try the Actor on real data before you pay anything.

### Good to know

- **Reach, platform and audience data exist only for ads shown in the EU** (published under the Digital Services Act). For other ads these fields are `null`.
- **Google's "times shown" figures are ranges** that Google refreshes periodically. `impressionsMax: null` means Google's open top bucket (e.g. "over 10M"). For the lowest bucket, `impressionsMin: null` with `impressionsMax: 1000` means "under 1,000".
- **Date filter**: Google only applies date filters to roughly the **last 12 months**. Older windows return nothing (the Actor tells you). For older ads, leave the dates empty and use `firstShown`/`lastShown`.
- **Platform filters** apply to ads shown since September 2023.
- **Ad text** comes from Google's own ad preview. Ads that Google archives as plain images keep their words inside the image, so they have no extractable text. They are not charged for the text add-on.
- **Monitor mode** remembers creative IDs in a named key-value store (`monitorStoreName`). With a low `maxAdsPerTarget`, the next run continues with ads it has not returned before. For true "new ad" alerts, seed the first run with a high limit.
- **Speed**: the Actor throttles itself (default 50 requests/minute) and retries rate limits with backoff and a fresh session. A list page returns 40 ads per request. Details and text need one extra request per ad (about 1–1.5 s per ad).

### Use with AI agents (MCP)

Google Ads Transparency Scraper works as a ready-made tool for Claude, ChatGPT, Cursor, VS Code and any other MCP client through the official [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). The agent gets one tool, `cleandata-labs--google-ads-transparency-explorer`, with the input fields described on this page, and you pay the normal pay-per-event price from your Apify account (a free account works; it includes $5 of monthly credit).

**MCP server URL with only this Actor:**

```text
https://mcp.apify.com?tools=cleandata-labs/google-ads-transparency-explorer
```

On first connection your client opens the Apify sign-in (OAuth). To use an API token instead, send the header `Authorization: Bearer <YOUR_APIFY_TOKEN>`.

**Claude (claude.ai and Claude Desktop):** Settings → Connectors → Add custom connector. Name: `Google Ads Transparency`, Remote MCP server URL: the URL above.

**Claude Desktop with a local config file** (`claude_desktop_config.json`, needs Node.js 18+):

```json
{
  "mcpServers": {
    "google-ads-transparency": {
      "command": "npx",
      "args": ["-y", "@apify/actors-mcp-server", "--tools", "cleandata-labs/google-ads-transparency-explorer"],
      "env": { "APIFY_TOKEN": "<YOUR_APIFY_TOKEN>" }
    }
  }
}
```

**Cursor** (`~/.cursor/mcp.json`, or `.cursor/mcp.json` in a project):

```json
{
  "mcpServers": {
    "google-ads-transparency": {
      "url": "https://mcp.apify.com?tools=cleandata-labs/google-ads-transparency-explorer"
    }
  }
}
```

**Claude Code:**

```bash
claude mcp add --transport http google-ads-transparency "https://mcp.apify.com?tools=cleandata-labs/google-ads-transparency-explorer"
```

**VS Code** (`.vscode/mcp.json`):

```json
{
  "servers": {
    "google-ads-transparency": { "type": "http", "url": "https://mcp.apify.com?tools=cleandata-labs/google-ads-transparency-explorer" }
  }
}
```

Already connected to `https://mcp.apify.com` with the default tools? Just ask your agent to use `cleandata-labs/google-ads-transparency-explorer`; it can run it through `call-actor`. To load several Actors in one connection, separate them with commas, e.g. `https://mcp.apify.com?tools=cleandata-labs/google-trends-explorer,cleandata-labs/url-to-markdown`.

#### Tips for agents

- Smallest useful input: `{"domains": ["nike.com"], "queries": [], "regions": ["US"], "maxAdsPerTarget": 10}` (10 ads that point to nike.com, shown in the US).
- 10 ads take about 5 seconds; with `includeAdText` or `includeDetails` allow about 1 second per ad, so results are usually ready within the MCP call's default 30-second wait. The call returns a dataset ID; the agent reads the rows with `get-dataset-items`.
- Cost: $0.0015 per ad (10 ads = $0.015). Ad text +$0.001 only when text is found, full details +$0.0015 per ad, advertiser rows $0.002. Targets with no ads and errors are free.
- Pass `queries: []` when you search by `domains`, `advertiserIds` or `startUrls`; otherwise the demo default `["Nike"]` is also run.
- Keep `maxAdsPerTarget` at 10-20 for a quick look (the default is 100 per target, and a brand name can match up to 3 advertisers).
- Use `resultType: "advertisers"` to answer "who advertises for this brand / website?" with one row per advertiser account.
- Reach and audience data exist only for ads shown in the EU.

#### Example prompts

1. "Show me 10 recent YouTube video ads that hellofresh.com ran in the US, with their YouTube links and first/last shown dates."
2. "Which Google advertiser accounts run ads for booking.com in the UK? Give their legal names, countries and approximate ad counts."
3. "Has Nike started any new Google ads in Germany since 1 October 2026? Include the ad text where available."

### Integrations

Google Ads Transparency Scraper works with everything that connects to Apify:

- **Make, Zapier and n8n** – start a run and process the results in your no-code workflows.
- **Google Sheets** – export the dataset to a spreadsheet, or keep a sheet updated with a scheduled run.
- **Webhooks** – get a notification (Slack, email, your own endpoint) when a run finishes or fails.
- **Apify API and clients** – start runs and download results from your code with the REST API, the [Python client](https://docs.apify.com/api/client/python) (`apify-client`) or the [JavaScript client](https://docs.apify.com/api/client/js) (`apify-client`).
- **AI agents** – use it as a tool through the Apify MCP server or the LangChain / LlamaIndex integrations.

Python example:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("cleandata-labs/google-ads-transparency-explorer").call(run_input={"domains": ["nike.com"], "regions": ["US"], "maxAdsPerTarget": 100})
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)
```

### Limitations & legal

- This Actor is **not affiliated with or endorsed by Google**. It reads only the public information that adstransparency.google.com shows to any visitor without signing in. The site publishes this data for public transparency and serves no robots.txt restrictions. The Actor does not bypass logins, captchas or other protections. If Google rate-limits it persistently, the affected target is reported as blocked and not charged.
- Advertiser names are those of advertiser accounts (companies, or occasionally sole traders) as published by Google. Use the data in line with applicable law and Google's terms.

### FAQ

**A brand name returns the wrong company?** Use `domains` or `advertiserIds` for exact targeting, or raise `maxAdvertisersPerQuery`. The log shows which accounts each query matched.

**I got rate-limited.** Lower `maxRequestsPerMinute`, or enable Apify Proxy so sessions rotate.

**Is it legal to scrape the Google Ads Transparency Center?** The Actor only reads information that Google publishes for public transparency and shows to any visitor without signing in, and it does not bypass logins or captchas. Advertiser names can occasionally belong to individuals (sole traders), so we can't guarantee the data contains no personal data. You are responsible for using it in line with Google's terms and applicable law (e.g. GDPR); ask a lawyer if you are unsure.

**Can I use it with integrations, the API or LLM tools?** Yes. Connect it to Make, Zapier, n8n, Google Sheets or webhooks, call it from Python or JavaScript with the Apify API, or use it as a tool for AI agents via the Apify MCP server (see *Integrations* above).

**How do I monitor a competitor's new ads?** Turn on **Monitor mode: only new ads**, run it once with a high **Max ads per target**, then schedule it daily. Each run returns only ads not seen before; add a webhook or the Slack / email integration to get notified.

**Why do some ads have no reach or audience data?** Google publishes "times shown" and audience data only for ads shown in the EU. For other ads these fields are `null`.

# Actor input Schema

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

Brand names or websites to look up, e.g. \["Nike"] or \["hellofresh.com"]. Names are matched to advertiser accounts (see maxAdvertisersPerQuery). If you omit this field the default \["Nike"] is used, so pass \[] when you only use domains, advertiserIds or startUrls.

## `domains` (type: `array`):

Exact websites, e.g. \["nike.com"]. Returns every ad that points to the domain, from any advertiser account. The most precise way to see a competitor's ads.

## `advertiserIds` (type: `array`):

Advertiser IDs that start with AR, e.g. \["AR16735076323512287233"], taken from an advertiser page URL on adstransparency.google.com.

## `startUrls` (type: `array`):

Optional advertiser, creative or domain-search links copied from adstransparency.google.com, e.g. \[{"url": "https://adstransparency.google.com/advertiser/AR16735076323512287233?region=US"}]. Filters in the URL (region, format, platform, dates) are applied.

## `resultType` (type: `string`):

"ads" (default) = one row per ad creative. "advertisers" = one row per advertiser account with approximate ad count, country, legal name and verification status. Use "advertisers" to check who advertises for a brand or website.

## `regions` (type: `array`):

Country codes where the ads were shown, e.g. \["US"] or \["DE","FR"] (ads shown in ANY of them). \[] = anywhere. Default \["US"]. Reach and audience data exist only for EU countries.

## `platforms` (type: `array`):

Optional Google surfaces: any of "SEARCH", "YOUTUBE", "SHOPPING", "MAPS", "PLAY". \[] = all. Google applies this filter only to ads shown since September 2023.

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

Creative format: "ALL" (default), "TEXT", "IMAGE" or "VIDEO".

## `startDate` (type: `string`):

Optional. Only ads shown on or after this date, format YYYY-MM-DD, e.g. "2026-06-01". Google applies date filters only to about the last 12 months.

## `endDate` (type: `string`):

Optional. Only ads shown on or before this date, format YYYY-MM-DD.

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

Max ads per domain / advertiser, 0 = no limit. Default 100. Each ad costs one result, so AI agents should use 10-20 for a quick look. A brand-name query can expand to several advertisers.

## `maxAdvertisersPerQuery` (type: `integer`):

How many matching advertiser accounts to use per brand-name query, 1-20. Default 3. Exact name matches first, then by ad count. Use 1 for the main brand only.

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

true = one extra request per ad to add all A/B variations, every country with dates, Google's 'times shown' ranges (EU ads), audience selection and topic. Paid add-on per ad and slower (about 1 s per ad). Default false.

## `includeAdText` (type: `boolean`):

true = read Google's ad preview to add the visible ad text (headline, description, product title, display URL) and the YouTube video ID of video ads. Paid add-on, charged only when text or a video ID was found. Default false.

## `includeAdvertiserInfo` (type: `boolean`):

true (default, free) = add advertiser country, legal name, verification status and EU-only flag to each row.

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

true = monitor mode: remember creative IDs in a named key-value store and return only ads not seen in earlier runs. Combine with a schedule for new-ad alerts. Default false.

## `monitorStoreName` (type: `string`):

Name of the key-value store used by monitor mode. Use a different name per monitored target. Default "ads-transparency-monitor".

## `maxRequestsPerMinute` (type: `integer`):

Request throttle, 5-600. Default 50. Without a proxy keep it around 50.

## `maxRetries` (type: `integer`):

Retries per request on rate limits or network errors, 0-10. Default 5. Each retry uses a fresh session (and proxy IP, if enabled).

## `requestTimeoutSecs` (type: `integer`):

Timeout per HTTP request in seconds, 5-120. Default 30.

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

Proxy settings. Default {"useApifyProxy": true}, recommended so sessions can rotate on rate limits. Leave as is unless you have a reason to change it.

## Actor input object example

```json
{
  "queries": [
    "Nike"
  ],
  "resultType": "ads",
  "regions": [
    "US"
  ],
  "adFormat": "ALL",
  "maxAdsPerTarget": 100,
  "maxAdvertisersPerQuery": 3,
  "includeDetails": false,
  "includeAdText": false,
  "includeAdvertiserInfo": true,
  "onlyNewAds": false,
  "monitorStoreName": "ads-transparency-monitor",
  "maxRequestsPerMinute": 50,
  "maxRetries": 5,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "queries": [
        "Nike"
    ],
    "regions": [
        "US"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleandata-labs/google-ads-transparency-explorer").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": ["Nike"],
    "regions": ["US"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cleandata-labs/google-ads-transparency-explorer").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": [
    "Nike"
  ],
  "regions": [
    "US"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cleandata-labs/google-ads-transparency-explorer --silent --output-dataset

```

## MCP server setup

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

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/lom7MSv380u1VzjVo/builds/bEqviMJSj2fOZ0QgM/openapi.json
