# Google Ads Transparency Center (Google Ads) Scraper (`confidential_gnat/google-ads-transparency-scraper`) Actor

Scrape ads from the Google Ads Transparency Center (adstransparency.google.com) by keyword, domain, website or link. Extracts advertiser, ad text, images, videos, formats, dates, impressions, countries, platforms and targeting as JSON, CSV or Excel.

- **URL**: https://apify.com/confidential_gnat/google-ads-transparency-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.00 / 1,000 results

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

## Google Ads Transparency Center (Google Ads) Scraper

**Scrape ads from the Google Ads Transparency Center (adstransparency.google.com)** by keyword, domain, website address or a link copied from the Transparency Center. Each ad comes back with its advertiser, ad text, images or video links, format, dates, impressions, countries, platforms and targeting, exported as **JSON, CSV or Excel**, and the actor can be called as an **API**. Type a keyword or domain, press Start.

**Target website:** [adstransparency.google.com](https://adstransparency.google.com)

### ✨ Features of this Google Ads Transparency Center scraper

- **Ad data extraction** — ad text, image and video links, previews, format, first and last shown dates, days active, impressions and total matching ads on every record.
- **Advertiser details** — advertiser name, legal name, country, Transparency Center profile link and (for keyword searches) the advertiser's ad count range.
- **Structured ad copy** — headline, description, display URL, call to action and the store locations shown with text ads.
- **Reach and targeting details** — countries and platforms the ad ran on with impression ranges (per country and per platform), and the targeting criteria used.
- **Keyword, domain, website and link input** — search by brand keyword, domain (nike.com), website address or a Transparency Center link, including links to a single ad.
- **Pagination support** — keeps reading result pages until your ads limit is reached.
- **Region, platform, format, topic and date filtering** — narrow ads by region, Google platform, ad format, political topic and date range.
- **Proxy support** — configurable proxy settings, with datacenter proxies by default.
- **Media download** — optionally save ad images and previews to the key-value store.
- **No browser required** — HTTP requests only, which makes runs fast and cheap.

### 🚀 How to scrape Google ads in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (a keyword, domain, website or Transparency Center link is required).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing

This actor uses **pay-per-result** billing based on the compute units a run consumes.

- New Apify accounts include **$5 of free monthly credit**.
- It works over plain HTTP requests, so it costs significantly less to run than browser-based scrapers.

### 🔧 Input configuration

| Field                   | Type    | Required | Default     | Description                                                                                    |
| ----------------------- | ------- | -------- | ----------- | ---------------------------------------------------------------------------------------------- |
| Keywords or domains     | array   | —        | nike.com    | Keywords (advertiser or brand name), domains or website addresses to find ads for.             |
| Links                   | array   | —        | —           | Transparency Center links (advertiser, domain search or single ad pages) or website addresses. |
| Maximum ads per search  | integer | —        | 3           | Ads collected for each keyword advertiser, domain or link.                                     |
| Advertisers per keyword | integer | —        | 3           | Matching advertisers scraped for each keyword.                                                 |
| Region                  | string  | —        | anywhere    | Two-letter country code the ads were shown in, or anywhere.                                    |
| Platform                | string  | —        | —           | Google Play, Maps, Search, Shopping or YouTube.                                                |
| Ad format               | string  | —        | —           | Text, image or video.                                                                          |
| Topic                   | string  | —        | all         | All topics or political ads.                                                                   |
| Start date              | string  | —        | —           | Only ads shown on or after this date, YYYY-MM-DD.                                              |
| End date                | string  | —        | —           | Only ads shown on or before this date, YYYY-MM-DD.                                             |
| Download media          | boolean | —        | false       | Save ad images and previews to the key-value store.                                            |
| Proxy configuration     | object  | —        | Apify proxy | Proxy used to reach the Transparency Center.                                                   |

**Supported inputs:**

- Keyword: `nike` (matched to the largest advertisers with that name)
- Domain or website: `nike.com` or `https://www.nike.com/`
- Domain search link: `https://adstransparency.google.com/?region=anywhere&domain=nike.com`
- Advertiser link: `https://adstransparency.google.com/advertiser/AR16735076323512287233?region=anywhere`
- Single ad link: `https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR12805937033067364353`

### 📦 Google ads scraper output data

The output is a dataset of ads (exportable as JSON, CSV or Excel) with the keys: `id`, `advertiserId`, `creativeId`, `advertiserName`, `advertiserLegalName`, `advertiserCountry`, `advertiserUrl`, `advertiserAdCountRange`, `domain`, `format`, `url`, `previewUrl`, `previewStoreKey`, `firstShownAt`, `lastShownAt`, `daysActive`, `impressions`, `impressionsLastShownOn`, `shownCountries`, `shownCountryCount`, `platforms`, `platformImpressions`, `countryStats`, `audienceSelections`, `adText`, `adHeadline`, `adDescription`, `adDisplayUrl`, `adCallToAction`, `storeLocations`, `imageUrls`, `videoUrls`, `variants`, `searchedFor`, `totalAds`. The dataset has 1 view.

- **Overview** — a compact table with advertiser, domain, format, ad text, preview image, first and last shown dates, days active, impressions, countries, platforms, total ads and the ad link.

**Output at a glance:**

| Advertiser                                                                                                                                                       | Domain   | Format | First shown | Last shown | Days active | Impressions | Countries |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------ | ----------- | ---------- | ----------- | ----------- | --------- |
| [Nike Retail BV](https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR13061583725727318017?region=anywhere\&domain=nike.com\&topic=all) | nike.com | TEXT   | 2026-07-11  | 2026-10-13 | 94          | 1000        | 2         |
| [Nike Retail BV](https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR06194970100861239297?region=anywhere\&domain=nike.com\&topic=all) | nike.com | TEXT   | 2025-10-30  | 2026-10-13 | 348         | 10000       | 2         |
| [Nike Retail BV](https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR00910630081473282049?region=anywhere\&domain=nike.com\&topic=all) | nike.com | TEXT   | 2025-10-24  | 2026-10-13 | 354         | 30000       | 8         |

**Sample output (raw JSON):**

```json
{
  "id": "CR09221065519157739521",
  "advertiserId": "AR18378488041124659201",
  "creativeId": "CR09221065519157739521",
  "advertiserName": "Nike Retail BV",
  "advertiserLegalName": "Nike Retail BV",
  "advertiserCountry": "NL",
  "advertiserUrl": "https://adstransparency.google.com/advertiser/AR18378488041124659201",
  "advertiserAdCountRange": null,
  "domain": "nike.com",
  "format": "TEXT",
  "url": "https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR09221065519157739521...",
  "previewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?client=ads-integrity-transpa...",
  "previewStoreKey": null,
  "firstShownAt": "2025-10-22T18:40:28.000Z",
  "lastShownAt": "2026-10-13T17:24:05.000Z",
  "daysActive": 356,
  "impressions": "6000",
  "impressionsLastShownOn": "2026-10-13",
  "shownCountries": [
    "Luxembourg",
    "Germany"
  ],
  "shownCountryCount": 4,
  "platforms": [
    "Google Search",
    "Google Maps"
  ],
  "platformImpressions": [
    {
      "name": "Google Maps",
      "code": "MAPS",
      "impressions": {
        "lowerBound": null,
        "upperBound": "1000"
      }
    },
    {
      "name": "Google Search",
      "code": "SEARCH",
      "impressions": {
        "lowerBound": "5000",
        "upperBound": "6000"
      }
    }
  ],
  "countryStats": [
    {
      "code": "LU",
      "name": "Luxembourg",
      "firstShownAt": "2025-10-23",
      "lastShownAt": "2026-10-10",
      "impressions": {
        "lowerBound": null,
        "upperBound": "1000"
      },
      "platformStats": [
        {
          "name": "Google Search",
          "code": "SEARCH",
          "impressions": {
            "lowerBound": null,
            "upperBound": "1000"
          }
        }
      ]
    },
    {
      "code": "DE",
      "name": "Germany",
      "firstShownAt": "2025-10-22",
      "lastShownAt": "2026-10-13",
      "impressions": {
        "lowerBound": "5000",
        "upperBound": "6000"
      },
      "platformStats": [
        {
          "name": "Google Maps",
          "code": "MAPS",
          "impressions": {
            "lowerBound": null,
            "upperBound": "1000"
          }
        },
        {
          "name": "Google Search",
          "code": "SEARCH",
          "impressions": {
            "lowerBound": "5000",
            "upperBound": "6000"
          }
        }
      ]
    }
  ],
  "audienceSelections": [
    {
      "name": "Demographic info",
      "hasIncludedCriteria": true,
      "hasExcludedCriteria": false
    },
    {
      "name": "Geographic locations",
      "hasIncludedCriteria": true,
      "hasExcludedCriteria": false
    }
  ],
  "adText": "{KeyWord:Nike Court} - Entdecke {Keyword:Nike schuhe} online auf Nike.com – der offiziellen Nike Website. - nike.com",
  "adHeadline": "{KeyWord:Nike Court}",
  "adDescription": "Entdecke {Keyword:Nike schuhe} online auf Nike.com – der offiziellen Nike Website.",
  "adDisplayUrl": "nike.com",
  "adCallToAction": null,
  "storeLocations": [
    {
      "name": "NIKE STORE OBERHAUSEN CENTRO (Partnered)",
      "street": "CentrO-Promenade 555",
      "city": "Oberhausen",
      "postalCode": "46047",
      "country": "DE"
    }
  ],
  "imageUrls": [],
  "videoUrls": [],
  "variants": [
    {
      "textContent": "{KeyWord:Nike Court} - Entdecke {Keyword:Nike schuhe} online auf Nike.com – der offiziellen Nike Website. - nike.com",
      "headline": "{KeyWord:Nike Court}",
      "description": "Entdecke {Keyword:Nike schuhe} online auf Nike.com – der offiziellen Nike Website.",
      "displayUrl": "nike.com",
      "callToAction": null,
      "locations": [
        {
          "name": "NIKE STORE OBERHAUSEN CENTRO (Partnered)",
          "street": "CentrO-Promenade 555",
          "city": "Oberhausen",
          "postalCode": "46047",
          "country": "DE"
        }
      ],
      "images": []
    }
  ],
  "searchedFor": "https://adstransparency.google.com/?region=anywhere&domain=nike.com&topic=all",
  "totalAds": 100000
}
```

### 🐍 How to scrape Google ads with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/google-ads-scraper").call(run_input={
    "queries": ["nike.com"],
    "maxItems": 10,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('confidential_gnat/google-ads-scraper').call({
    queries: ['nike.com'],
    maxItems: 10,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

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

### 💡 What you can use Google Ads Transparency Center data for

- Competitor ad monitoring: see which ads a brand runs, where and for how long
- Creative research: collect ad copy, images and video links by advertiser or domain
- Estimating reach with impression ranges per country and platform
- Tracking political and issue advertising by region and date
- Brand protection: find ads that use your domain or brand name

Marketers, agencies, researchers, journalists and compliance teams in e-commerce, finance, politics and media typically use this data.

### ⚠️ Limitations & known issues

- **Impression ranges** — Google publishes impressions as ranges, and some ads show none.
- **Restricted ads** — ads the Transparency Center hides cannot be read and are skipped.
- **Total ads** — the total is Google's approximate count of matching ads and is rounded for large searches.
- **Rate limiting** — Google throttles heavy usage; the actor retries automatically and switching to residential proxies helps.

### ❓ Frequently asked questions

#### Can I scrape the Google Ads Transparency Center legally?

The actor only collects data already publicly visible in the Google Ads Transparency Center — no login, paywall or private content is accessed. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*), but you are responsible for complying with the site's Terms of Service and applicable laws such as GDPR/CCPA if personal data is involved.

#### What data does the Google ads scraper return?

Advertiser name, legal name and country, domain, format, ad text, image, video and preview links, first and last shown dates, days active, impressions, countries and platforms with per-country ranges, targeting criteria and the total number of matching ads. Turning on Download media also stores images in the key-value store.

#### How many ads can I scrape from one keyword, domain or link?

Maximum ads per search limits each keyword advertiser, domain or link separately; the default is 3. Keywords are matched to up to the number of advertisers set in Advertisers per keyword, so a keyword can return that many times the limit.

#### Do I need a proxy to scrape adstransparency.google.com?

Yes, a proxy is recommended. The input defaults to Apify datacenter proxies, which work for most runs; switch to residential proxies if you see throttling or empty results.

#### How do I scrape Google ads with Python?

Use the Python example above and iterate over the dataset items returned by the run.

#### Can I run this Google ads scraper on a schedule?

Yes. Use Apify Schedules to run it daily or weekly with the same input, for example to track a competitor's new ads.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### Why does a keyword return ads from advertisers I did not expect?

Keywords are matched to advertiser names in the Transparency Center, largest first. To target one company precisely, use its domain, website address or a copied advertiser link instead.

### 🔗 Other actors you may find useful

| Actor                                                                                                           | Description                                                                |
| --------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| [📱 TikTok Ad Library Scraper](https://apify.com/confidential_gnat/tiktok-ads-scraper)                          | Scrape TikTok ads with creative, advertiser, spend and targeting data.     |
| [🛒 Google Shopping Products Scraper](https://apify.com/confidential_gnat/google-shopping-scraper)              | Scrape Google Shopping listings with prices, merchants and ratings.        |
| [📸 Snapchat Profile Scraper](https://apify.com/confidential_gnat/snapchat-profile-scraper)                     | Scrape public Snapchat profiles, Spotlight videos, stories and highlights. |
| [▶️ YouTube Channel Info and Stats Scraper](https://apify.com/confidential_gnat/youtube-channel-info-and-stats) | Scrape YouTube channel info and statistics from channel About pages.       |
| [📅 Facebook Events Scraper](https://apify.com/confidential_gnat/facebook-events-scraper)                       | Scrape public Facebook events by keyword, location, page or URL, no login. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/google-ads-scraper/issues/open) or reach out via the [Apify Community Forum](https://community.apify.com/).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

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

Keywords (an advertiser or brand name), domains (ridge.com) or website addresses to find ads for. Keywords are matched to the largest advertisers with that name.

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

Google Ads Transparency Center links copied from the browser (advertiser, domain search or single ad pages), or website addresses.

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

Maximum number of ads to collect for each keyword advertiser, domain or link.

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

How many matching advertisers to scrape for each keyword.

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

Two-letter country code (for example DE or US) the ads were shown in, or anywhere.

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

Only ads shown on this Google platform.

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

Only ads in this format.

## `topic` (type: `string`):

Search all ads or political ads only.

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

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

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

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

## `downloadMedia` (type: `boolean`):

Save ad images and previews to the key-value store (store name media-store). Slower and uses more storage.

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

Proxy used to reach the Transparency Center. Datacenter proxies work for most runs; switch to residential if requests are throttled.

## Actor input object example

```json
{
  "queries": [
    "ridge.com"
  ],
  "maxItems": 3,
  "maxAdvertisersPerQuery": 3,
  "region": "anywhere",
  "topic": "all",
  "downloadMedia": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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": [
        "ridge.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

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

```

## MCP server setup

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