# Google Ads Transparency Scraper (`santamaria-automations/google-ads-scraper`) Actor

Scrape Google Ads Transparency Center by brand, domain or advertiser ID. Get ad creatives with advertiser, format, shown dates, headline and previews. No login or API key. Pay per result: $0.001 per ad plus $0.005 per run start.

- **URL**: https://apify.com/santamaria-automations/google-ads-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** 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

## Google Ads Transparency Scraper

Look up any brand, domain or advertiser in Google's public [Ads Transparency Center](https://adstransparency.google.com/) and get its ad creatives as clean rows. No login, no API key.

### What data can you extract?

For each ad creative:

- **Advertiser name and ID**, with a link to the advertiser page
- **Ad format**: TEXT, IMAGE or VIDEO
- **First and last shown date**
- **Image URL** (text ads are rendered as an image) and the **creative preview URL**
- **Destination domain** (domain searches)
- **The name, domain or advertiser ID** that found the ad, plus the region filter used
- **Direct link** to the creative in the Transparency Center

By default (`includeAdDetails` on) you also get the **headline, description and display URL**, the **image and video links**, the **number of variations** and the **countries** the ad was shown in. This needs extra lookups per ad and takes about 2-3 seconds per ad; switch it off for faster runs with list fields only. Not every ad shows text: many classic text ads are only published as an image, in which case `headline` stays empty and `image_urls` has the picture. Sitelinks and ratings shown in the Transparency Center are part of that image and cannot be read as text.

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client, including Claude Desktop, Claude.ai, Cursor, VS Code, LangChain and LlamaIndex.

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://mcp.apify.com?tools=santamaria-automations/google-ads-scraper",
        "--header",
        "Authorization: Bearer <APIFY_TOKEN>"
      ]
    }
  }
}
```

Example prompt: "Use `google-ads-scraper` to get the latest 50 US ads from Nike and show advertiser, format and last shown date as a table."

### Example input

```json
{
  "searchTerms": ["nike"],
  "region": "US",
  "maxAds": 50
}
```

With ad details:

```json
{
  "searchTerms": ["nike"],
  "region": "US",
  "maxAds": 50,
  "includeAdDetails": true
}
```

An empty input `{}` also works and runs the defaults (nike, 50 ads, all regions).

### How searches work

- **Brand or advertiser names** (`searchTerms`): the name is looked up in the Transparency Center's advertiser search. The closest name match wins (legal suffixes like Inc or GmbH are ignored), and among equal matches the advertiser with the most ads. `maxAdvertisersPerTerm` (default 1) controls how many matches are scraped. Free-text keyword search for ad content is not supported by Google's endpoint, only advertiser names.
- **Domains** (`domains`, or a name like `tesla.com`): ads whose destination domain matches, from any advertiser. Domains are searched directly because the advertiser lookup does not resolve them.
- **Advertiser IDs** (`advertiserIds`): all ads of one advertiser, for example `AR17828074650563772417`.

A creative found by several searches is returned once.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchTerms` | array | `["nike"]` | Brand or advertiser names. Used only when domains and advertiserIds are empty too |
| `domains` | array | none | Domains such as `nike.com` |
| `advertiserIds` | array | none | Advertiser IDs (AR plus 20 digits) |
| `region` | string | empty | Two-letter country code to only get ads shown there (US, GB, DE, FR, CH, ...) |
| `maxAdvertisersPerTerm` | integer | `1` | Advertisers to scrape per name (1-10) |
| `maxAds` | integer | `50` | Total ads across all searches (1-100,000) |
| `maxAdsPerQuery` | integer | `0` | Optional cap per name, domain or advertiser (0 = only the total cap) |
| `includeAdDetails` | boolean | `true` | Load the ad content (headline, description, display URL, images, video, variations, countries). Slower: about 2-3 seconds per ad |

### What you get

One row per ad creative:

| Field | Type | Description |
|-------|------|-------------|
| `creative_id` | string | Unique creative ID |
| `advertiser_id` | string | Advertiser ID (matched advertiser for name searches) |
| `advertiser_name` | string | Advertiser display name |
| `advertiser_url` | string | Advertiser page in the Transparency Center |
| `ad_format` | string | TEXT, IMAGE or VIDEO |
| `first_shown_date` | string | First date the ad was shown (YYYY-MM-DD) |
| `last_shown_date` | string | Last date the ad was shown (YYYY-MM-DD) |
| `image_url` | string | Ad image URL (text ads render as an image) |
| `preview_url` | string | Google preview script URL of the creative (image and video ads) |
| `domain` | string | Destination domain (domain searches only) |
| `search_term` | string | Name, domain or advertiser ID that found this ad |
| `search_type` | string | keyword, domain or advertiser_id |
| `region` | string | Region filter applied, empty for all regions |
| `source_url` | string | Direct link to the creative |
| `scraped_at` | string | ISO 8601 scrape time |
| `headline` | string | Ad headline (with ad details) |
| `description` | string | Ad description text (with ad details) |
| `display_url` | string | Display URL shown with the ad (with ad details) |
| `destination_url` | string | Landing page, when the ad exposes it (with ad details) |
| `sitelinks` | array | Extra links shown under a text ad, as {title, url}. Empty if none could be read (with ad details) |
| `variations_count` | integer | Number of variations of this creative (with ad details) |
| `image_urls` | array | Image URLs of the ad variations (with ad details) |
| `video_url` | string | Video link for video ads (with ad details) |
| `regions_shown` | array | Countries the ad was shown in, as two-letter codes (with ad details) |
| `detail_status` | string | not_requested, ok, partial (ad text could not be loaded) or failed (list fields only) |

The ad detail fields are always present. With `includeAdDetails` switched off they are empty and `detail_status` is `not_requested`. If the ad content cannot be loaded for an ad, the row is still returned with `detail_status` set to `failed` (list fields only) or `partial` (ad text missing, other details present). Each ad is billed once either way.

#### Output example (with ad details)

```json
{
  "creative_id": "CR00033613616649338881",
  "advertiser_id": "AR16735076323512287233",
  "advertiser_name": "Nike, Inc.",
  "advertiser_url": "https://adstransparency.google.com/advertiser/AR16735076323512287233",
  "ad_format": "TEXT",
  "first_shown_date": "2023-11-17",
  "last_shown_date": "2026-10-21",
  "image_url": "https://tpc.googlesyndication.com/archive/simgad/6766108139373326992",
  "preview_url": "",
  "headline": "Nike® Official Site",
  "description": "Shop the official Nike® store for the latest shoes, apparel & gear.",
  "display_url": "nike.com",
  "destination_url": "",
  "sitelinks": [],
  "variations_count": 5,
  "image_urls": ["https://tpc.googlesyndication.com/archive/simgad/6766108139373326992"],
  "video_url": "",
  "regions_shown": ["US"],
  "detail_status": "ok",
  "domain": "",
  "search_term": "nike",
  "search_type": "keyword",
  "region": "US",
  "source_url": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR00033613616649338881",
  "scraped_at": "2026-10-21T10:30:00Z"
}
```

### Pricing

Pay per event:

| Event | When | Price |
|-------|------|-------|
| `actor-start` | Once per run, only if at least one ad was saved | $0.005 |
| `google-ads-result` | Per ad saved to the dataset | $0.001 |

$0.001 per ad means $1.00 per 1,000 ads. Runs that find nothing cost nothing.

### Data protection

This actor returns only data that is publicly visible on the source pages. Results can include personal data, such as names, phone numbers, email addresses and addresses of private persons, sole traders or contact persons. Where the source labels an entry type, it is included so you can filter the results yourself.

You are responsible for using the data lawfully, including the GDPR/DSGVO, national data-protection laws and unfair-competition rules (e.g. UWG) for marketing and outreach.

### Related actors

- [Facebook Ad Library Scraper](https://apify.com/santamaria-automations/facebook-ad-library-scraper) - the same competitor research for Meta ads.
- [Google Search Scraper](https://apify.com/santamaria-automations/google-search-scraper) - organic and paid results for your keywords.
- [SimilarWeb Scraper](https://apify.com/santamaria-automations/similarweb-scraper) - traffic and channel data for the advertisers you find.
- [Website Contact Extractor](https://apify.com/santamaria-automations/website-contact-extractor) - contact details from advertiser websites.

### Notes

- The Ads Transparency Center is a public database that Google publishes by law, no login required.
- If a search finds no ads, the run ends with a clear status message and a failed exit, so you are not billed.
- Google limits heavy use. Blocked requests are retried automatically; if a run still reports being blocked, try again later.

# Actor input Schema

## `searchTerms` (type: `array`):

Brand or advertiser names, for example Nike or Tesla. Each name is looked up in the Ads Transparency Center and the best matching advertiser (closest name, most ads) is scraped. A name that looks like a domain (tesla.com) is searched as a domain. Defaults to nike when searchTerms, domains and advertiserIds are all empty.

## `domains` (type: `array`):

Domains to search, for example nike.com. Returns ads whose destination domain matches, from any advertiser.

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

Google advertiser IDs (AR followed by 20 digits), for example AR17828074650563772417. Find the ID in the advertiser's Transparency Center URL.

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

Only ads shown in this country, as a two-letter code (US, GB, DE, FR, CA, AU, IT, ES, NL, CH, AT, BR, IN, JP, MX, SE, PL, IE, NZ, SG, BE, DK, NO, FI, PT, ZA, AE). Empty means all regions.

## `maxAdvertisersPerTerm` (type: `integer`):

How many matching advertisers to scrape for each brand name (best match first). Use 1 for the main brand account.

## `maxAds` (type: `integer`):

Maximum number of ads returned in total across all names, domains and advertisers.

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

Optional cap per name, domain or advertiser so one large advertiser cannot use the whole budget. 0 means only the total cap applies.

## `includeAdDetails` (type: `boolean`):

Also load the content of each ad: headline, description, display URL, image and video links, number of variations and countries shown. Slower, because every ad needs extra lookups (about 2-3 seconds per ad). Switch off for faster runs with list fields only. Ads that cannot be loaded are still returned with detail_status set to failed or partial.

## Actor input object example

```json
{
  "searchTerms": [
    "nike"
  ],
  "region": "US",
  "maxAdvertisersPerTerm": 1,
  "maxAds": 50,
  "maxAdsPerQuery": 0,
  "includeAdDetails": true
}
```

# Actor output Schema

## `defaultDataset` (type: `string`):

Dataset of ad creatives scraped from Google Ads Transparency Center

# 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 = {
    "searchTerms": [
        "nike"
    ],
    "region": "US",
    "maxAds": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/google-ads-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 = {
    "searchTerms": ["nike"],
    "region": "US",
    "maxAds": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/google-ads-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 '{
  "searchTerms": [
    "nike"
  ],
  "region": "US",
  "maxAds": 50
}' |
apify call santamaria-automations/google-ads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/google-ads-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/Y8WVZkVFvazvZvDmk/builds/Uc8NDf7c8qA5kYuI8/openapi.json
