# Google Ads Transparency Center Scraper (`pulsedata/google-ads-transparency-scraper`) Actor

Extract every ad an advertiser runs on Google Search, YouTube, Display, Shopping, Maps & Play from the Ads Transparency Center. Search by name, domain, ID or URL. Formats, dates, days active, countries, EU impressions, YouTube IDs, images. $1/1k ads.

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

## Pricing

$1.00 / 1,000 ad scrapeds

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/platform/actors/running/actors-in-store#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 Center Scraper

Extract **every ad an advertiser is running or has run on Google** – Search, YouTube, Display, Shopping, Maps and Google Play – straight from the [Google Ads Transparency Center](https://adstransparency.google.com/). Search by **advertiser name, domain, advertiser ID or URL** and get clean, structured JSON with formats, first/last shown dates, days active, countries, EU impression ranges, targeting flags, YouTube video IDs and creative images.

Pure API scraper – no browser, fast, cheap and stable. **$1 per 1,000 ads, details and previews included.**

### What you get

| Field | Description |
|---|---|
| `advertiserId`, `advertiserName`, `advertiserCountry`, `advertiserLegalName`, `advertiserVerified` | Advertiser identity from the Transparency Center |
| `creativeId`, `url`, `advertiserUrl` | Stable IDs and links back to the Transparency Center |
| `format` | `TEXT`, `IMAGE` or `VIDEO` |
| `firstShown`, `lastShown`, `daysShown` | When the ad was first and last served and on how many days it was active |
| `previewImageUrl`, `previewUrl`, `imageUrls` | Rendered preview image (text/display ads) and all creative image assets |
| `youtubeVideoId`, `youtubeUrl` | The YouTube video behind video ads (also for App campaigns) |
| `destinationUrl`, `appId` | Landing page / app store ID when exposed in the preview |
| `regions[]` | Per country: first/last shown date, impression range (EU), impression range per platform (Search, YouTube, Shopping, Maps, Play) |
| `regionsShownIn` | Comma-separated list of country codes the ad was shown in |
| `euTotals` | Aggregated EU impression range and platform breakdown (DSA transparency data) |
| `targeting` | EU targeting criteria used: demographic, geographic, contextual – each with included/excluded flags |
| `topicId`, `variationsCount` | Google's topic label ID and number of creative variations |

Example item:

```json
{
  "advertiserId": "AR15589870916631265281",
  "advertiserName": "Zalando SE",
  "advertiserCountry": "DE",
  "advertiserVerified": true,
  "creativeId": "CR02366714687346704385",
  "url": "https://adstransparency.google.com/advertiser/AR15589870916631265281/creative/CR02366714687346704385?region=anywhere",
  "format": "TEXT",
  "firstShown": "2024-06-13T14:01:09.029Z",
  "lastShown": "2026-08-19T12:02:07.405Z",
  "daysShown": 788,
  "previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/13004201952535908299",
  "regionsShownIn": "NL, BE",
  "regions": [
    { "regionCode": "BE", "regionName": "Belgium", "impressionsLow": 15000, "impressionsHigh": 20000,
      "firstShown": "2024-06-13", "lastShown": "2026-08-19",
      "platforms": [ { "platform": "GOOGLE_SEARCH", "impressionsLow": 15000, "impressionsHigh": 20000 },
                     { "platform": "YOUTUBE", "impressionsLow": 1000, "impressionsHigh": 2000 } ] }
  ],
  "euTotals": { "impressionsLow": 15000, "impressionsHigh": 20000, "firstShown": "2024-06-13", "lastShown": "2026-08-19" },
  "targeting": { "demographic": { "included": true, "excluded": false },
                 "geographic": { "included": true, "excluded": true },
                 "contextual": { "included": true, "excluded": false } }
}
```

### Use cases

- **Competitor ad intelligence** – see every creative a competitor runs, how long it has been live (`daysShown` is a strong signal for winning ads), and in which countries.
- **Ad spend & reach estimation in the EU** – impression ranges per country and platform are disclosed for ads shown in the EU.
- **Creative research** – collect YouTube video IDs and image assets for swipe files or AI analysis.
- **Lead generation** – check which domains/companies are advertising on Google at all (pass a list of domains, set `maxAdsPerQuery` to 1).
- **Brand protection & compliance** – monitor who advertises with your brand terms or domain.

### Input

| Field | Type | Description |
|---|---|---|
| `queries` | array | Advertiser names (`Nike`), domains (`nike.com`), advertiser IDs (`AR16735076323512287233`) or Transparency Center URLs. One per line. |
| `region` | string | `anywhere` (default) or ISO country code: `US`, `DE`, `GB`, `FR`, … |
| `format` | select | `ALL`, `TEXT`, `IMAGE`, `VIDEO` |
| `platform` | select | `ALL`, `SEARCH`, `YOUTUBE`, `MAPS`, `PLAY`, `SHOPPING` |
| `startDate`, `endDate` | date | Only ads shown in this date range |
| `maxAdsPerQuery` | integer | Default 100. `0` = unlimited (big brands have 100k+ ads) |
| `advertiserMatch` | select | `best` (default) picks the largest advertiser matching a name, `all` scrapes every matching advertiser |
| `includeDetails` | boolean | Fetch per-ad details (regions, EU impressions, targeting). Default on. |
| `enrichPreviews` | boolean | Extract YouTube IDs, image assets and destination URLs from image/video previews. Default on. |
| `proxyConfiguration` | object | Apify Proxy is recommended; datacenter proxies normally work. |

Example input:

```json
{
  "queries": ["nike.com", "Zalando", "AR16735076323512287233"],
  "region": "DE",
  "format": "VIDEO",
  "maxAdsPerQuery": 500
}
```

### Pricing

Pay per event: **$0.001 per ad** ($1 per 1,000 ads). Details and preview enrichment are included – there are no extra events for details, advertisers or start. You only pay for ads actually returned.

### Tips

- Domains are the most precise query: `nike.com` returns ads whose landing page is on nike.com, across all Nike advertiser accounts.
- Names are resolved through the official advertiser suggestions. If the wrong advertiser is picked, use its `AR…` ID instead (visible in any Transparency Center URL) or set `advertiserMatch` to `all`.
- `daysShown` counts the days an ad was actually served – great for finding evergreen winners.
- Impression ranges and targeting are only disclosed for ads shown in the EU (Digital Services Act).
- Large advertisers can have hundreds of thousands of ads; combine `region`, `format`, `platform` and date filters to narrow down.

### Ready-made report from this actor

Don't want to run it yourself? We publish a ready-made analysis built with this exact actor: **[State of Google Advertising — DTC & Ecommerce 2026](https://pulsdata.gumroad.com/l/google-ads-dtc-2026/LAUNCH)** — 102 consumer brands, ~4,000 ads, channel-mix benchmarks and ad-longevity rankings as a PDF report + full CSV dataset (launch discount applied at the link).

### Integrations & API

Run it from the Apify Console, schedule it, or call it via API / the Apify SDKs. Datasets export to JSON, CSV, Excel, or connect to Google Sheets, Make, Zapier, n8n, Airbyte and more. Works as an MCP tool for AI agents.

### Legal

This actor only collects publicly available data from Google's Ads Transparency Center, which Google publishes precisely for transparency and research. Respect Google's terms and applicable law when using the data.

# Actor input Schema

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

One entry per line. Accepts: advertiser names (e.g. `Nike`), domains (e.g. `nike.com`), advertiser IDs (e.g. `AR16735076323512287233`), or Ads Transparency Center URLs (advertiser or search pages). Names are resolved to advertisers via the official suggestions; domains return ads pointing to that domain.

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

Only ads shown in this country. Use `anywhere` for all countries or an ISO 3166-1 alpha-2 code (`US`, `DE`, `GB`, `FR`, …).

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

Filter by creative format.

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

Filter by the Google surface where the ad was shown.

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

Only ads shown on/after this date, format `YYYY-MM-DD`.

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

Only ads shown on/before this date, format `YYYY-MM-DD`.

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

Stop after this many ads for each query. Set 0 for no limit (large advertisers can have tens of thousands of ads).

## `advertiserMatch` (type: `string`):

When a query is an advertiser *name*: `best` picks the single most relevant advertiser (largest matching one); `all` scrapes every suggested advertiser that contains the name.

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

Fetches the detail page of every ad: per-country first/last shown dates, EU impression ranges per country and platform, targeting flags and creative variations. One extra request per ad.

## `enrichPreviews` (type: `boolean`):

For image/video ads, fetches the creative preview and extracts the YouTube video ID, thumbnail and image asset URLs. One extra request per image/video ad.

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

Google blocks shared datacenter IPs quickly – keep Apify residential proxies (default). Only the small JSON API calls go through the proxy; creative previews are fetched directly, so proxy traffic stays tiny (~3 KB per ad).

## Actor input object example

```json
{
  "queries": [
    "nike.com"
  ],
  "region": "anywhere",
  "format": "ALL",
  "platform": "ALL",
  "maxAdsPerQuery": 100,
  "advertiserMatch": "best",
  "includeDetails": true,
  "enrichPreviews": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Ads stored in the default dataset (JSON/CSV/Excel via the dataset API).

# 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": [
        "nike.com"
    ],
    "region": "anywhere",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

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

```

## MCP server setup

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