# Google Ads Transparency Scraper - Ad Copy & Creatives (`webdata_labs/google-ads-transparency-scraper`) Actor

\[💵 $1.40 / 1K · no start fee] Scrape Google Ads Transparency Center: ad headlines and descriptions, destination URLs, images, YouTube video URLs, verified advertiser identity, dates and formats. Search, YouTube, Shopping, Maps and Play. Many competitors per run.

- **URL**: https://apify.com/webdata\_labs/google-ads-transparency-scraper.md
- **Developed by:** [WebData Labs](https://apify.com/webdata_labs) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 ad scrapeds

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

**Scrape the [Google Ads Transparency Center](https://adstransparency.google.com) by domain, keyword or advertiser ID and get the ads your competitors are running, including the ad copy.**

> **Track which Google ads your competitors are running across Search, YouTube, Shopping, Maps and Play, without paying $200 a month for SpyFu or SEMrush.**

Google publishes every ad it serves, who paid for it, where it ran and for how long. Most scrapers of this data hand you an image URL and an ID and stop there, which is useless if what you actually wanted was the headline your competitor is bidding on. This Actor returns the ad copy, the destination, the verified advertiser behind the ad, and the creative assets, as one clean row per ad.

### ✅ What you get / ❌ What this isn't

| ✅ You get | ❌ Not this |
|---|---|
| **Headline and description text** of text ads, extracted from Google's own ad render | Not an ID-and-image dump you still have to click through |
| **Verified advertiser identity**: legal name, disclosure country, verification status | Not just the display name printed on the ad |
| **Bulk input**: keywords, domains and advertiser IDs mixed in one run | Not one run per competitor |
| **Filters echoed on every row** (`region`, `platform`, `creativeFormat`) | Not an unlabelled pile you cannot segment after merging runs |
| **`videoUrl` for video ads**, resolved to the actual YouTube video | Not a preview shell link |
| **A cost table that matches the configured price**, to the cent | Not a README quoting a price the billing does not use |
| **Drop-in field names** for anyone migrating off another Transparency scraper | Not a rename that breaks your existing sheet |
| **Source-side filtering**, so you only pay for ads that match | Not client-side filtering after you have been billed |

### 🔎 Why use this Actor

- **Ad copy, not just creative IDs.** For text ads the Actor opens Google's own ad render and pulls out `headline`, `description`, `adText` and `destinationUrl`. This is the single field marketers actually want and the one the popular alternative does not return at all.
- **Advertiser identity resolved once, cached, cheap.** `advertiserLegalName`, `advertiserLocation`, `advertiserDomain` and `advertiserVerified` come from Google's advertiser record, looked up once per advertiser no matter how many of their ads you pull.
- **Bulk from the first run.** `queries` takes a list. Fifty competitors, a mix of domains, brand keywords and advertiser IDs, is one run and one dataset.
- **Auto-detected input types.** `nike.com` is treated as a domain, `AR16735076323512287233` as an advertiser ID, `running shoes` as a keyword resolved through Google's own advertiser suggestions, and a pasted Transparency Center URL as whatever it points at.
- **Filters applied by Google, not by us.** Country, platform, format and date range are sent with the query, so filtered-out ads are never fetched and never billed.
- **Runs on 256 MB.** No browser, no Puppeteer. The Actor talks to the Transparency Center's own JSON endpoints, so compute cost stays near zero and results stream into the dataset as they are found.
- **Per-advertiser caps.** `maxResultsPerAdvertiser` stops one heavy spender from eating a budget meant to cover twenty competitors.

### 👥 Who it's for

Performance marketers, SEO and PPC agencies, competitive-intelligence analysts and founders sizing up a market.

- Pull every headline a competitor is bidding on before writing your own ad copy.
- Watch a competitor's creative rotation week over week on a schedule.
- Find who is advertising against your brand terms, and which legal entity is paying.
- Build a swipe file of image and video creatives for a whole category.
- Qualify leads by "is this company actively spending on Google Ads right now".

### 🔍 Ready-made research tasks

Each of these is a saved configuration you can open, adapt and run:

- [Scrape competitor Google ad copy by domain](https://apify.com/webdata_labs/google-ads-transparency-scraper/examples/google-ads-transparency-competitor-ad-copy)
- [Find a competitor's YouTube video ads](https://apify.com/webdata_labs/google-ads-transparency-scraper/examples/google-ads-transparency-youtube-video-ads)
- [Research competitor Google Shopping ads](https://apify.com/webdata_labs/google-ads-transparency-scraper/examples/google-shopping-ads-competitor-research)
- [Track competitor Google ads in the UK](https://apify.com/webdata_labs/google-ads-transparency-scraper/examples/google-ads-transparency-uk-competitor-ads)
- [Google Anzeigen der Konkurrenz in Deutschland](https://apify.com/webdata_labs/google-ads-transparency-scraper/examples/google-anzeigen-transparenz-deutschland)
- [Monitor competitor Google ads every week](https://apify.com/webdata_labs/google-ads-transparency-scraper/examples/google-ads-weekly-competitor-monitor)
- [Run a Google Ads competitor audit for a client](https://apify.com/webdata_labs/google-ads-transparency-scraper/examples/google-ads-competitor-audit-for-agencies)

### ⚙️ How to track a competitor's Google ads

1. Put the competitor's domain, brand name or Google advertiser ID into **Keywords, domains or advertiser IDs**. Add as many as you want to track.
2. Set **Country** to the market you care about, for example `US`, `GB` or `DE`. Leave it empty for worldwide.
3. Optionally narrow by **Google platform** (Search, YouTube, Shopping, Maps, Play) and **Creative format** (text, image, video).
4. Optionally set **Shown from** / **Shown until** to study a season or a launch window.
5. Set **Max ads**. Start at 20 to see what is there, then raise it or set `0` for unlimited.
6. Click **Start**. Rows appear in the dataset while the run is still going. Export as JSON, CSV, Excel or XML from the **Storage** tab.

#### Watch a competitor every week

Save the run as a Task, schedule it weekly, and point a webhook or a Google Sheets integration at the dataset. Because every row carries `firstShown`, `lastShown` and `approxDaysShown`, comparing two weeks tells you exactly which creatives were retired and which are new.

### 📥 Input

```json
{
  "queries": ["nike.com", "adidas.com", "running shoes", "AR16735076323512287233"],
  "region": "US",
  "platform": "any",
  "creativeFormat": "any",
  "dateFrom": "2026-01-01",
  "dateTo": "2026-07-27",
  "maxResults": 200,
  "maxResultsPerAdvertiser": 50,
  "includeCreativeAssets": true,
  "includeAdvertiserDetails": true
}
````

- `queries` - list of domains, brand keywords, Google advertiser IDs or Transparency Center URLs. Type is detected per item. Aliases accepted so you can paste another scraper's input as-is: `searchQuery`, `searchQueries`, `domains`, `domain`, `advertiserId`, `advertiserIds`, `keywords`, `startUrls`.
- `region` - two-letter country code, for example `US`, `GB`, `DE`, `BR`, `IN`. 190+ countries. Empty means worldwide. Country names are accepted for the major markets.
- `platform` - `any`, `search`, `youtube`, `shopping`, `maps`, `play`.
- `creativeFormat` - `any`, `text`, `image`, `video`. Text ads are the ones carrying headline and description copy.
- `dateFrom`, `dateTo` - `YYYY-MM-DD`. Returns ads that were running inside the window. Google's archive starts in 2018.
- `maxResults` - total rows across all queries. `0` means unlimited. Default 20.
- `maxResultsPerAdvertiser` - optional cap per advertiser. `0` means no cap.
- `includeCreativeAssets` - default on. Fetches each creative's render to extract ad copy, full-resolution images and video URLs. Turning it off makes runs faster and drops `headline`, `description`, `destinationUrl` and `videoUrl`.
- `includeAdvertiserDetails` - default on. Adds the advertiser's legal name, country and verification status. Billed once per advertiser, not per ad.
- `proxyConfiguration` - advanced. Google throttles repeat callers by IP, so residential proxies are the default and the Actor rotates the session on every retry.

### 📤 Output

| advertiserName | adFormat | headline | description | destinationUrl | firstShown | lastShown | region |
|---|---|---|---|---|---|---|---|
| Hubspot, Inc. | text | Top CRM Solution - Next-Generation CRM | Close more deals with our top CRM. Track opportunities and nurture prospects. | https://www.hubspot.com/products/crm | 2026-06-16 | 2026-07-27 | US |
| Nike, Inc. | text | Shop Nike Back To School | Use promo code DAYONE to get an extra 25% off on select styles. | https://nike.com | 2026-05-11 | 2026-07-27 | US |
| nordvpn s.a. | video | | | | 2026-07-23 | 2026-07-27 | US |

Every row also carries: `advertiserId`, `creativeId`, `approxDaysShown`, `adUrl` (the ad's public page on Google), `imageUrl`, `previewUrl`, `videoUrl` and `videoId` for video creatives, `assetUrls` with every image variation of the creative, `adText` (headline and description joined), `advertiserDomain`, `advertiserLegalName`, `advertiserLocation`, `advertiserVerified`, `servedCountries` (every country the creative actually ran in), the echoed `region` / `platform` / `creativeFormat`, the `searchQuery` and `searchType` that produced the row, and `scrapedAt`.

The first ten fields use the same names as the widely used alternative Transparency scraper, so switching over does not break an existing sheet, dashboard or downstream script.

### 💵 How much does it cost?

Pay per event, **no start fee**, no monthly rent. You are charged for what you receive:

| Event | What triggers it | FREE | BRONZE | SILVER | GOLD | PLATINUM | DIAMOND |
|---|---|---|---|---|---|---|---|
| `ad-scraped` | one ad creative written to the dataset | $0.0014 | $0.0013 | $0.0012 | $0.0011 | $0.0010 | $0.0008 |
| `advertiser-resolved` | one advertiser identity lookup, once per advertiser per run | $0.0014 | $0.0013 | $0.0012 | $0.0011 | $0.0010 | $0.0008 |

On the FREE tier that is **$1.40 per 1,000 ads**. Realistic runs:

| Job | Ads | Advertisers | Cost on FREE |
|---|---|---|---|
| Look at one competitor | 50 | 1 | $0.07 |
| Track 10 competitors, 100 ads each | 1,000 | 10 | $1.41 |
| Full pull of one big advertiser | 5,000 | 1 | $7.00 |
| Category sweep, 50 brands | 10,000 | 50 | $14.07 |

Platform compute is on top and is small: the Actor runs at 256 MB with no browser. Filters are applied by Google before results are returned, so an ad that does not match your country, platform, format or date range is never fetched and never billed.

SpyFu and SEMrush start around $39 and $139 a month for the plans that show competitor ad copy. A weekly 1,000-ad pull on ten competitors costs about $6 a month here.

### 🤖 Use with AI agents via MCP

The Actor is callable from any MCP client through Apify's MCP server, so an agent can research competitor ads on its own.

**Claude Code**

```bash
claude mcp add apify --env APIFY_TOKEN=your_apify_token -- npx -y @apify/actors-mcp-server --actors webdata_labs/google-ads-transparency-scraper
```

**Cursor** (`~/.cursor/mcp.json`) or any client that reads the standard MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": ["-y", "@apify/actors-mcp-server", "--actors", "webdata_labs/google-ads-transparency-scraper"],
      "env": { "APIFY_TOKEN": "your_apify_token" }
    }
  }
}
```

Prompts that work well:

- "Pull the last 100 Google Search ads for hubspot.com in the US and list every distinct headline."
- "Compare the ad copy nike.com and adidas.com are running in Germany this month."
- "Which advertisers are running YouTube video ads for the keyword 'project management software'?"

### 🔁 Use this Actor in n8n

1. Add the **Apify** node to your workflow and connect your Apify API token.
2. Choose **Run an Actor**, then pick `webdata_labs/google-ads-transparency-scraper`.
3. Paste the input JSON above, or map `queries` from an earlier node such as a list of accounts from your CRM.
4. Add **Get Dataset Items** after it to pull the rows into the workflow.
5. Route the rows wherever they belong: a Google Sheet, a Slack alert when a competitor launches new copy, or a database.

The same pattern works in Make, Zapier and plain webhooks, and the Actor can be called directly over the Apify API.

### 🔁 Run it on the Apify platform

Schedule the Actor daily or weekly, call it from the API, or trigger it from Make, Zapier or n8n. Datasets export to JSON, CSV, Excel, XML and RSS, and webhooks can fire the moment a run finishes. Results stream into the dataset while the run is still going, so a long pull is usable before it ends.

### ⚠️ Limits and caveats

- **Not every creative has text.** Google's archive stores many ads only as a rendered image, including ads it labels `text`. When there is no text render, `headline`, `description` and `destinationUrl` come back empty and you still get the image. Coverage depends on the advertiser: on a verification run against a large retail brand 33 of 50 ads carried readable copy, while some B2B advertisers publish almost everything as static images and return far less. Filter for rows where `headline` is set if copy is all you need.
- **Dynamic search ads have no fixed headline.** Google generates their headline from the landing page at serve time and publishes the placeholder text `<dynamically generated based on landing page content>` instead. That literal string is what you get, because that is what Google shows. The `description` on those ads is real.
- **`destinationUrl` is the ad's display URL**, which is what Google publishes. The full final landing URL with tracking parameters is not part of the public archive.
- **Keyword search is advertiser discovery, not full-text ad search.** A keyword is resolved through Google's own advertiser and domain suggestions, then every matching advertiser's ads are pulled. Google does not expose a public search across ad body text.
- **Google throttles by IP.** The Actor paces requests and rotates proxy sessions on every retry. Very large unlimited runs are slower for this reason, not because of the parsing.
- **Impression and spend ranges are political-ads-only** in Google's data, so they are not part of the standard output.
- **Coverage varies by country.** Google's transparency obligations differ by market, so an advertiser can have thousands of ads in the EU and far fewer elsewhere.

### 🧩 Related Actors

Complete ad intelligence across Google, Meta, LinkedIn and TikTok:

- **[Meta Ads Library Scraper](https://apify.com/webdata_labs/meta-ads-library-scraper)** - the same competitor's Facebook and Instagram ads, with copy and creatives. Run both on one brand to see the whole paid mix.
- **[LinkedIn Ads Library Scraper](https://apify.com/webdata_labs/linkedin-ads-library-scraper)** - B2B ad creatives and CTAs from LinkedIn's public library.
- **[TikTok Creative Center Ad Intelligence](https://apify.com/webdata_labs/tiktok-creative-center-ad-intelligence)** - top-performing TikTok ads by industry and region.
- **[AI Ad Creative Intelligence API](https://apify.com/webdata_labs/ai-ad-creative-intelligence-api)** - feed the creatives from any of the above in and get structured analysis of hooks, offers and angles.
- **[Google Search Results Scraper](https://apify.com/webdata_labs/google-search-results-scraper)** - the organic side of the same keywords, so you can see who buys what they cannot rank for.

### ❓ FAQ

**Is it legal to scrape Google Ads Transparency Center?**
The Transparency Center is a public archive Google built specifically for public accountability: it exists so anyone can see who is advertising, what they said and where it ran. This Actor reads that public data. There is no login, no paywall and no personal data involved. You remain responsible for how you use the output, and for complying with Google's terms and with the laws that apply to you. Do not use it for spam or harassment.

**Do I get the actual ad text?**
Yes, wherever Google stores a text render of the ad. Set `creativeFormat` to `text` and keep `includeCreativeAssets` on. Creatives that exist only as an image in Google's archive have no text to return, and the Actor says so with empty fields rather than guessing.

**Am I charged for ads that get filtered out?**
No. Country, platform, format and date filters are sent to Google with the query. Non-matching ads are never returned and never billed.

**Can I track many competitors in one run?**
Yes. `queries` is a list and mixes domains, keywords and advertiser IDs. Use `maxResultsPerAdvertiser` to spread the budget evenly.

**Where do I find a Google advertiser ID?**
Open the advertiser's page on adstransparency.google.com and copy the `AR...` value from the URL, or just paste the whole URL into `queries`. Every output row also carries `advertiserId`.

**Do I need a proxy?**
Apify Residential proxy is the default and is what makes larger runs reliable. Google rate-limits by IP.

**Which countries are supported?**
190+, by ISO code. `region` also accepts the names of major markets, for example `Germany` or `United Kingdom`.

### 📝 Changelog

**0.1** - First release. Bulk queries with type auto-detection, ad copy extraction for text ads, advertiser identity resolution, video URL resolution, source-side country, platform, format and date filters, filters echoed on every row, three dataset views.

### 🛠️ Support

Something wrong or missing? Open an issue on the Actor's Issues tab with the run URL, the input you used and what you expected. Bugs get fixed fast.

### ⭐ Rate this Actor

If it saved you an afternoon, please leave a rating on the Reviews tab. Reviews are the only signal that tells other buyers this works, and they decide what gets built next. If something is broken, open an issue first so it can be fixed, rather than leaving a low rating on a problem that takes an hour to solve.

# Actor input Schema

## `queries` (type: `array`):

What to track. Each item can be a domain (nike.com), a brand keyword (running shoes), a Google advertiser ID (AR16735076323512287233) or a Transparency Center URL. Add as many as you like - 50 competitors in one run is a normal input, not 50 runs.

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

Two-letter country code the ads were shown in, for example US, GB, DE, BR, IN. Leave empty to search every country. The filter is applied by Google, so you are only charged for ads that match.

## `platform` (type: `string`):

Restrict results to ads served on one Google surface. Leave as Any platform to include all of them.

## `creativeFormat` (type: `string`):

Restrict results to one creative format. Text ads are the ones that carry headline and description copy.

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

Only return ads shown on or after this date (YYYY-MM-DD). Leave empty for no lower bound. Google holds data back to 2018.

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

Only return ads shown on or before this date (YYYY-MM-DD). Leave empty for no upper bound.

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

Maximum ad rows across all queries. Set to 0 for unlimited. The low default keeps a first run cheap and fast.

## `maxResultsPerAdvertiser` (type: `integer`):

Cap the rows any single advertiser can contribute, so one heavy spender cannot eat the whole budget when you track many competitors. 0 means no per-advertiser cap.

## `includeCreativeAssets` (type: `boolean`):

Fetch each creative's render to extract the headline, description, destination URL, full-resolution images and the YouTube video URL for video ads. Slower per ad, and the only way to get the ad text.

## `includeAdvertiserDetails` (type: `boolean`):

Look up each advertiser once to add the verified legal name, the disclosure country and the verification status. Charged once per advertiser, not per ad.

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

Google rate-limits repeat callers by IP, so the Actor rotates proxy sessions on every retry. Residential proxies are the reliable default.

## Actor input object example

```json
{
  "queries": [
    "nike.com"
  ],
  "region": "US",
  "platform": "any",
  "creativeFormat": "any",
  "dateFrom": "",
  "dateTo": "",
  "maxResults": 20,
  "maxResultsPerAdvertiser": 0,
  "includeCreativeAssets": true,
  "includeAdvertiserDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `adCopy` (type: `string`):

No description

## `advertisers` (type: `string`):

No description

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

No description

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

No description

# 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 = {
    "queries": [
        "nike.com"
    ],
    "region": "US",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdata_labs/google-ads-transparency-scraper").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 = {
    "queries": ["nike.com"],
    "region": "US",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("webdata_labs/google-ads-transparency-scraper").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 '{
  "queries": [
    "nike.com"
  ],
  "region": "US",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call webdata_labs/google-ads-transparency-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Ads Transparency Scraper - Ad Copy & Creatives",
        "description": "[💵 $1.40 / 1K · no start fee] Scrape Google Ads Transparency Center: ad headlines and descriptions, destination URLs, images, YouTube video URLs, verified advertiser identity, dates and formats. Search, YouTube, Shopping, Maps and Play. Many competitors per run.",
        "version": "0.1",
        "x-build-id": "mO01EguPFuCe5Urxh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/webdata_labs~google-ads-transparency-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-webdata_labs-google-ads-transparency-scraper",
                "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/webdata_labs~google-ads-transparency-scraper/runs": {
            "post": {
                "operationId": "runs-sync-webdata_labs-google-ads-transparency-scraper",
                "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/webdata_labs~google-ads-transparency-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-webdata_labs-google-ads-transparency-scraper",
                "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": {
                    "queries": {
                        "title": "Keywords, domains or advertiser IDs",
                        "type": "array",
                        "description": "What to track. Each item can be a domain (nike.com), a brand keyword (running shoes), a Google advertiser ID (AR16735076323512287233) or a Transparency Center URL. Add as many as you like - 50 competitors in one run is a normal input, not 50 runs.",
                        "default": [
                            "nike.com"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "region": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter country code the ads were shown in, for example US, GB, DE, BR, IN. Leave empty to search every country. The filter is applied by Google, so you are only charged for ads that match.",
                        "default": "US"
                    },
                    "platform": {
                        "title": "Google platform",
                        "enum": [
                            "any",
                            "search",
                            "youtube",
                            "shopping",
                            "maps",
                            "play"
                        ],
                        "type": "string",
                        "description": "Restrict results to ads served on one Google surface. Leave as Any platform to include all of them.",
                        "default": "any"
                    },
                    "creativeFormat": {
                        "title": "Creative format",
                        "enum": [
                            "any",
                            "text",
                            "image",
                            "video"
                        ],
                        "type": "string",
                        "description": "Restrict results to one creative format. Text ads are the ones that carry headline and description copy.",
                        "default": "any"
                    },
                    "dateFrom": {
                        "title": "Shown from",
                        "type": "string",
                        "description": "Only return ads shown on or after this date (YYYY-MM-DD). Leave empty for no lower bound. Google holds data back to 2018.",
                        "default": ""
                    },
                    "dateTo": {
                        "title": "Shown until",
                        "type": "string",
                        "description": "Only return ads shown on or before this date (YYYY-MM-DD). Leave empty for no upper bound.",
                        "default": ""
                    },
                    "maxResults": {
                        "title": "Max ads",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum ad rows across all queries. Set to 0 for unlimited. The low default keeps a first run cheap and fast.",
                        "default": 20
                    },
                    "maxResultsPerAdvertiser": {
                        "title": "Max ads per advertiser",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap the rows any single advertiser can contribute, so one heavy spender cannot eat the whole budget when you track many competitors. 0 means no per-advertiser cap.",
                        "default": 0
                    },
                    "includeCreativeAssets": {
                        "title": "Resolve ad copy and creative assets",
                        "type": "boolean",
                        "description": "Fetch each creative's render to extract the headline, description, destination URL, full-resolution images and the YouTube video URL for video ads. Slower per ad, and the only way to get the ad text.",
                        "default": true
                    },
                    "includeAdvertiserDetails": {
                        "title": "Resolve advertiser identity",
                        "type": "boolean",
                        "description": "Look up each advertiser once to add the verified legal name, the disclosure country and the verification status. Charged once per advertiser, not per ad.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Google rate-limits repeat callers by IP, so the Actor rotates proxy sessions on every retry. Residential proxies are the reliable default.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
