# Google Ads Transparency Scraper — Advertiser Ads & Creatives (`silentshadow55/google-ads-transparency-actor`) Actor

Scrape every ad creative an advertiser runs on Google from the Ads Transparency Center. Resolve by advertiser name, ID, or domain; get image and HTML5 creatives with first/last-shown dates, region filtering, and full pagination — no 100-item cap. Cookieless, no login, no CAPTCHA.

- **URL**: https://apify.com/silentshadow55/google-ads-transparency-actor.md
- **Developed by:** [Esteban Ortega](https://apify.com/silentshadow55) (community)
- **Categories:** SEO tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 ad 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/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 — Advertiser Ads & Creatives

Scrape every ad creative an advertiser runs on Google straight from the **Google Ads Transparency Center** (adstransparency.google.com). Give it an advertiser name, an advertiser ID, or a domain, and get back a clean, structured list of that advertiser's image and HTML5 ad creatives — with first-shown / last-shown dates, region filtering, and **full pagination (no hidden 100-item cap)**. Cookieless, no login, no CAPTCHA.

Built for competitive-ad researchers, performance marketers, brand-safety teams, and AI agents that need an advertiser's live ad library without the Google Ads Transparency Center's clunky UI.

### What it does

- **Resolves an advertiser three ways.** Look up by **advertiser name** ("Verizon"), by exact **advertiser ID** (`AR11385763688137883649`), or by **domain** ("verizon.com"). No fuzzy guesswork — the mode is explicit, and ambiguous names return disambiguation candidates you can pin.
- **Lists every creative with full token pagination.** Most scrapers silently stop at 100 results. This one follows Google's pagination token to the end (or your chosen cap), so you get the whole ad library — deduped by creative ID and guarded against stuck pagination tokens and runaway page loops.
- **Region filtering that actually works.** Pass a 2-letter country code (US, GB, CA…; UK/USA are aliased) to see only ads shown in that country. Uses Google's real geo IDs, validated against the live site. An unknown code fails fast with one error record instead of silently scraping the whole world.
- **Optional per-region enrichment.** Turn on creative enrichment to add every render variant and per-country last-shown dates for each creative.
- **Optional asset rehosting.** Google's `simgad` image and preview URLs expire fast — enable `downloadAssets` to persist the actual creative bytes in your run's key-value store.
- **Loud on anomalies, never silently empty.** If Google changes its internal payload shape or soft-blocks a request (the #1 reason competing scrapers return nothing), this actor surfaces an explicit error or notice record — including mid-pagination truncation (`partial: true` on the advertiser summary) — instead of pretending the result is a complete zero. A genuinely dormant advertiser (Google's own counts say 0 recent and 0 lifetime ads) is reported as a clean zero, not a false alarm.
- **Streaming results.** Every page of creatives is pushed to the dataset the moment it is scraped, so a timeout or migration late in a long run still leaves everything already fetched in your dataset.

### Output fields

Each creative is one dataset item (`type: "creative"`). Every run also emits one `advertiser` summary record per advertiser, plus `advertiser_candidate` / `domain_candidate` records for disambiguation. At most **one** `error` or `notice` record is emitted per advertiser target (and failures never consume your `maxCreativesPerAdvertiser` budget). All records share the identical key set, so exports stay rectangular.

Sample creative output item:

```json
{
  "type": "creative",
  "scraped_at": "2026-07-23T05:10:00+00:00",
  "advertiser_id": "AR11385763688137883649",
  "advertiser_name": "Verizon Value, Inc",
  "creative_id": "CR15308872423592427521",
  "format": "image",
  "format_enum": 1,
  "image_url": "https://tpc.googlesyndication.com/archive/simgad/6369736585639432871",
  "preview_url": null,
  "first_shown": "2025-09-22T07:00:00+00:00",
  "last_shown": "2026-07-23T04:14:25+00:00",
  "region": "US",
  "regions": [],
  "variants": [],
  "deep_link": "https://adstransparency.google.com/advertiser/AR11385763688137883649/creative/CR15308872423592427521?region=us",
  "asset_kvs_key": null,
  "error": null
}
````

Sample advertiser summary item:

```json
{
  "type": "advertiser",
  "advertiser_id": "AR11385763688137883649",
  "advertiser_name": "Verizon Value, Inc",
  "legal_name": "Verizon Value, Inc",
  "country": "US",
  "verified": true,
  "total_creatives": 500,
  "recent_ads": 500,
  "lifetime_ads": 600,
  "partial": false,
  "region": "US"
}
```

- `total_creatives` — the number of creatives **actually scraped in this run** (after your cap / region filter / any truncation).
- `recent_ads` / `lifetime_ads` — **Google's own reported totals** for the advertiser (from the search results page, falling back to the suggestion service), so you can tell a capped scrape from a complete one.
- `partial` — `true` on the advertiser summary when pagination ended abnormally (soft-block, stuck token, page failure) and the creative list may be incomplete; a matching `error` record explains where it was truncated.
- `format` — `image`, `html5`, or `unknown` (raw enum kept in `format_enum`).
- `image_url` — direct `simgad` image URL (static image ads).
- `preview_url` — Google `displayads-formats` preview URL (HTML5 / responsive ads).
- `first_shown` / `last_shown` — ISO-8601 UTC, converted from Google's unix timestamps.
- `regions` — populated only with `enrichCreativeDetail`: `[{geo_id, country, last_shown}]` per country.
- `variants` — populated only with `enrichCreativeDetail`: every render variant of the creative.
- `deep_link` — direct link to the creative in the Ads Transparency Center.
- `asset_kvs_key` — populated only with `downloadAssets`: the key-value-store key holding the rehosted bytes.

### Input

| Field | Type | Description |
|---|---|---|
| `advertiserName` | string | Advertiser to resolve by name (e.g. `Verizon`). Best match is scraped; other matches become `advertiser_candidate` records. Defaults to `Verizon` when no target field is provided at all. |
| `advertiserId` | string | Exact `AR…` advertiser ID. Most deterministic input; takes priority over name/domain. |
| `domain` | string | Website domain (e.g. `verizon.com`). Lowest priority. |
| `region` | string | Optional 2-letter ISO country code (US, GB, CA…; `UK`/`USA` aliased to GB/US) to filter creatives by where they ran. Empty = all regions. Any other unknown code fails fast with one error record — never an accidental all-regions scrape. |
| `maxCreativesPerAdvertiser` | integer | Cap on creatives per advertiser (`0` = no cap — full pagination). Bounds cost on very large advertisers. |
| `enrichCreativeDetail` | boolean | One extra request per creative to add per-region dates + all variants. Slower; no extra dataset items. |
| `includeAdvertiserDetail` | boolean | One request per advertiser for legal name / country / verified. Default on. |
| `downloadAssets` | boolean | Download + rehost each creative's bytes to the key-value store (URLs expire). |
| `requestDelaySeconds` | number | Politeness delay between requests (default 1s). Raise for large or enrichment-heavy crawls. |
| `proxyConfiguration` | object | Optional proxies. Works cookieless from datacenter IPs at modest volume. |

### Use cases

- **Competitive ad intelligence** — pull a competitor's entire live creative library and track how it changes week over week.
- **Creative research / swipe files** — collect every image and HTML5 ad a brand is running, by country.
- **Brand safety & compliance** — audit which ads an advertiser is currently showing in a given region.
- **Ad-tech & agency reporting** — feed an advertiser's ad inventory into dashboards with stable, rectangular fields.
- **AI agents** — a deterministic "list this advertiser's Google ads" tool with explicit input modes and clean JSON.

### FAQ

#### How do I scrape Google Ads Transparency Center without an API?

Google doesn't offer a public Ads Transparency Center API. This actor talks to the same internal endpoints the website itself uses, cookieless and without a browser, and returns structured JSON — so you don't have to reverse-engineer anything.

#### How do I find an advertiser's ID?

Search by name or domain and read the `advertiser` / `advertiser_candidate` records — each carries the `AR…` ID. Or copy it from an `adstransparency.google.com/advertiser/AR…` URL. Pinning the ID is the most reliable way to run repeatedly.

#### Why do some scrapers return an empty result for a busy advertiser?

Google periodically changes the internal request payload shape. Scrapers that copied an old payload then silently receive `{}` and report zero ads. This actor mirrors the current live payload exactly and never swallows an unexpected empty response. An empty response is genuinely ambiguous, so the actor classifies it honestly: if Google's own suggestion counts say the advertiser has 0 recent and 0 lifetime ads, the zero is reported as a clean result; otherwise you get one clear `error` record stating that the advertiser may have no live ads **or** Google changed the payload / soft-blocked the request. On a region-filtered run an empty first page gets a cautious `notice` record ("zero ads in this region OR drift — cross-check without the region filter"), and an empty response mid-pagination marks the result `partial` instead of pretending it is complete.

#### Can I get all of an advertiser's ads, not just the first 100?

Yes. Leave `maxCreativesPerAdvertiser` at `0` and the actor follows Google's pagination token to the end.

#### Why are the image URLs sometimes dead when I open them later?

Google's `simgad` and preview URLs expire quickly. Enable `downloadAssets` to rehost the actual bytes into your run's key-value store, and use `asset_kvs_key`.

#### Can I filter ads by country?

Yes — set `region` to a 2-letter ISO code. The actor maps it to Google's geo ID and filters server-side.

### Pricing

This actor bills **per result** (pay-per-event, one charge per dataset item). Each creative, each advertiser summary, and each candidate record is one item. Error/notice records are capped at **one per advertiser target**, and failed requests never consume your `maxCreativesPerAdvertiser` budget — the cap counts only real, deduplicated creatives. To control cost on large advertisers, set `maxCreativesPerAdvertiser`. Enrichment flags (`enrichCreativeDetail`, `includeAdvertiserDetail`, `downloadAssets`) add requests but **not** extra dataset items.

### A note on data source and terms

This actor reads **public ad-transparency data** that Google itself publishes for accountability. The endpoints are unauthenticated and require no login or terms acceptance. Google's general Terms of Service broadly discourage automated access to its products, so treat large-scale or aggressive use as a business/legal judgment call: keep volume modest, use the built-in delays, and consider residential proxies for heavy crawls. The actor never attempts CAPTCHA or WAF evasion. You are responsible for your own use of the data.

# Actor input Schema

## `advertiserName` (type: `string`):

Advertiser to look up by name, e.g. 'Verizon' or 'Nike'. The name is resolved to an advertiser ID via the Ads Transparency Center's suggestion service; the single best match is scraped and any other matches are emitted as 'advertiser\_candidate' records so you can re-run pinned to a specific advertiserId. Ignored if advertiserId is set. Defaults to 'Verizon' (a stable, large US advertiser) when no target field is provided at all, so a run always returns data.

## `advertiserId` (type: `string`):

Exact advertiser ID starting with 'AR' (e.g. AR11385763688137883649). This is the most deterministic input — no name resolution, no ambiguity. You can find an ID from a previous run's 'advertiser' / 'advertiser\_candidate' records or from an adstransparency.google.com/advertiser/\<AR...> URL. Takes priority over advertiserName and domain.

## `domain` (type: `string`):

Look up by website domain, e.g. 'nike.com'. Resolved via the suggestion service. Note: Google's public API exposes domain match counts but NOT a domain->advertiser list, so if a domain has no directly associated advertiser candidate you will get 'domain\_candidate' records and a notice asking you to re-run with a specific advertiserId. Lowest priority (used only when advertiserId and advertiserName are both empty).

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

Optional ISO-3166-1 alpha-2 country code (e.g. US, GB, CA, DE) to filter creatives to those shown in that country. 'UK' and 'USA' are accepted as aliases for GB and US. Leave empty for all regions. Any other unknown code fails fast with a single error record and scrapes nothing — the run never silently falls back to an uncapped all-regions scrape.

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

Hard cap on creatives returned per advertiser (0 = no cap — follow the pagination token to the end, which is how this actor beats the incumbents' silent 100-item cap). You are billed per result, so set a cap here to bound cost for very large advertisers (some run 500+ creatives).

## `enrichCreativeDetail` (type: `boolean`):

For every creative, make one extra GetCreativeById call to add its per-region last-shown dates (regions\[]) and every render variant (variants\[]). This makes ONE additional request per creative — much slower and more likely to be rate-limited on large advertisers — but does not add extra dataset items. Leave off for fast listing.

## `includeAdvertiserDetail` (type: `boolean`):

Make one GetAdvertiserById call per advertiser to enrich the 'advertiser' summary record with legal name, country, and verified status. One cheap call per advertiser; does not add extra dataset items.

## `downloadAssets` (type: `boolean`):

Download each creative's image/preview bytes and store them in this run's key-value store, setting asset\_kvs\_key on the creative. The simgad image and preview URLs on Google's servers expire quickly, so enable this if you need the actual creative bytes to persist. Adds one download per creative.

## `requestDelaySeconds` (type: `number`):

Politeness delay between requests to adstransparency.google.com. 1 second is safe for modest volume; raise it (and add a proxy) for large or enrichment-heavy crawls to avoid soft-blocking. This actor never attempts CAPTCHA or WAF evasion.

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

Optional proxies for the requests. When enabled, the actor rotates a 4-session proxy pool on every request — retries automatically move to a fresh IP instead of re-hitting Google from a soft-blocked one. The endpoints work cookieless from a datacenter IP at modest volume; for high-volume or enrichment-heavy runs, residential proxies plus a higher requestDelaySeconds reduce soft-blocking.

## Actor input object example

```json
{
  "advertiserName": "Verizon",
  "maxCreativesPerAdvertiser": 0,
  "enrichCreativeDetail": false,
  "includeAdvertiserDetail": true,
  "downloadAssets": false,
  "requestDelaySeconds": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "advertiserName": "Verizon"
};

// Run the Actor and wait for it to finish
const run = await client.actor("silentshadow55/google-ads-transparency-actor").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 = { "advertiserName": "Verizon" }

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Ads Transparency Scraper — Advertiser Ads & Creatives",
        "description": "Scrape every ad creative an advertiser runs on Google from the Ads Transparency Center. Resolve by advertiser name, ID, or domain; get image and HTML5 creatives with first/last-shown dates, region filtering, and full pagination — no 100-item cap. Cookieless, no login, no CAPTCHA.",
        "version": "0.0",
        "x-build-id": "Gh8ICZOdYn0I8AKGC"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/silentshadow55~google-ads-transparency-actor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-silentshadow55-google-ads-transparency-actor",
                "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/silentshadow55~google-ads-transparency-actor/runs": {
            "post": {
                "operationId": "runs-sync-silentshadow55-google-ads-transparency-actor",
                "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/silentshadow55~google-ads-transparency-actor/run-sync": {
            "post": {
                "operationId": "run-sync-silentshadow55-google-ads-transparency-actor",
                "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",
                "properties": {
                    "advertiserName": {
                        "title": "Advertiser name",
                        "type": "string",
                        "description": "Advertiser to look up by name, e.g. 'Verizon' or 'Nike'. The name is resolved to an advertiser ID via the Ads Transparency Center's suggestion service; the single best match is scraped and any other matches are emitted as 'advertiser_candidate' records so you can re-run pinned to a specific advertiserId. Ignored if advertiserId is set. Defaults to 'Verizon' (a stable, large US advertiser) when no target field is provided at all, so a run always returns data."
                    },
                    "advertiserId": {
                        "title": "Advertiser ID (AR...)",
                        "type": "string",
                        "description": "Exact advertiser ID starting with 'AR' (e.g. AR11385763688137883649). This is the most deterministic input — no name resolution, no ambiguity. You can find an ID from a previous run's 'advertiser' / 'advertiser_candidate' records or from an adstransparency.google.com/advertiser/<AR...> URL. Takes priority over advertiserName and domain."
                    },
                    "domain": {
                        "title": "Domain",
                        "type": "string",
                        "description": "Look up by website domain, e.g. 'nike.com'. Resolved via the suggestion service. Note: Google's public API exposes domain match counts but NOT a domain->advertiser list, so if a domain has no directly associated advertiser candidate you will get 'domain_candidate' records and a notice asking you to re-run with a specific advertiserId. Lowest priority (used only when advertiserId and advertiserName are both empty)."
                    },
                    "region": {
                        "title": "Region (2-letter country)",
                        "type": "string",
                        "description": "Optional ISO-3166-1 alpha-2 country code (e.g. US, GB, CA, DE) to filter creatives to those shown in that country. 'UK' and 'USA' are accepted as aliases for GB and US. Leave empty for all regions. Any other unknown code fails fast with a single error record and scrapes nothing — the run never silently falls back to an uncapped all-regions scrape."
                    },
                    "maxCreativesPerAdvertiser": {
                        "title": "Max creatives per advertiser",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Hard cap on creatives returned per advertiser (0 = no cap — follow the pagination token to the end, which is how this actor beats the incumbents' silent 100-item cap). You are billed per result, so set a cap here to bound cost for very large advertisers (some run 500+ creatives).",
                        "default": 0
                    },
                    "enrichCreativeDetail": {
                        "title": "Enrich each creative (per-region dates + all variants)",
                        "type": "boolean",
                        "description": "For every creative, make one extra GetCreativeById call to add its per-region last-shown dates (regions[]) and every render variant (variants[]). This makes ONE additional request per creative — much slower and more likely to be rate-limited on large advertisers — but does not add extra dataset items. Leave off for fast listing.",
                        "default": false
                    },
                    "includeAdvertiserDetail": {
                        "title": "Include advertiser detail (legal name, country, verified)",
                        "type": "boolean",
                        "description": "Make one GetAdvertiserById call per advertiser to enrich the 'advertiser' summary record with legal name, country, and verified status. One cheap call per advertiser; does not add extra dataset items.",
                        "default": true
                    },
                    "downloadAssets": {
                        "title": "Download & rehost creative assets",
                        "type": "boolean",
                        "description": "Download each creative's image/preview bytes and store them in this run's key-value store, setting asset_kvs_key on the creative. The simgad image and preview URLs on Google's servers expire quickly, so enable this if you need the actual creative bytes to persist. Adds one download per creative.",
                        "default": false
                    },
                    "requestDelaySeconds": {
                        "title": "Delay between requests (seconds)",
                        "minimum": 0.2,
                        "maximum": 30,
                        "type": "number",
                        "description": "Politeness delay between requests to adstransparency.google.com. 1 second is safe for modest volume; raise it (and add a proxy) for large or enrichment-heavy crawls to avoid soft-blocking. This actor never attempts CAPTCHA or WAF evasion.",
                        "default": 1
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional proxies for the requests. When enabled, the actor rotates a 4-session proxy pool on every request — retries automatically move to a fresh IP instead of re-hitting Google from a soft-blocked one. The endpoints work cookieless from a datacenter IP at modest volume; for high-volume or enrichment-heavy runs, residential proxies plus a higher requestDelaySeconds reduce soft-blocking.",
                        "default": {
                            "useApifyProxy": 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
