# Google Ads Transparency Scraper: Competitor Ads by Brand (`dtkfoundry/google-ads-transparency`) Actor

Google Ads Transparency Center scraper for competitor ads: every ad a brand runs on Google Search, YouTube, Maps, Play and Shopping, with creatives, format, first and last shown, and EU impressions and targeting. Pay per ad.

- **URL**: https://apify.com/dtkfoundry/google-ads-transparency.md
- **Developed by:** [DTK Foundry](https://apify.com/dtkfoundry) (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.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.

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: Competitor Ads by Brand

A Google Ads Transparency Center scraper for competitor ads: every ad a brand runs on Google Search, YouTube, Google Maps, Google Play and Google Shopping, from Google's
public Ads Transparency Center: the creative, its format, when it was first and last shown, and the
advertiser behind it. Turn on details to add each ad's variations and topic, the countries it ran in, and for
EU countries how many times it was shown (overall and per platform) and how its audience was selected.

- **Search the way you think:** a brand name ("Nike"), a website ("temu.com") or an advertiser account ID.
  Brand names are matched to the brand's own website when Google knows it, so "Temu" finds Temu's ads even
  though they run under the name Elementary Innovation Pte. Ltd. Every row says what your search matched.
- **Filters that match the site:** country (or anywhere), format, platform, and a date range.
- **Reliable.** Tested on 200 varied searches (50 brands, 20 websites, 10 countries, random format, platform
  and date filters, details on 30%): all 200 answered, none failed, median 2.6 seconds per search.
- **Pay per ad: $0.001.** Searches that fail or find nothing are never charged.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `advertisers` | array | `[]` | One per line: brand name, website, or account ID (`AR...`). Empty = a free format example. |
| `region` | string | `US` | 2-letter country code where the ads were shown, or `anywhere`. |
| `format` | string | `all` | `all`, `text`, `image`, `video`. |
| `platform` | string | `all` | `all`, `search`, `youtube`, `maps`, `play`, `shopping`. |
| `shownFrom` / `shownTo` | date | any time | Only ads shown in this date range. |
| `maxAdsPerAdvertiser` | integer | `100` | 1-5,000, newest first. |
| `includeDetails` | boolean | `false` | Variations, topic, countries, and EU reach and targeting. One more request per ad. |

```json
{
    "advertisers": ["Nike", "temu.com"],
    "region": "DE",
    "format": "all",
    "platform": "youtube",
    "shownFrom": "2026-07-01",
    "maxAdsPerAdvertiser": 100,
    "includeDetails": true
}
```

### Output (one record per ad)

A real record from a run on 2026-10-20 (searched `nike.com` in Germany with details on; lists shortened):

```json
{
    "searchedFor": "nike.com",
    "searchType": "website",
    "region": "DE",
    "scrapedAt": "2026-10-20T20:31:54+00:00",
    "advertiserIds": null,
    "estimatedAdsMin": 2000,
    "estimatedAdsMax": 3000,
    "status": "ok",
    "rank": 2,
    "advertiserId": "AR18378488041124659201",
    "advertiserName": "Nike Retail BV",
    "creativeId": "CR02281612109399719937",
    "website": "nike.com",
    "format": "text",
    "firstShown": "2021-10-25",
    "lastShown": "2026-10-20",
    "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/8919616364878071",
    "imageWidth": 364,
    "imageHeight": 305,
    "previewUrl": null,
    "adUrl": "https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR02281612109399719937?region=DE",
    "topic": null,
    "variations": [
        {
            "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/8919616364878071",
            "imageHeight": 305,
            "imageWidth": 364
        }
    ],
    "variationCount": 4,
    "regions": [
        {
            "countryCode": "US",
            "region": "United States",
            "firstShown": null,
            "lastShown": "2026-10-19",
            "timesShownMin": null,
            "timesShownMax": null,
            "timesShownByPlatform": []
        },
        {
            "countryCode": "DE",
            "region": "Germany",
            "firstShown": "2023-03-01",
            "lastShown": "2026-10-20",
            "timesShownMin": 60000,
            "timesShownMax": 70000,
            "timesShownByPlatform": [
                {
                    "platform": "Google Search",
                    "timesShownMin": 45000,
                    "timesShownMax": 50000
                },
                {
                    "platform": "Google Shopping",
                    "timesShownMin": 0,
                    "timesShownMax": 1000
                }
            ]
        }
    ],
    "timesShownEuMin": 175000,
    "timesShownEuMax": 200000,
    "audienceSelection": {
        "demographicInfo": "included",
        "geographicLocations": "included",
        "contextualSignals": "included"
    }
}
```

The detail fields (`topic` to `audienceSelection`) appear only with `includeDetails`. Times shown and audience
selection are published by Google for EU countries only (EU Digital Services Act); elsewhere the regions list
has dates only.

- `imageUrl` is the archived creative image. Text ads are archived by Google as images too, so their wording
  is in the image, not in a text field. Ads Google renders on the fly (most video and some image ads) have a
  `previewUrl` instead: Google's own preview script for that ad.
- `estimatedAdsMin`/`Max` is Google's estimate of how many ads match the whole search.
- `resolvedTo` (brand-name searches) says what the name matched: `website nike.com` or
  `advertiser Nike, Inc.`.
- A search with no ads gives one record with `status: "no-results"`; a search that could not be completed
  gives `status: "failed"` and an `error`. Neither is charged.

### Pricing

Pay per event, no subscription.

| Event | Price | When it is charged |
|---|---|---|
| Ad | **$0.001** | Once per ad delivered. 100 ads = $0.10. |
| Ad details | **$0.001** | Once per ad whose details were delivered (only with `includeDetails`). |

Set a maximum charge in the run options and the actor stops before it would go over. Apify's standard
run-start event adds $0.00005 per run.

### Limits, stated plainly

- Brand names are matched as well as Google's own suggestions allow. For an exact search use the website or
  the advertiser ID from the advertiser's Transparency Center page (`adstransparency.google.com/advertiser/AR...`).
- Google limits how fast this site can be read. The actor spreads requests over fresh connections and waits
  when told to; very large runs (thousands of ads with details) take minutes, not seconds.
- Political ads (Google's separate political ads report) are not covered.
- Public data only: no login, no personal data.

### Privacy

Only your search terms are sent to Google. Results are stored only in your run's dataset. The actor runs with
limited permissions and reads nothing else in your account.

# Actor input Schema

## `advertisers` (type: `array`):

One per line: a brand or company name ("Nike"), a website ("temu.com"), or an advertiser account ID from the Transparency Center ("AR16735076323512287233"). Names find the advertiser with the most ads among Google's suggestions, with all of its accounts. Leave empty for a free format example.

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

2-letter country code where the ads were shown (US, GB, DE, FR, IN, BR ...), or "anywhere". EU countries add times shown and audience selection when details are on.

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

Only ads of this format.

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

Only ads shown on this Google platform.

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

YYYY-MM-DD. Only ads shown on or after this date. Empty = any time.

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

YYYY-MM-DD. Only ads shown on or before this date. Empty = up to today.

## `maxAdsPerAdvertiser` (type: `integer`):

Up to 5,000, newest first. Each ad is one charged result.

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

Adds each ad's variations, topic, and the regions it ran in with first and last shown dates; in EU countries also how many times it was shown (overall and per platform) and its audience selection. Charged as a second event per ad, and slower: one more request per ad.

## Actor input object example

```json
{
  "advertisers": [
    "Nike",
    "temu.com"
  ],
  "region": "US",
  "format": "all",
  "platform": "all",
  "maxAdsPerAdvertiser": 100,
  "includeDetails": false
}
```

# Actor output Schema

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

Every ad with advertiser, format, dates, creative and (optionally) details.

## `resultsCsv` (type: `string`):

The same ads as CSV.

# 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 = {
    "advertisers": [
        "Nike",
        "temu.com"
    ]
};

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

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

```

## MCP server setup

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