# Competitor Ad Watch (`67-labs/competitor-ad-watch`) Actor

Weekly report on up to 10 competitors: new Google ads, example ads and worst app reviews. Schedule it, get a Sheets-ready CSV.

- **URL**: https://apify.com/67-labs/competitor-ad-watch.md
- **Developed by:** [Mokksh Bhatt](https://apify.com/67-labs) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1,000.00 / 1,000 result (one competitor report)s

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

## Competitor Ad Watch — a weekly report on your competitors' new Google ads and worst app reviews

Give it up to 10 competitors. Once a week it tells you, for each one: how many new Google ads they started, 5 example ads to open, and the 3 worst recent reviews of their Android app. You get one row per competitor, a short summary text, and a CSV that opens in Google Sheets. Set it on an Apify schedule and the report arrives every Monday without you doing anything.

**Who uses this:** PPC managers and agencies who want to know what a client's rivals are running, e-commerce and app teams tracking competitors, founders who check the market every Monday, sales teams who need a fresh hook for an outreach message.

### What you get per competitor

| Field | What it is |
|---|---|
| `competitor`, `advertiserName`, `advertiserId` | Who was checked, and the advertiser found in the Google Ads Transparency Center |
| `periodStart`, `periodEnd` | The days the report covers |
| `newAdsCount` | Ads first shown in the period |
| `newAdsByFormat` | The same count split into `text`, `image` and `video` |
| `adsShownInPeriod` | All ads the competitor showed in the period, new and old |
| `countsAreMinimums` | `true` if the competitor has more ads than the scan limit, so the counts are "at least" |
| `exampleAdLinks` | Up to 5 links to the newest ads, open them on the Transparency Center |
| `androidAppId`, `reviewsScanned`, `lowRatedReviews` | Their app, how many newest reviews were read, and how many are 1 or 2 stars |
| `worstReviews` | The 3 worst recent reviews: rating, text, date, helpful votes, link |
| `summary` | One plain sentence per competitor that you can paste into an email or a chat |

The run also saves `report.csv` (flat columns, one row per competitor, ready for Google Sheets) and `summary.txt` (one line per competitor) in the Key-value store.

### Price

**$0.01 per run + $1.00 per competitor report.** That is two pay-per-event charges: `actor-start` ($0.01) and `result` ($1.00) for each competitor that is found. A competitor that cannot be found is shown in the results and is not charged. A run that Google blocks before it returns any data is not charged. Ten competitors every Monday cost about $43 a month.

### How to use

1. Open the Input tab and add your competitors, one per line. Write a name (`Nike, Inc.`), or paste the advertiser's Transparency Center link or ID. To add their Android app, write the app ID after a bar: `Zomato | com.application.zomato`.
2. Leave **Days back** at 7 for a weekly report. Click Start.
3. To run it every Monday: open Schedules in Apify Console, create a schedule with the cron `0 9 * * 1`, and add this Actor with the same input. Add the Google Sheets integration to the schedule if you want the rows in a sheet.

**Which advertiser does a name pick?** Among the advertisers whose name contains your text, the one with the most ads. Paste the advertiser link or ID to be exact.

### Input example

```json
{
    "competitors": [
        "Nike, Inc.",
        "Zomato | com.application.zomato",
        "https://adstransparency.google.com/advertiser/AR16735076323512287233"
    ],
    "daysBack": 7
}
```

### Output example

```json
{
    "status": "ok",
    "competitor": "Zomato",
    "advertiserName": "zomato limited",
    "advertiserId": "AR01028087910781419521",
    "transparencyUrl": "https://adstransparency.google.com/advertiser/AR01028087910781419521",
    "periodStart": "2026-09-19",
    "periodEnd": "2026-09-26",
    "newAdsCount": 0,
    "newAdsByFormat": { "text": 0, "image": 0, "video": 0 },
    "adsShownInPeriod": 2,
    "countsAreMinimums": false,
    "exampleAdLinks": [],
    "androidAppId": "com.application.zomato",
    "reviewsScanned": 100,
    "lowRatedReviews": 19,
    "worstReviews": [
        {
            "rating": 1,
            "text": "pathetic brand...worst customer support",
            "date": "2026-09-24",
            "thumbsUp": 1,
            "url": "https://play.google.com/store/apps/details?id=com.application.zomato&reviewId=ee20fe12-42af-43e7-80e5-95d699462866"
        }
    ],
    "generatedAt": "2026-09-26T06:58:16.148Z",
    "summary": "zomato limited: 0 new Google ads since 2026-09-19 (0 text, 0 image, 0 video). 2 ads were shown in the period. Of the 100 newest reviews of com.application.zomato, 19 are 1-2 stars. Worst: \"pathetic brand...worst customer support\" (1 star)."
}
```

The example is shortened: a real report lists up to 3 worst reviews.

### Limits

- Google ads only. The data comes from the public Google Ads Transparency Center. Other ad networks are not included.
- "New" means first shown on or after the start date, as the Transparency Center reports it.
- The actor asks Google for up to **Max ads to scan** ads per competitor (1,000 by default). A very large advertiser can have more. Then `countsAreMinimums` is `true` and the counts mean "at least".
- Reviews come from the 100 newest reviews of the Android app in English for the US store. Only 1 and 2 star reviews count as "worst". Without an app ID there are no review fields.
- The actor keeps to about 4 requests a second and retries with a pause. If Google still answers with 429, turn on **Proxy** and choose Residential.

### FAQ

**Can I watch more than 10 competitors?** Run the actor twice with two lists. Each run takes up to 10.

**Can I get the report by e-mail or in Slack?** Yes. Add an integration to the schedule in Apify Console, or read the dataset through the Apify API.

**Is the data public?** Yes. Everything comes from public Google pages: the Ads Transparency Center and Google Play. No login and no private data.

**Something is wrong. What now?** Open an issue on the Issues tab with the competitor and the input you used. Field requests are welcome.

### Changelog

- **0.1** First release: new ads, example ads, worst app reviews, summary, CSV, pay per event.

# Actor input Schema

## `competitors` (type: `array`):

Up to 10 entries. Each is an advertiser name (Nike, Inc.), a Google Ads Transparency Center advertiser URL, or an advertiser ID (AR followed by digits). To add their Android app, write the app ID after a bar: Zomato | com.application.zomato. A name picks the advertiser with the most ads. Paste the URL or ID to be exact. You pay per competitor, so this list is also your cost cap.

## `daysBack` (type: `integer`):

The report covers this many days up to today. New ads are ads that were first shown in this period. Use 7 for a weekly schedule.

## `maxAdsScan` (type: `integer`):

How many ads Google is asked for, for each competitor. Advertisers with more ads than this show counts marked as minimums. Higher numbers are slower.

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

Google shows a CAPTCHA to servers that ask too fast. If runs fail with 429, turn on Apify Proxy and pick Residential.

## Actor input object example

```json
{
  "competitors": [
    "Nike, Inc.",
    "Zomato | com.application.zomato",
    "https://adstransparency.google.com/advertiser/AR16735076323512287233"
  ],
  "daysBack": 7,
  "maxAdsScan": 1000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `report` (type: `string`):

newAdsCount, exampleAdLinks, worstReviews and a summary for each competitor.

## `reportCsv` (type: `string`):

One row per competitor, flat columns, ready to import into Google Sheets.

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

One line per competitor.

# 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 = {
    "competitors": [
        "Nike, Inc."
    ],
    "daysBack": 7
};

// Run the Actor and wait for it to finish
const run = await client.actor("67-labs/competitor-ad-watch").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 = {
    "competitors": ["Nike, Inc."],
    "daysBack": 7,
}

# Run the Actor and wait for it to finish
run = client.actor("67-labs/competitor-ad-watch").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 '{
  "competitors": [
    "Nike, Inc."
  ],
  "daysBack": 7
}' |
apify call 67-labs/competitor-ad-watch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,67-labs/competitor-ad-watch"
        }
    }
}
```

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/qeRed4XFymMVwT2op/builds/51kvtOVwe7IjYSWXq/openapi.json
