# Google Ads Transparency Scraper: Ad Copy, Headlines & Creatives (`plain-signal/google-ads-transparency-scraper`) Actor

Scrape competitors' Google Ads from the Ads Transparency Center by domain, brand or advertiser ID: headlines, descriptions, display URLs and sitelinks of text ads (read from the ad), image and video creatives, first and last shown dates. Filter by country, format and date. Monitor mode for new ads.

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

## Pricing

Pay per event

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

### What does Google Ads Transparency Scraper do?

**Google Ads Transparency Scraper** extracts the ads any company runs on Google from the [Google Ads Transparency Center](https://adstransparency.google.com): Search, YouTube, Display, Shopping and Maps ads, searchable by **website domain, brand name or advertiser ID**.

Unlike other Transparency Center scrapers, it returns the **ad copy itself**: **headline, description, display URL and sitelinks** of text ads, read from the ad Google shows. You also get the creative (image or preview link), **first and last shown dates**, the advertiser's verified name and a link to the ad in the Transparency Center, as clean JSON, CSV or Excel.

- ✍️ **Ad copy, not just screenshots:** headlines and descriptions as text, ready for a spreadsheet or an AI prompt.
- 🔎 **Any input:** `nike.com`, `Nike`, `AR16735076323512287233` or a Transparency Center link.
- 🌍 **Country, format and date filters:** only US ads, only video ads, only ads shown in the last 30 days.
- 🔔 **Monitor mode:** schedule it and get only competitors' new ads on every run.
- ✅ **Advertiser check:** one row per company: does it run Google Ads, roughly how many ads, when it last ran one.

### What can I use it for?

- 🕵️ **Competitor ad research:** see every headline and offer your competitors test, and how long each ad has been running (long-running ads are the ones that work).
- 📝 **Ad copy swipe files:** collect hundreds of real headlines in your niche as a CSV, or feed them to an LLM to draft your own.
- 🎯 **Lead generation:** check a list of domains and find the companies that spend money on Google Ads, a strong signal for agencies and SaaS sales.
- 🔔 **Alerts:** get a Slack message or email when a competitor launches new ads.
- 🛡️ **Brand protection:** find advertisers bidding on your brand name or imitating your ads.

### How to use it

1. Enter one or more **advertisers**: domains (`hubspot.com`), brand names (`HubSpot`), advertiser IDs or Transparency Center links.
2. Optionally pick a **country**, an **ad format** and **Shown in the last N days**.
3. Click **Start**. Download the results as JSON, CSV or Excel, or get them through the API.

#### Advertiser check (lead lists)

Set **Mode** to *Advertiser check* and paste a list of domains. You get one row per domain with `isAdvertising`, Google's ad count range (`adCountMin`–`adCountMax`), the formats used, the last date an ad was shown and the advertiser names behind the domain.

#### Get alerts for new ads (monitor mode)

Set **Monitor name** (e.g. `competitors`) and [schedule](https://docs.apify.com/platform/schedules) the Actor daily or weekly. Each run then returns **only ads it hasn't returned before** under that name. Connect it to Slack, email, Google Sheets, Make, Zapier or n8n through Apify integrations.

### Input example

```json
{
  "advertisers": ["hubspot.com", "salesforce.com", "Pipedrive"],
  "country": "US",
  "adFormat": "TEXT",
  "shownInLastDays": 30,
  "maxAdsPerAdvertiser": 100
}
```

### Output example

A real text ad from a run on 2026-10-02:

```json
{
  "advertiserId": "AR10072600183532683265",
  "advertiserName": "Hubspot, Inc.",
  "domain": "hubspot.com",
  "creativeId": "CR03473167961525583873",
  "format": "TEXT",
  "firstShown": "2025-10-15",
  "lastShown": "2026-10-02",
  "daysShown": 322,
  "headline": "SEO Keyword Research Tools - Track Your SEO Progress",
  "description": "HubSpot's SEO tools help you research keywords, track rankings & optimize content. Get actionable SEO...",
  "displayUrl": "www.hubspot.com/",
  "sitelinks": ["Free Website Builder", "Sign Up Free", "HubSpot SEO Tools", "Improve Your Site Rank", "Free Content Tools"],
  "adTexts": ["SEO Keyword Research Tools - Track", "Your SEO Progress", "HubSpot's SEO tools help you research keywords, track", "rankings & optimize content. Get actionable SEO...", "..."],
  "adCopySource": "ocr",
  "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/10713166194209069207",
  "videoUrl": null,
  "previewUrl": null,
  "adUrl": "https://adstransparency.google.com/advertiser/AR10072600183532683265/creative/CR03473167961525583873?region=US",
  "searchInput": "hubspot.com",
  "country": "US",
  "scrapedAt": "2026-10-02T08:00:20+00:00"
}
```

Video ads also have `videoUrl` (the YouTube video) and a thumbnail in `imageUrl`.

### How much does it cost?

**$0.002 per ad** ($2 per 1,000 ads), ad copy included. **$0.002 per advertiser** in advertiser-check mode. No monthly fee, and you only pay for results.

| Use case | Results | Cost |
|---|---|---|
| One competitor, 100 latest ads | 100 | $0.20 |
| 10 competitors × 200 ads | 2,000 | $4.00 |
| Advertiser check for 500 domains | 500 | $1.00 |
| Weekly monitor of 5 competitors, ~50 new ads a week | ~200/month | ~$0.40/month |

Set **Max results in total** to cap the cost of a run.

### Good to know

- **How ad copy is read:** for most text ads Google keeps only a rendered image of the ad. The Actor reads it with OCR and splits it into display URL, headline (Google's blue line), description and sitelinks. Accuracy is very high for Latin-script languages (English, German, French, Spanish, Italian, Portuguese, Dutch, Polish); for other scripts (Japanese, Chinese, Arabic…) the text fields may be empty or garbled. `adCopySource` says where the copy came from (`ocr` or `preview`), and `adTexts` keeps every line that was read.
- **Dynamic keyword insertion:** some ads use `{KeyWord:Default text}` placeholders; the Actor returns the default text.
- **Video and image ads:** you get the thumbnail or image, the preview link and any text Google embeds (headline, call to action) when present.
- **Domains vs. advertisers:** searching a domain returns ads from every advertiser account that points to it, including agencies and resellers. Use an advertiser ID to get one account only.
- **Dates:** `firstShown` and `lastShown` come from Google. `daysShown` is Google's count of days the ad was shown.
- **Coverage:** Google lists ads from verified advertisers, back to 2018 for some formats. Political ads are in a separate report and are not included.
- The Actor reads public data only. It doesn't log in and doesn't collect personal data.

### FAQ

**Why are there fewer ads than I asked for?** The advertiser has no more ads for your filters (country, format, date). Try *Anywhere* or remove the date filter.

**Which advertiser is used for a brand name?** The matching advertiser with the most ads; the run log lists the other matches with their IDs so you can pick one exactly.

**Something's wrong or missing?** Open an issue on the Issues tab. Requests are welcome.

# Actor input Schema

## `advertisers` (type: `array`):

One per line: a website domain (nike.com), an advertiser ID (AR16735076323512287233), a link from adstransparency.google.com, or a brand name (Nike; the advertiser with the most ads is used).

## `country` (type: `string`):

Only ads shown in this country. 'Anywhere' covers all countries.

## `maxAdsPerAdvertiser` (type: `integer`):

Newest ads first. Large brands run thousands of ads; set this to what you need.

## `includeAdCopy` (type: `boolean`):

Read headline, description, display URL and sitelinks from each ad. Text ads are read from Google's rendered screenshot with OCR. Turn off for faster runs if you only need dates and creative links.

## `mode` (type: `string`):

'Ads' returns every ad. 'Advertiser check' returns one row per entry: does it run Google Ads, roughly how many, and when it last ran one. Useful for lead lists.

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

Only ads of this format.

## `shownInLastDays` (type: `integer`):

Only ads Google showed within this many days. Leave empty for all ads, including ones that stopped running.

## `maxItems` (type: `integer`):

Stop after this many results across all advertisers. Caps the cost of a run.

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

Give a name (e.g. 'competitors') and schedule the Actor: each run checks the newest ads (up to 'Max ads per advertiser') and returns only those it hasn't returned before under that name.

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

Not needed normally. Use Apify Proxy if Google starts rate-limiting large runs.

## Actor input object example

```json
{
  "advertisers": [
    "hubspot.com"
  ],
  "country": "anywhere",
  "maxAdsPerAdvertiser": 100,
  "includeAdCopy": true,
  "mode": "ads",
  "adFormat": "ANY",
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Ads with headline, description, dates and creative links, as JSON, CSV or Excel.

## `allFields` (type: `string`):

Every field, including sitelinks, all ad texts and preview links (and advertiser-check rows).

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

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

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

```

## MCP server setup

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