# Google Ads Transparency Scraper: Ads by Advertiser or Domain (`sports-odds-lab/google-ads-transparency`) Actor

Every ad an advertiser runs on Google Search, YouTube, Display, Shopping and Maps, from the Google Ads Transparency Center. Search by website, advertiser name or ID; filter by country, format and dates. Ad text, images, landing pages, first/last shown.

- **URL**: https://apify.com/sports-odds-lab/google-ads-transparency.md
- **Developed by:** [Min Maxxxer](https://apify.com/sports-odds-lab) (community)
- **Categories:** SEO tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 by Advertiser or Domain

> 🎁 **Free until 14 October 2026.** Press **Start** — the prefilled input returns the latest ads of nike.com and booking.com in seconds.

See **every ad an advertiser runs on Google** — Search, YouTube, Display, Shopping, Maps and Play — straight from the public **Google Ads Transparency Center**. Type a **website** (nike.com), an **advertiser name** (Nike), an **advertiser ID** (AR…) or paste a Transparency Center link, filter by **country, format and dates**, and get one clean row per ad:

- **advertiser**, format (text, image, video), **first and last shown**, **days shown**
- the **ad image** (Google archives most text and image ads as a picture of the ad) and the ad preview
- for responsive display ads: **headline, description, call to action, logo, image and landing page**
- for Shopping ads: the **product title**
- optional: **every country the ad ran in**, with dates, and the ad's **category**

Perfect for **competitor research**, ad copy and creative inspiration, spotting **new campaigns** early (schedule it with *Shown in the last N days*) and checking which landing pages competitors push.

### What you get — one row per ad

| Field | Example |
|---|---|
| `advertiserName`, `advertiserId`, `domain` | Nike Retail BV, AR18378488041124659201, nike.com |
| `creativeId`, `format` | CR11529870939114176513, text / image / video |
| `firstShown`, `lastShown`, `daysShown` | 2021-10-25, 2026-09-30, 1620 |
| `imageUrl`, `imageWidth`, `imageHeight` | the ad as Google archived it |
| `headline`, `description`, `callToAction` | "Découvrez des maisons, des hôtels, etc.", "Un Service Clients disponible 24h/24…", "Réserver" |
| `displayUrl`, `landingUrl` | booking.com, http://www.booking.com/index.html?aid=2395786 |
| `logoUrl`, `productTitle`, `html5BundleUrl` | logo, "Nike Zoom Fly 6 Men's Road-Racing Trainers…", HTML5 ad bundle |
| `previewUrl`, `adUrl` | Google's ad preview, the ad's page in the Transparency Center |
| `regions`, `category` | `[{"countryCode": "PL", "country": "Poland", "firstShown": "2023-04-09", "lastShown": "2023-04-09"}, …]`, "Apparel & Accessories" |

The **per-search summary** (key-value store record `SUMMARY`) shows how many ads were saved and Google's estimate of all matching ads for every search.

### How to use it

1. Add **advertisers or websites** — one per line: `nike.com`, `Nike`, `AR06641858037806006273` or `https://adstransparency.google.com/advertiser/AR…?region=US`.
2. Optionally filter by **country**, **ad format** and **dates** (*Shown in the last N days*, or a date range).
3. Click **Start**, then download JSON, CSV or Excel, or read the dataset through the Apify API.

A **website** returns the ads of every advertiser that promotes it (Nike runs ads through several legal entities); a **name** picks the best-matching verified advertiser — or all of them with *Advertiser names: All matching*.

#### Input example — a competitor's ads in the US from the last 30 days

```json
{
  "searches": ["booking.com"],
  "region": "US",
  "lastDays": 30,
  "maxAdsPerSearch": 500
}
```

#### Input example — all video ads of several brands, with the countries they ran in

```json
{
  "searches": ["nike.com", "adidas.com", "puma.com"],
  "adFormat": "video",
  "includeRegions": true
}
```

#### Output example (a real row, shortened)

```json
{
  "advertiserName": "Booking.com",
  "domain": "booking.com",
  "creativeId": "CR04173554866964135937",
  "format": "text",
  "firstShown": "2026-08-27T05:50:16Z",
  "lastShown": "2026-09-30T13:21:34Z",
  "daysShown": 36,
  "headline": "Découvrez des maisons, des hôtels, etc.",
  "description": "Un Service Clients disponible 24h/24 et 7j/7, où que vous soyez.",
  "callToAction": "Réserver",
  "displayUrl": "booking.com",
  "landingUrl": "http://www.booking.com/index.html?aid=2395786",
  "imageUrl": "https://tpc.googlesyndication.com/simgad/13487100057649545191",
  "adUrl": "https://adstransparency.google.com/advertiser/AR02934798844673654785/creative/CR04173554866964135937?region=anywhere"
}
```

### Speed and limits

About 40 ads per request, most recently shown first — a few hundred ads a minute. Google limits how many requests one IP may send; with **Apify Proxy** (on by default) the Actor moves to a fresh IP whenever that happens and continues from the same page, so long runs do not stop. *Countries of each ad* costs one more request per ad — turn it on when you need it.

### Pricing

⏱️ **Free until 14 October 2026** — during the launch period you only pay Apify's platform usage, typically well under $0.01 per run.

**From 15 October 2026 you pay per ad saved — platform usage and proxies included**, nothing else:

| Apify plan | Per 1,000 ads | Countries of each ad (optional), per 1,000 ads |
|---|---|---|
| Free | $1.50 | +$1.00 |
| Starter | $1.35 | +$0.90 |
| Scale | $1.20 | +$0.80 |
| Business and higher | $1.05 | +$0.70 |

💡 The monthly $5 credit of Apify's free plan covers about 3,300 ads. Set a spending limit on the run for a hard cap — the Actor stops as soon as it is reached.

### FAQ

**What is "days shown"?** The number of days Google reports the ad as shown. Long-running ads are usually the ones that work.

**Why do some ads have only an image?** Google's Transparency Center archives most text and image ads as a picture of the ad — you get that image. For responsive display and Shopping ads the Actor also reads the headline, description, product and landing page from the ad's preview.

**What about video ads?** You get the advertiser, dates and a link to the ad's preview and Transparency Center page.

**Which countries?** Every country Google lists in the Transparency Center; "Anywhere" searches all of them.

**Where does the data come from?** From the public Google Ads Transparency Center (adstransparency.google.com), which Google publishes so anyone can see who advertises and what. This Actor is not affiliated with Google.

### More from Min Maxxxer

- 💼 [ATS Jobs Scraper](https://apify.com/sports-odds-lab/ats-jobs-scraper) — open jobs from Greenhouse, Lever, Ashby, Workday and 7 more ATS, by company or across 15,000+ companies
- 📊 [Polymarket & Kalshi Scraper](https://apify.com/sports-odds-lab/polymarket-kalshi-odds) — prediction market odds, price history and results
- 📋 [ESPN Scraper](https://apify.com/sports-odds-lab/espn-scraper) — box scores and player stats

⭐ **Did this Actor save you time?** A short review on this page helps others find it — and tells us what to add next.

### Changelog

- **0.1** — first release: search by website, advertiser name, advertiser ID or Transparency Center link; country, format and date filters; ad images, display-ad text and landing pages, Shopping product titles, countries per ad; automatic IP rotation.

# Actor input Schema

## `searches` (type: `array`):

One per line: a website (nike.com — every advertiser running ads for it), an advertiser name (Nike — the best-matching verified advertiser), an advertiser ID (AR06641858037806006273) or a Google Ads Transparency Center link (adstransparency.google.com/advertiser/AR…?region=US or …?domain=nike.com).

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

Only ads shown in this country. 'Anywhere' = all countries.

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

Text, image or video ads only.

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

Only ads shown at some point in the last N days (e.g. 30). 0 = any time — or use the dates below.

## `shownFrom` (type: `string`):

Only ads shown on or after this date (YYYY-MM-DD). Ignored when 'last N days' is set.

## `shownTo` (type: `string`):

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

## `advertiserMatch` (type: `string`):

When you type a name: take the best match (verified advertiser with most ads) or every advertiser whose name contains it (e.g. all Nike legal entities).

## `includeAdContent` (type: `boolean`):

Open each ad's preview for its headline, description, call to action, logo, image, product title and landing page (where Google publishes them). A little slower.

## `includeRegions` (type: `boolean`):

One extra request per ad: every country the ad ran in, with first and last shown dates, and the ad's category.

## `maxAdsPerSearch` (type: `integer`):

Newest first. 0 = all (big brands run tens of thousands).

## `maxItems` (type: `integer`):

Stop after this many saved ads. 0 = no limit.

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

Google limits how many requests one IP may send; with Apify Proxy the Actor moves to a new IP when that happens.

## Actor input object example

```json
{
  "searches": [
    "nike.com",
    "booking.com"
  ],
  "region": "anywhere",
  "adFormat": "all",
  "lastDays": 0,
  "advertiserMatch": "best",
  "includeAdContent": true,
  "includeRegions": false,
  "maxAdsPerSearch": 50,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per ad with advertiser, format, image, text, landing page and dates.

## `results` (type: `string`):

Full records including preview links and countries.

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

Ads saved and Google's estimate of matching ads per search.

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

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sports-odds-lab/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/nZnUw8tg09HRLo4CD/builds/6WdvDYWEnsT2H55Ac/openapi.json
