# Google Ads Transparency Scraper | Bulk Ads (`xtech/google-ad-transparency-scraper`) Actor

Compare public Google ad creatives across advertisers and countries. Export deduplicated creative records, preview links, and available timing and impression ranges. Build competitor research datasets from domains or advertiser IDs, with optional creative details.

- **URL**: https://apify.com/xtech/google-ad-transparency-scraper.md
- **Developed by:** [Xtech](https://apify.com/xtech) (community)
- **Categories:** E-commerce, Lead generation, Developer tools
- **Features:** Limited permissions
- **Stats:** 639 total users, 17 monthly users, 83.2% runs succeeded, 27 bookmarks
- **User rating**: 3.01 out of 5 stars

## Pricing

from $14.00 / 1,000 creative 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 Scraper | Bulk Ads

Compare the ads your competitors publish on Google. Add company domains or advertiser IDs, choose countries and surfaces, and export one record per unique creative found in the run. Use the dataset for campaign reviews and repeatable ad-library snapshots. Public previews, dates, impression ranges and other details depend on what Google makes available; this is not a source of private spend or campaign performance.

Creative result prices per 1,000: Free $20, Bronze $18, Silver $16, Gold/Platinum/Diamond $14. Optional creative details have no extra per-creative fee. Actor start is $0.00005 per GB of memory, minimum one event. Check the Pricing tab for your exact plan rate and current platform-usage treatment.

### Workflow: compare competitor Google ads

1. Open the [public Nike starter](https://apify.com/xtech/google-ad-transparency-scraper/examples) to inspect a small, capped sample. Replace its domain with one advertiser you want to research.
2. Check creative IDs and preview links before adding more advertisers, countries or surfaces. Optional details depend on public availability.
3. Export the results and save dated snapshots. Compare creative IDs between snapshots in your own reporting workflow; deduplication within a run does not create a cross-run change detector.

Start with the $0.05 cap in the published example. At the Free base rate, two creative results cost $0.04 plus the start event; plan discounts reduce the creative fee. A cap is a maximum, not a promise of a particular number of results.

### Best for

- Comparing a competitor’s visible creatives across countries and Google surfaces
- Building a small, repeatable ad-library snapshot before a campaign review
- Exporting deduplicated creative links and public timing/impression signals to a dashboard

### What you can do

- Research one or many advertisers by domain, advertiser ID, or public Transparency Center URL.
- Compare visible creatives across selected countries and Google surfaces.
- Build recurring competitor-ad archives for dashboards, alerts, or internal analysis.
- Export a clean record for every unique creative found in a run.

### Quick start

```json
{
  "targets": ["google.com"],
  "regions": ["US"],
  "maxCreativesPerTarget": 3,
  "includeCreativeDetails": false
}
```

Use an advertiser ID beginning with `AR`, a company domain, or a public Google Ads Transparency Center advertiser or search URL. Add up to 100 targets to a run.

### Ready-to-run presets

Fast brand validation:

```json
{
  "targets": ["nike.com"],
  "regions": ["US"],
  "surfaces": ["ALL"],
  "maxCreativesPerTarget": 25,
  "includeCreativeDetails": false
}
```

Compare a brand across markets:

```json
{
  "targets": ["nike.com"],
  "regions": ["US", "GB", "DE"],
  "surfaces": ["ALL"],
  "maxCreativesPerTarget": 100,
  "includeCreativeDetails": true
}
```

Focus on YouTube creatives:

```json
{
  "targets": ["nike.com", "adidas.com"],
  "regions": ["US"],
  "surfaces": ["YOUTUBE"],
  "maxCreativesPerTarget": 50,
  "includeCreativeDetails": false
}
```

### Choose your coverage

Select one or more supported markets from the input dropdown: Australia, Brazil, Canada, France, Germany, India, Italy, Japan, Mexico, the Netherlands, Poland, Spain, Sweden, the United Kingdom, and the United States.

Search all available surfaces or limit the result set to Google Search or YouTube. Leave the default `ALL` value for broad competitor research.

### Pricing and run budget

At the current base price, each saved creative costs **$0.02** (**$20 per 1,000 creatives**). A small run-start fee of **$0.00005 per allocated GB of memory** also applies, with a minimum of one event. Discounts, when available, are shown in the Console.

Start with the three-creative example above and a **$0.10 maximum run charge**. Its result fees are at most $0.06 before discounts, plus the run-start fee. Set the spending limit in the Console or pass `maxTotalChargeUsd` when starting through the API. The Actor checks affordable result capacity before collecting more creatives and stops when that capacity is filled. Empty searches and source errors do not become paid creative rows.

### What each result contains

Each dataset item represents one unique public creative. It can include:

| Field | Description |
| --- | --- |
| Advertiser | The public advertiser name and ID. |
| Creative | Creative ID, detected format, preview links, and the public source link. |
| Timing and reach | First/last shown dates and impression range when Google makes them available. |
| Targeting signals | Publicly displayed high-level targeting indicators, when available. |
| Coverage | The selected markets and Google surfaces where the creative was returned. |
| Run context | Your matched target, observation time, and whether extra creative details were available. |

Google does not publish every field for every creative. Empty fields mean that information was not available in the public record at collection time.

Unavailable impression bounds are `null`; if neither bound is available, `impressionRange` is `null`. Missing targeting flags are omitted. A zero impression count or a `false` targeting flag is exported only when the public source explicitly supplies that value.

#### Example output

```json
{
  "advertiserId": "AR1234567890",
  "advertiserName": "Example Brand",
  "creativeId": "123456789",
  "creativeType": "Video",
  "previewUrls": ["https://example.com/public-preview"],
  "firstShown": "2026-01-10",
  "lastShown": "2026-08-01",
  "impressionRange": {"min": "10K", "max": "100K"},
  "regions": ["US"],
  "surfaces": ["YOUTUBE"],
  "sourceUrl": "https://adstransparency.google.com/advertiser/AR1234567890/creative/123456789",
  "queryTargets": ["example.com"],
  "detailStatus": "not_requested"
}
```

The exact public fields vary by creative and market; an empty optional field means Google did not expose it for that record.

### Plan large runs confidently

`maxCreativesPerTarget` controls how many distinct creatives are collected for each target. Start with 25 and disable creative details for a fast validation run, then increase up to 1,000 and enable details when you need broader coverage.

Creatives are deduplicated across targets, markets, and surfaces within the same run. One stored result is one unique creative; only saved unique creatives count toward result pricing.

### Useful workflows

- **Competitor creative tracking:** run the same advertiser list regularly and compare newly observed creatives with prior exports.
- **Agency research:** gather a multi-brand creative sample before a pitch or campaign review.
- **Market comparisons:** run the same targets in several countries to understand where ads are publicly visible.
- **Creative inventory:** export source links and preview URLs for a review queue or reporting dashboard.

### Notes

This Actor only collects information available through Google’s public Ads Transparency Center. Public availability, field coverage, and search results can change over time, so a target may return fewer records or no records in a given market. It does not access advertising accounts or private campaign data.

### Troubleshooting

- **A domain returns no creatives:** retry with the advertiser’s public Transparency Center URL or advertiser ID, and check another market.
- **The run is slow or expensive:** start with 25 creatives, one market, and `includeCreativeDetails: false`; expand only after the target is confirmed.
- **One target fails:** inspect the run summary and keep the successful targets; the Actor fails only when every target is unreachable.
- **A market is rejected:** use one of the supported ISO country codes shown in the input form.

### Related research workflows

- [News Source Crawler](https://apify.com/xtech/news-source-crawler) — monitor articles and coverage around the brands you research.
- [Social Media Finder Pro](https://apify.com/xtech/social-media-finder-pro) — discover public social profiles for advertisers, creators, or company usernames.
- [Google Keyword Scraper Pro](https://apify.com/xtech/google-keyword-scraper-pro) — compare public search interest before interpreting a creative change.

When `includeCreativeDetails` is enabled, `creativeDetails` retains available preview metadata per variation. Supported public text templates expose `headline`, `body`, `visible_url` and `advertiser` under `textAdMetadata`; image templates expose available copy and media under `imageAdMetadata`. Fields remain absent when Google does not supply them or a preview cannot be read. A visible domain is not a verified destination URL. Preview failures preserve the creative and its preview link.

Shopping image previews can expose a product headline, advertiser and verified image URL. They may contain no description or destination link; those fields are not inferred.

# Actor input Schema

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

Required. Add up to 100 targets. Use an advertiser ID starting with AR, a domain such as example.com, or a public Google Ads Transparency Center advertiser or search URL.

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

Choose one or more markets using ISO country codes. The default is US.

## `surfaces` (type: `array`):

Use ALL for broad coverage, or limit results to Google Search or YouTube.

## `maxCreativesPerTarget` (type: `integer`):

Maximum distinct creatives to collect for each target. The form starts with five for a quick sample; increase it when you need broader coverage.

## `includeCreativeDetails` (type: `boolean`):

Include public preview links, impression ranges, dates, and high-level targeting indicators when Google makes them available.

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

Optional. Leave empty to use the actor's included connection. Explicit proxy URLs you supply are used exactly as given. Set useApifyProxy to false to connect directly; Apify proxy routing is not used.

## `searchInputs` (type: `array`):

Compatibility field for existing integrations. Use targets for new runs.

## `maxPages` (type: `integer`):

Compatibility field for existing integrations. Use maxCreativesPerTarget for new runs.

## Actor input object example

```json
{
  "targets": [
    "nike.com"
  ],
  "regions": [
    "US"
  ],
  "surfaces": [
    "ALL"
  ],
  "maxCreativesPerTarget": 5,
  "includeCreativeDetails": true
}
```

# Actor output Schema

## `creatives` (type: `string`):

Unique public creatives collected by the run.

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

Counts of requested targets, source errors, found creatives, and saved creatives.

# 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"
    ],
    "maxCreativesPerTarget": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtech/google-ad-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"],
    "maxCreativesPerTarget": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("xtech/google-ad-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"
  ],
  "maxCreativesPerTarget": 5
}' |
apify call xtech/google-ad-transparency-scraper --silent --output-dataset

```

## MCP server setup

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