# Google Ads Transparency Scraper: Ads & Creative Details (`xmolodtsov/google-ads-transparency-scraper`) Actor

Google Ads Transparency scraper for public ads by advertiser name, ID or domain. Export creative IDs, formats, activity dates, image and preview links, plus optional regional details.

- **URL**: https://apify.com/xmolodtsov/google-ads-transparency-scraper.md
- **Developed by:** [GoFetch](https://apify.com/xmolodtsov) (community)
- **Categories:** Marketing, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 ad creative saveds

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 exports public ads by advertiser name, advertiser ID or website domain. Get stable creative IDs, advertiser names, text/image/video formats, first and last shown dates, image links and rendered preview links in an Apify dataset. Optional details add creative variations, country activity dates, impression ranges and links to Google-hosted previews.

Use the data to monitor brand campaigns, compare creative formats across markets, maintain an ad archive or feed a research dashboard. The Actor reads the public Google Ads Transparency Center without signing into a Google account. It is an independent tool and is not affiliated with or endorsed by Google.

![Google Ads Transparency research mascot](https://api.apify.com/v2/key-value-stores/2DxCOvbMjhvK3S1qP/records/google-ads-transparency-scraper-avatar.png)

### What data you get

Every row represents one unique advertiser and creative ID pair. The core fields are `advertiserId`, `advertiserName`, `creativeId`, `domain`, `format`, `firstShown`, `lastShown`, `shownForDays`, `imageUrl`, `previewUrl` and `adUrl`. Dates from search results are UTC timestamps. `shownForDays` is the value supplied by Google, rather than a calculation that assumes continuous activity.

Turn on `includeDetails` to get `variations`, `variationCount`, `regions` and the original numbered detail object in `detail`. Each region includes its country code, Google region ID, first and last activity dates, and lower/upper impression bounds when published. Impression bounds remain strings so large counts retain their precision. A missing lower bound stays null; it does not mean zero. Region-level activity dates use YYYY-MM-DD.

`previewText` is null in this build. Preview-text enrichment is omitted because fetching rendered previews exceeded the measured cost guard. Open `previewUrl` or `imageUrl` to inspect creative content. This Actor does not perform OCR. Media files are linked, not downloaded.

### How to use it

1. Enter one or more website domains, or exact advertiser names/AR IDs.
2. Optionally select the country where ads were shown, an activity date range and a creative format.
3. Set the global maximum number of unique ads. Enable details only when needed.
4. Start the run and export its dataset as JSON, CSV, Excel or another Apify-supported format.

Domains are the most reliable starting point because advertiser name suggestions are fuzzy. All case-insensitive exact name matches are searched together. If there are only fuzzy suggestions, the log lists candidate IDs rather than selecting one silently. Copy the intended AR ID into `advertisers` to select a single account. A domain search may legitimately return several advertisers, such as regional entities or agencies that advertise the same website.

For the API, post this input to the Actor's run endpoint:

```json
{"domains":["nike.com"],"region":"US","format":"all","maxItems":100,"includeDetails":false}
```

API endpoint: `https://api.apify.com/v2/acts/xmolodtsov~google-ads-transparency-scraper/runs`. Authenticate using your Apify API token as a Bearer header. Retrieve the run's default dataset when it finishes. [Use this Actor through Apify MCP](https://mcp.apify.com?tools=xmolodtsov/google-ads-transparency-scraper) for compatible agent tools.

### Pricing and free-plan limits

Pay per saved creative, including optional details: **$1.00 per 1,000 results** at the FREE tier, **$0.90** at BRONZE, **$0.80** at SILVER and **$0.70** at GOLD and above. There is no separate detail fee. The Store pricing table shows the current tier rate. Empty queries do not emit result events. A run stops when its maximum charge is reached and reports only the rows accepted by the dataset.

On a free Apify plan, this Actor allows **100 unique ads per run and 20 runs per UTC calendar month**. These are limits set by the developer, not by Apify. The monthly allowance resets on the first day of each month. A run after the allowance is exhausted succeeds with a clear quota message and no results. Paid Apify plans remove these developer free-plan caps; the requested `maxItems` and platform budgets still apply.

### Input reference

| Input | Meaning |
|---|---|
| `advertisers` | List of exact advertiser names or AR IDs; optional if domains are supplied |
| `domains` | Website domains or URLs, normalized to domains |
| `region` | Country where ads appeared, ISO alpha-2; `ALL` means anywhere |
| `startDate`, `endDate` | Inclusive activity-overlap range in YYYY-MM-DD |
| `format` | `all`, `text`, `image` or `video` |
| `maxItems` | Global unique creative cap across all targets, default 100 |
| `includeDetails` | Additional creative-detail requests, default false |
| `proxyConfiguration` | Optional proxy settings; default Apify RESIDENTIAL US |

A date range filters activity overlap, not the creative's creation date. An ad that first appeared before your start date can still match. The region filter is independent of the proxy exit country. The Actor defaults to residential because datacenter exits produced more Google CAPTCHAs in testing. An explicit datacenter/custom-proxy setting stays selected for the whole run; there is no silent switch to another proxy tier. Supplying your own proxy URLs uses your bandwidth.

### Output and coverage

Output is globally deduplicated by advertiser/creative pair. All IDs stay strings. Unknown source data stays null. The default dataset includes an overview table, and the run's key-value store contains `STATISTICS` with request counts, failed/blocked requests, compressed response bytes, zero-confirm checks, per-target outcomes and result counts.

Google decides which creatives and regional metrics it publishes. An ad's preview link can expire or change, so retain the creative ID and Transparency Center link for future reference. This Actor does not claim unlimited coverage or bypass Google's published-data boundaries.

An actual image-creative row from the private proof (fields selected for readability):

```json
{
  "advertiserId": "AR18378488041124659201",
  "advertiserName": "Nike Retail BV",
  "creativeId": "CR10405335294273388545",
  "format": "image",
  "domain": "nike.com",
  "firstShown": "2026-06-19T13:25:20.000Z",
  "lastShown": "2026-10-18T21:29:16.000Z",
  "shownForDays": 75,
  "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/15476018587414296602",
  "previewUrl": null,
  "previewText": null,
  "adUrl": "https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR10405335294273388545",
  "scrapedAt": "2026-10-18T22:05:24.660Z"
}
```

### Guarantees and failure behavior

CAPTCHA, network and invalid-response errors are retried on fresh sessions of the selected proxy mode. Empty queries are rechecked on a second session and compared with a known-positive query, because an invalid request can also receive an empty JSON object from Google.

A run that cannot obtain a valid answer fails with a machine-readable status prefix, such as `blocked:`, `network:`, `invalid:` or `timeout:`. A confirmed query with no matching creatives succeeds empty. If data has already been saved when a later page/detail fails or the run approaches its time limit, the run succeeds with partial results and says so on the run card. Check `STATISTICS` before treating a partial dataset as complete. Repeated pagination tokens stop the affected target instead of creating a loop.

### Integrations

Datasets can feed Apify integrations, webhooks, scheduled workflows, n8n or Make. Store creative IDs in your own database to compare snapshots across days. Connect the exported dataset to a spreadsheet for manual ad review, or retain the JSON output when nested region/variation detail matters.

### More scrapers from this developer

**TikTok:** [TikTok Search Scraper](https://apify.com/xmolodtsov/tiktok-search-scraper): videos and creators for any keyword, pay per result · [TikTok Profile Scraper (Pay Per Result)](https://apify.com/xmolodtsov/tiktok-profile-scraper): profiles, followers and latest posts by username · [TikTok Comments Scraper](https://apify.com/xmolodtsov/tiktok-comments-scraper): comments and full reply threads from any video · [TikTok Hashtag Scraper](https://apify.com/xmolodtsov/tiktok-hashtag-scraper): videos for any hashtag, with views, likes and music · [TikTok Sound & Music Scraper](https://apify.com/xmolodtsov/tiktok-sound-scraper): videos that use a sound or song · [TikTok Top Ads Scraper](https://apify.com/xmolodtsov/tiktok-top-ads-scraper): public Creative Center ad rankings, engagement, media and landing pages

**Social & news:** [Reddit Search Scraper](https://apify.com/xmolodtsov/reddit-scraper): posts by keyword, subreddit or author · [Google News Scraper](https://apify.com/xmolodtsov/google-news-scraper): Google News results as clean full-text articles

**E-commerce:** [Prom.ua Product Search Scraper](https://apify.com/xmolodtsov/prom-ua): Prom.ua product search results, no browser needed · [Amazon Product Search & Bestsellers Scraper](https://apify.com/xmolodtsov/amazon-search-scraper): search results, Best Sellers and product details from Amazon · [AliExpress Search Scraper](https://apify.com/xmolodtsov/aliexpress-search-scraper): aliExpress products by keyword with prices, orders and shipping

**Maps & leads:** [Google Maps Scraper](https://apify.com/xmolodtsov/google-maps-scraper): places, leads and emails from Google Maps

**Ads:** [Facebook Ad Library Scraper (Meta Ads Library)](https://apify.com/xmolodtsov/facebook-ads-library-scraper): ads from the Meta Ad Library, with EU reach and payers

**Video:** [YouTube Transcript Scraper](https://apify.com/xmolodtsov/youtube-transcript-scraper): transcripts, subtitles and captions from YouTube videos · [YouTube Shorts Scraper](https://apify.com/xmolodtsov/youtube-shorts-scraper): Shorts of any channel with exact views, likes and duration · [YouTube Channel Scraper](https://apify.com/xmolodtsov/youtube-channel-scraper): every video of a channel, with channel stats · [YouTube Search Scraper](https://apify.com/xmolodtsov/youtube-search-scraper): search results and videos for any keyword · [YouTube Comments Scraper](https://apify.com/xmolodtsov/youtube-comments-scraper): comments, replies and likes from any video

### FAQ

#### Does a text ad always include text?

No. Google often publishes text creatives as rendered images. Those records have image links and null text. This build links to HTML previews and images; it does not fetch their text.

#### Why does a domain return multiple advertisers?

Regional companies and agencies may advertise the same destination domain. Each row keeps the actual advertiser ID and name Google returned, so you can group or filter them later.

#### Is it legal to scrape Google Ads Transparency data?

This Actor collects only publicly accessible ad-library data. It does not log in, collect private accounts or enrich personal contact details. Your use of the data should respect the source's terms and applicable privacy rules. Advertiser records can still contain personal data for individuals or sole traders; review your processing obligations, including GDPR/CCPA where applicable, before storing or redistributing it.

#### Does the Actor estimate clicks, conversions or budgets?

No. It returns published fields and ranges. Missing numbers remain null. A preview or long run duration does not establish ad performance.

### Support

Use the Actor's Apify Issues tab to report a problem. Include your run ID, target type and expected behavior. Avoid including API tokens, proxy passwords or private account information.

# Changelog

This Actor's version history is a separate document: https://apify.com/xmolodtsov/google-ads-transparency-scraper/changelog.md

# Actor input Schema

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

Exact advertiser names or AR IDs. Ambiguous names return candidate IDs in the log; use a domain or AR ID to select precisely. You may combine this list with domains.

## `domains` (type: `array`):

Domains such as nike.com. Search all advertisers with creatives pointing to each domain. Full website URLs are normalized to their hostname.

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

Filter by country where the ad was shown. ALL means anywhere; this is separate from the proxy exit country.

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

Optional inclusive activity-overlap start date, YYYY-MM-DD. Ads first shown earlier may still match if active during the period.

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

Optional inclusive activity-overlap end date, YYYY-MM-DD. Must not precede the start date.

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

Server-side text, image or video filter. Text ads can be rendered as images and then have no extractable text.

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

Global maximum across all targets. Free Apify plans: 100 items per run and 20 runs per UTC calendar month, limits set by the developer. Paid plans remove the free-plan caps.

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

Fetch variations, per-country dates and impressions where Google publishes them. Does not fetch preview pages or OCR images; previewText remains null. Uses one extra request per creative.

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

Defaults to Apify RESIDENTIAL US. Select another residential country if needed. Datacenter is an explicit alternative with higher observed CAPTCHA risk. Free runs use Apify Proxy unless you supply your own proxy URLs. Proxy mode never changes silently.

## Actor input object example

```json
{
  "domains": [
    "nike.com"
  ],
  "region": "ALL",
  "format": "all",
  "maxItems": 5,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

Unique public Google ad creatives with advertiser identity, dates, format, previews and optional regional details.

# 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 = {
    "domains": [
        "nike.com"
    ],
    "maxItems": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("xmolodtsov/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 = {
    "domains": ["nike.com"],
    "maxItems": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

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

```

## MCP server setup

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