# Google Ads Creative & Competitor Monitor (`nexascout/google-ads-creative-competitor-monitor`) Actor

Track public Google Ads creatives by advertiser or domain. Extract headlines, ad copy, formats, media, destinations, and landing-page signals, then detect new, changed, or removed ads across scheduled runs.

- **URL**: https://apify.com/nexascout/google-ads-creative-competitor-monitor.md
- **Developed by:** [NexaScout](https://apify.com/nexascout) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 analyzed google ads creatives

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 Creative & Competitor Monitor

Monitor public Google Ads creatives by competitor domain, advertiser name, or direct Google Ads Transparency Center URL. The Actor turns ad-library pages into structured competitive intelligence and compares scheduled runs to surface new, changed, and removed creatives.

This is an independent scraper. It does not call another Apify Actor or require a third-party data API.

### Use this Actor for

- competitor creative monitoring for agencies and in-house marketing teams;
- detecting new and removed Google Ads across scheduled runs;
- comparing hooks, offers, CTAs, visible copy, formats, and destinations;
- identifying duplicate or reused creative concepts;
- tracking landing-page changes for campaign and CRO research;
- exporting stable JSON rows to workflows, dashboards, webhooks, or MCP clients.

### Do not use it for

- Google Ads account management, spend, impressions, clicks, or conversion data;
- automated ad creation, campaign editing, or bidding;
- bypassing login gates, CAPTCHAs, regional restrictions, or Google access controls;
- guaranteed OCR or video transcription in version 0.1;
- treating a missing top result as definitive proof that an ad stopped running.

### What each result contains

- advertiser and creative IDs;
- ad format, public detail URL, first/last shown dates when exposed;
- visible headline, supporting copy, destination, image/video URLs;
- heuristic hook, CTA, offer, and message-theme analysis;
- creative and landing-page fingerprints for duplicate/change detection;
- `BASELINE`, `NEW`, `CHANGED`, `UNCHANGED`, or `REMOVED` history status;
- transparent competitor activity score and readable activity signals;
- data-quality state and per-row limitations.

### Quick start

```json
{
  "competitorDomains": ["nike.com"],
  "advertiserNames": [],
  "transparencyUrls": [],
  "regions": ["US"],
  "maxAdsPerCompetitor": 5,
  "maxTotalAds": 5,
  "adFormats": ["TEXT", "IMAGE", "VIDEO", "OTHER"],
  "analyzeLandingPages": false,
  "compareWithPreviousRun": true,
  "historyKey": "nike-us-weekly"
}
```

Using competitor domains is the most reliable discovery method. Advertiser-name searches select the exact name when possible and otherwise use the first public suggestion. Direct URLs can point to an advertiser, domain search, or individual creative.

### Monitoring workflow

1. Run a small baseline with the final competitor list and regions.
2. Review `dataQuality`, creative URLs, and the run summary.
3. Save the input as an Apify Task with a stable `historyKey`.
4. Schedule it daily or weekly.
5. Later clean runs compare against the private key-value-store snapshot.
6. Filter `snapshotStatus` for new, changed, or removed creative events.

Removed rows are emitted only when discovery and creative-detail collection finish without failures. The Actor labels removal confidence as `MEDIUM` because a creative can disappear from a limited result set due to ranking or the configured maximum. Increase `maxAdsPerCompetitor` for stronger coverage.

### Landing pages

Enable `analyzeLandingPages` to fetch detected public destinations and record the final URL, HTTP status, title, description, canonical URL, and content fingerprint. Use `maxLandingPages` as a hard global limit.

Some ad frames do not expose a direct clickable destination. In that case the Actor preserves the visible display destination and records the limitation instead of inventing a URL.

### Cost and runtime controls

- `maxTotalAds` caps creative-detail pages and billable output;
- pay-per-event runs automatically reduce `maxTotalAds` to the number of results still allowed by the user's maximum cost per run;
- collection stops before paid work when the remaining budget cannot cover another result, and output stops immediately when the event limit is reached;
- `maxAdsPerCompetitor` caps coverage per input source;
- default concurrency is 2 and is capped at 5;
- landing-page visits are disabled by default and separately capped;
- failed sources are recorded in `OUTPUT` diagnostics;
- the default input analyzes five Nike creatives in one region and is designed to finish within the Apify Store five-minute auto-test window under normal site conditions.

### Monetization note

Use `apify-default-dataset-item` as the primary pay-per-event event, titled **Analyzed Google Ads creative**. Every charged item remains visible in the dataset. Version 0.1.8 reads the user's maximum cost per run before collection and limits paid work and output accordingly.

Demand Radar suggested a market anchor of **$0.0007–$0.001 per raw ad**, **$0.02–$0.05 per advertiser analysis**, and **$0.01 per detected change**. This Actor opens individual creative details and performs monitoring analysis, so do not copy the raw-ad price blindly. Run production tests first, calculate platform cost per returned row at small and large limits, and set a price with a healthy margin before publishing.

### Data source and responsible use

The Actor reads public pages in [Google Ads Transparency Center](https://adstransparency.google.com/). Google describes the service as a way to find active ads published through Google. Page structure, availability, regional coverage, creative previews, and labels can change.

The Actor does not sign in, solve CAPTCHAs, or collect private Google Ads account data. Users remain responsible for lawful use, intellectual-property rights, privacy requirements, and the applicable platform terms.

### Suggested public Tasks

#### Track Nike and Adidas US creative launches

```json
{
  "competitorDomains": ["nike.com", "adidas.com"],
  "regions": ["US"],
  "maxAdsPerCompetitor": 10,
  "maxTotalAds": 20,
  "compareWithPreviousRun": true,
  "historyKey": "sportswear-us-weekly"
}
```

#### Monitor DTC skincare offers

```json
{
  "competitorDomains": ["glossier.com", "drunkelephant.com"],
  "regions": ["US"],
  "maxAdsPerCompetitor": 10,
  "maxTotalAds": 20,
  "compareWithPreviousRun": true,
  "historyKey": "dtc-skincare-offers"
}
```

#### Compare SaaS competitor messaging

```json
{
  "competitorDomains": ["notion.so", "monday.com"],
  "regions": ["US", "GB"],
  "maxAdsPerCompetitor": 8,
  "maxTotalAds": 30,
  "analyzeLandingPages": true,
  "maxLandingPages": 10,
  "historyKey": "saas-messaging"
}
```

#### Watch ecommerce holiday campaigns

```json
{
  "competitorDomains": ["bestbuy.com", "target.com"],
  "regions": ["US"],
  "maxAdsPerCompetitor": 15,
  "maxTotalAds": 30,
  "compareWithPreviousRun": true,
  "historyKey": "holiday-offers-us"
}
```

#### Audit one advertiser from a direct Transparency URL

```json
{
  "competitorDomains": [],
  "transparencyUrls": ["https://adstransparency.google.com/advertiser/AR16735076323512287233?region=US"],
  "regions": ["US"],
  "maxAdsPerCompetitor": 20,
  "maxTotalAds": 20,
  "compareWithPreviousRun": true,
  "historyKey": "direct-advertiser-audit"
}
```

# Changelog

This Actor's version history is a separate document: https://apify.com/nexascout/google-ads-creative-competitor-monitor/changelog.md

# Actor input Schema

## `competitorDomains` (type: `array`):

Advertiser destination domains, without paths. This is the most reliable discovery method.

## `advertiserNames` (type: `array`):

Public advertiser names to resolve in Google Ads Transparency Center, such as Nike, Inc.

## `transparencyUrls` (type: `array`):

Optional direct advertiser, domain-search, or creative-detail URLs from adstransparency.google.com.

## `regions` (type: `array`):

Two-letter country codes. The Actor checks every source in every selected region.

## `maxAdsPerCompetitor` (type: `integer`):

Maximum creative-detail pages opened for each domain, name, or direct advertiser source.

## `maxTotalAds` (type: `integer`):

Hard cost and runtime limit across all competitors and regions.

## `adFormats` (type: `array`):

Leave all selected to return every detected format.

## `analyzeLandingPages` (type: `boolean`):

Visit detected public landing pages to record the final URL, title, description, status, and content fingerprint.

## `maxLandingPages` (type: `integer`):

Global landing-page visit limit for this run. Creative collection continues after this limit.

## `compareWithPreviousRun` (type: `boolean`):

Save a private baseline and label new, changed, unchanged, and removed creatives on later runs.

## `emitRemovedAds` (type: `boolean`):

Return a synthetic REMOVED row when a previously observed creative is missing from the same monitored source and region.

## `historyKey` (type: `string`):

Optional stable key shared by scheduled runs. Leave empty to derive it from the monitored competitors and regions.

## `resetBaseline` (type: `boolean`):

Ignore the previous snapshot and replace it with this run after collection.

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

Detail-page concurrency. Two is the recommended balance of speed, memory, and reliability.

## `navigationTimeoutSecs` (type: `integer`):

Maximum duration of an individual Transparency Center navigation.

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

Apify Proxy is recommended. Residential groups are not selected by default to keep costs predictable.

## Actor input object example

```json
{
  "competitorDomains": [
    "nike.com"
  ],
  "advertiserNames": [],
  "transparencyUrls": [],
  "regions": [
    "US"
  ],
  "maxAdsPerCompetitor": 5,
  "maxTotalAds": 5,
  "adFormats": [
    "TEXT",
    "IMAGE",
    "VIDEO",
    "OTHER"
  ],
  "analyzeLandingPages": false,
  "maxLandingPages": 5,
  "compareWithPreviousRun": true,
  "emitRemovedAds": true,
  "historyKey": "",
  "resetBaseline": false,
  "maxConcurrency": 2,
  "navigationTimeoutSecs": 45,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `creatives` (type: `string`):

One dataset row per analyzed creative, plus optional removed-creative events from the previous baseline.

## `runSummary` (type: `string`):

Coverage, advertiser activity, change totals, history status, pricing guidance, and diagnostics.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nexascout/google-ads-creative-competitor-monitor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("nexascout/google-ads-creative-competitor-monitor").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 '{}' |
apify call nexascout/google-ads-creative-competitor-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexascout/google-ads-creative-competitor-monitor"
        }
    }
}
```

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/yubRVFWYukiHxCnJD/builds/SND5swhEC1frmbo80/openapi.json
