# Google Ads Transparency Scraper — Creatives & Media (`chronometrica/google-ads-transparency-scraper`) Actor

Collect public Google Ads Transparency creatives by advertiser name, domain, advertiser ID, or URL. Export media, dates, formats, payer, served regions, served platforms, advertiser details, and stable IDs.

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

## Pricing

from $0.80 / 1,000 google ad creatives

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Ads Transparency Scraper

### 📊 What does Google Ads Transparency Scraper do?

Google Ads Transparency Scraper collects public ad creatives from the Google
Ads Transparency Center. Enter an advertiser name, website domain, advertiser
ID, advertiser URL, or creative URL. The Actor returns clean rows with public
creative media or previews, stable IDs, dates, formats, and advertiser details.

Use it for competitor ad research, creative libraries, brand audits, ad history
checks, market research, scheduled monitoring, and data pipelines.

With Google Ads Transparency Scraper, you can:

- 🔎 Find public ads by advertiser name or website domain.
- 🆔 Collect an exact advertiser or creative by its public ID or URL.
- 🖼️ Export creative media and public preview URLs.
- 📅 Track first-shown, last-shown, and observation dates.
- 🌎 Filter by region, Google platform, ad format, and date range.
- 🧾 Add public payer, served region, and served platform details when needed.
- ♻️ Remove duplicate creatives within each run.
- 📦 Download results as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.
- 🚦 Understand empty, partial, and failed results through clear statuses and
  the run summary.

One saved row means one observed public ad creative. The Actor does not save a
metadata-only row when no usable media or preview is available.

This Actor uses logged-out public Google Ads Transparency Center data. It does
not use Google accounts, customer sessions, private campaign data, or challenge
solving.

### 📦 What Google Ads Transparency data can I extract?

Each dataset row represents one public ad creative observed during one Actor
run.

| Data group        | Example fields                                                                                                             |
| ----------------- | -------------------------------------------------------------------------------------------------------------------------- |
| 🔎 Input context  | `input`, `inputType`, `requestedRegion`, `requestedPlatform`, `requestedFormat`                                            |
| 🏢 Advertiser     | `advertiserId`, `advertiserName`, `advertiserLegalName`, `advertiserDomain`, `advertiserCountryCode`, `advertiserVerified` |
| 🆔 Creative       | `creativeId`, `creativeUrl`, `format`                                                                                      |
| 📅 Ad dates       | `firstShownAt`, `lastShownAt`, `approxDaysShown`                                                                           |
| 🖼️ Creative media | `mediaUrl`, `previewUrl`, `variationCount`, `variations`                                                                   |
| 🌐 Delivery       | `payerName`, `servedRegions`, `servedPlatforms`                                                                            |
| 📌 Observation    | `observedAt`                                                                                                               |
| 🚦 Row status     | `status`, `statusReason`                                                                                                   |

Each item in `variations` uses this fixed field order:
`mediaUrl`, `previewUrl`, `width`, and `height`.

Missing public values stay `null`. They are not guessed. Zero appears only when
the public source gives an explicit zero.

Rows are saved as soon as they are ready. Repeated runs create new observations
with a new `observedAt` value.

### ⚙️ Can I use this Actor through an API?

Yes. You can run Google Ads Transparency Scraper manually in Apify Console or
use it through:

- Apify API
- Python SDK
- Node.js SDK
- Webhooks
- Scheduled runs
- Make, Zapier, and n8n
- Other Apify integrations

This makes the Actor useful for creative databases, competitor monitors,
research pipelines, reporting tools, and automated alerts.

### 🎯 Why scrape Google Ads Transparency creatives?

Public ad creative data helps you study how advertisers present products,
offers, messages, and formats across markets and over time.

| Use case               | How the data helps                                                     |
| ---------------------- | ---------------------------------------------------------------------- |
| 🕵️ Competitor research | Review public creatives used by other advertisers.                     |
| 🖼️ Creative libraries  | Save media, previews, dates, formats, and stable creative IDs.         |
| 📈 Ad monitoring       | Compare observed creative inventories across scheduled runs.           |
| 🌎 Market research     | Filter public ads by region, platform, format, and date.               |
| 🧾 Brand audits        | Check public advertiser identity and creative history when available.  |
| 🧱 Data products       | Feed clean creative rows into databases, dashboards, and AI workflows. |

### 💵 Pricing Event

Google Ads Transparency Scraper uses pay-per-result pricing. One
`google-ad-creative` event means one useful creative row saved to the default
dataset.

Failed targets, empty searches, duplicate creatives, and public creatives
without usable media or previews do not create paid result rows.

Use `maxItems` to control the largest possible number of paid rows. Start with
10 creatives. Increase the limit only after the small run gives the data you
need. The current price appears in Apify Console before you start the run.

### 🚀 How do I use Google Ads Transparency Scraper?

1. Create or log in to your Apify account.
2. Open **Google Ads Transparency Scraper**.
3. Enter one advertiser name, domain, ID, or URL.
4. Select the region where the ads were shown.
5. Keep all platforms and formats for your first run.
6. Keep payer and delivery details off for your first run.
7. Set the maximum saved creatives to 10.
8. Click **Start**.
9. Open the **Output** tab to inspect the dataset and run summary.
10. Download the results or connect the Actor to your workflow.

### ⬇️ Input

The main input is `targets`. Enter one to 100 advertiser names, domains,
advertiser IDs, advertiser URLs, or creative URLs.

Use this small first run:

```json
{
  "targets": ["nike.com"],
  "region": "US",
  "platform": "ALL",
  "adFormat": "ALL",
  "includeDeliveryDetails": false,
  "maxItems": 10
}
```

#### 🔎 Advertiser targets

| Target type     | Example                                                                | Behavior                                        |
| --------------- | ---------------------------------------------------------------------- | ----------------------------------------------- |
| Advertiser name | `Nike, Inc.`                                                           | Uses the closest public advertiser match.       |
| Website domain  | `nike.com`                                                             | Finds public creatives connected to the domain. |
| Advertiser ID   | `AR16735076323512287233`                                               | Uses one exact public advertiser account.       |
| Advertiser URL  | `https://adstransparency.google.com/advertiser/AR16735076323512287233` | Uses the advertiser ID in the URL.              |
| Creative URL    | A full Ads Transparency Center creative URL                            | Collects that exact public creative.            |

An advertiser ID or advertiser URL gives the safest account match. A name uses
the closest public match. Check `targetOutcomes` in `OUTPUT` to confirm the
resolved advertiser.

Broad domain searches can match more than one advertiser account. Legal name,
advertiser country, and verification can be unavailable for these searches.
Use an advertiser ID when you need those fields.

#### 🌎 Region, platform, format, and dates

Search one advertiser ID with narrow filters:

```json
{
  "targets": ["AR16735076323512287233"],
  "region": "CA",
  "platform": "GOOGLE_SEARCH",
  "adFormat": "IMAGE",
  "dateFrom": "2026-07-01",
  "dateTo": "2026-08-16",
  "maxItems": 25
}
```

Search more than one advertiser:

```json
{
  "targets": ["nike.com", "adidas.com"],
  "region": "GB",
  "maxItems": 100
}
```

The 100-row limit is shared across both targets.

#### 🧾 Optional payer and delivery details

Turn on `includeDeliveryDetails` when you need the payer name, regions shown,
or platforms shown for each creative. This check can increase run time. Keep it
off when you need only the creative, media, dates, and advertiser details.

```json
{
  "targets": ["AR10641703725577535489"],
  "region": "US",
  "platform": "ALL",
  "adFormat": "ALL",
  "includeDeliveryDetails": true,
  "maxItems": 10
}
```

Google does not publish all three values for every creative. `payerName` can be
different from `advertiserName`. `servedPlatforms` can be incomplete for older
ads. A missing value stays `null`.

#### 🎛️ Settings

| Setting                  | What it controls                                                                                     |
| ------------------------ | ---------------------------------------------------------------------------------------------------- |
| `targets`                | One to 100 advertiser names, domains, advertiser IDs, advertiser URLs, or creative URLs.             |
| `region`                 | Country where the public source shows the ads. Use `ANYWHERE` for wider results. Default: `US`.      |
| `platform`               | All platforms, Google Search, YouTube, Google Shopping, Google Maps, or Google Play. Default: `ALL`. |
| `adFormat`               | All public formats, image, text, or video. Default: `ALL`.                                           |
| `dateFrom`               | Optional real date from 2000-01-01 through today. Blank keeps the earliest available date.           |
| `dateTo`                 | Optional real date from 2000-01-01 through today. Blank keeps the latest available date.             |
| `includeDeliveryDetails` | Optional payer, served region, and served platform details. Default: `false`.                        |
| `maxItems`               | Shared saved-row and pricing-event cap. Range: 1 to 5,000. Default: 10.                              |

### ⬆️ Output sample

Results are stored in the default dataset. This sample follows one tested row:

```json
{
  "input": "Nike, Inc.",
  "inputType": "advertiser_name",
  "requestedRegion": "ca",
  "requestedPlatform": "google_search",
  "requestedFormat": "image",
  "advertiserId": "AR16735076323512287233",
  "advertiserName": "Nike, Inc.",
  "advertiserLegalName": "Nike, Inc.",
  "advertiserDomain": null,
  "advertiserCountryCode": "US",
  "advertiserVerified": true,
  "creativeId": "CR07777348434821906433",
  "creativeUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR07777348434821906433?region=CA",
  "format": "image",
  "firstShownAt": "2026-07-17T10:02:02.000Z",
  "lastShownAt": "2026-08-16T16:04:17.000Z",
  "approxDaysShown": 31,
  "mediaUrl": "https://tpc.googlesyndication.com/archive/simgad/4414980705340742578",
  "previewUrl": null,
  "variationCount": 1,
  "variations": [
    {
      "mediaUrl": "https://tpc.googlesyndication.com/archive/simgad/4414980705340742578",
      "previewUrl": null,
      "width": 734,
      "height": 192
    }
  ],
  "payerName": null,
  "servedRegions": null,
  "servedPlatforms": null,
  "observedAt": "2026-08-16T21:24:56.083Z",
  "status": "ok",
  "statusReason": "The public creative and its media were collected."
}
```

#### 📌 Run summary

The `OUTPUT` and `RUN_SUMMARY` key-value-store records include:

- targets received and resolved;
- one outcome for each processed target;
- duplicate and unusable creatives skipped;
- useful creatives saved;
- row status counts;
- the final run status and stop reason;
- the schema version and run times.

An empty dataset does not always mean the Actor failed. A target can have no
public ads for the selected region, platform, format, or date range. The run
summary separates `no_results` from an unavailable public source.

### 🎯 Status and quality fields

Use `status`, `statusReason`, and the run summary to interpret each result.

| Status or field     | Meaning                                                                     |
| ------------------- | --------------------------------------------------------------------------- |
| `status: "ok"`      | The public creative, usable media or preview, and format were collected.    |
| `status: "partial"` | The creative has usable media or a preview, but its format was unavailable. |
| `statusReason`      | Gives the buyer-facing reason for the row status.                           |
| `targetOutcomes`    | Shows how each target resolved and how many rows it saved.                  |
| `observedAt`        | Shows when this Actor observed the creative.                                |
| `firstShownAt`      | Shows the first date reported by the public source when available.          |
| `lastShownAt`       | Shows the last date reported by the public source when available.           |

`requestedRegion` records the selected filter. It does not claim that the row
contains every region where the ad ran.

### 🔒 Source boundary

Google Ads Transparency Scraper reads logged-out public data from the Google Ads
Transparency Center.

It does not:

- sign in to a Google account;
- use customer sessions or cookies;
- solve access challenges;
- read private campaign data;
- provide bid keywords, spend, targeting, or conversion data;
- claim to be an official Google API.

### ⚠️ Limits and interpretation

- The Google Ads Transparency Center is a changing public source.
- `maxItems` is a cap. It is not a promise that the source has that many
  matching creatives.
- Advertiser names can be similar. Use an advertiser ID or exact URL when
  identity matters.
- A domain can match more than one advertiser account.
- Broad domain searches can leave legal name, advertiser country, and
  verification as `null`.
- Some creatives provide a preview instead of a direct media file.
- A video creative can provide a public preview without a reusable video file.
- Landing pages are not a promised field.
- Creative media links can change or stop working after collection.
- Platform filters can exclude older ads that have no supported platform data.
- Delivery details can increase run time. Google can omit the payer, region,
  or platform breakdown for some creatives.
- The Actor does not claim a complete ad history.

### ❓ FAQ

#### Does this Actor need a Google API key, login, or cookies?

No. It reads logged-out public Google Ads Transparency Center data.

#### Why did I get fewer rows than `maxItems`?

The public source can have fewer matching creatives. Filters, duplicate
creatives, and public creatives with no usable media or preview can also reduce
the result. Read `targetOutcomes` and the counters in `OUTPUT`.

#### Why is `mediaUrl` null?

Some formats use an interactive public preview instead of one media file. In
that case, `previewUrl` can contain the creative.

#### Why is a row `partial`?

The Actor saved a usable public creative, but the public source did not give its
format. The row keeps the available media or preview and sets `format` to
`null`.

#### Can I search ad text or paid keywords?

No. Search targets identify advertisers. This Actor does not search bid
keywords or all ad copy.

#### Does it return impressions, clicks, spend, CPM, or conversions?

No. The public source does not give standard campaign performance data for
these ads. The Actor does not estimate these values.

#### Why is the payer different from the advertiser?

Google can show a different entity that paid for the creative. The Actor keeps
that value in `payerName`. It does not replace `advertiserName`.

#### Does it return landing pages or reusable video files?

No stable landing-page or direct video-file field is promised. Public previews
can contain links or video playback, but those forms are not consistent enough
for a stable row field.

#### How does duplicate removal work?

The Actor uses the advertiser ID and creative ID as the unique creative key
within a run. The same creative can appear again in a later run because that
later row is a new observation.

### ⚖️ Legal and responsible use

This Actor collects public data. Public data can still be subject to source
terms, privacy rules, intellectual property rights, and laws in your country.
Use the data only for a lawful purpose. This section is general information and
is not legal advice.

This Actor is independent. Google and Google Ads are trademarks of Google LLC.

### 🛟 Support

For support, include:

- the Actor run ID;
- a small input example;
- the advertiser or creative you expected;
- the row or field that looks wrong;
- the `OUTPUT` summary;
- whether the issue affects one row or the whole run.

Do not send account cookies, passwords, private campaign data, or other secret
values.

### 🔗 Related Actors

Continue the same research workflow with:

- [Google Search Scraper](https://apify.com/chronometrica/google-search-scraper)
  — collect public web results from Google, Bing, Brave, and DuckDuckGo.
- [Google Jobs Scraper](https://apify.com/chronometrica/google-jobs-scraper)
  — collect public job listings from Google Jobs searches.

# Actor input Schema

## `targets` (type: `array`):

Enter one advertiser name, website domain, advertiser ID, or Ads Transparency Center URL per line. A name uses the closest public advertiser match. An exact ID or URL is best when names are similar.

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

Keep ads that the public source shows for this country. Anywhere gives wider results for verified advertisers. This filter does not prove a complete list of every region where an ad ran.

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

Keep ads shown on one Google platform. Platform data is available only for dates supported by the public source.

## `adFormat` (type: `string`):

Keep all public ad formats, or only text, image, or video ads.

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

Choose a real date from 2000-01-01 through today. Leave it blank to keep the earliest available date.

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

Choose a real date from 2000-01-01 through today. Leave it blank to keep the latest available date.

## `includeDeliveryDetails` (type: `boolean`):

Check each saved creative for a public payer name, regions shown, and platforms shown. This can increase run time. Default: off.

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

The Actor stops after it saves this many unique ad creatives across all targets. You pay only for saved creative rows. The public source can return fewer rows.

## Actor input object example

```json
{
  "targets": [
    "nike.com"
  ],
  "region": "US",
  "platform": "ALL",
  "adFormat": "ALL",
  "dateFrom": "",
  "dateTo": "",
  "includeDeliveryDetails": false,
  "maxItems": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

Useful public ad creative rows saved by this run.

## `summary` (type: `string`):

Target results, counts, status, and stop reason for this run.

# 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 = {
    "targets": [
        "nike.com"
    ],
    "region": "US",
    "platform": "ALL",
    "adFormat": "ALL",
    "includeDeliveryDetails": false,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("chronometrica/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 = {
    "targets": ["nike.com"],
    "region": "US",
    "platform": "ALL",
    "adFormat": "ALL",
    "includeDeliveryDetails": False,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("chronometrica/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 '{
  "targets": [
    "nike.com"
  ],
  "region": "US",
  "platform": "ALL",
  "adFormat": "ALL",
  "includeDeliveryDetails": false,
  "maxItems": 10
}' |
apify call chronometrica/google-ads-transparency-scraper --silent --output-dataset

```

## MCP server setup

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