# Google Ads Transparency Scraper + New Ads Monitor (`alucard2392/google-ads-transparency`) Actor

Get every ad a company runs on Google Search, YouTube, Display and Shopping from the Google Ads Transparency Center. Search by advertiser name, domain or ID, filter by country, format and date, extract ad text, and get only new ads on scheduled runs.

- **URL**: https://apify.com/alucard2392/google-ads-transparency.md
- **Developed by:** [Le Huu Lam](https://apify.com/alucard2392) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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?

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 Scraper + New Ads Monitor

Get every ad a company runs on **Google Search, YouTube, Display, Shopping and Maps** from the [Google Ads Transparency Center](https://adstransparency.google.com/). Search by **advertiser name, domain or advertiser ID**, filter by **country, format and date**, and get each ad's **headline, description, display URL, sitelinks, YouTube video URL** and the **countries it ran in**.

Run it on a schedule with **Only new ads** turned on, and each run returns only the ads your competitors launched since the last one.

### What you can do with it

- **Competitor ad research**: see every Search, video and image ad a rival is running, in any of 240+ countries.
- **Ad copy swipe files**: export headlines, descriptions and sitelinks at scale. Text that Google only stores as a screenshot is read with OCR, so text ads come back with text, not just an image.
- **New-ad alerts**: schedule a daily or weekly run in monitoring mode and pipe new ads to Slack, email, Google Sheets or a webhook through Apify integrations.
- **Video ad discovery**: get the YouTube URL and thumbnail of each video ad.
- **Agency reporting and lead generation**: find which companies in a market are advertising on Google right now.

### Input

| Field | What it does |
|---|---|
| **Advertisers, domains or URLs** | One per line: `nike.com`, `Canva`, `AR16735076323512287233`, or a Transparency Center URL. Domains are the most reliable for brands. |
| **Country** | 2-letter code (`US`, `GB`, `DE`, `VN`…) or `anywhere`. |
| **Ad format** | All, Text, Image or Video. |
| **Shown from / until** | Only ads that ran at some point in this date range (ads still running are included). |
| **Max ads per target** | Stop after this many ads for each line. |
| **Extract ad text & media** | Headline, description, display URL, sitelinks, YouTube URL, product images. |
| **OCR language** | Language of screenshot-only text ads (`eng`, `deu`, `fra`, `spa`, `vie`, `eng+deu`…). |
| **Include countries and variations** | The countries each ad ran in (with last-shown date) and all its variations. |
| **Only new ads** | Skip ads returned by earlier runs with the same monitor name and filters. |

Example:

```json
{
  "targets": ["hubspot.com", "salesforce.com"],
  "region": "US",
  "format": "text",
  "maxAdsPerTarget": 200,
  "extractText": true,
  "onlyNewAds": true,
  "monitorName": "crm-competitors"
}
```

### Output

One item per ad. Download as JSON, CSV, Excel or HTML, or read it through the API.

A real item from a test run (`variations` shortened):

```json
{
  "advertiserId": "AR10072600183532683265",
  "advertiserName": "Hubspot, Inc.",
  "creativeId": "CR16205648495346974721",
  "format": "TEXT",
  "firstShown": "2026-08-31T04:00:48.000Z",
  "lastShown": "2026-10-19T03:02:50.000Z",
  "daysRunning": 49,
  "headline": "One Platform. Real Results - Better Data. Better Decisions",
  "description": "Al that takes the right action at the right moment - built into your HubSpot tools. Your marketing, sales, and service data connected, secure, and ready to act on.",
  "displayUrl": "www.hubspot.com/",
  "sitelinks": [],
  "adText": "One Platform. Real Results - Better Data. Better Decisions — Al that takes the right action at the right moment - built into your HubSpot tools. …",
  "textSource": "ocr",
  "ocrConfidence": 93,
  "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/4911148235677678944",
  "regions": [
    { "region": "CA", "lastShown": "2026-10-18" },
    { "region": "US", "lastShown": "2026-10-18" }
  ],
  "variationsCount": 1,
  "variations": ["…"],
  "adUrl": "https://adstransparency.google.com/advertiser/AR10072600183532683265/creative/CR16205648495346974721",
  "searchTarget": "hubspot.com",
  "region": "anywhere",
  "scrapedAt": "2026-10-19T03:30:50.934Z"
}
```

Note the OCR slip in that item: "Al" should be "AI". That is the kind of error to expect from screenshot text.

Video ads also have `videoUrl` (YouTube) and `videoThumbnailUrl`. Image and Shopping ads have `mediaImageUrls`. Each item lists only the fields you turned on.

### Pricing

You pay per result, with no subscription and no proxy fees:

| Event | Price |
|---|---|
| Ad | $1.20 per 1,000 ads |
| Ad text & media (optional) | $1.50 per 1,000 ads that return text or media |
| Countries & variations (optional) | $0.80 per 1,000 ads |

You are only charged for the add-ons when they return data. Set a maximum cost per run in the run options and the Actor stops when it reaches it.

### Tips

- **Use domains for big brands.** A name like "Nike" matches many small advertisers with the same name; `nike.com` returns the brand's ads (and ads from resellers that point to it).
- **Counts are ranges.** The Transparency Center reports totals as ranges such as "8,000–9,000 ads"; the log shows them for each target.
- **Text-ad screenshots** are read with OCR. Accuracy is high (90%+ confidence on typical ads) but not perfect; `ocrConfidence` tells you how sure it was.
- **Large runs:** Google rate-limits the Transparency Center per IP. For more than a few hundred ads per run, turn on Apify Proxy (residential works best). Only the small search requests go through the proxy; ad previews are fetched directly, so proxy traffic stays low.

### Is it legal?

The Actor reads only information Google publishes in the Ads Transparency Center for public accountability: ads and the businesses that pay for them. It does not log in, and it collects no personal data about people who see ads. You are responsible for how you use the data. If in doubt, ask your lawyer.

### Feedback

Found a bug or want a field added? Open an issue on the Actor's **Issues** tab. Fixes usually ship within a few days.

# Actor input Schema

## `targets` (type: `array`):

One per line. Accepts an advertiser name ("Nike"), a domain ("nike.com"), an advertiser ID ("AR16735076323512287233") or an Ads Transparency Center URL.

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

2-letter country code (US, GB, DE, VN…) or "anywhere".

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

Only return ads of this format.

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

Only ads that were shown at some point on or after this date (YYYY-MM-DD). Ads still running are included.

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

Only ads that were shown at some point on or before this date (YYYY-MM-DD). An ad that started before and is still running counts.

## `maxAdsPerTarget` (type: `integer`):

Stop after this many ads for each advertiser, domain or URL.

## `extractText` (type: `boolean`):

Get the headline, description, display URL and sitelinks of every ad (read from the preview, or by OCR when Google only keeps a screenshot), plus the YouTube URL of video ads and product image URLs. Adds a small extra charge per ad.

## `ocrLanguage` (type: `string`):

Tesseract language code(s) for reading screenshot-only text ads, e.g. eng, deu, fra, spa, vie, or eng+deu.

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

Fetch each ad's detail page: the countries it ran in (with last-shown date) and all creative variations. Adds a small extra charge per ad.

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

Remember which ads were already returned and skip them next time. Schedule the Actor daily or weekly to get just the ads your competitors launched since the last run.

## `monitorName` (type: `string`):

Keeps separate memories for different monitors. Use the same name on every scheduled run of one monitor.

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

Recommended for runs of more than a few hundred ads: Google rate-limits per IP. Only the small search requests use the proxy.

## Actor input object example

```json
{
  "targets": [
    "nike.com"
  ],
  "region": "anywhere",
  "format": "all",
  "maxAdsPerTarget": 100,
  "extractText": false,
  "ocrLanguage": "eng",
  "includeDetails": false,
  "onlyNewAds": false,
  "monitorName": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `ads` (type: `string`):

One item per ad: advertiser, format, dates, ad text, media URLs and countries.

# 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 = {
    "targets": [
        "nike.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("alucard2392/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 = { "targets": ["nike.com"] }

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

```

## MCP server setup

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