# Google Ads Transparency Scraper: Competitor Ads API (`sourcedirect/google-ads-transparency-api`) Actor

See every Google ad a competitor runs: search by brand name, website or advertiser ID. Get format, first/last shown, days running, regions, all variations (image links) and political-ad spend and impressions. Fast, no browser.

- **URL**: https://apify.com/sourcedirect/google-ads-transparency-api.md
- **Developed by:** [Kurt Landman](https://apify.com/sourcedirect) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 ads

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: Competitor Ads API

See **every ad a company runs on Google** (Search, YouTube, Display, Shopping and Maps), straight from Google's **Ads Transparency Center**. Search by **brand name**, **website** or **advertiser ID**.

Each ad comes with:

- format (text, image or video)
- first and last shown dates, and how many days it ran
- the countries it ran in
- every variation of the creative
- for political ads, Google's published **spend and impressions** ranges

It's fast and needs no browser. Each ad is one clean JSON record.

### What you can do with it

- **Competitor research:** see which ads a rival is running right now, how long they keep winners live, and where they advertise.
- **Creative inspiration:** collect the text and image ads of the best brands in your niche.
- **Agencies:** monitor clients' competitors on a schedule and get alerted to new campaigns.
- **Journalists and researchers:** track political advertisers' spend and reach by country.
- **AI agents:** answer "What Google ads is X running?" in one call.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | One per line: a website (`nike.com`), a brand or advertiser name (`adidas`), an advertiser ID (`AR16735076323512287233`), or any advertiser or ad link from adstransparency.google.com |
| `region` | Two-letter country code to only include ads shown there (`US`, `GB`, `DE`...), or `anywhere` |
| `format` | `all`, `text`, `image` or `video` |
| `maxAdsPerSource` | Ads per entry (newest first). Default 100 |
| `maxAdvertisersPerSearch` | For name searches: how many matching advertiser accounts to include, biggest first |
| `includeDetails` | Variations, per-country dates and impressions, spend. On by default, same price |

**Websites and names behave differently:**

- **A website** returns all ads that point to that site, from any advertiser account.
- **A name** finds the best-matching advertiser, the one with the most ads, and returns its ads. Other matching accounts are listed in the run summary, so you can add them.

#### Examples

Nike's US ads, newest first:

```json
{ "searchTerms": ["nike.com"], "region": "US", "maxAdsPerSource": 200 }
```

Video ads of two competitors, worldwide:

```json
{ "searchTerms": ["adidas", "puma.com"], "format": "video" }
```

### Output example

This is a real political ad, shortened:

```json
{
  "type": "ad",
  "adId": "CR07909667787277074433",
  "advertiserId": "AR00040546930815664129",
  "advertiserName": "SENTINEL ACTION FUND",
  "format": "text",
  "firstShownAt": "2026-09-05T04:03:08.702Z",
  "lastShownAt": "2026-10-01T04:00:47.731Z",
  "daysShown": 27,
  "regionsShown": ["MP", "US", "PR"],
  "regionStats": [
    { "region": "US", "regionName": "United States", "criteriaId": 2840, "firstShownDate": "2026-09-04", "lastShownDate": "2026-09-30", "impressionsMin": 60000, "impressionsMax": 70000 }
  ],
  "impressionsMin": 60000,
  "impressionsMax": 70000,
  "spend": { "currency": "USD", "min": 4000, "max": 4500 },
  "previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/3656283509581012566",
  "variationCount": 2,
  "adUrl": "https://adstransparency.google.com/advertiser/AR00040546930815664129/creative/CR07909667787277074433?region=US",
  "advertiser": { "name": "SENTINEL ACTION FUND", "legalName": "SENTINEL ACTION FUND", "country": "US", "isVerified": true },
  "region": "US"
}
```

Field meanings:

- `firstShownAt`, `lastShownAt` and `daysShown` are the "First shown", "Last shown" and "Ran for" values on the ad's Transparency Center page.
- `spend` and `impressions` are published by Google for political ads, and impressions also for ads shown in the EU.
- The run summary (key-value store record `SUMMARY`) gives Google's approximate total number of ads for each entry. Nike.com has about 8,000–9,000.

### Pricing

**$0.002 per ad**, details included. There are no platform-usage charges on top and no fee per run.

For example, 100 ads cost $0.20 and 1,000 ads cost $2.

Entries that can't be resolved return an item with `"type": "error"` and are **not charged**. If you set a maximum cost, the run stops cleanly when it is reached.

### Using it from AI agents (MCP)

Available through the [Apify MCP server](https://mcp.apify.com) for Claude, ChatGPT, Cursor and other MCP clients. Agents can also pay per call through Apify's agentic payments.

Example prompts:

- "What Google ads is Allbirds running in the US right now? Summarize their messaging."
- "How long has Nike kept its current search ads live?"
- "Which political advertisers spent the most on Google ads in the US this month?"

Agents: use a website for complete coverage. Use `maxAdsPerSource` to limit cost on big brands.

### Good to know

- **Images:** text ads, and many image ads, have a direct image in `previewImageUrl` and in `variations[].imageUrl`. Other image ads and video ads come with Google's preview link (`previewUrl`). Open the ad's `adUrl` to view it.
- **Coverage:** this is exactly the data Google publishes in its Ads Transparency Center. Long-running ads keep their original first-shown date; some of Nike's current search ads date back to 2022. Spend and impressions appear only where Google publishes them.
- **Region:** an ad can run in several countries. `regionStats` gives the dates per country.
- **Legal:** the Ads Transparency Center is a public transparency tool. This Actor reads only what Google publishes there, and no personal data.

### FAQ

**Can I monitor a competitor daily?** Yes. Schedule the Actor and compare `adId`s between runs to spot new ads. Send results to Google Sheets, Slack, Zapier, Make or n8n.

**Why does a brand name return few ads?** Big brands often advertise through several advertiser accounts. Search by their website instead, or raise `maxAdvertisersPerSearch`.

**Something not working?** Open an issue on the **Issues** tab with your input.

# Changelog

This Actor's version history is a separate document: https://apify.com/sourcedirect/google-ads-transparency-api/changelog.md

# Actor input Schema

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

One per line: a brand/advertiser name (nike), a website (nike.com), an advertiser ID (AR16735076323512287233), or an advertiser/ad link from adstransparency.google.com. Websites return ads that point to that site; names return ads of the best-matching advertiser.

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

Two-letter country code (US, GB, DE, AU, ...) to only include ads shown there, or "anywhere".

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

Only ads of this format.

## `maxAdsPerSource` (type: `integer`):

Upper limit of ads returned for each entry (big advertisers have thousands). Newest ads come first.

## `maxAdvertisersPerSearch` (type: `integer`):

When you search by name, how many matching advertisers to include (biggest first). Brands often run ads under several advertiser accounts.

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

All variations (image links), regions with first/last shown dates, and impressions and spend where Google publishes them. Same price; turn off only for speed.

## `includeAdvertiserInfo` (type: `boolean`):

Advertiser legal name, country and whether Google verified their identity.

## `maxConcurrency` (type: `integer`):

How many ad details to fetch at once.

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

Proxies keep requests to Google reliable at volume.

## Actor input object example

```json
{
  "searchTerms": [
    "nike.com",
    "adidas",
    "AR16735076323512287233"
  ],
  "region": "anywhere",
  "format": "all",
  "maxAdsPerSource": 100,
  "maxAdvertisersPerSearch": 1,
  "includeDetails": true,
  "includeAdvertiserInfo": true,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `overview` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("sourcedirect/google-ads-transparency-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 = {
    "searchTerms": ["nike.com"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

```

## MCP server setup

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