# Google Ads Transparency: Search/YouTube/Display Ad Spy (`dltik/google-ads-transparency`) Actor

Scrape Google's public Ad Transparency Center: every Search, YouTube, Shopping, Maps and Play ad a brand runs. Start from a keyword (auto-resolves top advertisers) or an advertiser ID. Get creative HTML, image/video URLs, dates, formats, regions. For competitor spy, agencies, ad research.

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

## Pricing

$0.80 / 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/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

## Google Ads Transparency Scraper — Search/YouTube/Display Ad Spy

**Google Ads Transparency Scraper** extracts every Google Search, YouTube and Display ad an advertiser has run, straight from the **official Google Ad Transparency Center** (DSA-mandated public data). Search by keyword (auto-resolved to advertisers) or by advertiser ID. No login, no API key, no Chromium — pure HTTP, fast and cheap.

> 🔎 **Start from a keyword, not an advertiser ID.** Most Google ad scrapers force you to paste one advertiser URL at a time. This one takes a plain keyword (e.g. `crm`, `running shoes`), auto-resolves the **top advertisers** competing on it, and pulls their creatives across **Search, YouTube, Shopping, Maps and Play** — so you discover competitors you didn't even know to look for.

> ⭐ **Found this useful?** Click the **Bookmark** button at the top of [this page](https://apify.com/dltik/google-ads-transparency) — it's the single strongest signal that keeps this actor visible to others. Takes 1 click. No signup beyond your existing Apify account.

***

### What can Google Ads Transparency Scraper do?

- 🔍 **Search ads by keyword** — type a brand name, get top matching advertisers and their creatives
- 🎯 **Search ads by advertiser ID** — pull all ads from a specific advertiser (AR... ID from the Ad Transparency URL)
- 🌍 **Filter by region** — 13 countries supported (US, FR, GB, DE, IT, ES, CA, JP, BR, AU, MX, NL + numeric override for any)
- 🎬 **All formats covered** — Search ads, Display ads, YouTube video ads, plus image and text creatives
- 📅 **Dates included** — first shown / last shown timestamps per creative
- 🖼️ **Creative URLs** — embedded HTML, image URLs, video URLs (where present)
- ⚡ **Pure HTTP** — no browser, no Chromium, no proxy required by default. ~5s for 50 ads.

***

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

| Field | Description |
|-------|-------------|
| `advertiser_name` | Verified advertiser name |
| `advertiser_id` | Google's internal advertiser ID (AR...) |
| `creative_id` | Unique creative ID (CR...) |
| `format` | text, image, video |
| `format_code` | Google's numeric format code (1=text, 2=image, 3/6=video) |
| `html` | Embedded creative HTML snippet |
| `image_url` | Extracted image URL (when applicable) |
| `video_url` | Video URL (when applicable) |
| `first_shown` | ISO timestamp the creative first ran |
| `last_shown` | ISO timestamp the creative last ran |
| `region` | ISO country where the creative was shown |
| `region_id` | Google's internal region code |
| `variant_count` | Number of variants per creative |
| `creative_url` | Direct link to view the creative on the Ad Transparency Center |

***

### How to spy on Google ads

1. **[Create a free Apify account](https://apify.com/sign-up)** — no credit card required
2. **Open [Google Ads Transparency Scraper](https://apify.com/dltik/google-ads-transparency)** in Apify Store
3. **Enter a keyword** (e.g. `nike`, `salesforce`, `shopify`) — or paste advertiser IDs directly
4. **Pick a region** (default `US`)
5. **Click Start** — creatives stream into the dataset within seconds
6. **Download** as JSON, CSV, or Excel

***

### How much does it cost to spy on Google ads?

**$0.0008 per ad creative** ($0.80 per 1,000 ads). No surprise compute or proxy charges — the scraper is HTTP only and runs at 512 MB without any proxy.

| Run size | Creatives | Apify cost | Time |
|----------|-----------|------------|------|
| Quick test | 10 | ~$0.01 | ~5s |
| Standard | 50 | ~$0.05 | ~5s |
| Per advertiser | 100 | ~$0.10 | ~10s |
| Full sweep (5 brands × 100) | 500 | ~$0.50 | ~30s |

***

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `queries` | array | ❌\* | — | Brand names to search via the autocomplete (e.g. `["nike","adidas"]`) |
| `advertiserIds` | array | ❌\* | — | Direct advertiser IDs (e.g. `["AR02981058906626719745"]`) |
| `region` | string | ❌ | `US` | ISO country code (US, FR, GB, DE, …) or `ANYWHERE` |
| `regionId` | integer | ❌ | — | Advanced: override with Google's internal region ID |
| `topAdvertisersPerQuery` | integer | ❌ | `3` | Top N advertisers to scrape per keyword (autocomplete returns up to 10) |
| `maxResultsPerAdvertiser` | integer | ❌ | `50` | Cap on creatives per advertiser (Google's API caps at 100 per call) |
| `useResidentialProxy` | boolean | ❌ | `false` | Enable only if you hit rate limits on large runs |

> \*Provide at least one of `queries` or `advertiserIds`.

***

### Output example

```json
{
  "advertiser_id": "AR16735076323512287233",
  "advertiser_name": "Nike, Inc.",
  "creative_id": "CR10068536946902171649",
  "format": "image",
  "format_code": 2,
  "html": "<img src=\"https://tpc.googlesyndication.com/archive/simgad/14056061733995238543/" height=\"511\" width=\"724\">",
  "image_url": "https://tpc.googlesyndication.com/archive/simgad/14056061733995238543",
  "video_url": null,
  "first_shown": "2025-08-12T00:00:00Z",
  "last_shown": "2025-12-05T00:00:00Z",
  "region": "US",
  "region_id": 2250,
  "variant_count": 2,
  "creative_url": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR10068536946902171649"
}
```

***

### Use cases

- **Competitor ad spy** — see every Google ad a brand has run in the last year
- **Agency reporting** — track competitor creatives across Search, YouTube, Display in one feed
- **Dropshipping research** — find winning creatives by searching product / brand keywords
- **DSA compliance research** — pull the official transparency record for any advertiser
- **AI training data** — collect labeled creatives (format, advertiser, region) at scale

***

### Use the actor via API

**Python:**

```python
import requests

run = requests.post(
    "https://api.apify.com/v2/acts/dltik~google-ads-transparency/runs",
    headers={"Authorization": "Bearer YOUR_APIFY_TOKEN"},
    json={
        "queries": ["nike", "adidas"],
        "region": "US",
        "topAdvertisersPerQuery": 3,
        "maxResultsPerAdvertiser": 50
    }
).json()
print("Run started:", run["data"]["id"])
```

**curl:**

```bash
curl -X POST "https://api.apify.com/v2/acts/dltik~google-ads-transparency/runs" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries":["nike"],"region":"US","maxResultsPerAdvertiser":50}'
```

***

### FAQ

**Do I need a Google account or API key?**
No. The Ad Transparency Center is a public DSA transparency tool. The scraper hits its internal RPC directly — no login, no cookies, no token.

**Why does the scraper return at most 100 ads per advertiser?**
That's the Google Ad Transparency API's per-call cap. The public cursor isn't exposed, so to cover larger advertisers run queries by additional regions or date filters.

**Can I find an advertiser ID without the autocomplete?**
Yes — open the advertiser on https://adstransparency.google.com and copy the `AR...` ID from the URL into `advertiserIds`.

**Does the scraper need a proxy?**
No. The endpoint is public and accepts cold requests from Apify datacenter IPs. The residential-proxy toggle is provided only for very large or repeated runs.

**What's the difference vs Google's official Ad Transparency search?**
This actor returns the same data the official search shows, but in machine-readable JSON ready for spreadsheets, CRMs, BI tools, or AI pipelines.

***

### Connect with Make, Zapier & n8n

This actor integrates with any automation platform via the Apify API.

#### Make (Integromat)

1. Add an **Apify module** in your Make scenario
2. Select **Run Actor** → choose this actor
3. Configure the input (paste your JSON)
4. Add a **Get Dataset Items** module to retrieve results
5. Send creatives to Google Sheets, HubSpot, Slack, or any downstream app

#### Zapier

1. Use the **Apify integration** on Zapier
2. Trigger: **Actor Run Finished**
3. Action: **Get Dataset Items**
4. Pipe results into your CRM, email tool, or spreadsheet

#### n8n

1. Add an **HTTP Request** node to call the Apify API
2. POST to `https://api.apify.com/v2/acts/dltik~google-ads-transparency/runs`
3. Wait for completion, then fetch dataset items
4. Route results into any n8n node

***

⭐ **Found this Google Ads Transparency Scraper useful? Bookmark it** — Apify ranks actors by bookmarks, so it's the strongest single signal for Store visibility. One click = directly helps this actor stay surfaced.

### Other scrapers by dltik

| Actor | What it does | Price |
|-------|-------------|-------|
| [Facebook Ads Library Scraper](https://apify.com/dltik/facebook-ads-scraper) | Meta (Facebook + Instagram) ad library spy with DSA detail enrichment | $0.75/1K |
| [LinkedIn Ad Library Scraper](https://apify.com/dltik/linkedin-ad-library) | B2B competitor ad spy from LinkedIn's public Ad Library, DSA impressions | $2/1K |
| [TikTok Scraper](https://apify.com/dltik/tiktok-scraper) | Profiles, videos, hashtags, search, trending | $8/1K |
| [Trustpilot Scraper](https://apify.com/dltik/trustpilot-scraper) | Reviews, ratings, company profiles with sentiment | $0.50/1K |

# Actor input Schema

## `searchQuery` (type: `string`):

Single search query — paste an advertiser name (e.g. 'Nike') or an advertiser ID (e.g. 'AR02981058906626719745'). Strings starting with 'AR' are treated as direct IDs; everything else is resolved via the autocomplete to the top matching advertisers.

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

Advanced: multiple brand/advertiser names at once. Use this OR searchQuery, not both. Example: \['Nike','Adidas'].

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

Advertiser IDs from the Ad Transparency Center (e.g. 'AR02981058906626719745'). Skips the keyword lookup and fetches creatives directly. Find them in the URL on adstransparency.google.com.

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

ISO country code to filter ads by where they were shown (US, FR, GB, DE, IT, ES, CA, JP, AU, BR, MX, NL). Use 'ANYWHERE' for any region.

## `regionId` (type: `integer`):

Advanced: Google's internal region ID (e.g. 2250 = US, 2012 = FR). Overrides the ISO mapping above when set — use this for regions the ISO mapping doesn't know yet.

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

Filter by Google platforms. Note: the string → numeric mapping is reverse-engineered and may need fixes — if the results don't match the platform you expect, use the numeric platformIds override below instead.

## `platformIds` (type: `array`):

Advanced: bypass the string mapping and pass Google's internal platform integers directly (subset of \[1,2,3,4,5]). Read them off the Ad Transparency Center URL when you apply a platform filter in the UI.

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

Only return ads of this creative format.

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

Only return ads shown on or after this date (YYYY-MM-DD). Leave empty for no lower bound.

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

Only return ads shown on or before this date (YYYY-MM-DD). Leave empty for no upper bound.

## `topAdvertisersPerQuery` (type: `integer`):

When searching by keyword, how many top matching advertisers to scrape per query (autocomplete returns ~10).

## `maxResultsPerAdvertiser` (type: `integer`):

Cap on creatives per advertiser. Google's API caps at 100 per request and the public cursor isn't exposed, so values above 100 are treated as 100. For broader coverage of large advertisers, run separate queries per region.

## `useResidentialProxy` (type: `boolean`):

Enable only if Google rate-limits your runs — the Ad Transparency Center API works fine from Apify datacenter IPs (free, no rate limit observed). Residential rotation is available as a fallback for high-volume runs.

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

Advanced: override the proxy. Only honored when 'Use residential proxy' is enabled. Defaults to Apify residential when proxy is on.

## Actor input object example

```json
{
  "searchQuery": "nike",
  "region": "US",
  "format": "any",
  "topAdvertisersPerQuery": 3,
  "maxResultsPerAdvertiser": 50,
  "useResidentialProxy": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

List of creatives with advertiser, format, dates, region, and the embedded ad HTML.

# 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 = {
    "searchQuery": "nike",
    "region": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("dltik/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 = {
    "searchQuery": "nike",
    "region": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("dltik/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 '{
  "searchQuery": "nike",
  "region": "US"
}' |
apify call dltik/google-ads-transparency --silent --output-dataset

```

## MCP server setup

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