# Google Ads Transparency Scraper – Ads by Domain or Brand (`brii3343/google-ads-transparency-scraper`) Actor

Get every Google ad of any domain, brand or advertiser from the Ads Transparency Center: the text of Search ads (read from the image), images, videos, landing pages, first/last shown dates, countries, EU impressions and targeting. Pay only for ads returned.

- **URL**: https://apify.com/brii3343/google-ads-transparency-scraper.md
- **Developed by:** [Brian Gastaldelli](https://apify.com/brii3343) (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 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

### Google Ads Transparency Scraper — every Google ad of any domain or brand

Type a website domain or a brand name and get all its Google ads from the Google Ads Transparency Center: **ad text (also for Search text ads)**, images, videos, landing pages, first and last shown dates, countries, impressions and targeting. One row per ad, ready for spreadsheets, CRMs, n8n, Make or your own code.

#### Why this Actor

- **Just type `nike.com` or `Nike`.** No need to look up advertiser IDs or copy URLs from the Transparency Center: domains, brand names, advertiser IDs (`AR…`) and Transparency Center URLs all work, mixed in one list.
- **The text of Search ads, not just a picture.** Google shows Search text ads only as an image. This Actor reads it for you: headline, description, display URL, sitelinks and extensions (callouts, reviews, offers), in any Latin, Cyrillic or Greek-script language. Dynamic Search Ads are flagged.
- **Everything about each ad in one row.** Images, YouTube video ID, MP4 link, landing page and call to action of video ads, app ID of app-install ads, product title and price for Shopping ads, business name and address for Maps ads, countries with first and last shown dates, impressions by platform (EU), audience targeting and topic.
- **Pay only for ads.** Inputs without ads, unknown brands and invalid entries come back with a clear status and **are not charged**.
- **Fast.** In our tests: 60 Search text ads with their text read in 49 seconds, 30 video ads in 13 seconds, 300 mixed ads with all details in about 5 minutes.

#### Use cases

- **Competitor research**: see every ad a competitor runs, where, since when, and what it says.
- **Lead generation**: find out which companies advertise on Google and how much (number of ads, countries, platforms).
- **Creative inspiration**: collect headlines, descriptions, images and videos that are running right now in your market.
- **Brand monitoring and compliance**: check who advertises with your brand or domain, and in which countries.
- **Agencies and AI pipelines**: feed ad copy and landing pages to your reports, dashboards or LLM prompts.

#### Input

| Field | Description |
|---|---|
| Domains, brands, advertiser IDs or URLs | One per line: `nike.com` (ads pointing to that site), `Nike` (the matching advertiser), `AR16735076323512287233`, or a Transparency Center URL (advertiser, single ad or domain search). |
| Region | Two-letter country code (`US`, `GB`, `DE`, `IT`…). Empty = ads shown anywhere. |
| Shown in | Any time, last 7 / 30 / 90 days, last 12 months, or custom dates. |
| Platform | Google Search, YouTube, Google Maps, Google Play or Google Shopping. |
| Ad format | Text, image or video. |
| Max ads per input | Newest ads first (default: 50). |
| Include ad details | Text, media, landing page, countries, impressions and targeting (default: on). Off = only the list (IDs, format, dates, preview image), much faster. |
| Read the text of Search ads | Reads headline, description and display URL from the ad image (default: on). |
| Advertisers per brand name | How many matching advertiser accounts to include for a brand name (default: 1, the one with most ads). |

Example input:

```json
{
  "queries": ["nike.com", "Zalando", "AR16735076323512287233"],
  "region": "US",
  "dateRange": "last30",
  "maxAdsPerQuery": 100
}
```

#### Output

One item per ad. Real output of a Search text ad (shortened):

```json
{
  "query": "expedia.com",
  "status": "ok",
  "advertiserId": "AR12910272019299303425",
  "advertiserName": "Expedia Inc",
  "creativeId": "CR12595362474535944193",
  "adUrl": "https://adstransparency.google.com/advertiser/AR12910272019299303425/creative/CR12595362474535944193",
  "format": "TEXT",
  "firstShown": "2023-05-15",
  "lastShown": "2026-09-28",
  "daysShown": 1233,
  "adType": "Commercial",
  "topic": "Travel & Tourism",
  "headline": "Flights to Dublin, Ireland - Compare Prices by Dates",
  "description": "Flights to Dublin, Ireland. View Deals and Book Now on Expedia. Search by Change Policies, Carrier and Flexible Dates for Best Prices. Expedia's Best Prices. Instant Confirmation. Fast & Secure Booking.",
  "displayUrl": "www.expedia.com/flights/dublin",
  "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/16545938054957949133",
  "variations": [
    {
      "type": "text",
      "headline": "Flights to Dublin, Ireland - Compare Prices by Dates",
      "extensions": ["Protect Your Booking", "Cancel within 24hrs of Booking", "Roundtrip, One-Way, Multi-City"],
      "ocrConfidence": 95
    }
  ],
  "impressions": { "min": 0, "max": 1000 },
  "impressionsByPlatform": [{ "platform": "GOOGLE_SEARCH", "impressions": { "min": 0, "max": 1000 } }],
  "regions": [
    { "code": "IE", "name": "Ireland", "firstShown": "2023-05-18", "lastShown": "2026-09-19", "impressions": { "min": 0, "max": 1000 } }
  ],
  "audience": {
    "demographics": { "included": true, "excluded": false },
    "geography": { "included": true, "excluded": false },
    "contextual": { "included": true, "excluded": true },
    "customerLists": { "included": true, "excluded": false }
  }
}
```

A video ad (only the video fields):

```json
{
  "query": "barilla.com",
  "advertiserName": "APX ITALY S.R.L.",
  "format": "VIDEO",
  "headline": "Basil Bar by Pesto Barilla",
  "description": "Ripercorri le tappe della Via del Pesto",
  "callToAction": "Scopri Ora",
  "youtubeVideoId": "J4WiIaWnZ0o",
  "youtubeUrl": "https://www.youtube.com/watch?v=J4WiIaWnZ0o",
  "videoUrl": "https://rr4---sn-p5qs7nsk.googlevideo.com/videoplayback?expire=…",
  "clickUrl": "https://www.barilla.com/it-it/campagna/barilla-basil-bar?utm_source=YouTube&…"
}
```

`status` is one of:

| Status | Meaning | Charged |
|---|---|---|
| `ok` | Ad returned | yes |
| `no_ads` | No ads for this input with these filters | no |
| `not_found` | No advertiser with this name (try the domain) | no |
| `invalid_input` | Not a domain, name, advertiser ID or Transparency Center URL | no |
| `blocked`, `error` | Google refused every retry (rare); try again later | no |

#### Honest limits

- **Impressions** are published by Google only for ads shown in the European Union (Digital Services Act): elsewhere `impressions` is empty.
- **Text of Search ads** is read from the image Google publishes (OCR): in our checks the headline was right in 9 ads out of 10 and present in 60 out of 60, but rare characters or words cut at the image edge can be misread. The text is read from the first readable variation of each ad; other variations keep their image. Ads shown only in countries with other scripts (Japanese, Chinese, Korean, Arabic, Hebrew, Thai…) are not read; you still get the image.
- **Landing page** (`clickUrl`) is published by Google mostly for video ads. For Search text ads you get the display URL shown in the ad.
- **`videoUrl`** is a temporary Google link (it expires after a few hours): download the video right after the run, or use `youtubeUrl` when the ad has one. Some video ads are archived by Google only as a still image: they come with `imageUrl` and no video.
- **Domain search** returns what the Transparency Center returns: mostly the owner's ads, plus ads of other advertisers whose landing pages are on that domain (for example pages hosted on HubSpot or Shopify). Use the brand name or advertiser ID to get only one advertiser.
- Google shows the **platform** filter only for ads from September 2023 onwards, and gives the total number of ads only as an estimate.
- A few ad variations use layouts that cannot be read: they come with their image and dates but without text.

#### Pricing

**$1.50 per 1,000 ads** on the Starter plan, down to **$1.00** on Business (pay per event: one event per ad returned; the Pricing tab shows the price for your plan), details and text reading included. Rows with a status other than `ok` are free.

# Actor input Schema

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

One per line. A website domain (<code>nike.com</code>) gives the ads that point to it; a brand name (<code>Nike</code>) gives the ads of the matching advertiser; an advertiser ID (<code>AR16735076323512287233</code>) or an Ads Transparency Center URL (advertiser, single ad or domain search) works too.

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

Two-letter country code, for example <code>US</code>, <code>GB</code>, <code>DE</code>, <code>IT</code>. Leave empty for ads shown anywhere in the world.

## `dateRange` (type: `string`):

Only ads shown in this period.

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

With 'Custom dates': first day, as YYYY-MM-DD.

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

With 'Custom dates': last day, as YYYY-MM-DD. Empty = today.

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

Only ads shown on this Google platform (Google shows this filter only for ads from September 2023 onwards).

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

Only ads of this format. Text = Google Search text ads.

## `maxAdsPerQuery` (type: `integer`):

Newest ads first. Big brands have thousands of ads.

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

Ad text, images, videos, landing page, regions, impressions and targeting for every ad. Turn off to get only the list (IDs, format, dates, preview image) much faster.

## `readTextAds` (type: `boolean`):

Google shows Search text ads only as an image: this reads the headline, description and display URL from it (Latin-alphabet languages).

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

When you enter a brand name, how many matching advertiser accounts to include (the ones with most ads first).

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

How many ads are read at the same time.

## Actor input object example

```json
{
  "queries": [
    "nike.com"
  ],
  "region": "",
  "dateRange": "any",
  "platform": "",
  "format": "",
  "maxAdsPerQuery": 50,
  "includeDetails": true,
  "readTextAds": true,
  "maxAdvertisersPerName": 1,
  "maxConcurrency": 20
}
```

# Actor output Schema

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

One item per ad: advertiser, format, ad text, images, videos, landing page, dates, regions, impressions and targeting.

# 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": [
        "nike.com"
    ]
};

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

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

```

## MCP server setup

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