# Google Ads Transparency Scraper — EU reach, $1 per 1,000 ads (`theaisololab/google-ads-transparency`) Actor

Every ad a company runs on Google Search, YouTube, Shopping, Maps and Play, from the Ads Transparency Center: by website, advertiser name or ID, with dates, formats, images, ad text, regions and EU reach. No login.

- **URL**: https://apify.com/theaisololab/google-ads-transparency.md
- **Developed by:** [AI Solo Lab](https://apify.com/theaisololab) (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 ad listeds

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 — EU reach, $1 per 1,000 ads

See every ad a company runs on Google — **Search, YouTube, Shopping, Maps and Play** — straight from Google's [Ads Transparency Center](https://adstransparency.google.com). Search by **website**, **advertiser name** or **advertiser ID** and get one clean row per ad: format, first and last shown, how many days it ran, the image or preview, and a link to Google's ad page.

Turn on **details** and each ad also comes with the **regions where it ran** (with dates), **EU reach** (impression ranges per country and platform), the ad's **topic**, **audience selection** (demographic, geographic, contextual), its **variations** — and the **text of the ad** when Google renders it as HTML.

- **$1 per 1,000 ads.** Details are an extra $2 per 1,000, charged only when an ad's details actually load.
- **Targets that fail are free.** If Google blocks a request, the Actor backs off, switches proxy session and tries again; if it still can't get through, you get the reason in the summary — and no charge.
- **Newest ads first**, with date filters that stop paging as soon as the ads get too old — fast and cheap on huge advertisers.
- **A summary per website/advertiser** (ads by format, recent activity, top regions) written so people and LLMs can read it directly.
- **No login, no cookies, no browser.**

### What people use it for

- **Competitor research** — what your competitors advertise, where, in which formats, and since when.
- **Creative inspiration** — collect the images and copy of ads that have run for months (long-running ads are usually the ones that work).
- **Agency pitches and audits** — show a prospect every ad they and their competitors run in their country.
- **Market and policy research** — EU reach and audience-selection data published under the Digital Services Act.
- **AI agents** — call it from Claude, Cursor or any MCP client through the [Apify MCP server](https://mcp.apify.com); the summary is written for LLMs.

### Input

```json
{
  "domains": ["nike.com"],
  "advertisers": ["Nike, Inc.", "AR16735076323512287233"],
  "regions": ["PT", "ES"],
  "formats": ["IMAGE", "VIDEO"],
  "platforms": ["YOUTUBE"],
  "lastDays": 30,
  "maxAdsPerTarget": 100,
  "includeDetails": true
}
```

| Field | What it does | Default |
|---|---|---|
| `domains` | Websites. Every advertiser that advertises the site is included — the most complete way to research a brand. | — |
| `advertisers` | Advertiser names (as Google shows them), IDs starting with `AR`, or links copied from adstransparency.google.com. | — |
| `regions` | Only ads shown in these countries. | anywhere |
| `formats` | `TEXT`, `IMAGE`, `VIDEO`. | all |
| `platforms` | `SEARCH`, `YOUTUBE`, `SHOPPING`, `MAPS`, `PLAY` (Google filters by platform for ads since 4 Sep 2023). | all |
| `lastDays`, `startDate`, `endDate` | Only ads shown in this window. | any time |
| `maxAdsPerTarget` | Cap per website/advertiser, newest first. | 100 |
| `maxAdvertisersPerName` | A name can match several accounts; the largest are used first. | 3 |
| `includeDetails` | Regions with dates, EU reach, topic, audience selection, variations and ad text. | off |
| `proxyConfiguration` | Apify Proxy; sessions rotate automatically when Google limits an IP. | Apify Proxy |

### Output

One row per ad:

```json
{
  "target": "nike.com",
  "adId": "CR01003845904182018049",
  "advertiserId": "AR16735076323512287233",
  "advertiserName": "Nike, Inc.",
  "format": "IMAGE",
  "firstShown": "2021-10-25",
  "lastShown": "2026-09-27",
  "daysShown": 1799,
  "imageUrl": null,
  "previewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?...",
  "adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR01003845904182018049?region=PT",
  "adText": "FC Barcelona 2026/27 Stadium Home Nike Men's Dri-FIT Soccer Replica Jersey · Nike",
  "topic": "Apparel & Accessories",
  "variations": 3,
  "impressionsMin": 3000,
  "impressionsMax": 4000,
  "regionsShown": [
    { "region": "PT", "firstShown": "2023-03-01", "lastShown": "2024-07-26", "impressionsMin": 0, "impressionsMax": 1000 }
  ],
  "audience": { "demographic": "included", "geographic": "included", "contextual": "not used" }
}
```

The detail fields (`adText` to `audience`) are `null` unless `includeDetails` is on. EU reach and audience selection exist only for ads shown in the EU. Text comes from ads Google renders as HTML (most text and shopping ads); ads shown as a picture keep `imageUrl` instead.

The key-value store record **SUMMARY** has one entry per website/advertiser: the advertisers matched, Google's own estimate of the total, ads collected by format, how many ran in the last 30 days, top regions, and a one-paragraph `summary`.

### How it works

It asks the Ads Transparency Center the same questions its web page asks, 100 ads per request, newest first. Google limits how many requests one IP may make, so the Actor paces itself, retries with backoff, rotates proxy sessions and — if Google keeps saying no — moves to residential proxies (your price doesn't change).

**Limits, stated plainly:** Google publishes what it publishes. Impression ranges and audience selection exist only for EU ads; spend is only shown for political ads. Video ads come with Google's preview, not the video file.

### Pricing

Pay per event: **$0.001 per ad listed** ($1 per 1,000) and **$0.002 per ad with details**. Failed targets are free. You can cap spending per run in the run options — the Actor stops cleanly when it's reached.

### FAQ

**Is this legal?** It reads public information Google publishes for transparency, the same pages anyone can open without logging in. It collects no personal data. Use the results in line with the laws that apply to you.

**Why not use Google's own export?** The Transparency Center has no bulk export or API. This Actor gives you the data as rows you can filter, join and schedule.

**Can I track a competitor over time?** Yes — schedule a run with `lastDays: 7` and you'll get each week's new and still-running ads.

### Changelog

- **0.1** — first release: websites, advertiser names/IDs and Transparency Center links; region, format, platform and date filters; details with regions, EU reach, topic, audience selection, variations and ad text; summary per target.

This Actor is independent and not affiliated with Google.

# Actor input Schema

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

Websites whose Google ads you want (nike.com). Every advertiser that advertises this site is included. The most complete way to research a brand.

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

Advertiser names as Google shows them (Nike, Inc.), advertiser IDs (AR…), or links copied from adstransparency.google.com.

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

Only ads shown in these countries. Leave empty for anywhere. For EU countries, details add reach (impression ranges) and audience selection.

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

Leave empty for all formats.

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

Leave empty for all. Google only filters by platform for ads shown since 4 September 2023.

## `lastDays` (type: `integer`):

For example 30 for ads running this month. Leave empty to include older ads.

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

Only ads last shown on or after this date.

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

Only ads first shown on or before this date.

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

Newest ads first. Keeps costs predictable on huge advertisers.

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

An advertiser name can match several accounts (Nike, Inc. and Nike Retail BV). The largest ones are used first.

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

Also open each ad: regions where it ran (with dates), EU reach, topic, audience selection, variations and the ad's text when Google renders it as HTML. Slower; charged as a separate event.

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

Google limits requests per IP; the Actor rotates proxy sessions automatically.

## `residentialFallback` (type: `boolean`):

Doesn't change your price.

## Actor input object example

```json
{
  "domains": [
    "nike.com"
  ],
  "maxAdsPerTarget": 100,
  "maxAdvertisersPerName": 3,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "residentialFallback": true
}
```

# Actor output Schema

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

One row per ad: advertiser, format, dates, image, ad text and a link to Google's ad page.

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

Per target: advertisers matched, Google's total estimate, ads by format, recent activity, top regions and a one-paragraph summary for people and LLMs.

# 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 = {
    "domains": [
        "nike.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("theaisololab/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 = {
    "domains": ["nike.com"],
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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