# Google Ads Transparency Center Scraper & API (`insights_data/google-ads-transparency-center-scraper-api`) Actor

Google Ads Transparency Center scraper & API: extract ads across Search, YouTube, Shopping, Maps & Play by brand, domain or advertiser ID. No login. Competitor ad intelligence, monitor mode & export JSON/CSV/Excel.

- **URL**: https://apify.com/insights\_data/google-ads-transparency-center-scraper-api.md
- **Developed by:** [Insights Data](https://apify.com/insights_data) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

### What does Google Ads Transparency Center Scraper & API do?

> **Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Google LLC or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "Google Ads Transparency Center" is referenced only to describe the publicly available website this Actor collects data from.

This **Google Ads Transparency Center scraper** turns [adstransparency.google.com](https://adstransparency.google.com) into clean, structured JSON you can call like a **Google Ads Transparency Center API**. Paste a brand name, domain, advertiser ID, or Transparency Center URL — then extract every public creative across Search, YouTube, Shopping, Maps, and Play. No login, no cookies, no Google account. ✅

Use it as a **Google Ads scraper**, **ad transparency scraper**, **Google ad spy tool**, or full **competitor ad intelligence** workflow: build swipe files, run **PPC competitor research**, or schedule a standing **brand ad tracker** for new launches.

Open it in [Apify Console](https://console.apify.com), paste your targets, hit **Start** — results stream into your dataset as they arrive.

#### ✨ What can this Google Ads scraper do?

- 🔗 **One smart `urls` field** — mix brand names, domains, `AR…` advertiser IDs, `AR…/CR…` creative pairs, and pasted Transparency Center URLs in one bulk list
- 🎯 **Two scrape modes** — individual ad creatives, or fast advertiser summaries via the built-in **advertiser lookup tool**
- 🌍 **Rich filters** — region, platform (Search / YouTube / Shopping / Maps / Play), ad format, and date window
- 🔬 **Optional deep detail** — A/B creative variations and per-country last-shown history for true **ad creative intelligence**
- 🗳️ **Political ad transparency** — spend/impression ranges and regional political reach when Google publishes them
- 👁️ **Monitor mode** — scheduled runs return only new ads, turning this into a standing **ad monitoring tool** / **brand ad tracker**
- 🗂️ **Per-section output views** — Ad Creatives · Advertiser Summaries · Pagination & Stats · Disapproved Ads
- ⚡ **Live results + combined file** — dataset rows land as they scrape, plus one `OUTPUT` JSON array for a classic single-file download
- 🧩 **Apify platform powers** — scheduling, monitoring, API access, MCP, webhooks, and 1,000+ integrations

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

| 🗂️ Section | 📌 What you get |
|---|---|
| 📰 Ad creatives | Creative ID, advertiser, domain, format, first/last shown, image/preview URLs, region, customer/ad-group IDs when available |
| 🔬 Full detail (optional) | Every A/B variation + `regionsShown` country history — the core of **ad creative intelligence** |
| 📋 Advertiser summaries | Advertiser ID/name, approximate ad-count bounds, billing country, Transparency Center URL |
| 🗳️ Political ads | Spend/impression ranges and per-region political reach when exposed |
| 🧯 Disapproved ads | Site-wide policy-rejected creatives feed (optional) |
| 📑 Pagination & stats | Match counts and `nextPageToken` to resume large scrapes |

As a **Google Ads competitor analysis** tool it also works as a **YouTube ads scraper**, **Google Shopping ads scraper**, and **Google Display Network ads scraper** in one pass — filter by platform or pull all surfaces together.

### 🌟 Why scrape Google Ads Transparency Center?

Google does **not** ship an official commercial **Google Ads Transparency Center API**. Teams still need to **download competitor ad creatives**, track messaging, and monitor markets. This **ad library scraper** is a practical API alternative for:

- 🕵️ **Competitor ad intelligence** and **competitor ad monitoring** across Search, Display, and YouTube
- 📊 **PPC competitor research** — see formats, longevity, and creative angles rivals test
- 🎨 Building a swipe file with an **ad creative scraper**
- 🔍 Lead checks — who actively advertises (**Google ads by domain** or brand name)
- 🗳️ **Political ad transparency** research with spend/impression buckets
- 🔔 Standing alerts via a scheduled **ad monitoring tool**

### 🚀 How to scrape Google ads (Apify Console)

1. Open **Google Ads Transparency Center Scraper & API** in [Apify Console](https://console.apify.com)
2. Paste brands, domains, advertiser IDs, or URLs into **urls** (bulk paste supported)
3. Choose **Ad creatives** or **Advertiser summaries**, set region / platforms / format if needed
4. Optionally enable full creative details, political filters, monitor mode, or the disapproved-ads feed
5. Click **Start** and watch the Output table fill in real time
6. Export JSON / CSV / Excel / XML / RSS — or download the combined `OUTPUT` file from Storage

💡 Tip: looking up **Google ads by advertiser ID** or **Google ads by domain** uses the same field — the Actor auto-detects each line.

### 📥 Input

One field does almost everything:

```json
{
  "urls": ["Nike", "hellofresh.com", "AR16735076323512287233"],
  "resultType": "ads",
  "region": "US",
  "platforms": ["YOUTUBE", "SEARCH"],
  "adFormat": "VIDEO",
  "maxAdsPerSearch": 200,
  "includeDetails": false
}
```

| Field | Description |
|---|---|
| 🔗 `urls` *(required)* | Brand names, domains, `AR…` IDs, `AR…/CR…` pairs, or Transparency Center URLs — mixed freely. Powers both a quick **Google ad spy tool** pass and bulk **ad transparency scraper** runs. |
| 🎯 `resultType` | `"ads"` (creatives) or `"advertisers"` (summaries / **Google Ads competitor analysis** ad-check). |
| 🌍 `region` | Two-letter country code or `"ANYWHERE"`. |
| 📱 `platforms` / 🖼️ `adFormat` / dates | Filter Search, YouTube, Shopping, Maps, Play; TEXT / IMAGE / VIDEO; shown-after / shown-before. |
| 🗳️ `political` (+ impression ranges, candidate keyword) | **Political ad transparency** mode. |
| 📦 `maxAdsPerSearch` / `maxAdvertisersPerQuery` | Volume caps per target / brand query. |
| 🔬 `includeDetails` | Deep **ad creative intelligence** (variations + countries). |
| 🧯 `includeDisapprovedAds` | Site-wide rejected creatives feed. |
| 👁️ `onlyNewAds` (+ `monitorStoreName`) | **Brand ad tracker** / **ad monitoring tool** — only unseen ads. |
| Advanced | `pageToken`, sort options, `urlsFromFile`, raw payload, snake\_case aliases. |

See the **Input** tab for every field with helpful defaults.

### 📤 Output

Results stream live into the dataset (switch views in **Output**), plus one combined file:

- **📰 Ad Creatives** — one row per ad (core of the **Google Ads scraper**)
- **📋 Advertiser Summaries** — one row per advertiser (`resultType: "advertisers"`)
- **📑 Pagination & Stats** — match counts and resume tokens
- **🧯 Disapproved Ads** — when enabled
- **📄 `output.json` (combined)** — full run as one JSON array under key-value store **`OUTPUT`**:
  ```
  GET https://api.apify.com/v2/key-value-stores/{storeId}/records/OUTPUT
  ```

**Ad creative** example:

```json
{
  "recordType": "ad",
  "creativeId": "CR09405416287280037889",
  "advertiserId": "AR16735076323512287233",
  "advertiserName": "Nike, Inc.",
  "domain": "nike.com",
  "format": "IMAGE",
  "firstShown": "2022-11-30T15:26:06.000Z",
  "lastShown": "2026-06-10T00:00:00.000Z",
  "shownForDays": 898,
  "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/...",
  "width": 380,
  "height": 467,
  "googleCustomerId": "1287649103",
  "adGroupId": "181405790069",
  "adUrl": "https://adstransparency.google.com/advertiser/AR.../creative/CR...?region=US",
  "region": "US",
  "isNewSinceLastRun": true
}
```

With `includeDetails` on, each ad also carries `variations[]` and `regionsShown[]`.

**Advertiser summary** example:

```json
{
  "recordType": "advertiser",
  "advertiserId": "AR16735076323512287233",
  "advertiserName": "Nike, Inc.",
  "runsGoogleAds": true,
  "approxAdCountLowerBound": 10000,
  "approxAdCountUpperBound": 20000,
  "billingCountry": "US",
  "adUrl": "https://adstransparency.google.com/advertiser/AR...?region=US"
}
```

Unavailable string/list fields are `""` / `[]` (not `null`). Unmeasured numeric fields (impressions, spend) stay `null` with companion `hasXData` flags when applicable.

### 🤖 Use via API (Google Ads Transparency Center API style)

```bash
curl -X POST "https://api.apify.com/v2/acts/<YOUR_USERNAME>~google-ads-transparency-center-scraper-api/run-sync-get-dataset-items" \
     -H "Authorization: Bearer $APIFY_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{"urls": ["Nike"], "maxAdsPerSearch": 50}'
```

Clean, LLM-ready JSON — call this **Google Ads Transparency Center API** from Python, Node.js, Claude, ChatGPT, or agents via the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). Schedule runs, webhooks, and 1,000+ integrations (Sheets, Slack, Clay, n8n, warehouses).

### 🎯 Best use cases for this digital advertising research tool

- 🕵️ **Competitor ad intelligence** — creatives, formats, and run dates for full **Google Ads competitor analysis**
- 🔔 **Competitor ad monitoring** — schedule `onlyNewAds` as a **brand ad tracker**
- 📋 **Ad-check & lead generation** — `advertisers` mode as an **advertiser lookup tool** across company lists
- 🎨 **Creative & messaging research** — **ad creative scraper** for swipe files and hooks
- 🌐 **Cross-surface research** — combined **YouTube ads scraper**, **Google Shopping ads scraper**, and **Google Display Network ads scraper**
- 🗺️ **Geographic reach** — per-country history with `includeDetails`
- 🗳️ **Political research** — dedicated **political ad transparency** filters
- 📈 **Digital advertising research tool** workflows — export to BI, CRM, or enrichment pipelines

### 🔗 Integrations & related Actors

| Actor | What it helps with |
|---|---|
| [Y Combinator Scraper](https://apify.com) | YC companies, founders, jobs, and Launch YC data for startup ICP and outreach lists |

Need a custom pipeline (multi-network ad library, enrichment, CRM sync, or private competitor dashboards)? Email **hello.insights.data@gmail.com**.

### ❓ FAQ

#### Is this a real Google Ads Transparency Center API?

There is no official commercial API from Google. This Actor is a purpose-built **Google Ads Transparency Center scraper** that returns the same public data as structured JSON you can call like an API.

#### Do I need a Google account or cookies?

No. This **Google ad spy tool** reads the public Transparency Center only.

#### Can I get one combined file instead of the dataset table?

Yes — every run also saves a single JSON array to the key-value store **`OUTPUT`** key.

#### Why are some fields empty strings instead of null?

Empty string/array means “not available for this ad.” A few unmeasured numeric fields stay `null` with `hasXData` companions.

#### Can I resume a large paginated search?

Yes — copy `nextPageToken` from a Pagination & Stats row into `pageToken` on the next run.

#### Can I look up Google ads by domain and by advertiser ID in one run?

Yes. Mix domains, `AR…` IDs, brand names, and URLs in `urls` — **Google ads by domain** and **Google ads by advertiser ID** use the same input.

#### Can I get results in Python or JavaScript?

Yes. Use the Apify API / SDKs to pull ad data into Python, Node.js, or any HTTP client — the same pattern as calling a lightweight **Google ad transparency scraper** API.

#### Is scraping Google Ads Transparency Center allowed for research?

The Actor collects only publicly available Transparency Center pages. Use the data responsibly and in line with Google’s terms and applicable laws. For compliance questions on a custom deployment, contact **hello.insights.data@gmail.com**.

### 🛟 Support & custom solutions

Bugs or feature ideas? Open an issue on this Actor’s **Issues** tab in Apify Console, or visit the [Apify help center](https://help.apify.com/).

For custom scrapers, multi-platform **competitor ad intelligence** stacks, scheduled **ad monitoring tool** deployments, or enterprise exports, email **hello.insights.data@gmail.com** — we build tailored solutions on top of this Actor.

***

*Data is collected only from Google’s publicly available Ads Transparency Center. Intended for legitimate competitor research, creative analysis, political transparency research, and digital advertising research.*

# Actor input Schema

## `urls` (type: `array`):

✨ The one field you need. Add one entry per line — the actor auto-detects what each one is: a 🏷️ brand name (e.g. "Nike"), a 🌐 exact domain (e.g. "nike.com"), an 🆔 advertiser ID (e.g. "AR16735076323512287233"), an 🔗 advertiser ID + creative ID pair for a single-ad lookup (e.g. "AR16735076323512287233/CR09405416287280037889"), or a 📋 pasted Transparency Center URL (advertiser / creative / domain / search page). Supports bulk paste — add as many as you like.

## `resultType` (type: `string`):

📰 "Ad creatives" returns individual ads. 📋 "Advertiser summaries" returns one row per advertiser with approximate ad counts — perfect for a quick "does this company run Google Ads?" check across many brands.

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

Two-letter ISO 3166-1 country code (e.g. "US", "GB", "DE", "NL") to scope results, or "ANYWHERE" to search every region at once.

## `platforms` (type: `array`):

Restrict to ads served on specific Google surfaces. Leave empty for all. Only applies to ads shown on/after 2023-09-04.

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

Filter by creative format.

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

Only ads shown on or after this date.

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

Only ads shown before this date.

## `political` (type: `boolean`):

Filter to political & election ads. Unlocks spend ranges and per-region political reach data that ordinary commercial ads don't have.

## `impressionRanges` (type: `array`):

Only return ads/advertisers whose (mostly political) impressions fall in these bucketed ranges. Leave empty for no filter.

## `candidateNameKeyword` (type: `string`):

Only used together with 'Political/election ads only' — filters to ads mentioning this candidate's name.

## `maxAdsPerSearch` (type: `integer`):

Maximum ad creatives to collect for each resolved target (advertiser/domain).

## `maxAdvertisersPerQuery` (type: `integer`):

When a brand name (not an exact domain/ID) resolves to several matching advertisers, how many of the top matches to scrape.

## `pageToken` (type: `string`):

Paste a previous run's 'meta' record nextPageToken here to resume pagination for a single target instead of starting over. Leave empty for a normal first-page run.

## `sortBy` (type: `string`):

How returned ads are ordered.

## `sortDescending` (type: `boolean`):

Newest/highest first when checked.

## `advertiserSortBy` (type: `string`):

Only used in 'Advertiser summaries' mode.

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

Adds one extra request per ad to include every A/B creative variation plus 'regionsShown' — the full list of countries the ad ran in with per-country last-shown dates. Slower, and billed per ad via a separate event.

## `detailConcurrency` (type: `integer`):

How many per-ad detail requests run in parallel when 'Fetch full creative details' is on. Higher = faster but more aggressive. No effect otherwise.

## `includeDisapprovedAds` (type: `boolean`):

Pulls Google's site-wide, rolling feed of recently policy-rejected ad creatives (not scoped to your targets) into its own output section.

## `onlyNewAds` (type: `boolean`):

Output only ads not seen in previous runs. The actor remembers every ad it has seen in a named key-value store, so a scheduled (daily/weekly) run returns just newly-launched ads. The first run seeds the memory and returns everything.

## `monitorStoreName` (type: `string`):

Name of the store that remembers seen ad IDs across runs. Use a distinct name per monitored target so histories don't mix.

## `urlsFromFile` (type: `string`):

Paste extra URLs (one per line), OR a link to a .txt/.csv file or Google Sheet containing them — merged in on top of the 'urls' field above.

## `includeRawData` (type: `boolean`):

Attaches the raw decoded upstream data to each result for debugging. Off by default to keep records lean.

## `legacyKeyAliases` (type: `boolean`):

Also emit snake\_case field aliases (creative\_id, advertiser\_name, image\_url, ...) alongside the primary camelCase fields, for drop-in compatibility with tools built against that shape.

## `includeMeta` (type: `boolean`):

Emits one extra 'meta' row per target with pagination/match-count bookkeeping (visible in its own 'Pagination & Stats' output view).

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a single upstream response before treating it as failed.

## `maxRetries` (type: `integer`):

How many times a single failed request is retried (with backoff) before giving up on it.

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

How many targets (advertisers/domains/brand queries) are scraped at the same time.

## `httpMaxConcurrency` (type: `integer`):

Maximum number of HTTP requests in flight at once across the whole run, regardless of target concurrency.

## `requestDelay` (type: `number`):

A real global minimum pace shared by every concurrent request — raise this if you see rate-limit warnings in the log.

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

🚦 Default is NO proxy — the actor talks to Google directly. If a request ever gets rejected or blocked, it automatically escalates step-by-step: 🚫 no proxy → 🖥️ datacenter proxy → 🏠 residential proxy (retrying up to 3× on residential), and then sticks with residential for the rest of the run. Every escalation is logged clearly. Force a tier yourself here if you already know what a target needs.

## Actor input object example

```json
{
  "urls": [
    "Nike",
    "hellofresh.com",
    "AR16735076323512287233"
  ],
  "resultType": "ads",
  "region": "US",
  "platforms": [],
  "adFormat": "ALL",
  "startDate": "2026-01-01",
  "endDate": "2026-06-01",
  "political": false,
  "impressionRanges": [],
  "maxAdsPerSearch": 10,
  "maxAdvertisersPerQuery": 5,
  "sortBy": "LAST_ACTIVITY_DATE",
  "sortDescending": true,
  "advertiserSortBy": "IMPRESSIONS",
  "includeDetails": false,
  "detailConcurrency": 6,
  "includeDisapprovedAds": false,
  "onlyNewAds": false,
  "monitorStoreName": "ads-transparency-monitor",
  "includeRawData": false,
  "legacyKeyAliases": true,
  "includeMeta": true,
  "requestTimeoutSecs": 30,
  "maxRetries": 3,
  "concurrency": 5,
  "httpMaxConcurrency": 8,
  "requestDelay": 0.2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every scraped record — ads, advertiser summaries, pagination bookkeeping and disapproved ads together, in scrape order.

## `adCreatives` (type: `string`):

Only individual ad creative records, with the ad-focused columns.

## `advertiserSummaries` (type: `string`):

Only advertiser-summary records (resultType: "advertisers"), with approximate ad-count columns.

## `paginationAndStats` (type: `string`):

Per-target bookkeeping rows: match counts and the next-page token for resuming pagination.

## `disapprovedAds` (type: `string`):

The site-wide, policy-rejected creatives feed, only populated when 'Also fetch disapproved ads feed' was on.

## `outputJson` (type: `string`):

Every record from this run in a single combined JSON array — the same shape as the original standalone script's output.json — saved to the run's key-value store under the 'OUTPUT' key.

# 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 = {
    "urls": [
        "nike.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("insights_data/google-ads-transparency-center-scraper-api").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 = {
    "urls": ["nike.com"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("insights_data/google-ads-transparency-center-scraper-api").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 '{
  "urls": [
    "nike.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call insights_data/google-ads-transparency-center-scraper-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,insights_data/google-ads-transparency-center-scraper-api"
        }
    }
}

```

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/bdmzdi9QG0NgkxkXM/builds/XVdL8lD5uVqAJN77c/openapi.json
