# Google Ads Transparency Scraper & Competitor Ad Monitor (`kamerozkan/google-ads-verified-change-monitor`) Actor

Scrape the Google Ads Transparency Center for exact advertiser accounts and track what changed in a competitor's creative library. Export current ad creatives, formats, impression ranges, and start dates, then detect new, stopped, resumed, and changed ads in webhook-ready JSON.

- **URL**: https://apify.com/kamerozkan/google-ads-verified-change-monitor.md
- **Developed by:** [Kamer Ozkan](https://apify.com/kamerozkan) (community)
- **Categories:** SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.12 / 1,000 creative scanneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Google Ads Transparency Scraper & Competitor Ad Monitor

Track what changed in a verified competitor's Google Ads creative library.

This Actor scrapes current creatives from exact Google Ads Transparency advertiser accounts and tracks new, stopped, resumed, and changed creatives across later runs. It is designed for competitor research, swipe-file exports, scheduled monitoring, agency reporting, and webhook automation.

You do not need a Google Ads account, cookies, or a Google Ads API key.

### What problem does it solve?

A normal Google Ads scraper downloads the same creative rows every day. Your workflow still has to decide what is actually new, what disappeared, and whether a failed or partial scrape created a false alarm.

This Actor keeps monitor history and returns a clean change feed:

- `NEW`: a creative appeared after the baseline
- `DISCOVERED`: Google returned a previously unseen creative whose own first-shown date predates the last accepted scan
- `MISSING_ONCE`: one tentative absence, available only when requested
- `STOPPED_CONFIRMED`: absent from two consecutive complete scans
- `RESUMED`: a previously stopped creative returned
- `ASSET_CHANGED`: the same creative ID returned with different creative content

The first successful run creates the monitoring baseline. The default `ALL_CHECKED` output returns every current creative as a `CURRENT` row, while keeping existing ads out of the `NEW` event stream. Scheduled users can switch to `CHANGES_ONLY`.

Google can occasionally return an older creative that was absent from an earlier snapshot. The Actor labels that record `DISCOVERED`, not `NEW`. A `NEW` event requires the source's own `firstShown` date to be on or after the previous accepted scan date.

### Why use this Actor?

#### Exact advertiser isolation

The input accepts native Google advertiser IDs such as `AR13568824525935607809`. Domain searches can mix official brand accounts, agencies, affiliates, and unrelated advertisers. Exact IDs keep each monitor tied to the account you selected.

#### Safer stopped-ad detection

A creative is not marked stopped after one absence. `STOPPED_CONFIRMED` requires:

1. Two consecutive successful source runs
2. Complete pagination in both runs
3. The creative missing from both complete snapshots
4. At least six hours between the first absence and confirmation

Failed, blocked, timed-out, or capped scans do not advance the stopped-ad counter.
Immediate retries cannot confirm a stopped creative.

Google preview-container parameters can rotate without the creative changing. Those volatile parameters are excluded from asset identity. Direct media changes and stable creative fields can still produce `ASSET_CHANGED`.
When Google switches the same creative between an opaque preview container and a direct media URL, the Actor updates its evidence without claiming that the ad changed.

#### Automatic large-account protection

`AUTO` mode chooses the safest behavior for every advertiser:

- Complete scan: full lifecycle monitoring
- Result or page cap reached: new-launch feed only

The Actor never claims that an ad stopped when the account was only partially scanned.

#### Changes-only output

Use `CHANGES_ONLY` for scheduled runs. The dataset stays empty when nothing changed, making it easy to connect the Actor to Slack, Discord, Make, Zapier, n8n, or your own webhook.

### Quick start

Use one exact advertiser ID for the first test:

```json
{
  "advertiserIds": ["AR13568824525935607809"],
  "region": "US",
  "monitorName": "competitor-watch",
  "mode": "AUTO",
  "lookbackDays": 7,
  "maxCreativesPerAdvertiser": 1000,
  "outputMode": "ALL_CHECKED"
}
````

The first run returns the current creatives and creates the baseline. Run it again with the same `monitorName`, advertiser IDs, region, and activity window to receive verified changes.

### Example change

```json
{
  "recordType": "CHANGE",
  "status": "NEW",
  "eventId": "evt_2cad1f37712f32ad1af8a9a71f827452",
  "eventType": "NEW",
  "monitorName": "competitor-watch",
  "modeUsed": "FULL_LIFECYCLE",
  "region": "US",
  "advertiserId": "AR13568824525935607809",
  "advertiserName": "Linear Orbit, Inc.",
  "creativeId": "CR_EXAMPLE",
  "format": "VIDEO",
  "firstShown": "2026-07-23",
  "primaryAssetUrl": "https://tpc.googlesyndication.com/example-creative.mp4",
  "sourceUrl": "https://adstransparency.google.com/advertiser/AR13568824525935607809/creative/CR_EXAMPLE?region=US",
  "evidence": {
    "baseline": false,
    "runId": "competitor-watch:AR13568824525935607809:US:7d:2026-07-23T08:00:00.000Z"
  },
  "detectedAt": "2026-07-23T08:00:00.000Z",
  "schemaVersion": "1.0"
}
```

### Example current creative

```json
{
  "recordType": "CURRENT",
  "status": "CURRENT",
  "eventId": null,
  "eventType": null,
  "advertiserName": "Linear Orbit, Inc.",
  "creativeId": "CR_EXAMPLE",
  "format": "IMAGE",
  "region": "US",
  "firstShown": "2026-07-20",
  "primaryAssetUrl": "https://tpc.googlesyndication.com/example-creative.png",
  "sourceUrl": "https://adstransparency.google.com/advertiser/AR13568824525935607809/creative/CR_EXAMPLE?region=US"
}
```

### Input fields

| Field | Description | Default |
|---|---|---|
| `advertiserIds` | 1-20 native `AR...` IDs or advertiser URLs | Required |
| `region` | Country where the ads were shown | `US` |
| `monitorName` | Stable history name for one watchlist | `competitor-watch` |
| `mode` | `AUTO`, `FULL_LIFECYCLE`, or `NEW_LAUNCH_FEED` | `AUTO` |
| `lookbackDays` | Rolling activity window from 1 to 90 days | `7` |
| `maxCreativesPerAdvertiser` | Per-advertiser result and billing safety cap | `1000` |
| `outputMode` | Current creatives plus changes, or changes only | `ALL_CHECKED` |
| `includeBaseline` | In changes-only mode, label first-run creatives as `NEW` | `false` |
| `includeTentative` | Include internal `MISSING_ONCE` events | `false` |

### Monitoring modes

#### Auto

Recommended for most users. Full lifecycle is used only when all source pages finish. Large accounts automatically fall back to a safe new-launch feed.

#### Full lifecycle

Requires a complete advertiser scan. If the configured cap is reached, the target is reported as `INCOMPLETE`, history is not advanced, and no verified creative checks are billed for that target.

#### New launch feed

Tracks previously seen creative IDs and emits only new ones. This mode can operate on a capped recent window because it never produces stopped-ad claims.

### Output modes

#### Changes only

Returns only lifecycle events. Use this for schedules, webhooks, Slack, Discord, Make, Zapier, and n8n. The first baseline produces zero rows because existing ads are not new launches.

#### Changes and all checked creatives

The default mode. Adds one `CURRENT` row per verified creative and includes any verified change events. Use it for the first run, one-time exports, audits, and swipe-file workflows.

### Supported countries

The Actor currently supports 33 major Google Ads markets:

`AE`, `AT`, `AU`, `BE`, `BR`, `CA`, `CH`, `CZ`, `DE`, `DK`, `ES`, `FI`, `FR`, `GB`, `GR`, `HU`, `IE`, `IN`, `IT`, `JP`, `KR`, `MX`, `NL`, `NO`, `NZ`, `PL`, `PT`, `RO`, `SE`, `SG`, `TR`, `US`, `ZA`.

Country criteria use active Google geo target constants.

### How to find the advertiser ID

1. Open Google Ads Transparency Center.
2. Search for the advertiser.
3. Open the advertiser page.
4. Copy the `AR...` value from the URL.

Example:

```text
https://adstransparency.google.com/advertiser/AR13568824525935607809
```

You can paste either the full URL or only the advertiser ID into the Actor input.

### Scheduling and webhooks

For daily monitoring:

1. Save the Actor input as an Apify Task.
2. Keep the same `monitorName` and scope settings.
3. Add an Apify Schedule.
4. Add a webhook for `ACTOR.RUN.SUCCEEDED`.
5. Read the default dataset. Zero rows means no confirmed change was emitted.

Every change includes a deterministic `eventId`. Use it as the idempotency key when a webhook or downstream workflow retries delivery.

Changing `monitorName`, advertiser ID, region, or `lookbackDays` creates a different history scope.

### Billing

The Actor charges per successfully verified creative check. A check can be billed even when an unchanged row is hidden by `CHANGES_ONLY`, because the source request, advertiser isolation, and history comparison were completed.

- Creatives scanned: **$0.15 per 1,000**
- Verified changes: **$5.00 per 1,000** — never charged on a monitor's first run
- Actor start: $0.005 per GB of run memory
- Platform usage and proxies: included

You pay a low rate for looking, and only pay the higher rate when something actually changed. A full-dump scraper charges you the same amount every single day whether the library moved or not.

#### What daily monitoring actually costs

One advertiser, 1,000 creatives, checked daily for 30 days, with a typical five changes a day:

| | This Actor | Full-dump scraper at $0.80 / 1K |
|---|---:|---:|
| Day 1 (baseline, no change fee) | $0.15 | $0.80 |
| Each later day | $0.175 | $0.80 |
| **30-day total** | **$5.23** | **$24.00** |

That is **4.6x cheaper** for the same coverage — and the output is already reduced to what changed, so nothing downstream has to diff it again.

A one-off export is cheaper too: 1,000 creatives in a single run costs $0.15 against $0.80.

The default 1,000-creative cap limits scan charges to $0.15 per advertiser. With 20 advertisers at the full default cap, the maximum scan charge is $3.00 plus changes and the Actor start. Most advertisers return fewer rows and cost less.

Dataset rows are not a separate billable event, so `ALL_CHECKED` does not create a second result charge.

These cases are not billed as verified creative checks:

- Advertiser lookup failure
- Source request failure
- Advertiser contamination
- Explicit `FULL_LIFECYCLE` run that cannot finish pagination
- Suspicious empty snapshot after a previously active library
- Records beyond the run's maximum charge limit

The `OUTPUT` record contains the exact billed check count and a per-advertiser accounting summary.

### Reliability evidence

The pre-launch benchmark on July 22-23, 2026 included:

- 25/25 successful source targets across the United States and Germany
- 820 source records with zero duplicate creative IDs
- 100% native creative ID, asset, and date coverage on non-empty targets
- 8 verified advertiser accounts with full pagination
- 1,072 creatives per complete canary round
- Two consecutive complete rounds with zero false lifecycle events
- Direct HTTP rate-limit detection with a browser-session fallback
- A separate live United Kingdom smoke test with complete pagination

Automated tests cover baseline behavior, duplicate handling, incomplete-run safety, two-run stopped confirmation, resume detection, asset fingerprint stability, billing limits, account isolation, and state persistence.

### Important limitations

- Google Ads Transparency Center is a public transparency source, not the Google Ads performance API.
- The Actor does not provide spend, conversions, ROAS, exact impressions, or campaign performance.
- A missing transparency record does not prove that a campaign was deleted inside Google Ads.
- A complete but empty snapshot cannot erase a previously active library. The target is flagged as `SUSPICIOUS_EMPTY`, history is preserved, and no stopped events are emitted.
- Creative links and media availability depend on what Google exposes publicly.
- Very large advertisers may use `NEW_LAUNCH_FEED` in Auto mode rather than full stopped-ad detection.
- The Actor monitors one delivery country per run. Create separate tasks for separate countries.
- Avoid overlapping runs that use the same monitor name and scope. Schedule the next run after the previous run finishes. Every change includes a deterministic `eventId` so downstream systems can safely deduplicate retried delivery.
- Google reports source dates at day-level granularity. A `NEW` event means the source date is on or after the previous accepted scan date, not that the exact launch minute is known.

### FAQ

#### Can I enter a domain such as nike.com?

Not in this Actor. Domain searches can mix multiple advertiser accounts. Use an exact advertiser ID to preserve account isolation.

#### Why was my first dataset empty?

You selected `CHANGES_ONLY`, so the first successful run created a silent baseline. Use the default `ALL_CHECKED` mode when you want the current creative snapshot on the first run.

#### Why did Auto mode use New Launch Feed?

The advertiser had more creatives than the configured cap. Auto mode refused to make stopped-ad claims from a partial snapshot.

#### Does a stopped event require two days?

It requires two consecutive complete scheduled runs, not a fixed number of days. With a daily schedule, confirmation normally takes two daily absences.

#### Can I monitor several competitors?

Yes. Add up to 20 advertiser IDs. Every advertiser receives an independent state and completeness decision.

#### Is this affiliated with Google?

No. This Actor is not affiliated with or endorsed by Google. Users are responsible for using public data lawfully and in accordance with applicable rules.

# Actor input Schema

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

Paste 1-20 native AR advertiser IDs or full Google Ads Transparency advertiser URLs. Exact IDs prevent unrelated advertisers from being mixed into the monitor.

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

Return creatives shown in this country. Monitor the same advertiser separately when you need both regions.

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

Stable name used to compare scheduled runs. Keep it unchanged for one watchlist.

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

Auto uses full lifecycle when every page finishes and safely falls back to new-launch tracking for very large accounts.

## `lookbackDays` (type: `integer`):

Monitor creatives that appeared in this rolling window. Keep this value unchanged across scheduled runs.

## `maxCreativesPerAdvertiser` (type: `integer`):

Safety and cost cap for each advertiser. At the default cap, verified checks cost at most $1.50 per advertiser plus the Actor start. Auto mode switches to new-launch tracking when the complete account exceeds this limit.

## `outputMode` (type: `string`):

Current creatives plus changes is best for the first run and one-time exports. Changes only is best for scheduled alerts.

## `includeBaseline` (type: `boolean`):

Advanced option for changes-only output. When enabled, the first successful run labels existing creatives as NEW instead of creating a silent baseline. Current-creatives output already returns them as CURRENT.

## `includeTentative` (type: `boolean`):

Expose MISSING\_ONCE rows before a second complete absence confirms that a creative stopped.

## `failOnAllTargetsFailed` (type: `boolean`):

Fail the run after writing diagnostics when every advertiser target fails.

## Actor input object example

```json
{
  "advertiserIds": [
    "AR13568824525935607809"
  ],
  "region": "US",
  "monitorName": "competitor-watch",
  "mode": "AUTO",
  "lookbackDays": 7,
  "maxCreativesPerAdvertiser": 1000,
  "outputMode": "ALL_CHECKED",
  "includeBaseline": false,
  "includeTentative": false,
  "failOnAllTargetsFailed": true
}
```

# Actor output Schema

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

Default dataset with current creatives plus new, discovered, stopped, resumed, and changed rows.

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

OUTPUT record with per-advertiser completeness, mode selection, event counts, billing, 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 = {
    "advertiserIds": [
        "AR13568824525935607809"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kamerozkan/google-ads-verified-change-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 = { "advertiserIds": ["AR13568824525935607809"] }

# Run the Actor and wait for it to finish
run = client.actor("kamerozkan/google-ads-verified-change-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "advertiserIds": [
    "AR13568824525935607809"
  ]
}' |
apify call kamerozkan/google-ads-verified-change-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kamerozkan/google-ads-verified-change-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Ads Transparency Scraper & Competitor Ad Monitor",
        "description": "Scrape the Google Ads Transparency Center for exact advertiser accounts and track what changed in a competitor's creative library. Export current ad creatives, formats, impression ranges, and start dates, then detect new, stopped, resumed, and changed ads in webhook-ready JSON.",
        "version": "0.0",
        "x-build-id": "X9554zCHMyczZrBXW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kamerozkan~google-ads-verified-change-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kamerozkan-google-ads-verified-change-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/kamerozkan~google-ads-verified-change-monitor/runs": {
            "post": {
                "operationId": "runs-sync-kamerozkan-google-ads-verified-change-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/kamerozkan~google-ads-verified-change-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-kamerozkan-google-ads-verified-change-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "advertiserIds"
                ],
                "properties": {
                    "advertiserIds": {
                        "title": "Google advertiser IDs or URLs",
                        "minItems": 1,
                        "maxItems": 20,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Paste 1-20 native AR advertiser IDs or full Google Ads Transparency advertiser URLs. Exact IDs prevent unrelated advertisers from being mixed into the monitor.",
                        "items": {
                            "type": "string",
                            "pattern": "^(AR[0-9]+|https://adstransparency\\.google\\.com/advertiser/AR[0-9]+(?:[/?#].*)?)$"
                        }
                    },
                    "region": {
                        "title": "Ad delivery region",
                        "enum": [
                            "US",
                            "GB",
                            "CA",
                            "AU",
                            "DE",
                            "FR",
                            "ES",
                            "IT",
                            "NL",
                            "BE",
                            "CH",
                            "AT",
                            "IE",
                            "SE",
                            "NO",
                            "DK",
                            "FI",
                            "PL",
                            "PT",
                            "CZ",
                            "RO",
                            "HU",
                            "GR",
                            "BR",
                            "MX",
                            "IN",
                            "JP",
                            "KR",
                            "SG",
                            "NZ",
                            "AE",
                            "ZA",
                            "TR"
                        ],
                        "type": "string",
                        "description": "Return creatives shown in this country. Monitor the same advertiser separately when you need both regions.",
                        "default": "US"
                    },
                    "monitorName": {
                        "title": "Monitor name",
                        "pattern": "^[A-Za-z0-9._-]{3,64}$",
                        "minLength": 3,
                        "maxLength": 64,
                        "type": "string",
                        "description": "Stable name used to compare scheduled runs. Keep it unchanged for one watchlist.",
                        "default": "competitor-watch"
                    },
                    "mode": {
                        "title": "Monitoring mode",
                        "enum": [
                            "AUTO",
                            "FULL_LIFECYCLE",
                            "NEW_LAUNCH_FEED"
                        ],
                        "type": "string",
                        "description": "Auto uses full lifecycle when every page finishes and safely falls back to new-launch tracking for very large accounts.",
                        "default": "AUTO"
                    },
                    "lookbackDays": {
                        "title": "Activity window in days",
                        "minimum": 1,
                        "maximum": 90,
                        "type": "integer",
                        "description": "Monitor creatives that appeared in this rolling window. Keep this value unchanged across scheduled runs.",
                        "default": 7
                    },
                    "maxCreativesPerAdvertiser": {
                        "title": "Maximum creatives per advertiser",
                        "minimum": 40,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Safety and cost cap for each advertiser. At the default cap, verified checks cost at most $1.50 per advertiser plus the Actor start. Auto mode switches to new-launch tracking when the complete account exceeds this limit.",
                        "default": 1000
                    },
                    "outputMode": {
                        "title": "Dataset output",
                        "enum": [
                            "CHANGES_ONLY",
                            "ALL_CHECKED"
                        ],
                        "type": "string",
                        "description": "Current creatives plus changes is best for the first run and one-time exports. Changes only is best for scheduled alerts.",
                        "default": "ALL_CHECKED"
                    },
                    "includeBaseline": {
                        "title": "Label the first baseline as new",
                        "type": "boolean",
                        "description": "Advanced option for changes-only output. When enabled, the first successful run labels existing creatives as NEW instead of creating a silent baseline. Current-creatives output already returns them as CURRENT.",
                        "default": false
                    },
                    "includeTentative": {
                        "title": "Include first missing observation",
                        "type": "boolean",
                        "description": "Expose MISSING_ONCE rows before a second complete absence confirms that a creative stopped.",
                        "default": false
                    },
                    "failOnAllTargetsFailed": {
                        "title": "Fail when no advertiser succeeds",
                        "type": "boolean",
                        "description": "Fail the run after writing diagnostics when every advertiser target fails.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
