# Google Ads Transparency Scraper — Ads, Advertisers & Dates (`yugenox/google-ads-transparency-scraper`) Actor

Scrape the Google Ads Transparency Center: every ad an advertiser or website runs on Search, YouTube, Maps, Play and Shopping, with format, first/last shown dates, days shown, preview image, countries, impressions, targeting and ad text. Advertiser search too. No login.

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

## Pricing

from $1.20 / 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: competitors' ads, advertisers and dates

Scrape the **Google Ads Transparency Center** (adstransparency.google.com): every ad an advertiser or a website runs on **Google Search, YouTube, Google Maps, Google Play and Google Shopping**, with the **ad format, first and last shown dates, days shown, preview image, the website it points to and a link to the ad**. Turn on **ad details** to also get the **countries it ran in, the ad text (headline + description), image and YouTube video links, every variation, who paid for it** and, for ads shown in the EU, **impressions per country and platform and the audience targeting used**. Look up advertisers by name, by advertiser ID, by website, or paste Transparency Center links. Run it weekly with **Only new ads** to see what your competitors launched. No login, no cookies, no account.

### What you get

| | |
|---|---|
| **Ad** | Creative ID, format (text, image, video), first shown, last shown, days shown, preview image (with size), preview link, link to the ad on the Transparency Center |
| **Advertiser** | Name, advertiser ID, country, verification status, link to the advertiser's page |
| **Website** | The domain the ad points to (website searches) |
| **Ad details** (optional) | Headline and text lines, image URLs, YouTube video ID and link, landing page when the ad shows it, number of variations with all their previews, who paid for the ad |
| **Where it ran** (optional) | Every country with its last shown date; for EU / EEA countries also the first shown date, impressions range and the platforms (Search, YouTube, Maps, Play, Shopping) with their impressions |
| **Targeting** (optional, EU ads) | Whether demographics, locations, contextual signals, topics of interest and customer lists were used, plus the age groups, genders and locations included or excluded |
| **Advertisers mode** | One row per advertiser found by name: name, ID, country, verified or not, number of ads |

### How to use it

1. Add what you want to watch:
   - **Advertiser names**, e.g. `Nike`, `HubSpot`, `Shopify`: looked up in the Transparency Center's own advertiser search. The best match is the advertiser whose name is the one you typed (Inc., LLC, GmbH and the like are ignored) with the most ads; choose **All matches** to get every advertiser with those words in its name (e.g. every country's Nike entity).
   - **Websites**, e.g. `shopify.com`: every ad that points to that website, from any advertiser.
   - **Advertiser IDs** (`AR…`) or **Transparency Center URLs** (an advertiser page, a single ad, or a website search; the filters in the link are kept).
2. Optionally filter by **Regions** (countries where the ads were shown), **Ad format**, **Platforms** and **Shown from / until** dates.
3. Set **Max ads per advertiser / website** and **Max rows**, and run. Ads come newest first, in the Transparency Center's own order.

#### Input examples

The 10 newest Nike ads (the example input):

```json
{
  "advertiserNames": ["Nike"],
  "maxAdsPerTarget": 10,
  "maxItems": 10
}
```

Every video ad two competitors showed in the US in the last 30 days, with ad text, video links and countries:

```json
{
  "advertiserNames": ["HubSpot", "Salesforce"],
  "regions": ["US"],
  "format": "VIDEO",
  "dateFrom": "30 days",
  "maxAdsPerTarget": 0,
  "includeAdDetails": true
}
```

Weekly competitor monitor: only the ads you haven't seen yet (schedule it weekly):

```json
{
  "domains": ["shopify.com", "bigcommerce.com", "wix.com"],
  "regions": ["US", "CA"],
  "maxAdsPerTarget": 100,
  "onlyNew": true
}
```

Find the advertisers in a niche (lead generation):

```json
{
  "mode": "advertisers",
  "advertiserNames": ["plumbing"],
  "regions": ["US"],
  "maxAdsPerTarget": 100
}
```

### Output example

A text ad with **Include ad details** on (trimmed):

```json
{
  "type": "ad",
  "advertiserId": "AR10072600183532683265",
  "advertiserName": "Hubspot, Inc.",
  "advertiserCountry": "US",
  "advertiserUnverified": false,
  "creativeId": "CR16463018706843205633",
  "format": "TEXT",
  "firstShown": "2026-05-11T15:53:16.645Z",
  "lastShown": "2026-10-29T03:20:17.497Z",
  "daysShown": 157,
  "previewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?client=ads-integrity-transparency&…",
  "adUrl": "https://adstransparency.google.com/advertiser/AR10072600183532683265/creative/CR16463018706843205633?region=US",
  "advertiserUrl": "https://adstransparency.google.com/advertiser/AR10072600183532683265?region=US",
  "detailsStatus": "ok",
  "variationCount": 1,
  "adText": "HubSpot\nwww.hubspot.com/\nHubSpot Customer Platform\nSee how HubSpot unifies your marketing, sales, and service teams in one platform.",
  "adTextLines": ["HubSpot", "www.hubspot.com/", "HubSpot Customer Platform", "See how HubSpot unifies your marketing, sales, and service teams in one platform."],
  "paidBy": "Hubspot, Inc.",
  "regionCount": 1,
  "regionsShown": [
    { "regionCode": "US", "regionName": "United States", "firstShown": null, "lastShown": "2026-10-28", "impressionsMin": null, "impressionsMax": null, "platforms": [] }
  ],
  "searchTarget": "advertiser \"Hubspot, Inc.\"",
  "searchRegions": "US",
  "position": 6,
  "scrapedAt": "2026-10-29T04:34:54.791Z"
}
```

A video ad with details also has `"videoId": "q85mzf_L4D0"`, `"videoUrl": "https://www.youtube.com/watch?v=q85mzf_L4D0"` and the video thumbnail as `previewImageUrl`. An ad shown in the EU lists impressions per country and platform, e.g. `{ "regionCode": "ES", "regionName": "Spain", "firstShown": "2023-03-01", "lastShown": "2026-04-14", "impressionsMin": 1000, "impressionsMax": 2000, "platforms": [{ "platform": "GOOGLE_SEARCH", "impressionsMin": 1000, "impressionsMax": 2000 }] }`, plus `eeaImpressionsMin` / `eeaImpressionsMax` and `audienceTargeting`.

Without ad details a row has the ad's basics (advertiser, format, dates, days shown, preview image, links). Every row has the same columns; a value Google doesn't publish for that ad is `null` (or an empty list).

### Pricing

Pay per result, no subscription:

- **$1.20 per 1,000 ads** (or advertisers in Advertisers mode).
- **+ $2.00 per 1,000 ads with details**, only when **Include ad details** is on and the details came back.
- **$0.20 per 1,000 results pages read**: each page holds up to 40 ads, so this adds about half a cent per 1,000 ads. Each advertiser-name search, advertiser-ID lookup and pasted ad link also counts as one page. It is what a monitor run with nothing new costs. Failed requests and bot checks are never charged.
- **$0.001 per run.**

Examples: 1,000 ads ≈ $1.21; 1,000 ads with details ≈ $3.21; a weekly monitor of 10 websites (100 ads each) with nothing new ≈ $0.007.

### Use cases

- **Competitor ad monitoring**: see every ad a competitor launched this week, on which platforms, and in which countries.
- **PPC and creative research**: collect headlines, descriptions, images and videos that have been running for months (long-running ads are usually the winners; sort by `daysShown`).
- **Agency reporting**: a weekly sheet of each client's competitors' new ads.
- **Lead generation**: find businesses that advertise on Google in a niche and country (Advertisers mode), with their number of ads.
- **Brand protection**: check which advertisers run ads pointing at your website.
- **Market research**: ad volume, formats and launch dates by brand, industry and country.

### Tips

- Use **Regions** to get only the ads shown in those countries. With a single country, the ad and advertiser links open the Transparency Center's view for that country.
- **Max ads per advertiser / website = 0** gets everything (up to **Max rows**). Big brands have thousands of ads.
- Long ad lists are fast: 40 ads per request. **Include ad details** reads two more requests per ad, so it is slower; use it on the ads you need.
- **Only new ads** remembers what earlier runs with the same input saved. Each run re-checks the newest ads up to **Max ads per advertiser / website** and saves only the ones you don't have yet.
- Impressions, platforms and targeting are published by Google for ads shown in the EU / EEA. For other countries the Transparency Center shows where and until when an ad ran.
- Google publishes many text ads only as a picture of the ad. For those, `previewImageUrl` holds the ad and `adText` is empty; ads with a live preview get their text lines too.

### FAQ

**Do I need a Google account, cookies or a login?** No. The scraper reads the same public Transparency Center that anyone can open in a browser.

**Why is the advertiser name "Hubspot, Inc." when I typed "HubSpot"?** Google lists ads under the legal name of the verified advertiser. With **Best match**, the advertiser whose name matches yours with the most ads is used; the run report lists which one was picked. Use **All matches** or paste the advertiser ID to choose yourself.

**Why are some impressions or first-shown dates empty?** Google publishes impressions, platforms and audience targeting only for ads shown in the EU / EEA. For other countries it shows the last date the ad was shown.

**Why didn't a run return anything?** The status message says why: no advertiser with that name, no ads in the chosen countries or dates, or Google refusing requests for a while (the run stops cleanly and you are not charged for rows; please try again later).

**Which proxy should I use?** Keep the default (Apify Proxy, datacenter). It comes with every Apify plan, including the free one.

**Is it legal to scrape the Google Ads Transparency Center?** This Actor only collects publicly available data: ads and advertiser information that Google publishes for anyone to see, without an account. The advertisers are businesses and organizations, and the data is about their ads. Collecting publicly available data is generally legal, but you're responsible for how you use it, including copyright in the ad creatives and Google's terms. If you're unsure, check with a lawyer. More on this: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**Does it access any private data?** No. Everything comes from the public Transparency Center pages any visitor sees without logging in. It never touches Google accounts or ad accounts, and it follows the site's robots.txt. Personal e-mail addresses that appear in ad text are masked; business contact mailboxes such as info@ stay.

*This Actor is not affiliated with, endorsed by or sponsored by Google.*

# Actor input Schema

## `advertiserNames` (type: `array`):

Company or brand names, e.g. "Nike", "Shopify", "HubSpot". Each name is looked up in the Ads Transparency Center's own advertiser search. In "Ads" mode the best-matching advertiser (the one whose name is the name you typed, with the most ads) is scraped — see "Which advertisers" below. In "Advertisers" mode every advertiser the search finds is saved as a row.

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

Website domains, e.g. "shopify.com" or "https://www.nike.com". You get the ads that point to that website, from every advertiser — exactly what the Transparency Center shows when you search a website.

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

Advertiser IDs as shown in Transparency Center links, e.g. "AR16735076323512287233". Faster and exact — no name lookup.

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

Paste links from adstransparency.google.com: an advertiser page (/advertiser/AR…), a single ad (/advertiser/AR…/creative/CR…) or a website search (/?domain=…). The region, format, platform and date filters in the link are kept.

## `mode` (type: `string`):

"Ads" = one row per ad (advertiser, format, first and last shown dates, days shown, preview image, website, links). "Advertisers" = one row per advertiser found by name (name, ID, country, verification, number of ads) — good for finding who advertises in a niche.

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

For advertiser names in "Ads" mode: "Best match" scrapes the one advertiser whose name is your name (legal suffixes like Inc. or GmbH ignored) with the most ads. "All matches" scrapes every advertiser whose name contains all your words (e.g. every country's "Nike" entity).

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

Countries where the ads were shown: ISO codes or names, e.g. "US", "GB", "Germany", "India". Empty = anywhere. Several countries = ads shown in any of them.

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

Text (Search), image (Display / Shopping) or video (YouTube) ads only. "All" = every format.

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

Google platforms the ads ran on. Empty = all.

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

Only ads shown on or after this date (YYYY-MM-DD, or relative like "30 days"). Empty = no limit.

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

Only ads shown on or before this date (YYYY-MM-DD, or relative like "7 days"). Empty = up to today.

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

Most ads to save for each advertiser, website or URL (newest first, the Transparency Center's own order). With "Only new ads": how many of the newest ads are re-checked each run. In "Advertisers" mode: most advertisers per name searched. 0 = all of them (up to Max rows).

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

Most rows for the whole run. 0 = no limit (50,000 per run at most).

## `includeAdDetails` (type: `boolean`):

Also read each ad's detail page: every country it was shown in (first and last date, impressions range, platforms), Google Search / YouTube / Maps / Play / Shopping, audience targeting used (age, gender, location, topics, customer lists), who paid for it, every variation, and the ad's content — headline and text, image URLs, YouTube video. Charged as an extra "ad details" event per ad (see Pricing); takes a few more seconds per 10 ads.

## `onlyNew` (type: `boolean`):

Skip ads (or advertisers) that an earlier run with the same input already saved — they are not saved and not charged as ads. Each run re-checks the newest ads of every advertiser / website, up to "Max ads per advertiser / website", and saves only the ones you don't have yet. Schedule the run daily or weekly to get each competitor's new ads.

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

Apify Proxy (datacenter) is the default and comes with every Apify plan, including the free one.

## `_noResidential` (type: `boolean`):

Internal (canaries): behave exactly like an account without the RESIDENTIAL proxy group.

## Actor input object example

```json
{
  "advertiserNames": [
    "Nike"
  ],
  "mode": "ads",
  "advertiserMatch": "best",
  "format": "ALL",
  "maxAdsPerTarget": 10,
  "maxItems": 10,
  "includeAdDetails": false,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "_noResidential": false
}
```

# Actor output Schema

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

All scraped ads (or advertisers).

## `run` (type: `string`):

Status and statistics for this run.

## `report` (type: `string`):

RUN_REPORT: how the run ended, counts per advertiser/website, requests and proxy use.

# 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 = {
    "advertiserNames": [
        "Nike"
    ],
    "maxAdsPerTarget": 10,
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/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 = {
    "advertiserNames": ["Nike"],
    "maxAdsPerTarget": 10,
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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