# Google Ads Transparency Scraper (`devilscrapes/google-ads-transparency`) Actor

Scrape ad creatives from Google Ads Transparency Center by advertiser domain or advertiser ID. Pay-per-event pricing — $1.20 / 1K ads.

- **URL**: https://apify.com/devilscrapes/google-ads-transparency.md
- **Developed by:** [DevilScrapes](https://apify.com/devilscrapes) (community)
- **Categories:** SEO tools, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## Google Ads Transparency Scraper

**💰 $1.20 / 1 000 ads** &nbsp;·&nbsp; pay only for results &nbsp;·&nbsp; no credit card to try

_We do the dirty work so your dataset stays clean._ 😈

Extract every ad creative from **Google Ads Transparency Center** for a brand domain or advertiser ID. Get advertiser name, creative ID, landing domain, format type, first/last seen timestamps, and preview-image / video URLs — exported to JSON, CSV, or Excel.

</div>

---

### 🎯 What this scrapes
The [Google Ads Transparency Center](https://adstransparency.google.com) is Google's public registry of every ad campaign running on Search, YouTube, Display, Shopping, Maps, and Play. This Actor talks to its internal `SearchService/SearchCreatives` RPC directly — no Chrome, no Playwright, no Selenium — so it's fast, stable, and cheap.

Per creative you get:

| Field | Type | Notes |
|---|---|---|
| `advertiser_id` | string | Google's stable advertiser identifier (e.g. `AR0123…`) |
| `advertiser_name` | string | Public-facing brand name |
| `creative_id` | string | Stable per-creative ID (e.g. `CR0123…`) |
| `creative_url` | string | Deep link into Transparency Center |
| `landing_domain` | string | Click-through domain |
| `format_type` | integer | Numeric format code (1=text, 2=image, 3=video — inferred) |
| `first_shown_ts` | integer | Unix seconds, first observed impression |
| `last_shown_ts` | integer | Unix seconds, last observed impression |
| `impressions` | integer | Google-reported impression count |
| `preview_image_url` | string \| null | Static thumbnail (image creatives) |
| `preview_content_js_url` | string \| null | JS bundle URL (video/rich creatives) |
| `region` | string | Locale label you passed (display only) |
| `scraped_at` | string | ISO-8601 UTC timestamp |

### 💡 Use cases
- **Competitor ad-spend tracking** — pull every Nike ad once a week and diff the creative set to see launches.
- **Trademark enforcement** — monitor advertisers running ads against your brand keyword. Combine with your own takedown workflow.
- **Affiliate-fraud detection** — flag advertisers whose landing domain doesn't match the advertiser name.
- **Political-ad monitoring** — track which advertisers are active in an election cycle.
- **Brand-safety audits** — for agencies, prove the ads currently live for a client.
- **Market research** — observe how saturated a vertical (e.g. crypto, sports betting, supplements) is with ads.
- **AI / RAG ingestion** — feed creative metadata + image URLs into a vector store for image-grounded analysis.

### ⚙️ How to use it
1. **Click "Try for free"** at the top of the page.
2. **Paste one or more brand domains** into the `Brand domains` field (e.g. `nike.com`, `adidas.com`). One per line. Each domain spawns its own scrape.
3. *(Optional)* Drop in **advertiser IDs** if you already know them — they look like `AR0123456789` and live in the Transparency Center URL when you click into an advertiser.
4. *(Optional)* Set a **date window** to narrow ad activity. Defaults to the last 365 days.
5. **Run**. Each ad is one row in the dataset; export to JSON, CSV, or Excel from the Storage tab.

The first run on a new account uses `$5` of free Apify credit — that's roughly **4 000 ads** at our pricing.

### 📥 Input
The schema lives in `.actor/input_schema.json`. The fields:

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `searchDomains` | array of string | one of | `["nike.com"]` | Brand landing domains, one per line |
| `advertiserIds` | array of string | one of | `[]` | Google advertiser IDs (`AR…`) |
| `region` | enum string | no | `anywhere` | **Display-only** — Google's RPC does not filter by region (see [Limitations](#limitations)) |
| `dateFrom` | string (`YYYY-MM-DD`) | no | 365 days back | Lower bound of ad-activity window |
| `dateTo` | string (`YYYY-MM-DD`) | no | today (UTC) | Upper bound |
| `maxResults` | integer | no | `1000` | Total dataset items across all targets. `0` = unlimited |
| `maxPages` | integer | no | `25` | RPC budget per target (40 ads × 25 pages = 1 000 / target) |
| `proxyConfiguration` | proxy config | no | Apify Proxy enabled | Sticky session recommended |

At least one of `searchDomains` or `advertiserIds` must contain at least one entry.

#### Example input

```json
{
  "searchDomains": ["nike.com", "adidas.com"],
  "advertiserIds": ["AR03012025048987521025"],
  "region": "US",
  "dateFrom": "2025-11-15",
  "dateTo": "2026-05-15",
  "maxResults": 5000,
  "maxPages": 25,
  "proxyConfiguration": { "useApifyProxy": true }
}
````

### 📤 Output

Every row is one creative. Example:

```json
{
  "advertiser_id": "AR18378488041124659201",
  "advertiser_name": "Nike Retail BV",
  "creative_id": "CR15771942603307614209",
  "creative_url": "https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR15771942603307614209?region=anywhere",
  "landing_domain": "nike.com",
  "format_type": 1,
  "first_shown_ts": 1761145807,
  "last_shown_ts": 1778871417,
  "impressions": 205,
  "preview_image_url": "https://tpc.googlesyndication.com/archive/simgad/12774179880874022668",
  "preview_content_js_url": null,
  "region": "anywhere",
  "scraped_at": "2026-05-15T19:17:59+00:00"
}
```

Export options once the run finishes:

- **JSON** — full payload, ideal for AI/RAG pipelines
- **CSV / Excel** — for analyst spreadsheets, sort by `impressions` to find big-spender ads
- **JSONL** — line-delimited, easy to stream into a warehouse
- **API** — fetch programmatically via `GET /v2/datasets/{id}/items`; webhook on `ACTOR.RUN.SUCCEEDED` for live pipelines

### 💰 Pricing

Pay-per-event. You pay for what you get, nothing for what you ask for:

| Event | Price | When charged |
|---|---:|---|
| `actor-start` | **$0.005** | Once per run (covers warm-up + cookie handshake) |
| `ad-result` | **$0.0012** | Per ad creative written to the dataset |

**Examples**:

| Pull | Cost |
|---|---:|
| 100 ads | $0.13 |
| 1 000 ads | $1.21 |
| 10 000 ads | $12.01 |
| 100 000 ads (monthly competitor sweep) | $120.05 |

Compare to: building this in-house is ~2 engineer-weeks plus the ongoing cost of maintaining a proxy pool and the TLS-fingerprint replay loop. We've already done it.

### 🔥 Features

- ⚡ **Direct-RPC, no browser** — calls Google's internal `SearchCreatives` endpoint via `curl-cffi` with a Firefox TLS+H2 fingerprint. ~1 second per page (40 ads).
- 🌍 **Batch input** — scrape multiple domains and advertiser IDs in a single run, deduplicated automatically.
- 🛡️ **Apify Proxy aware** — sticky-session URLs threaded through curl-cffi for cookie continuity across pagination.
- 📦 **Golden-file tested** — every parser change runs against 4 captured creative shapes (still image, rich video, minimal, malformed) before shipping.
- 🔬 **Live wire validation** — opt-in smoke tests catch RPC contract drift before users do.
- 🪶 **Open output schema** — flat, predictable JSON. Drops straight into Pandas, BigQuery, or your vector store.

### 💡 Tips for best results

- **Search by domain when you can** — domains return *every* ad pointing at that landing page, including ones bought by resellers or affiliates. Advertiser IDs are narrower.
- **Pull bigger date windows in one run** — Google's response is paginated, not date-segmented. Asking for 365 days is the same cost per ad as asking for 30 days.
- **Big brands hit the cap fast** — Nike's library claims ~300 000 ads. The default `maxPages=25` caps at 1 000 ads per domain. Raise it for full-history pulls.
- **Use `region` as a tag** — it doesn't filter the RPC, but if you're running parallel campaigns per market, set `region: "US"` on the US sweep so your downstream tables can group by it.
- **Run weekly, not hourly** — Google updates the Transparency Center daily at most. Scheduling more often just wastes credit.

### 🚧 Limitations

- **Region is metadata, not a filter.** Google's `SearchCreatives` RPC ignores the geo target — we proved this empirically (see `scripts/recon/FINDINGS.md`). The Transparency Center's browser UI shows a region selector, but the server returns the same creative set regardless. We expose `region` purely so you can tag exports by intended locale.
- **No region-only browsing.** You must give the scraper a `searchDomain` or `advertiserId`. There is no "all ads in country X" mode on the public RPC. If Google adds one we'll ship it.
- **Video / rich creatives return a `content.js` URL, not an MP4.** Rendering the actual video frame requires executing Google's JS bundle — out of scope for v1.
- **Date range is enforced by Google, not us.** They retain ~12 months of history. Asking for older dates just clips to that window.

### 🔌 Integrations

- **Schedule** — Apify Console → Schedules tab → run weekly for monitoring.
- **Webhooks** — register `ACTOR.RUN.SUCCEEDED` to fire your downstream pipeline as soon as the dataset is final.
- **API** — `POST /v2/acts/DevilScrapes~google-ads-transparency/run-sync-get-dataset-items` returns the full result set in one synchronous call (good for ≤ a few thousand ads).
- **Make / Zapier** — every Apify Actor surfaces as a node out of the box.
- **n8n** — use the Apify community node.

### ❓ FAQ

**Is this legal?**

Yes. The Google Ads Transparency Center is a public registry Google operates under EU DSA + US regulatory pressure. We scrape only what the public UI exposes, at a polite cadence (~1 req/s per session), and we do not bypass any authentication. We also don't collect personal data — only advertiser-level metadata.

**Why is the region selector marked "display only"?**

Because we empirically confirmed the RPC ignores it. Other scrapers on the Store claim region filtering; we tested every plausible RPC body shape and none of them returned a region-narrowed result set. We'd rather under-promise than ship broken filtering. If Google adds a region filter, we'll wire it in.

**Why isn't there a search-by-keyword mode?**

Because Google's RPC doesn't expose one. You search by advertiser. For brand-keyword monitoring, give us the domain (e.g. `nike.com`) and the scraper returns every ad pointing at that domain — including those bought by competitors trying to bid on your name.

**Can I scrape political ads specifically?**

Not yet — political ads live in a separate Google library with its own endpoints. Open an issue on the Apify Store listing if you want this; we'll prioritize based on demand.

**How do I export to Google Sheets / a database?**

Three options:

1. **Console → Storage → Export** for one-off CSV downloads.
2. **Webhook** the dataset URL to a small Make / Zapier flow that appends to Sheets.
3. **Apify integration nodes** in Airbyte, n8n, or your warehouse loader.

**Some preview URLs are `null`. Why?**

Rich / video / animated creatives expose only a `content.js` URL — Google's preview is rendered by JavaScript. Static images give you a direct `preview_image_url`. Plan accordingly: if you need actual video frames, post-process the `content.js` URL with a headless browser.

**The number of returned ads is less than Google's reported total. Why?**

Google paginates and stops responding past some internal limit (we've observed ~1 000-ad caps per query). For very large advertisers (Nike, Coca-Cola), `maxPages = 25` is intentionally conservative. Raise it if you need full coverage.

### 💬 Support & feedback

Spotted a bug, missing field, or want a new feature? Open an issue on the [Apify Store listing](https://apify.com/DevilScrapes/google-ads-transparency) — we read every one.

Built by **Devil Scrapes** — Apify Actors with attitude. PPE, transparent pricing, no junk fields.

# Actor input Schema

## `searchDomains` (type: `array`):

List of advertiser landing-page domains to scrape. The scraper returns every ad pointing at each domain in the date window. Example: <code>nike.com</code>, <code>adidas.com</code>.

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

Optional Google advertiser IDs (e.g. <code>AR0123456789</code>) to scrape instead of, or alongside, brand domains. Use when you already know the exact advertiser.

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

ISO-3166 alpha-2 country code or <code>anywhere</code>. Stored on each output row as metadata. <strong>Important</strong>: Google's SearchCreatives RPC ignores this on the server side — it does not narrow which ads come back. We expose it so you can tag exports by intended market.

## `dateFrom` (type: `string`):

Lower bound of the ad-activity window (<code>YYYY-MM-DD</code>). Leave empty to default to 365 days before <em>Date to</em>.

## `dateTo` (type: `string`):

Upper bound of the ad-activity window (<code>YYYY-MM-DD</code>). Leave empty to default to today (UTC).

## `maxResults` (type: `integer`):

Total dataset items to keep across all targets. <code>0</code> disables the cap. Defaults to 1000.

## `maxPages` (type: `integer`):

Hard ceiling on RPC round-trips per domain/advertiser. Each page returns up to 40 creatives, so the default 25 covers up to 1 000 ads per target. Lift this only if a target trips the cap.

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

Apify Proxy is recommended — Google does not aggressively block this endpoint, but sticky sessions help cookie continuity across pagination. Default uses the account's available proxy groups; specify <code>RESIDENTIAL</code> on paid plans for the cleanest exit IPs.

## Actor input object example

```json
{
  "searchDomains": [
    "nike.com"
  ],
  "advertiserIds": [],
  "region": "anywhere",
  "dateFrom": "2025-11-15",
  "dateTo": "2026-05-15",
  "maxResults": 1000,
  "maxPages": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Full set of scraped ad creatives — one item per ad. Streamed JSON via the Apify dataset API.

## `datasetItemsCsv` (type: `string`):

Same data, CSV export. Drop straight into a spreadsheet or warehouse loader.

## `datasetView` (type: `string`):

Open the run's dataset in the Console with the Overview view applied.

# 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 = {
    "searchDomains": [
        "nike.com"
    ],
    "advertiserIds": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Ads Transparency Scraper",
        "description": "Scrape ad creatives from Google Ads Transparency Center by advertiser domain or advertiser ID. Pay-per-event pricing — $1.20 / 1K ads.",
        "version": "0.2",
        "x-build-id": "MI3edend5JuFftvKG"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/devilscrapes~google-ads-transparency/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-devilscrapes-google-ads-transparency",
                "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/devilscrapes~google-ads-transparency/runs": {
            "post": {
                "operationId": "runs-sync-devilscrapes-google-ads-transparency",
                "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/devilscrapes~google-ads-transparency/run-sync": {
            "post": {
                "operationId": "run-sync-devilscrapes-google-ads-transparency",
                "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": {
                    "searchDomains": {
                        "title": "Brand domains",
                        "type": "array",
                        "description": "List of advertiser landing-page domains to scrape. The scraper returns every ad pointing at each domain in the date window. Example: <code>nike.com</code>, <code>adidas.com</code>.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "advertiserIds": {
                        "title": "Advertiser IDs",
                        "type": "array",
                        "description": "Optional Google advertiser IDs (e.g. <code>AR0123456789</code>) to scrape instead of, or alongside, brand domains. Use when you already know the exact advertiser.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "region": {
                        "title": "Region (display label only)",
                        "enum": [
                            "anywhere",
                            "AE",
                            "AR",
                            "AT",
                            "AU",
                            "BE",
                            "BG",
                            "BR",
                            "CA",
                            "CH",
                            "CL",
                            "CO",
                            "CZ",
                            "DE",
                            "DK",
                            "EE",
                            "EG",
                            "ES",
                            "FI",
                            "FR",
                            "GB",
                            "GR",
                            "HU",
                            "ID",
                            "IE",
                            "IL",
                            "IN",
                            "IT",
                            "JP",
                            "KR",
                            "LT",
                            "LV",
                            "MX",
                            "MY",
                            "NL",
                            "NO",
                            "NZ",
                            "PH",
                            "PL",
                            "PT",
                            "RO",
                            "SA",
                            "SE",
                            "SG",
                            "SK",
                            "TH",
                            "TR",
                            "UA",
                            "US",
                            "VN",
                            "ZA"
                        ],
                        "type": "string",
                        "description": "ISO-3166 alpha-2 country code or <code>anywhere</code>. Stored on each output row as metadata. <strong>Important</strong>: Google's SearchCreatives RPC ignores this on the server side — it does not narrow which ads come back. We expose it so you can tag exports by intended market.",
                        "default": "anywhere"
                    },
                    "dateFrom": {
                        "title": "Date from",
                        "type": "string",
                        "description": "Lower bound of the ad-activity window (<code>YYYY-MM-DD</code>). Leave empty to default to 365 days before <em>Date to</em>."
                    },
                    "dateTo": {
                        "title": "Date to",
                        "type": "string",
                        "description": "Upper bound of the ad-activity window (<code>YYYY-MM-DD</code>). Leave empty to default to today (UTC)."
                    },
                    "maxResults": {
                        "title": "Max results (per run)",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Total dataset items to keep across all targets. <code>0</code> disables the cap. Defaults to 1000.",
                        "default": 1000
                    },
                    "maxPages": {
                        "title": "Max pages (per target)",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Hard ceiling on RPC round-trips per domain/advertiser. Each page returns up to 40 creatives, so the default 25 covers up to 1 000 ads per target. Lift this only if a target trips the cap.",
                        "default": 25
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy is recommended — Google does not aggressively block this endpoint, but sticky sessions help cookie continuity across pagination. Default uses the account's available proxy groups; specify <code>RESIDENTIAL</code> on paid plans for the cleanest exit IPs.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
