# Google Ads Transparency Center and Ad Library Scraper (`xenikii/google-ads-transparency-scraper`) Actor

Google Ads Transparency scraper: extract active ad creatives, copy, video/image assets, verified advertisers, days active, and EU reach.

- **URL**: https://apify.com/xenikii/google-ads-transparency-scraper.md
- **Developed by:** [Xenikii](https://apify.com/xenikii) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 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.

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 Center and Ad Library Scraper

Pass competitor domains (`monday.com`, `grammarly.com`), brand names, Google Advertiser IDs (`AR...`), or Transparency URLs to extract active **Google Search, Display, and YouTube ad creatives**, **verified advertiser legal entities**, **days active & evergreen status (`30+` days)**, **image and YouTube video assets**, and optional **EU Digital Services Act (DSA) country reach**.

### Key Capabilities

- **4 Input Formats in One Batch:** Mix bare domains (`"shopify.com"`), brand names (`"Notion"`), Google Advertiser IDs (`"AR05288677867637440513"`), and direct `/advertiser/AR.../creative/CR...` URLs.
- **Filter for Winning Evergreen Ads (`minDaysActive`):** Set `minDaysActive: 30` (or `60+`) to skip short-lived A/B tests and isolate profitable Search, Display, and YouTube creatives that competitors keep funding month after month.
- **Direct Media & Variation Extraction:** Captures high-resolution `simgad` creative images, direct `youtubeVideoIds` / `youtubeVideoUrls`, ad copy snippets when served as text, and creative size variations (`width` × `height`) at `$0` extra charge.
- **Optional EU DSA & Country Reach (`includeCountryReach`):** Enrich creatives with per-country impression windows (`countryStats`), `countriesServed`, and `targetingSignals` (`demographics`, `geographic`, `contextual`) disclosed under EU transparency rules.

### Who Is This For?

- **Performance Marketers & Paid Media Agencies:** Benchmark competitor Google Search and YouTube creative angles, ad formats (`TEXT`, `IMAGE`, `VIDEO`), and longevity before launching new campaigns.
- **Clay, n8n & B2B Outbound Teams:** Enrich prospect domains to verify active Google Ads spend, uncover the company's verified legal entity (`verifiedLegalName`), and prioritize high-budget advertisers.
- **Market & Brand Researchers:** Track multi-country rollouts and regional impression footprints across US, UK, EU, and LATAM markets.

### Input

```json
{
  "queries": ["grammarly.com", "shopify.com"],
  "maxAdsPerQuery": 25,
  "region": "ANYWHERE",
  "adFormat": "ALL",
  "minDaysActive": 30,
  "extractAdCopy": true,
  "includeCountryReach": false
}
```

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `queries` *(required)* | `string[]` | `["monday.com", "linear.app"]` | Company domains (`"grammarly.com"`), brand names (`"Notion"`), Advertiser IDs (`"AR..."`), or Transparency URLs. |
| `maxAdsPerQuery` | `integer` | `25` | Max ad creatives returned per query (`1–5000`), automatically paginated. |
| `region` | `string` | `"ANYWHERE"` | `"ANYWHERE"` or 2-letter ISO country code (`"US"`, `"GB"`, `"DE"`, `"FR"`, `"NL"`, `"CA"`, `"AU"`, `"ES"`, `"PL"`, `"BR"`, etc.). |
| `adFormat` | `string` | `"ALL"` | `"ALL"`, `"TEXT"`, `"IMAGE"`, or `"VIDEO"`. |
| `minDaysActive` | `integer` | `0` | Return only proven ads active for at least `N` days (e.g. `30` for evergreen winners). |
| `startDate` / `endDate` | `string` | `""` | Optional date window in `YYYY-MM-DD` format. |
| `extractAdCopy` | `boolean` | `true` | Extract creative variations, headlines/text snippets (when non-rasterized), banner `imageUrls`, and `youtubeVideoIds` (`$0` extra). |
| `includeCountryReach` | `boolean` | `false` | Optional per-creative lookup for per-country reach (`countriesServed`, `countryStats`) and EU DSA impression/targeting disclosures. |
| `maxAdvertisersPerBrand` | `integer` | `1` | Number of matching advertiser accounts scraped when querying by plain brand name (`1–10`). |
| `concurrency` | `integer` | `10` | Parallel worker concurrency (`1–30`). |
| `proxyConfiguration` | `object` | `undefined` | Optional proxy configuration. Works out of the box without manual setup. |

### Output

Each creative is pushed to the default **Dataset** (`JSON`, `CSV`, `Excel`, `Parquet`), and per-query totals are written to `SUMMARY` in the default **Key-Value Store**. Below is an untouched live output record for `"grammarly.com"`:

```json
{
  "query": "grammarly.com",
  "queryType": "domain",
  "status": "scraped",
  "advertiserId": "AR05288677867637440513",
  "advertiserName": "Superhuman Platform Inc.",
  "verifiedLegalName": "Superhuman Platform Inc.",
  "advertiserCountry": null,
  "advertiserUrl": "https://adstransparency.google.com/advertiser/AR05288677867637440513",
  "creativeId": "CR10808800124013117441",
  "previewUrl": "https://adstransparency.google.com/advertiser/AR05288677867637440513/creative/CR10808800124013117441",
  "targetDomain": "grammarly.com",
  "format": "VIDEO",
  "firstShownAt": "2026-08-21T22:10:18.000Z",
  "lastShownAt": "2026-11-03T18:06:52.000Z",
  "daysActive": 75,
  "isEvergreen": true,
  "headline": null,
  "description": null,
  "displayUrl": null,
  "callToAction": null,
  "textSnippets": [],
  "imageUrls": [
    "https://i.ytimg.com/vi/a2nYw3gao7E/hqdefault.jpg"
  ],
  "youtubeVideoIds": [
    "a2nYw3gao7E"
  ],
  "youtubeVideoUrls": [
    "https://www.youtube.com/watch?v=a2nYw3gao7E"
  ],
  "landingUrls": [],
  "variationsCount": 1,
  "variations": [
    {
      "headline": null,
      "description": null,
      "displayUrl": null,
      "callToAction": null,
      "textSnippets": [],
      "imageUrls": [
        "https://i.ytimg.com/vi/a2nYw3gao7E/hqdefault.jpg"
      ],
      "youtubeVideoIds": [
        "a2nYw3gao7E"
      ],
      "landingUrls": [],
      "width": null,
      "height": null
    }
  ],
  "totalImpressionsMin": null,
  "totalImpressionsMax": null,
  "targetingSignals": null,
  "countriesServed": [],
  "countryStats": [],
  "error": null,
  "scrapedAt": "2026-11-03T19:36:38.247Z"
}
```

### Pricing (Pay Per Event)

Queries with zero matching ads or invalid inputs cost **`$0`**, and creative asset extraction (`extractAdCopy: true`) is included in the base creative price.

| Event | Title | Price | Charged When |
| :--- | :--- | :--- | :--- |
| `actor-start` | Actor start | `$0.0005` | Once per run |
| `ad-scraped` | Ad creative | `$0.0018` (`$1.80 / 1,000`) | Per ad creative returned (includes variations, image URLs, YouTube video links, and days active) |
| `country-reach-enriched` | Regional reach report | `$0.0012` (`$1.20 / 1,000`) | Only when `includeCountryReach: true` enriches a creative with regional/EU DSA reach data |

- **1,000 ad creatives (`includeCountryReach: false`):** `$1.80` total (`~2,750` ads/month covered by Apify's `$5` Free plan credit).
- **1,000 ad creatives + regional/EU DSA reach (`includeCountryReach: true`):** `$3.00` total.
- Respects Apify's **Maximum total charge** cap and stops cleanly when reached.

### API, Clay, n8n & MCP Integration

```bash
curl -X POST "https://api.apify.com/v2/acts/xenikii~google-ads-transparency-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries": ["grammarly.com", "monday.com"], "maxAdsPerQuery": 25, "minDaysActive": 30}'
```

- **Clay / n8n Lead Scoring:** Pass `["{{Domain}}"]` with `maxAdsPerQuery: 10` to check whether an account is actively running Google Search or YouTube campaigns and retrieve its `verifiedLegalName`.
- **MCP (`mcp.apify.com`):** Works directly inside Claude Desktop, Cursor, and AI research agents as `xenikii/google-ads-transparency-scraper`.

### FAQ & Data Compliance

- **Why are `headline` and `description` sometimes `null` on `TEXT` or `VIDEO` creatives?** Google Ads Transparency Center renders many Search and Display creatives as archived `simgad` images (`imageUrls`) or unlisted YouTube videos (`youtubeVideoUrls`) rather than DOM text. When text strings are present in Google's payload, `headline`, `description`, and `textSnippets` are populated automatically; otherwise the full visual asset URL is returned in `imageUrls` / `youtubeVideoUrls`.
- **When are `totalImpressionsMin` / `totalImpressionsMax` populated?** Google discloses impression ranges and targeting category flags primarily for ads served in **European Union / EEA** member states under the EU Digital Services Act (DSA) when `includeCountryReach: true` is enabled.
- **GDPR & Public Transparency Compliance:** This Actor retrieves **publicly mandated corporate advertising disclosures** published on Google Ads Transparency Center (including EU DSA transparency records). It collects **zero personal user data (PII)**, zero end-user browsing data, and zero cookies tied to individuals.

### Other B2B Intelligence Actors

Combine these Actors in **Clay**, **n8n**, **Make**, or **MCP** to build a complete B2B signal and SEO stack:

| Actor | Best For | Pricing |
| :--- | :--- | :--- |
| **[Company Domain, Tech Stack & MX/DNS Enricher](https://apify.com/xenikii/company-domain-tech-stack-enricher)** | Resolve company names to domains, 12-category tech stacks, MX/SPF/DMARC & role contacts | `$2.50 / 1k` enriched domains |
| **[B2B Hiring Signals & Multi-ATS Job Scraper](https://apify.com/xenikii/company-career-ats-job-scraper)** | Extract hiring velocity, salary transparency & open roles across 7 ATS platforms | `$1.50 / 1k` job postings |
| **[Google Ads Transparency & Ad Library Scraper](https://apify.com/xenikii/google-ads-transparency-scraper)** *(This Actor)* | Spy on active Google Search, Display & YouTube creatives, days active & EU reach | `$1.80 / 1k` ad creatives |
| **[Broken Link, Sitemap & AI SEO (`llms.txt`) Auditor](https://apify.com/xenikii/broken-link-sitemap-llms-txt-auditor)** | Audit broken links, XML sitemaps, `GPTBot`/`ClaudeBot` rules & generate `llms.txt` | `$3.00 / 1k` audited websites |
| **[Google Trends Breakout & Comparison Scraper](https://apify.com/xenikii/google-trends-scraper)** | Track `+5,000%` breakout queries, multi-keyword share of search & live news trends | `$2.50 / 1k` keyword trend reports |

# Actor input Schema

## `queries` (type: `array`):

Accepts company domains ('monday.com', 'linear.app'), brand names ('Notion'), Google Advertiser IDs ('AR15972262369074085889'), or direct adstransparency.google.com URLs.

## `maxAdsPerQuery` (type: `integer`):

Maximum number of ad creatives returned per input query (1–5000).

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

Use 'ANYWHERE' for global coverage or a 2-letter ISO country code ('US', 'GB', 'DE', 'FR', 'NL', 'CA', 'AU', 'ES', 'IT', 'PL', 'BR', 'IN', 'JP', etc.).

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

Filter by creative format across Google Search, YouTube, Display, and Shopping.

## `minDaysActive` (type: `integer`):

Set to e.g. 30 to return only proven evergreen ads that an advertiser has kept running for 30+ days.

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

Optional start date filter in YYYY-MM-DD format (e.g. '2026-01-01').

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

Optional end date filter in YYYY-MM-DD format (e.g. '2026-12-31').

## `extractAdCopy` (type: `boolean`):

Parse full ad headlines, body descriptions, display URLs, CTAs, banner image URLs, and YouTube video IDs from creative previews (included in base ad price).

## `includeCountryReach` (type: `boolean`):

Perform an extra per-creative lookup to retrieve EU DSA impression ranges (totalImpressionsMin/Max), targeting signals, and countryStats breakdown.

## `maxAdvertisersPerBrand` (type: `integer`):

When a plain brand name (not a domain or AR... ID) is given, how many matching verified advertiser accounts to scrape (1–10).

## `concurrency` (type: `integer`):

Parallel HTTP worker concurrency for creative preview parsing (1–30).

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

Optional proxy settings. Works out of the box with automatic residential fallback when needed; if configuring manually for \*.google.com, use RESIDENTIAL.

## Actor input object example

```json
{
  "queries": [
    "monday.com",
    "linear.app"
  ],
  "maxAdsPerQuery": 25,
  "region": "ANYWHERE",
  "adFormat": "ALL",
  "minDaysActive": 0,
  "extractAdCopy": true,
  "includeCountryReach": false,
  "maxAdvertisersPerBrand": 1,
  "concurrency": 10
}
```

# Actor output Schema

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

No description

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

No description

# 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 = {
    "queries": [
        "monday.com",
        "linear.app"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("xenikii/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 = { "queries": [
        "monday.com",
        "linear.app",
    ] }

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

```

## MCP server setup

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