# Google Ads Transparency Scraper: Ads, Text and Reach (`agenttoolworks/google-ads-transparency-scraper`) Actor

Google Ads Transparency scraper at $0.50 per 1,000 ads, with ad text, impressions per country and platform, and targeting included. Search by brand, website, advertiser ID or Transparency Center URL; filter by country, platform, format and dates; monitor only new ads.

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

## Pricing

from $0.40 / 1,000 ads

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What is this Google Ads Transparency scraper?

This Actor is a **Google Ads Transparency scraper**: it reads the [Google Ads Transparency Center](https://adstransparency.google.com) logged out and returns every ad of a brand, a website or an advertiser account as one row per ad, with the **ad's text, first and last day shown, impressions per country and per platform (Search, YouTube, Maps, Play, Shopping), and the targeting criteria used**, plus a link to the ad's own page. Search by brand name, website, advertiser ID, or paste the **Transparency Center URL** you already have: its region, platform, format and dates are kept, the date menu's presets (the last 7 or 30 days, today, yesterday) included.

**In short**

- **What you get**: one row per Google ad, with its format, headline and description (text ads), image or preview, first and last day shown, impressions in total, per country and per platform, targeting, and the ad's Transparency Center page. Filter by country, platform, format and dates; monitor only the ads that are new since your last run.
- **What it costs**: **$0.50 per 1,000 ads, with the details and the ad text included** ($0.45 and $0.40 on higher Apify plans). An ad already returned in the run is never charged twice.
- **Why this one** (prices read from the Apify Store on 2026-10-26): scrapesage/google-ads-transparency-scraper charges $2 per 1,000 ads, plus $3 per 1,000 for full creative details, plus $2 per 1,000 for ad text from 2026-11-01, so up to $7 per 1,000 ads with everything; solidcode/ads-transparency-scraper charges $1.50 per 1,000 results on the Free plan; silva95gustavo/google-ads-scraper $1.90 per 1,000 ads on the Free plan.

No Google account, no API key, no login.

### What data can you extract from the Google Ads Transparency Center?

One row per ad. Where Google does not publish a field, it is `null`, never guessed.

| Ad data | Reach and targeting | Search and advertiser data |
|---|---|---|
| Ad ID and link to the ad's Transparency Center page | Impressions range in total (`impressionsMin`, `impressionsMax`) | Advertiser name and ID |
| Format: text, image or video | Impressions per country, with first and last day shown in each (`reachByCountry`) | Optional advertiser records (`maxAdvertisers`): ID, name, country, how many ads Google holds |
| Headline and description of text ads, where Google renders them as text | The platforms that showed the ad, from Google's breakdown by platform (`publisherPlatforms`: SEARCH, YOUTUBE, MAPS, PLAY, SHOPPING) | `query`: which of your searches found the row |
| Display domain (`displayUrl`) | Targeting: the criteria the advertiser included or excluded (demographics, location, contextual signals) | |
| Image URL, or Google's preview for video and HTML ads | Countries where the ad was shown | |
| First and last day shown | | |

The row format is the same as the Google rows of our [Ad Library Scraper](https://apify.com/agenttoolworks/ad-library-scraper) (Meta, Google and Bing in one run), so the two datasets merge without mapping.

### What can you use Google ads data for?

- **Competitor ad research**: every ad a competitor runs on Google Search, YouTube, Maps, Play and Shopping, with its text and how long it has been running.
- **Creative and copy research**: headlines and descriptions of text ads, images and video previews, sorted by how recently they ran.
- **Market monitoring**: schedule a search with **Only new ads** and get each week only the ads that started since.
- **Media-mix and reach research**: impressions per country and per platform, where Google publishes them.
- **Lead generation**: which companies, websites or agencies run Google Ads, and how many ads each holds.
- **Data for AI agents and pipelines**: one predictable JSON row per ad.

### How to scrape the Google Ads Transparency Center

1. Click **Try for free** (or **Start**) on this page and sign in to Apify.
2. Type **Brands** (`nike`), **Websites** (`nike.com`) or **Advertiser IDs** (`AR16735076323512287233`), or paste **Transparency Center URLs** from your browser.
3. Pick the **Countries** (`US`, `FR`... or English names such as `France`; empty means anywhere), and if you want, **Platforms**, **Formats** and dates.
4. Set **Max ads per search**. You pay per ad returned, so start small to look at the data.
5. Click **Start**. When the run finishes, open the **Output** tab, pick the **Ads** or **Reach by country** view, and export as JSON, CSV, Excel or XML, or read it through the API.

### Input

| Field | What it does |
|---|---|
| `queries` | Brand or advertiser names, each its own search. Google has no keyword search of ad text: the Actor finds the advertiser named like the brand (`nike` finds "Nike, Inc."), the biggest by ad count, and returns its ads. A brand that advertises under its company's name (`temu`) is read through its own website (temu.com) when Google suggests it, and the run summary says so. An advertiser ID or a Transparency Center URL typed here is read as one, with a note. |
| `domains` | Advertiser websites (`nike.com`): every ad that points to the site, whichever advertiser account ran it. A word without a dot is searched as a brand, with a note. |
| `advertiserIds` | Google advertiser IDs (`AR` and 20 digits), as in the address bar of an advertiser's page. |
| `startUrls` | Transparency Center URLs: a search by website (`/?region=FR&domain=nike.com&platform=YOUTUBE&format=VIDEO&start-date=2026-09-01&end-date=2026-09-30`), an advertiser's page (`/advertiser/AR...?region=US`, `region=anywhere` works) or one ad's page (`/advertiser/AR.../creative/CR...`). The URL's own filters win over the fields below. The date menu's presets (today, yesterday, the last 7 or 30 days, in the page's language) are read as days in Pacific Time, the time zone the page dates ads in. A URL whose region, platform, format or dates cannot be read is left out with a note in the run summary, never searched without that filter; another parameter is named there and not read. |
| `countries` | Two-letter codes or English names, any case. Empty means anywhere. |
| `platforms` | `SEARCH`, `YOUTUBE`, `MAPS`, `PLAY`, `SHOPPING`. Google's filter takes one platform at a time and covers ads shown since 4 September 2023; with several, each platform is its own search. Empty searches every platform at once, older ads included. |
| `formats` | `TEXT`, `IMAGE`, `VIDEO`. Empty keeps every format. |
| `startDate`, `endDate` | `YYYY-MM-DD`: only ads shown in that window. |
| `maxAdsPerSearch` | Stop after this many ads per search (default 100, up to 5,000). Google lists the most recently shown ads first. |
| `includeDetails` | One more request per ad, no extra charge (default on): impressions per country and platform, dates per country, targeting, and the text of text ads. Off gives a faster list. |
| `maxAdvertisers` | Optional advertiser records per search (default 0: off), stored in the key-value store record `ADVERTISERS` and charged per record. For a brand search it also reads that many advertisers named like the brand. |
| `onlyNewAds`, `monitorName` | Return and charge only the ads not returned by earlier runs of this monitor (see below). |
| `proxy` | `auto` (default), `residential` or `none`. See the limits below for why the Actor reads through Apify Proxy. |

Example: one brand's YouTube video ads in France, by pasting the page you have open.

```json
{
  "startUrls": [{ "url": "https://adstransparency.google.com/?region=FR&domain=nike.com&platform=YOUTUBE&format=VIDEO" }],
  "maxAdsPerSearch": 50
}
```

Example: three competitors, their search ads in the US, with text.

```json
{
  "domains": ["nike.com", "adidas.com", "puma.com"],
  "countries": ["US"],
  "platforms": ["SEARCH"],
  "maxAdsPerSearch": 100
}
```

Example: a weekly monitor that returns only new ads.

```json
{
  "domains": ["booking.com"],
  "countries": ["GB"],
  "maxAdsPerSearch": 300,
  "onlyNewAds": true,
  "monitorName": "booking-uk"
}
```

### Output

The dataset holds **ads only**, one row per ad, with three views in Apify Console and in the API:

- **Ads**: advertiser, format, headline, text, website, first and last shown, impressions, platforms, countries and the ad's page.
- **Reach by country**: one row per ad and country, with the impressions range and the first and last day shown that Google publishes for that country.
- **All fields**: every field of every row.

A row from a cloud run (`nike`, United States, run HZTZnOehVcQeCsxPh, 2026-10-26), preview link shortened and empty fields left out:

```json
{
  "platform": "google",
  "adId": "CR04371376104225636353",
  "adLibraryUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR04371376104225636353?region=US",
  "advertiserId": "AR16735076323512287233",
  "advertiserName": "Nike, Inc.",
  "firstShown": "2023-11-16",
  "lastShown": "2026-10-26",
  "format": "text",
  "title": "Nike® Volleyball Collection",
  "body": "Designed and created to enable outstanding performance, The Nike® Volleyball Collection.",
  "displayUrl": "nike.com",
  "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/1293885961370619522",
  "previewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?client=ads-integrity-transparency&...",
  "publisherPlatforms": [],
  "countries": ["US"],
  "countriesBasis": "reach",
  "reachByCountry": [{ "country": "US", "countryImpressionsMin": null, "countryImpressionsMax": null, "countryLastShown": "2026-10-26" }],
  "query": "nike",
  "scrapedAt": "2026-10-26T16:06:35.261Z"
}
```

For an ad shown in the EU, Google also publishes impressions per country and per platform: a YouTube video of nike.com searched in France (run a0Ge0clnYRfqbkNUm) carried `publisherPlatforms` `["MAPS", "SEARCH", "YOUTUBE"]` and a `reachByCountry` entry per EU country with its impressions range and dates.

#### Only new ads (monitoring)

With `onlyNewAds` on, the Actor remembers, per search, the ads it returned, in a key-value store of your own account named `ads-transparency-monitor-<monitorName>`. Each run lists the first `maxAdsPerSearch` ads Google shows for the search (most recently shown first), leaves out the ones returned before, **before reading their details**, and returns and charges only the new ones. The first run returns everything it reads. Set `maxAdsPerSearch` deep enough to cover the brand's active ads: listing is cheap, and only new ads are read in detail and charged. Google's order among ads shown the same day changes from one run to the next (two runs of 30 on booking.com in the UK listed different ads, 2026-10-26), so a shallow list returns a different slice each time rather than the newest ads. A different country, platform, format or date window is a different search with its own memory; use one `monitorName` per schedule. The memory follows what a search lists, not how the input wrote it: adding a platform to the run, listing the countries in another order or typing the brand in capitals keeps it, and a URL with a date preset (the last 7 days) keeps it as the days move.

#### Run summary

The key-value store record `SUMMARY` has one entry per search: its status (`ok`, `partial` with the reason, `skipped` or `failed`), how many ads it found, how many were already seen (with `onlyNewAds`), how many requests it made, how many Google refused with HTTP 429 and which IPs it ended on, and notes (inputs that were not read, ads left out). A short result is never silent. When the run stopped early, the top-level `status` is `partial` with a `reason` (`run timeout` or `spending limit`).

### Limits worth knowing before you run it

- **Google has no keyword search of ad text.** A brand name is matched to advertiser names as a whole word (`nike` can also match a person's account named "Nike Klara"); the biggest advertiser by ad count is read, more with `maxAdvertisers`. Brands that advertise under a legal name (Temu advertises as Whaleco Inc.) are read through their own website when Google suggests it. For an exact brand, use **Websites**.
- **The platform filter only covers ads shown since 4 September 2023**, as the Transparency Center itself says. Google's breakdown of impressions by platform starts on the same day, and the page warns that an ad "may also have been shown on other platforms": `publisherPlatforms` lists the platforms of that breakdown, not every surface.
- **Impressions per country and per platform are published by Google for ads shown in the EU.** Ads shown only elsewhere come with their creative and dates, without those figures.
- **Ad text** is read where Google renders the ad as text (its preview of local and search text ads). Text ads that Google archives as an image carry their text only in the image (36 of 83 Nike text ads had their text read in a local run of the same reader, 2026-10-05). Google publishes **no landing URL**, only the display domain, so `linkUrl` is `null`.
- **Video ads** carry Google's preview script (`previewUrl`), not a video file.
- **Formats**: Google's filter takes one format. With two of the three, the Actor reads one listing per format, each with Google's own filter, and merges them, most recently shown first.
- **Google refuses many requests from the Apify cloud's shared IPs** (HTTP 429 on the first request of every run, 2026-10-26). The Actor reads through Apify Proxy, a new IP after each refusal and residential IPs after two in a row, at no extra charge to you. In 20 cloud runs of the same reader across 20 countries on 2026-10-26, Google refused 6.7% of requests, each was retried, and every run was read.
- **The run stops itself before its timeout**: two minutes before (less on a short run), it starts nothing new, stores what it read, and ends as succeeded with `SUMMARY` saying what was not covered. Only the ads in the dataset are charged.

### How it compares (Apify Store, read 2026-10-26)

Prices and 30-day figures as each Actor's public Store record showed them on 2026-10-26 (`pricingInfos` and `stats`). We did not run these Actors.

| | scrapesage/google-ads-transparency-scraper | solidcode/ads-transparency-scraper | silva95gustavo/google-ads-scraper | This Actor |
|---|---|---|---|---|
| Ads, per 1,000 (Free plan) | $2.00 | $1.50 | $1.90 | $0.50 |
| Ads, per 1,000 (top tier listed) | $2.00 | $0.80 | $0.90 | $0.40 |
| Full details (reach per country, dates, variations) | +$3.00 per 1,000 | no separate event | no separate event | included |
| Ad text of text ads | +$2.00 per 1,000 from 2026-11-01 | no separate event | no separate event | included |
| Advertiser records | $3.00 per 1,000 | none listed | none listed | $3.00 per 1,000 (opt-in) |
| Run start | none listed | $0.001 per GB of memory | $0.00005 | $0.00005 |
| Users, last 30 days | 1,282 | 628 | 467 | new |
| Public runs, last 30 days | 31,015 (0 failed, 0 timed out) | 237,207 (2 failed, 29 timed out) | 338,807 (1,171 failed, 3,473 timed out) | new |
| Rating | 5.0 (1 review) | 1.9 (4 reviews) | 4.9 (19 reviews) | new |

"No separate event" means the Actor lists one price per result; whether its rows carry those fields was not checked. What each one returns was not compared on the same input. Speed: silva95gustavo states "up to 400 ads per minute"; this Actor read 150 ads with their details (dates, reach, platforms) in 42 seconds in the cloud, about 210 a minute (samsung, Germany, 2026-10-26), and the listing alone is faster.

### How much does it cost to scrape the Google Ads Transparency Center?

Pay per event, no subscription, platform usage and proxies included:

| Event | Price |
|---|---|
| Ad returned, with details and ad text | **$0.50 per 1,000 ads** ($0.0005 each; $0.45 and $0.40 on higher Apify plans) |
| Advertiser record returned (only if you set `maxAdvertisers`) | **$3.00 per 1,000 records** |
| Run start | $0.00005 |

Examples:

- **1,000 ads with text, reach and targeting**: $0.50.
- **100 ads**: $0.05.
- **A weekly monitor of 300 ads that finds 20 new ones**: $0.01 a week.
- **Apify's free plan** includes $5 of monthly usage ([apify.com/pricing](https://apify.com/pricing)), enough for about **10,000 ads** a month.

Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached: it starts no further search, and reads no ad it could not charge.

### Use the Actor through the Apify API

Run it and get the ads in one HTTP call (replace `YOUR_APIFY_TOKEN`, from **Settings > API & Integrations** in Apify Console):

```bash
curl -X POST "https://api.apify.com/v2/acts/agenttoolworks~google-ads-transparency-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["nike.com"], "countries": ["US"], "maxAdsPerSearch": 50}'
```

Node.js, with the official [`apify-client`](https://docs.apify.com/api/client/js/):

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('agenttoolworks/google-ads-transparency-scraper').call({
    domains: ['nike.com'],
    countries: ['FR'],
    platforms: ['YOUTUBE'],
    maxAdsPerSearch: 100,
});
const { items: ads } = await client.dataset(run.defaultDatasetId).listItems();
console.log(ads.map((ad) => [ad.advertiserName, ad.format, ad.firstShown, ad.impressionsMax, ad.publisherPlatforms]));
```

Python, with the official [`apify-client`](https://docs.apify.com/api/client/python/):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("agenttoolworks/google-ads-transparency-scraper").call(
    run_input={"queries": ["temu"], "countries": ["US"], "platforms": ["SEARCH"], "maxAdsPerSearch": 200}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["advertiserName"], row["firstShown"], row["title"], row["body"])
```

The **API** tab on this page has ready-made snippets for every language and endpoint.

### FAQ

#### Do I need a Google account or an API key?

No. The Actor reads the Transparency Center the way a logged-out visitor's browser does. Google publishes no API for it.

#### How do I get every ad of one advertiser?

Paste the advertiser's page URL (`adstransparency.google.com/advertiser/AR...`) or its ID in **Advertiser IDs**, and raise **Max ads per search** (up to 5,000 per search). To get every ad that points to a website, whichever account ran it, use **Websites**.

#### Can I get ads shown in the United States or outside the EU?

Yes: set the country or leave countries empty. Impressions per country and per platform are published by Google for ads shown in the EU; the rest come with their creative, text and dates.

#### Why does a platform filter return fewer ads than the same search without it?

Google's platform filter only covers ads shown since 4 September 2023, and only the five platforms it lists (Search, YouTube, Maps, Play, Shopping).

#### How do I get only new ads every week?

Turn on **Only new ads**, give the schedule a **Monitor name**, and schedule the Actor (or a saved task) in Apify Console. Each run returns and charges only the ads the previous runs did not return.

#### Can I use it with Make, Zapier, n8n or Google Sheets?

Yes, through Apify's integrations: the dataset works with every Apify integration, and a webhook can fire when a run finishes.

#### Can AI agents use it through MCP?

Yes. Apify's hosted MCP server exposes Store Actors to MCP clients such as Claude or Cursor: `https://mcp.apify.com?tools=agenttoolworks/google-ads-transparency-scraper`.

#### Is it legal to scrape the Google Ads Transparency Center?

The Actor reads only what the Transparency Center shows to any visitor without logging in: ads and the businesses behind them, which Google publishes to meet its transparency obligations. It never logs in, uses no account and collects no data about the people who saw the ads. Google's terms for the Transparency Center restrict how its content may be reused; how you use the data is your responsibility.

#### Something is missing or broken?

Open an issue in the **Issues** tab: we read every one.

### Other Actors by AgentToolWorks

- [Facebook Ad Library Scraper: Meta, Google and Bing Ads](https://apify.com/agenttoolworks/ad-library-scraper): Meta (Facebook, Instagram), Google and Microsoft (Bing) ad libraries in one run, with EU reach, payer and beneficiary for Meta ads. Same row format as this Actor.
- [Shopify & WooCommerce Scraper and Price Tracker](https://apify.com/agenttoolworks/shopify-woocommerce-scraper): every product of any Shopify or WooCommerce store, with variants, barcodes and stock.
- [AliExpress Scraper: Products, Prices and Shipping per Country](https://apify.com/agenttoolworks/aliexpress-scraper): AliExpress products by keyword, category or product URL, with every SKU's price and stock and the shipping cost to each country you list, plus a price tracker mode that returns only the changes.
- [LinkedIn Jobs Scraper and Indeed Scraper](https://apify.com/agenttoolworks/linkedin-indeed-jobs-scraper): public job listings of both boards in one row format.
- [Google Maps Scraper](https://apify.com/agenttoolworks/google-maps-places-scraper): places with phone, website, rating, opening hours and emails.
- [Google Trends Scraper](https://apify.com/agenttoolworks/google-trends-scraper): interest over time, by region and related queries, plus each country's Trending now list.

### Learn more

- [What this Google Ads Transparency scraper returns, with real runs](https://agenttoolworks.com/scrapers/google-ads-transparency-scraper)
- [The Ad Library Scraper: Meta, Google and Bing ads side by side](https://agenttoolworks.com/scrapers/facebook-ad-library-scraper)

Built by [AgentToolWorks](https://agenttoolworks.com). Not affiliated with Google.

# Actor input Schema

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

Brand or advertiser names, one per line, each its own search. Google has no keyword search of ad text: the Actor finds the advertisers whose name contains the word ('nike' finds 'Nike, Inc.') and returns their ads. A brand that advertises under its company's name ('temu' advertises as Whaleco Inc.) is read through its own website when Google suggests one (temu.com), and the run summary says so. For an exact brand, use Websites.

## `domains` (type: `array`):

Advertiser websites, one per line (nike.com): every ad that points to the site, whichever Google advertiser account ran it (brands often advertise through agencies and regional companies).

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

Google advertiser IDs, one per line: AR followed by 20 digits, as in the Transparency Center's address bar (adstransparency.google.com/advertiser/AR16735076323512287233). The Actor reads that advertiser's ads directly.

## `startUrls` (type: `array`):

Paste what you see in adstransparency.google.com: a search by website (?region=FR\&domain=nike.com), an advertiser's page (/advertiser/AR...) or one ad's page (/advertiser/AR.../creative/CR...). The page's region (or anywhere), platform, format and dates are kept, the date menu's presets included (the last 7 or 30 days, today, yesterday, in Pacific Time as on the page), and win over the filters below. A URL whose filter cannot be read is left out with a note, never searched without it.

## `countries` (type: `array`):

Where the ads were shown: two-letter codes (US, FR, DE...) or English names (United States, India), in any case. Empty means anywhere. Impressions per country and per platform are published by Google for ads shown in the EU.

## `platforms` (type: `array`):

Only ads shown on these Google platforms. Google's platform filter only covers ads shown since 4 September 2023, and takes one platform at a time: with several, each is its own search, up to the max ads below each. Empty (the default) searches every platform at once, older ads included.

## `formats` (type: `array`):

Only ads of these formats. Empty (the default) keeps every format.

## `startDate` (type: `string`):

Optional, YYYY-MM-DD. Only ads shown on or after this day.

## `endDate` (type: `string`):

Optional, YYYY-MM-DD. Only ads shown on or before this day.

## `maxAdsPerSearch` (type: `integer`):

Stop after this many ads for each brand, website, advertiser or URL (and each platform, when you pick several). Google lists the most recently shown ads first. You are charged per ad returned.

## `includeDetails` (type: `boolean`):

One more request per ad, at no extra charge: impressions per country and in total, the platforms that showed it (Search, YouTube, Maps, Play, Shopping, for ads shown in the EU), first and last day shown per country, the targeting criteria used, and the headline and description of text ads where Google renders them. Off gives a faster list of creatives.

## `maxAdvertisers` (type: `integer`):

Optional, off by default. Also return up to this many advertiser records per search (ID, name, country, how many ads Google holds for it): stored in the run's key-value store (record ADVERTISERS), not in the ads dataset, and charged per advertiser. For a brand search it also widens the search to that many advertisers named like the brand (one by default, the biggest).

## `onlyNewAds` (type: `boolean`):

For scheduled runs: return and charge only the ads this monitor has not returned before, per search. The ads already returned are kept in a key-value store of your account named ads-transparency-monitor-<monitor name>. The first run returns everything it reads; the run summary says how many ads were new and how many already seen.

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

Names the memory of Only new ads, so separate schedules keep separate lists (letters, digits and hyphens). Empty means 'default'.

## `proxy` (type: `string`):

Google refuses many requests from the Apify cloud's shared IPs, so the Actor reads through Apify Proxy, at no extra charge to you. Auto: datacenter IPs, and residential ones after two refusals in a row. Residential: residential IPs from the start. None: no proxy (expect refusals on Apify).

## Actor input object example

```json
{
  "queries": [
    "nike",
    "adidas"
  ],
  "domains": [
    "nike.com"
  ],
  "advertiserIds": [
    "AR16735076323512287233"
  ],
  "startUrls": [
    {
      "url": "https://adstransparency.google.com/?region=FR&domain=nike.com&platform=YOUTUBE&format=VIDEO"
    }
  ],
  "countries": [
    "US",
    "GB"
  ],
  "maxAdsPerSearch": 20,
  "includeDetails": true,
  "maxAdvertisers": 0,
  "onlyNewAds": false,
  "monitorName": "competitors-weekly",
  "proxy": "auto"
}
```

# Actor output Schema

## `ads` (type: `string`):

No description

## `reach` (type: `string`):

No description

## `all` (type: `string`):

No description

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

No description

## `summary` (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"
    ],
    "countries": [
        "US"
    ],
    "maxAdsPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("agenttoolworks/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"],
    "countries": ["US"],
    "maxAdsPerSearch": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("agenttoolworks/google-ads-transparency-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "nike"
  ],
  "countries": [
    "US"
  ],
  "maxAdsPerSearch": 20
}' |
apify call agenttoolworks/google-ads-transparency-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,agenttoolworks/google-ads-transparency-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/dmMFdmi3TzQ9buyei/builds/P8pbCclfeGYpIZuYb/openapi.json
