# Google Ads Transparency Scraper: Ad Library & EU Reach (`jaaylee/google-ads-transparency-scraper`) Actor

Google Ads Transparency Center scraper: get ads any advertiser runs on Google Search, YouTube, Shopping, Maps and Play. Search by domain, brand or advertiser ID. Format, first/last shown, days shown, previews, EU impressions, targeting and topic. $0.50 per 1,000 ads. Export CSV/JSON or use the API.

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

## Pricing

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

### What is Google Ads Transparency Scraper?

**Google Ads Transparency Scraper** extracts ads from the **Google Ads Transparency Center** (the public Google ad
library) for any **website domain**, **advertiser or brand name**, or **advertiser ID**. For every ad you get the
advertiser, ad (creative) ID, **format (text, image or video)**, **first shown and last shown dates**, the **number of
days the ad was shown**, a **preview image or preview link** and a direct link to the ad in the Transparency Center.

Filter by **country**, **Google platform** (Search, YouTube, Shopping, Maps, Play), **ad format** and **date range**.
Turn on **ad details** to also get every **ad variation (A/B version)**, the **countries where the ad ran**, the legal
advertiser name and topic, and — for ads shown in the **EU** — the **number of times the ad was shown (impressions)**
and the advertiser's **audience targeting**.

Use it for **competitor ad research**, **ad creative inspiration**, **monitoring new ads of competitors**, **agency
pitches and audits**, **brand protection** and **market research**. Run it in Apify Console, on a schedule, or from
Python, JavaScript, Make, Zapier, n8n or an AI agent (MCP).

#### Why this Google Ads Transparency scraper

- 💸 **$0.50 per 1,000 ads.** One of the lowest prices for Google Ads Transparency data. Ads with full details are
  $1.00 per 1,000. Failed and blocked requests are free.
- 🔎 **Search by domain, brand name or advertiser ID.** Type `nike.com`, `Nike` or `AR16735076323512287233`, or paste
  an Ads Transparency Center URL. A brand name is matched to the advertiser with the most ads, not just the first
  suggestion (for "Nike" that is *Nike Retail BV* with 70,000+ ads, not a small advertiser called "Nikey"). Set
  'Advertisers per name' to 2 or more to also get the next ones, such as *Nike, Inc.*
- 🇪🇺 **EU reach and targeting.** For EU countries the details include the impressions range (e.g. 5K–6K), split by
  platform (Search, YouTube, Shopping), and whether the advertiser targeted demographics, locations, contextual signals,
  customer lists and interests.
- 📅 **Dates that match the Transparency Center.** First and last shown dates use the same calendar day as the Google
  page, plus `daysShown` (how many days the ad actually ran).
- 🧹 **No duplicates.** When a domain search and an advertiser search return the same ad, it is saved and charged
  once.
- ⚡ **Fast and light:** plain HTTP requests, no browser, 100 ads per request. In our tests 12,000 ads (6 domains ×
  2,000) took about 40 seconds.

### What Google Ads data can you extract?

| Group | Fields |
|---|---|
| Search | `searchTerm`, `searchType` (domain, advertiser or name), `region`, `platform`, `position`, `totalAdsMin`, `totalAdsMax` |
| Ad | `advertiserId`, `advertiserName`, `creativeId`, `format`, `firstShown`, `lastShown`, `daysShown`, `adUrl` |
| Preview | `previewImageUrl`, `previewWidth`, `previewHeight` (image and most text ads), `previewUrl` (video and script ads) |
| Details (optional) | `legalName`, `topic`, `topicId`, `variationCount`, `variations`, `regions` (country, first/last shown) |
| EU reach (optional) | `impressionsMin`, `impressionsMax`, `impressionsByPlatform`, `regions[].impressionsMin/Max`, `audienceSelection` |
| Run | `detailsIncluded`, `complete`, `scrapedAt` |

### How to scrape the Google Ads Transparency Center

1. Click **Try for free** and open the Actor input.
2. Enter one or more **domains, advertiser names or IDs** — e.g. `booking.com`, `Nike`, `AR16735076323512287233` or an
   `adstransparency.google.com/advertiser/...` URL.
3. Choose the **Region** (a country code such as `US`, `GB`, `DE`, or `anywhere`), and optionally the **Google
   platform**, **Ad format** and **dates**.
4. Set **Max ads per search** and, if you need variations, regions, EU impressions and targeting, turn on **Include
   ad details**.
5. Click **Start** and download the ads as JSON, CSV or Excel, or read them via the API.

#### Input example

```json
{
  "searchTerms": ["zalando.de", "Nike", "AR16735076323512287233"],
  "region": "DE",
  "platform": "all",
  "format": "all",
  "dateFrom": "2026-09-01",
  "maxAdsPerSearch": 500,
  "includeDetails": true
}
```

#### Output example

A text ad shown in Germany, with details:

```json
{
  "searchTerm": "zalando.de",
  "searchType": "domain",
  "advertiserId": "AR15589870916631265281",
  "advertiserName": "Zalando SE",
  "creativeId": "CR11206823616735870977",
  "format": "text",
  "firstShown": "2024-06-12",
  "lastShown": "2026-10-15",
  "daysShown": 485,
  "adUrl": "https://adstransparency.google.com/advertiser/AR15589870916631265281/creative/CR11206823616735870977?region=DE",
  "previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/15597456861372316862",
  "previewWidth": 348,
  "previewHeight": 160,
  "previewUrl": null,
  "region": "DE",
  "platform": "all",
  "position": 1,
  "totalAdsMin": 10000,
  "totalAdsMax": 20000,
  "legalName": "Zalando SE",
  "topic": "Apparel",
  "topicId": 10021,
  "variationCount": 3,
  "variations": [
    {"previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/15597456861372316862", "previewWidth": 348, "previewHeight": 160},
    {"previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/9246078059442420531", "previewWidth": 348, "previewHeight": 180},
    {"previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/7315893545847657116", "previewWidth": 348, "previewHeight": 200}
  ],
  "regions": [
    {
      "country": "DE",
      "firstShown": "2024-06-12",
      "lastShown": "2026-10-15",
      "impressionsMin": 5000,
      "impressionsMax": 6000,
      "impressionsByPlatform": [
        {"platform": "google-search", "impressionsMin": 5000, "impressionsMax": 6000},
        {"platform": "youtube", "impressionsMin": 0, "impressionsMax": 1000}
      ]
    }
  ],
  "impressionsMin": 5000,
  "impressionsMax": 6000,
  "impressionsByPlatform": [
    {"platform": "google-search", "impressionsMin": 5000, "impressionsMax": 6000},
    {"platform": "youtube", "impressionsMin": 0, "impressionsMax": 1000}
  ],
  "audienceSelection": {
    "demographics": "included",
    "geographicLocations": "included and excluded",
    "contextualSignals": "included and excluded"
  },
  "detailsIncluded": true,
  "scrapedAt": "2026-10-16T09:00:00+00:00",
  "complete": true
}
```

Without **Include ad details**, each ad has the fields up to `totalAdsMax` plus `scrapedAt` and `complete`.

### How much does it cost to scrape Google Ads Transparency data?

**$0.50 per 1,000 ads**, or **$1.00 per 1,000 ads with details**, on the Free plan. Lower prices apply on higher Apify
plans (see the pricing panel). Blocked and failed requests are free, and duplicate ads are not charged. Set **Max ads
in total** or a maximum total charge to cap any run.

| You scrape | You pay (Free plan) |
|---|---|
| 1 domain, 100 ads | ~$0.05 |
| 10 competitors × 500 ads | ~$2.50 |
| 1,000 ads with details (variations, regions, EU reach) | ~$1.00 |
| 50,000 ads | ~$25.00 |

### Google Ads Transparency data, explained

- `firstShown` / `lastShown` — the first and the most recent day the ad was shown in the selected region (Pacific
  time calendar day, as on the Transparency Center page).
- `daysShown` — the number of days the ad was actually shown. It can be lower than the span between the two dates
  when an ad was paused.
- `format` — `text`, `image` or `video`. Many text ads are archived by Google as an image, so they also have a
  `previewImageUrl`.
- `position` — the order in which the Transparency Center lists the ads for your search (most recently shown first).
- `totalAdsMin` / `totalAdsMax` — the rounded total number of ads Google reports for the search (e.g. 400,000–500,000).
- `impressionsMin` / `impressionsMax` — times shown in the EU, as a range. `impressionsMin` is `0` for "≤ 1K". Google
  publishes impressions and audience selection only for ads shown in the EU (Digital Services Act), so these fields are
  `null` for other regions.
- `audienceSelection` — for each criterion (demographics, geographic locations, contextual signals, customer lists,
  topics of interest): `included`, `excluded`, `included and excluded` or `none`.

### Use cases

- **Competitor ad research** — see every ad a competitor runs, which formats they use and which ads have run the
  longest (long-running ads are usually the ones that work).
- **Creative inspiration** — collect preview images and video links of ads in your industry.
- **Monitor new ads** — schedule a daily run with **Shown from** set to recent dates and get alerted when a competitor
  launches new campaigns.
- **Agency pitches and audits** — show a prospect what their competitors run on Search, YouTube and Shopping.
- **EU market analysis** — compare impressions ranges and targeting choices of brands in EU countries.
- **Brand protection** — check which advertisers run ads pointing to your domain.

### Use the Google Ads Transparency API

Python ([apify-client](https://docs.apify.com/api/client/python)):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("jaaylee/google-ads-transparency-scraper").call(
    run_input={"searchTerms": ["booking.com"], "region": "US", "maxAdsPerSearch": 300}
)
for ad in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(ad["advertiserName"], ad["format"], ad["firstShown"], ad["lastShown"], ad["daysShown"])
```

Find a competitor's longest-running YouTube video ads:

```python
run = client.actor("jaaylee/google-ads-transparency-scraper").call(
    run_input={"searchTerms": ["temu.com"], "platform": "youtube", "format": "video", "maxAdsPerSearch": 1000}
)
ads = list(client.dataset(run["defaultDatasetId"]).iterate_items())
for ad in sorted(ads, key=lambda a: -(a["daysShown"] or 0))[:10]:
    print(ad["daysShown"], ad["firstShown"], ad["adUrl"])
```

JavaScript / Node.js ([apify-client](https://docs.apify.com/api/client/js)):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('jaaylee/google-ads-transparency-scraper').call({
    searchTerms: ['zalando.de'],
    region: 'DE',
    includeDetails: true,
    maxAdsPerSearch: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((ad) => console.log(ad.creativeId, ad.impressionsMin, ad.impressionsMax, ad.audienceSelection));
```

cURL (synchronous run that returns the ads):

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

Export to CSV from the command line:

```bash
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&view=overview&token=<YOUR_APIFY_TOKEN>" -o google-ads.csv
```

### Integrations: Google Sheets, Make, Zapier, n8n, webhooks and schedules

- **Schedules:** run daily or weekly from Apify Console → Schedules to follow competitors' new ads.
- **Google Sheets:** export each run to a sheet with the Apify Google Sheets integration.
- **Make, Zapier, n8n:** start runs and read results with the official Apify apps and nodes.
- **Webhooks:** get notified when a run finishes and push new ads to Slack, email or your database.

### Use with AI agents (MCP)

This Actor works with the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). An AI agent can find it
with a query like "Google ads transparency", read its input schema and call it to list a competitor's current Google
ads — for example to summarize a brand's ad strategy or compare the ads of several competitors in one conversation.

### More scrapers by the same developer

- [AliExpress Search Scraper](https://apify.com/jaaylee/aliexpress-search-scraper) — AliExpress search results with
  rank, price, exact sold count, store and ship-from country in any currency.
- [Walmart Search Scraper](https://apify.com/jaaylee/walmart-search-scraper) — Walmart search and category results
  with rank, price, was-price, ratings, seller and stock.
- [Amazon Search Scraper](https://apify.com/jaaylee/amazon-search-scraper) — Amazon search results with rank, price,
  "bought in past month" and delivery dates for any US ZIP code.
- [Amazon ASIN Scraper](https://apify.com/jaaylee/amazon-asin-product-details) — full Amazon product details by ASIN:
  price, BSR, stock, delivery date by ZIP, variants, specs, images.
- [Amazon Best Sellers Scraper](https://apify.com/jaaylee/amazon-bestsellers-scraper) — top 100 Best Sellers and New
  Releases for any Amazon category and subcategory.

### Tips for accurate Google Ads Transparency data

- **Use the domain for complete results.** A domain search returns ads from every advertiser account that points to
  the site (brands often run several accounts and agencies). Use the advertiser ID when you want exactly one account.
- **Use names for convenience, IDs for precision.** A name is matched to the advertiser with the most ads whose name
  contains every word you typed. Raise **Advertisers per name** to include more matching accounts; the log shows which
  advertisers were used.
- **Pick the region.** Ads and dates depend on the country. Use `anywhere` for a global view; EU countries are needed for
  impressions and targeting.
- **Date filters cover about the last year.** The Transparency Center supports date filtering for roughly the last 12
  months; older ranges return no ads.
- **Cap the cost.** Set **Max ads per search**, **Max ads in total** or a maximum charge per run; the Actor stops
  cleanly and you only pay for ads saved before that.
- **Monitor with failure alerts.** For scheduled monitoring tasks, turn on **Fail run on low data quality** so that a run
  with mostly blocked requests shows up as failed and triggers your Apify notifications.

### Limitations

- The Transparency Center does not publish ad spend, clicks or the ad's landing page URL, so these fields are not
  available. Impressions and audience targeting are published only for ads shown in the EU.
- The ad text of text ads is shown by Google as an image (`previewImageUrl`); the Actor does not run OCR on it. Video
  and some text ads have a `previewUrl` (Google's preview script) instead of an image.
- Preview URLs are hosted by Google and can expire for old ads; download the images you want to keep.
- Google's "unusual traffic" checks (CAPTCHAs) are never solved; blocked requests are retried on fresh sessions and,
  if still blocked, skipped for free.
- This is an independent tool and is not affiliated with or endorsed by Google.

### FAQ

#### Is it legal to scrape the Google Ads Transparency Center?

The Ads Transparency Center is a public library that Google publishes so anyone can see who is advertising. This Actor
only reads publicly visible data without logging in and does not collect personal data. You are responsible for using
the data in line with applicable laws and Google's terms. If in doubt, consult a lawyer.

#### What is the difference between a domain search and an advertiser search?

A domain search (`nike.com`) returns ads from all advertiser accounts whose ads point to that website. An advertiser
search (`AR…` ID or a name) returns ads from one verified advertiser account, wherever they point.

#### Where do I find an advertiser ID?

Open the advertiser in the Ads Transparency Center; the ID starting with `AR` is in the page URL. You can also paste
the whole URL into **searchTerms**.

#### Why are impressions empty for my ads?

Google publishes impressions ranges and audience selection only for ads shown in the European Union. Set **Region** to
an EU country (for example `DE`, `FR`, `ES`, `IT`, `NL`) and turn on **Include ad details**.

#### Can I get only new ads?

Set **Shown from** to a recent date to get ads shown since then, and schedule the run. `firstShown` tells you when each
ad started, so you can keep only ads that started after your last run.

#### Found a bug or need a field?

Open an issue on the Issues tab with the domain or advertiser and what you expected.

# Actor input Schema

## `searchTerms` (type: `array`):

What to look up in the Google Ads Transparency Center. Each line is a website domain (nike.com), an advertiser or brand name (Nike), an advertiser ID (AR16735076323512287233) or an Ads Transparency Center advertiser or domain URL. Names are matched to the advertiser with the most ads (see 'Advertisers per name').

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

2-letter country code such as US, GB, DE, FR, IN or AU, or 'anywhere' for all countries. EU countries (DE, FR, ES, IT, NL...) also give impressions and audience targeting when 'Include ad details' is on.

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

Only ads shown on this Google platform.

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

Only ads of this format (text, image or video).

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

Optional. Only ads shown on or after this date (YYYY-MM-DD). The Transparency Center supports date filtering for roughly the last 12 months.

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

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

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

Stop after this many ads for each line in 'searchTerms'. Large advertisers have tens of thousands of ads; the most recently shown ads come first.

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

Optional. Stop after this many ads across all searches (useful to cap cost).

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

Makes one extra request per ad to add: all ad variations (A/B versions), countries where it ran with first and last dates, legal advertiser name, topic, and for EU countries the number of times shown (impressions range, also per platform) and audience selection (demographics, locations, contextual signals, customer lists, interests). Charged as 'ad with details'.

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

When a line is a name (not a domain or ID), scrape this many matching advertisers, starting with the one that has the most ads. Only advertisers whose name contains every word you typed are used.

## `maxConcurrency` (type: `integer`):

How many requests run in parallel. Pages of one search are fetched in order so positions are exact.

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

Primary proxy. The default Apify datacenter proxy works for the Transparency Center.

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

If a request stays blocked after 3 attempts on the primary proxy, retry it up to 2 more times through US residential proxies. Blocked requests are never charged.

## `failOnLowQuality` (type: `boolean`):

For monitoring tasks: mark the run as failed when fewer than 80% of requests succeed or key fields are missing.

## Actor input object example

```json
{
  "searchTerms": [
    "nike.com"
  ],
  "region": "US",
  "platform": "all",
  "format": "all",
  "maxAdsPerSearch": 100,
  "includeDetails": false,
  "maxAdvertisersPerName": 1,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "residentialFallback": true,
  "failOnLowQuality": false
}
```

# Actor output Schema

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

No description

## `files` (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 = {
    "searchTerms": [
        "nike.com"
    ],
    "region": "US",
    "maxAdsPerSearch": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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