# Google Ads Transparency Scraper (`devilscrapes/google-ads-transparency`) Actor

Google Ads Transparency Scraper: scrape ad creatives from the Google Ads Transparency Center by advertiser domain or advertiser ID — creative, format, regions, first/last shown, landing URL — export to JSON or CSV. A Google Ads Transparency API alternative. You pay only for ads that land.

- **URL**: https://apify.com/devilscrapes/google-ads-transparency.md
- **Developed by:** [DevilScrapes](https://apify.com/devilscrapes) (community)
- **Categories:** SEO tools, Automation, Lead generation
- **Features:** Limited permissions
- **Stats:** 136 total users, 24 monthly users, 99.6% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.64 / 1,000 ad creative scrapeds

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

The **Google Ads Transparency Center Scraper** exports every ad a brand or competitor runs on Google Search, YouTube, Display, Shopping, Maps and Play. Give it a domain such as `nike.com` or an advertiser ID, and it returns one row per ad creative: advertiser, creative ID, format, landing domain, first and last shown dates, impressions and preview URLs. Download the dataset as JSON, CSV or Excel, or call it as an API. Google publishes no official API for the Transparency Center; this Actor is the data export it does not offer.

**$0.20 per run plus $0.003 per ad** ($3.20 per 1,000 ads). A run that Google never answers is not charged.

[![Watch the demo](https://i.ytimg.com/vi/qwE60PX9KQA/hqdefault.jpg)](https://youtu.be/qwE60PX9KQA)

**[Full tutorial (2 min)](https://youtu.be/qwE60PX9KQA)** · **[50-second demo (Short)](https://www.youtube.com/shorts/48194R8Ag-4)**

### What data can you extract from Google Ads Transparency Center?

One row per ad creative, with these fields:

| Field | Type | What it holds |
|---|---|---|
| `advertiser_id` | string | Google's stable advertiser identifier (`AR…`) |
| `advertiser_name` | string | Public brand name of the advertiser |
| `creative_id` | string | Stable per-ad identifier (`CR…`) |
| `creative_url` | string | Link to the ad in the Transparency Center |
| `landing_domain` | string | Domain the ad clicks through to |
| `format_type` | integer | 1 text, 2 image, 3 video (inferred) |
| `first_shown_ts` | integer | First observed impression, Unix seconds |
| `last_shown_ts` | integer | Last observed impression, Unix seconds |
| `impressions` | integer | Impression count Google reports |
| `preview_image_url` | string or null | Thumbnail of an image ad |
| `preview_content_js_url` | string or null | Preview bundle of a video or rich ad |
| `region` | string | The region label you passed (display only) |
| `scraped_at` | string | ISO 8601 UTC timestamp |

Turn on **domain screening mode** and you get one row per input domain instead: does it run Google Ads, roughly how many, since when.

### Google Ads Transparency Center scraper features

- **Search by domain or advertiser ID.** Paste brand domains, advertiser IDs or both. Dozens of targets fit in one run.
- **Deduplicated batches.** An ad that appears under two of your targets is written and billed once.
- **Competitor ad history.** First and last shown dates tell you which creatives a competitor has kept running for months and which it dropped after a week.
- **Bulk domain screening.** Check a prospect list or a brand portfolio for Google Ads activity in one run, billed per domain rather than per ad.
- **Clean, typed rows.** Every field is validated before it reaches the dataset, and the output is tested against real image, video and minimal creatives before each release.
- **Automatic retries and optional proxy support.** Temporary refusals from Google are retried; Apify Proxy is on by default and you can supply your own.
- **Works with your tools.** Export to JSON, CSV, Excel or JSONL, call it through the Apify API, schedule it, or use it from Claude, ChatGPT or Cursor through Apify's MCP server.

### What can you use Google Ads Transparency data for?

- **Competitor ad monitoring.** Pull a competitor's ads every week and diff the creative set to see what launched and what was paused.
- **Agency reporting.** Show a client exactly which ads its rivals run before the quarterly review, with impressions and dates.
- **Trademark and brand protection.** Find advertisers whose landing domain does not match their name, or who run ads against your brand.
- **Affiliate compliance.** Spot affiliates advertising where your terms forbid it.
- **Market research.** Measure how crowded a vertical is and which formats dominate it.
- **Lead qualification.** Screen a list of domains for Google Ads activity before you pitch them.
- **AI and RAG pipelines.** Feed creative metadata and image URLs into a vector store for image-grounded competitive analysis.

### How to scrape Google Ads Transparency Center

1. Click **Try for free** on this page.
2. Paste one or more **brand domains** (`nike.com`, `adidas.com`), one per line.
3. Optionally add **advertiser IDs** (`AR…`, found in the Transparency Center URL of an advertiser).
4. Optionally set a **date window**. The default is the last 365 days.
5. Optionally turn on **domain screening mode** for one summary row per domain.
6. Click **Start**. When the run finishes, download the dataset from the Storage tab or fetch it through the API.

Apify's free plan includes $5 of monthly platform credit, which covers one run of about 1,600 ads at the prices below.

### How much does it cost to scrape Google Ads Transparency Center?

Pay-per-event pricing with two events:

| Event | Price | When it is charged |
|---|---:|---|
| Run start | **$0.20** | Once per run, the first time Google answers the search |
| Ad creative | **$0.003** | Per ad written to the dataset |

| Pull | Cost |
|---|---:|
| 100 ads | $0.50 |
| 1,000 ads | $3.20 |
| 10,000 ads | $30.20 |
| 100,000 ads (monthly competitor sweep) | $300.20 |

The run start fee is owed once Google answers, whether it returns 500 ads or none. If Google never answers (a blocked exit IP, a rate limit, an outage), the run ends as a failure and costs **$0.00**.

In **domain screening mode** the ad event is charged once per screened domain or advertiser, not per ad. Screening 50 domains costs $0.20 plus 50 × $0.003, about **$0.35**, however many ads each domain runs.

### Google Ads Transparency Center scraper input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `searchDomains` | array of strings | one of | `["nike.com"]` | Brand landing domains |
| `advertiserIds` | array of strings | one of | `[]` | Google advertiser IDs (`AR…`) |
| `region` | string | no | `anywhere` | Label only. Google does not filter results by region (see Limitations) |
| `dateFrom` | `YYYY-MM-DD` | no | 365 days ago | Start of the ad activity window |
| `dateTo` | `YYYY-MM-DD` | no | today (UTC) | End of the window |
| `maxResults` | integer | no | `1000` | Total rows across all targets. `0` means unlimited |
| `maxPages` | integer | no | `25` | Result pages per target, about 40 ads each |
| `proxyConfiguration` | proxy config | no | Apify Proxy on | Your own proxies work too |
| `screeningMode` | boolean | no | `false` | `true` gives one row per domain instead of one per ad |

At least one of `searchDomains` or `advertiserIds` must contain an entry.

```json
{
  "searchDomains": ["nike.com", "adidas.com"],
  "advertiserIds": ["AR03012025048987521025"],
  "dateFrom": "2025-11-15",
  "dateTo": "2026-05-15",
  "maxResults": 5000,
  "maxPages": 25,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Google Ads Transparency Center data output

One ad creative per row:

```json
{
  "advertiser_id": "AR18378488041124659201",
  "advertiser_name": "Nike Retail BV",
  "creative_id": "CR15771942603307614209",
  "creative_url": "https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR15771942603307614209?region=anywhere",
  "landing_domain": "nike.com",
  "format_type": 1,
  "first_shown_ts": 1761145807,
  "last_shown_ts": 1778871417,
  "impressions": 205,
  "preview_image_url": "https://tpc.googlesyndication.com/archive/simgad/12774179880874022668",
  "preview_content_js_url": null,
  "region": "anywhere",
  "scraped_at": "2026-05-15T19:17:59+00:00"
}
```

With `screeningMode: true`, one row per input domain. A domain with no ads is a normal successful row, not an error:

```json
{
  "domain": "nike.com",
  "has_ads_detected": true,
  "ad_count": 40,
  "first_seen_ts": 1761145807,
  "last_seen_ts": 1778871417,
  "sample_creative_url": "https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR15771942603307614209?region=anywhere"
}
```

Export as JSON, CSV, Excel or JSONL from the Storage tab, or fetch items with `GET /v2/datasets/{datasetId}/items`. Sort by `impressions` to find the ads a competitor spends the most on.

### Limitations

- **Region is a label, not a filter.** Google returns the same ads whatever region you pass. The field exists so you can tag exports by intended market.
- **No browse-by-country mode.** You must supply a domain or an advertiser ID. There is no "all ads in Germany" query on Google's side.
- **Video and rich ads give a preview bundle URL, not a video file.** Rendering the actual frame needs a browser downstream.
- **About 12 months of history.** Google keeps roughly a year of ads; older date windows are clipped to that.
- **Large advertisers stop at about 1,000 ads per query.** Google stops answering past that point. The default `maxPages` of 25 is deliberately conservative; raise it for fuller pulls knowing the ceiling exists.
- **Screening mode counts are a floor.** `ad_count` counts the ads actually pulled within `maxPages` and `maxResults`, so a domain may run more.

### FAQ

#### How do I see all the ads a competitor runs on Google?

Enter the competitor's domain, run the Actor and open the dataset. Each row is one ad with its format, landing domain, impressions and the dates it was first and last shown. For a changing picture, schedule a weekly run and compare creative IDs between runs.

#### Is there a Google Ads Transparency Center API?

Google does not publish one. This Actor is the closest thing: start it through the Apify API with `POST /v2/acts/DevilScrapes~google-ads-transparency/run-sync-get-dataset-items` and the ads come back in the response, or run it from an Apify schedule, webhook, Make, Zapier or n8n.

#### Is it legal to scrape the Google Ads Transparency Center?

The Transparency Center is a public registry that Google operates under EU and US advertising rules. The Actor reads only what the public site shows, at a polite pace, without logging in, and collects advertiser-level metadata rather than personal data. Check the rules that apply to your own use of the data.

#### Is this a Google Ads Library scraper?

Yes. "Google Ads Library" is what many people call the Google Ads Transparency Center, by analogy with Meta's Ad Library. Same registry, same data.

#### Can I filter ads by country?

No. Google's results are the same for every region, so the `region` field only labels your export. If Google adds a working region filter, this Actor will expose it.

#### Why do some rows have no preview image?

Video, animated and rich ads are rendered by Google from a script bundle, so they carry `preview_content_js_url` instead of `preview_image_url`. Static image ads have a direct thumbnail.

#### Why do I get fewer ads than Google's total?

Google stops serving results at about 1,000 ads per query. Raising `maxPages` helps up to that ceiling; splitting a large advertiser by date window helps further.

#### Can I check many domains for Google Ads activity at once?

Yes. Turn on `screeningMode` and give it the list. You get one row per domain with `has_ads_detected`, an `ad_count`, first and last seen dates and a sample ad, billed once per domain.

#### Can I use it from Claude, ChatGPT or Cursor?

Yes. Apify's MCP server exposes every public Actor to AI assistants, so you can ask your assistant to pull a competitor's Google ads and summarise them. The run is billed to your Apify account at the prices above.

#### How do I export to Google Sheets or a database?

Download CSV from the Storage tab for a one-off, or register a webhook on `ACTOR.RUN.SUCCEEDED` and let Make, Zapier or n8n append each run's dataset to a sheet or a table.

### More Devil Scrapes Actors

- [Meta Ad Library Scraper](https://apify.com/DevilScrapes/meta-ad-library-scraper): Facebook and Instagram ads by advertiser or keyword.
- [TikTok Ad Library Scraper](https://apify.com/DevilScrapes/tiktok-ad-library-scraper): TikTok's commercial content library.
- [Pinterest Ad Library Scraper](https://apify.com/DevilScrapes/pinterest-ad-library-scraper): Pinterest ads by advertiser.
- [Bing Ad Library Scraper](https://apify.com/DevilScrapes/bing-ad-library-scraper): Microsoft Advertising's ad library.
- [Apple Ad Repository Scraper](https://apify.com/DevilScrapes/apple-ad-repository-scraper): App Store Search Ads.

### Your feedback

Spotted a missing field or want a new feature? Open an issue on the [Apify Store listing](https://apify.com/DevilScrapes/google-ads-transparency). We read every one.

Built by **Devil Scrapes**. We do the dirty work so your dataset stays clean.

# Changelog

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

# Actor input Schema

## `searchDomains` (type: `array`):

List of advertiser landing-page domains to scrape. The scraper returns every ad pointing at each domain in the date window. Example: <code>nike.com</code>, <code>adidas.com</code>.

## `advertiserIds` (type: `array`):

Optional Google advertiser IDs (e.g. <code>AR0123456789</code>) to scrape instead of, or alongside, brand domains. Use when you already know the exact advertiser.

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

ISO-3166 alpha-2 country code or <code>anywhere</code>. Stored on each output row as metadata. <strong>Important</strong>: Google's SearchCreatives RPC ignores this on the server side — it does not narrow which ads come back. We expose it so you can tag exports by intended market.

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

Lower bound of the ad-activity window (<code>YYYY-MM-DD</code>). Leave empty to default to 365 days before <em>Date to</em>.

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

Upper bound of the ad-activity window (<code>YYYY-MM-DD</code>). Leave empty to default to today (UTC).

## `maxResults` (type: `integer`):

Total dataset items to keep across all targets. <code>0</code> disables the cap. Defaults to 1000.

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

Hard ceiling on RPC round-trips per domain/advertiser. Each page returns up to 40 creatives, so the default 25 covers up to 1 000 ads per target. Lift this only if a target trips the cap.

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

Apify Proxy is recommended — Google does not aggressively block this endpoint, but sticky sessions help cookie continuity across pagination. Default uses the account's available proxy groups; specify <code>RESIDENTIAL</code> on paid plans for the cleanest exit IPs.

## `screeningMode` (type: `boolean`):

When enabled, emit ONE row per input domain/advertiser instead of one row per creative — <code>domain</code>, <code>has_ads_detected</code>, <code>ad_count</code>, <code>first_seen_ts</code>, <code>last_seen_ts</code>, <code>sample_creative_url</code>. Aggregated over the same search, no extra request. Useful for bulk-checking a list of domains for Google Ads activity without paying per creative. A domain with zero ads still finishes as a successful run with <code>has_ads_detected: false</code>. Default off — existing per-creative runs and schedules are unaffected.

## Actor input object example

```json
{
  "searchDomains": [
    "nike.com"
  ],
  "advertiserIds": [],
  "region": "anywhere",
  "dateFrom": "2025-11-15",
  "dateTo": "2026-05-15",
  "maxResults": 10,
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "screeningMode": false
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Full set of scraped ad creatives — one item per ad. Streamed JSON via the Apify dataset API. When screeningMode=true, this dataset instead holds one row per screened domain/advertiser (see the README's Output section).

## `datasetItemsCsv` (type: `string`):

Same data, CSV export. Drop straight into a spreadsheet or warehouse loader.

## `datasetView` (type: `string`):

Open the run's dataset in the Console with the Overview view applied.

# 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 = {
    "searchDomains": [
        "nike.com"
    ],
    "advertiserIds": [],
    "maxResults": 10,
    "maxPages": 1,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/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 = {
    "searchDomains": ["nike.com"],
    "advertiserIds": [],
    "maxResults": 10,
    "maxPages": 1,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/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 '{
  "searchDomains": [
    "nike.com"
  ],
  "advertiserIds": [],
  "maxResults": 10,
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call devilscrapes/google-ads-transparency --silent --output-dataset

```

## MCP server setup

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