# Google Ads Transparency — Advertisers & Ad Creatives (`viralanalyzer/google-ads-transparency-scraper-pro`) Actor

Real Google advertiser identities, ad-volume ranges, verification status AND the actual ad creatives (headline, body, image, destination URL) from the Ads Transparency Center.

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

## Pricing

from $2.13 / 1,000 ad founds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

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

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

# README

## Google Ads Transparency Scraper Pro 🔍

> 🔗 [View on Apify Store](https://apify.com/viralanalyzer/google-ads-transparency-scraper-pro) | 🇺🇸 English | [🇧🇷 Português](#português)

***

### 🇺🇸 English

#### Overview

Resolve brand names into real Google advertiser identities — advertiser name, `AR…` id, registration country, Google's own ad-volume range, and the identity-verification flag — then pull the live ad creatives for the same brands.

Two kinds of records land in one dataset:

1. **Advertiser records**, from Google's Ads Transparency search endpoint.
2. **Creative records**, fetched by delegating to `viralanalyzer/google-ads-transparency`, the browser-based scraper that renders the advertiser page. Switch this off with `includeCreatives: false`.

#### Advertiser record

```json
{
  "query": "nike",
  "advertiserName": "<name Google has on file for the advertiser>",
  "advertiserId": "AR…",
  "advertiserCountry": "US",
  "adCountLow": null,
  "adCountHigh": null,
  "adCountIsExact": false,
  "isVerifiedAdvertiser": true,
  "transparencyUrl": "https://adstransparency.google.com/advertiser/AR…?region=US",
  "searchRegion": "US",
  "dataSource": "google-ads-transparency-search",
  "scrapedAt": "2026-08-26T14:03:11.008Z"
}
```

| Field | Type | Meaning |
|---|---|---|
| `query` | string | The term from your `advertisers` input that produced this record |
| `advertiserName` | string | Advertiser name as registered with Google |
| `advertiserId` | string | Google advertiser id, `AR` followed by digits. Stable across regions |
| `advertiserCountry` | string | null | Country code Google reports for the advertiser registration |
| `adCountLow` | number | null | Lower bound of the ad-volume range Google reports |
| `adCountHigh` | number | null | Upper bound of that range |
| `adCountIsExact` | boolean | `true` when low and high match, meaning Google gave an exact figure instead of a bucket |
| `isVerifiedAdvertiser` | boolean | `true` only when Google marks the advertiser identity-verified |
| `transparencyUrl` | string | Public Transparency Center page for this advertiser, scoped to your region |
| `searchRegion` | string | The `region` you sent, echoed back |
| `dataSource` | string | Constant `google-ads-transparency-search` |
| `scrapedAt` | string | ISO-8601 extraction timestamp |

#### Creative record

Emitted when `includeCreatives` is on and the upstream scraper returns cards. Each record is the upstream item passed through unchanged, with `query` and `dataSource` set by this actor:

| Field | Type | Meaning |
|---|---|---|
| `creativeId` | string | Google creative id, `CR` followed by digits |
| `advertiserId` | string | Owner of the creative |
| `advertiserName` | string | null | Advertiser name read from the page |
| `advertiserDomain` | string | null | Advertiser domain read from the page |
| `format` | string | null | `VIDEO`, `IMAGE` or `TEXT`, inferred from the media present on the card |
| `headline` | string | null | First usable text block on the card |
| `body` | string | null | Remaining text blocks joined, capped at 500 characters |
| `imageUrl` | string | null | First non-icon image on the card |
| `videoUrl` | string | null | `<video>` source or YouTube iframe source, when present |
| `destinationUrl` | string | null | First external link on the card |
| `regions` | array | Best-effort list of `{ region, firstShown, lastShown }` parsed from "Shown in XX" text. `firstShown` and `lastShown` are always `null` |
| `creativeUrl` | string | Direct link to the creative on the Transparency Center |
| `source` | string | Constant `google-ads-transparency` |
| `query` | string | The term from your input that produced this creative |
| `dataSource` | string | Constant `viralanalyzer/google-ads-transparency` |

#### Input Example

```json
{
  "advertisers": [
    "nike",
    "shopify"
  ],
  "region": "US",
  "maxAds": 30,
  "includeCreatives": true,
  "maxCreativesPerAdvertiser": 10
}
```

#### Input Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `advertisers` | string\[] | **Required.** Brand or company names to resolve. Brand names (`nike`) match better than full domains (`nike.com`) |
| `region` | string | Two-letter country code for the lookup: `US`, `GB`, `BR`, `DE`, `ALL`. Default `US` |
| `maxAds` | integer | Cap applied to advertiser records **and**, separately, to creative records. Default `30` |
| `includeCreatives` | boolean | Fetch ad creatives through the browser-based upstream scraper. Default `true`; the run takes longer with it on |
| `maxCreativesPerAdvertiser` | integer | Creatives requested per search term. Default `10`, maximum `100` |
| `proxyConfiguration` | object | Apify proxy, residential or datacenter. Default `{ "useApifyProxy": true }` |

#### When nothing matches

If Google answers but returns no advertiser for your terms, the run ends SUCCEEDED with a single diagnostic row and charges nothing:

```json
{
  "setup_status": "DIAGNOSTIC_GUIDE",
  "_dataQuality": "diagnostic",
  "message": "[DIAGNÓSTICO] O Google Ads Transparency respondeu à busca sem nenhum anunciante correspondente.",
  "potential_causes": [
    "Os termos informados não correspondem a nenhum anunciante indexado na região escolhida.",
    "O anunciante pode estar registrado em outra região."
  ],
  "remediations": [
    "Use o nome comercial da marca (ex: \"nike\") em vez do domínio completo",
    "Tente outra região no campo \"region\" (ex: BR, GB, DE)"
  ],
  "advertisers": ["nike"],
  "region": "US",
  "scrapedAt": "2026-08-26T14:03:11.008Z"
}
```

If the endpoint never answers at all, the run fails loudly instead of returning an empty dataset.

### ✅ Capabilities & Limits

Stated up front, so you do not pay a run to find out.

| Input / feature | Supported | Notes |
|---|---|---|
| `advertisers` — **required** | ✅ | One search per term. Brand names resolve better than domains. |
| `region` | ⚠️ | Scopes the lookup and is echoed back as `searchRegion`. It is your input, not proof that an ad ran there. |
| `maxAds` | ⚠️ | Applied twice: once to advertiser records, once to creative records. A run with both enabled can therefore write up to `2 × maxAds` items, and every item is one billable `ad-found` event. |
| `includeCreatives` | ✅ | Delegates to `viralanalyzer/google-ads-transparency`. That actor runs a browser, so expect a slower run and its own platform cost on top. |
| `maxCreativesPerAdvertiser` | ✅ | Per-term creative cap, 1 to 100. |
| Proxy | ✅ | Apify proxy for the search endpoint; the proxy config is forwarded to the upstream scraper too. |
| Ad geographic targeting (`targetRegion`) | ❌ | **Not emitted.** There is no `targetRegion` field. `searchRegion` only repeats the region you asked for, and `advertiserCountry` is the registration country. The creative record carries a best-effort `regions` array scraped from "Shown in XX" text, which is frequently empty. |
| First seen / last seen dates (`firstSeenDate`, `lastSeenDate`) | ❌ | **Not emitted.** No record carries an ad run date. Inside `regions`, `firstShown` and `lastShown` are always `null`. `scrapedAt` is the extraction time, nothing else. |
| Ad spend, impressions, clicks, CTR | ❌ | Google does not publish them, and this actor does not estimate them. |
| Keywords, bids, match types | ❌ | Not in the Transparency Center and not emitted. |
| Field names `adHeadline` / `adDescription` / `adFormat` | ❌ | Do not exist. Creative text lives in `headline`, `body` and `format`. |
| Landing page content | ❌ | `destinationUrl` is captured; the page behind it is not fetched. |

#### Tips

- Run once with `includeCreatives: false` to resolve `advertiserId` values cheaply, then run again with the ids you care about.
- `adCountIsExact` tells you whether `adCountLow`/`adCountHigh` are a real figure or a bucket. Filter on it before charting volumes.
- `advertiserId` is the stable join key across regions and across runs.

#### Use Cases

- **Competitor creative review** — read `headline`, `body`, `imageUrl` and `destinationUrl` for the brands you track.
- **Advertiser identity resolution** — turn a list of brand names into `AR…` ids plus verification status.
- **Ad-volume benchmarking** — compare `adCountLow`/`adCountHigh` across a competitive set.

#### FAQ

**Q: Does it cover YouTube video ads?**
A: Creative records are classified as `VIDEO` when the card holds a `<video>` element or a YouTube iframe, and `videoUrl` captures that source. Classification comes from the rendered card, not from a Google-declared format field.

**Q: Why is there no `targetRegion` or `lastSeenDate`?**
A: Neither is available from the endpoints this actor reads. Earlier builds printed them from generated values; that was removed in v3.0.0.

**Q: How am I billed?**
A: One `ad-found` event per item written — advertiser records included. Diagnostic runs write one row and charge nothing.

***

### 🇧🇷 Português

#### Visão Geral

Resolva nomes de marca em identidades reais de anunciantes do Google — nome, id `AR…`, país de registro, a faixa de volume de anúncios que o próprio Google publica e o selo de verificação — e depois puxe os criativos ativos dessas mesmas marcas.

Dois tipos de registro caem no mesmo dataset:

1. **Registros de anunciante**, vindos do endpoint de busca do Ads Transparency.
2. **Registros de criativo**, obtidos por delegação ao `viralanalyzer/google-ads-transparency`, o scraper de navegador que renderiza a página do anunciante. Desligue com `includeCreatives: false`.

#### Registro de anunciante

```json
{
  "query": "nike",
  "advertiserName": "<nome que o Google tem registrado para o anunciante>",
  "advertiserId": "AR…",
  "advertiserCountry": "US",
  "adCountLow": null,
  "adCountHigh": null,
  "adCountIsExact": false,
  "isVerifiedAdvertiser": true,
  "transparencyUrl": "https://adstransparency.google.com/advertiser/AR…?region=US",
  "searchRegion": "US",
  "dataSource": "google-ads-transparency-search",
  "scrapedAt": "2026-08-26T14:03:11.008Z"
}
```

| Campo | Tipo | Significado |
|---|---|---|
| `query` | string | Termo do seu input `advertisers` que gerou o registro |
| `advertiserName` | string | Nome do anunciante como registrado no Google |
| `advertiserId` | string | Id do anunciante no Google, `AR` seguido de dígitos. Estável entre regiões |
| `advertiserCountry` | string | null | Código de país do registro do anunciante |
| `adCountLow` | number | null | Limite inferior da faixa de volume de anúncios reportada pelo Google |
| `adCountHigh` | number | null | Limite superior dessa faixa |
| `adCountIsExact` | boolean | `true` quando limite inferior e superior coincidem, ou seja, o Google deu número exato em vez de faixa |
| `isVerifiedAdvertiser` | boolean | `true` só quando o Google marca a identidade como verificada |
| `transparencyUrl` | string | Página pública do anunciante no Transparency Center, na sua região |
| `searchRegion` | string | A `region` que você enviou, devolvida |
| `dataSource` | string | Constante `google-ads-transparency-search` |
| `scrapedAt` | string | Timestamp ISO-8601 da extração |

#### Registro de criativo

Sai quando `includeCreatives` está ligado e o scraper upstream devolve cards. Cada registro é o item do upstream repassado sem alteração, com `query` e `dataSource` definidos por este actor:

| Campo | Tipo | Significado |
|---|---|---|
| `creativeId` | string | Id do criativo no Google, `CR` seguido de dígitos |
| `advertiserId` | string | Dono do criativo |
| `advertiserName` | string | null | Nome do anunciante lido da página |
| `advertiserDomain` | string | null | Domínio do anunciante lido da página |
| `format` | string | null | `VIDEO`, `IMAGE` ou `TEXT`, inferido pela mídia presente no card |
| `headline` | string | null | Primeiro bloco de texto aproveitável do card |
| `body` | string | null | Demais blocos de texto concatenados, cortados em 500 caracteres |
| `imageUrl` | string | null | Primeira imagem não-ícone do card |
| `videoUrl` | string | null | Source do `<video>` ou do iframe do YouTube, quando existe |
| `destinationUrl` | string | null | Primeiro link externo do card |
| `regions` | array | Lista best-effort de `{ region, firstShown, lastShown }` extraída do texto "Shown in XX". `firstShown` e `lastShown` são sempre `null` |
| `creativeUrl` | string | Link direto para o criativo no Transparency Center |
| `source` | string | Constante `google-ads-transparency` |
| `query` | string | Termo do seu input que gerou o criativo |
| `dataSource` | string | Constante `viralanalyzer/google-ads-transparency` |

#### Exemplo de Entrada

```json
{
  "advertisers": [
    "nike",
    "shopify"
  ],
  "region": "US",
  "maxAds": 30,
  "includeCreatives": true,
  "maxCreativesPerAdvertiser": 10
}
```

#### Parâmetros de Entrada

| Parâmetro | Tipo | Descrição |
|-----------|------|-----------|
| `advertisers` | string\[] | **Obrigatório.** Nomes de marca ou empresa a resolver. Nome comercial (`nike`) casa melhor que domínio completo (`nike.com`) |
| `region` | string | Código de país de 2 letras para a busca: `US`, `GB`, `BR`, `DE`, `ALL`. Padrão `US` |
| `maxAds` | integer | Teto aplicado aos registros de anunciante **e**, separadamente, aos de criativo. Padrão `30` |
| `includeCreatives` | boolean | Busca os criativos pelo scraper de navegador upstream. Padrão `true`; o run demora mais com isso ligado |
| `maxCreativesPerAdvertiser` | integer | Criativos pedidos por termo de busca. Padrão `10`, máximo `100` |
| `proxyConfiguration` | object | Proxy Apify, residencial ou datacenter. Padrão `{ "useApifyProxy": true }` |

#### Quando nada casa

Se o Google responde mas não retorna anunciante para os seus termos, o run termina SUCCEEDED com uma única linha de diagnóstico e não cobra nada:

```json
{
  "setup_status": "DIAGNOSTIC_GUIDE",
  "_dataQuality": "diagnostic",
  "message": "[DIAGNÓSTICO] O Google Ads Transparency respondeu à busca sem nenhum anunciante correspondente.",
  "potential_causes": [
    "Os termos informados não correspondem a nenhum anunciante indexado na região escolhida.",
    "O anunciante pode estar registrado em outra região."
  ],
  "remediations": [
    "Use o nome comercial da marca (ex: \"nike\") em vez do domínio completo",
    "Tente outra região no campo \"region\" (ex: BR, GB, DE)"
  ],
  "advertisers": ["nike"],
  "region": "US",
  "scrapedAt": "2026-08-26T14:03:11.008Z"
}
```

Se o endpoint não responder nada, o run falha de forma explícita em vez de devolver dataset vazio.

### ✅ Capacidades e Limites

Declarado antes da compra, para não gastar um run descobrindo.

| Entrada / recurso | Suportado | Observações |
|---|---|---|
| `advertisers` — **obrigatório** | ✅ | Uma busca por termo. Nome de marca resolve melhor que domínio. |
| `region` | ⚠️ | Delimita a busca e volta como `searchRegion`. É o seu input, não prova de que um anúncio rodou ali. |
| `maxAds` | ⚠️ | Aplicado duas vezes: uma aos registros de anunciante, outra aos de criativo. Um run com os dois ligados pode gravar até `2 × maxAds` itens, e cada item é um evento `ad-found` cobrado. |
| `includeCreatives` | ✅ | Delega ao `viralanalyzer/google-ads-transparency`. Aquele actor sobe um navegador, então conte com run mais lento e custo de plataforma próprio por cima. |
| `maxCreativesPerAdvertiser` | ✅ | Teto de criativos por termo, de 1 a 100. |
| Proxy | ✅ | Proxy Apify no endpoint de busca; a configuração também é repassada ao scraper upstream. |
| Segmentação geográfica do anúncio (`targetRegion`) | ❌ | **Não é emitida.** Não existe campo `targetRegion`. `searchRegion` apenas repete a região que você pediu, e `advertiserCountry` é o país de registro. O registro de criativo traz um array `regions` best-effort raspado do texto "Shown in XX", que costuma vir vazio. |
| Datas de primeira/última veiculação (`firstSeenDate`, `lastSeenDate`) | ❌ | **Não são emitidas.** Nenhum registro traz data de veiculação. Dentro de `regions`, `firstShown` e `lastShown` são sempre `null`. `scrapedAt` é a hora da extração, e só. |
| Investimento, impressões, cliques, CTR | ❌ | O Google não publica, e este actor não estima. |
| Palavras-chave, lances, tipos de correspondência | ❌ | Não estão no Transparency Center e não são emitidos. |
| Campos `adHeadline` / `adDescription` / `adFormat` | ❌ | Não existem. O texto do criativo está em `headline`, `body` e `format`. |
| Conteúdo da landing page | ❌ | `destinationUrl` é capturada; a página por trás dela não é aberta. |

#### Dicas

- Rode primeiro com `includeCreatives: false` para resolver os `advertiserId` de forma barata, depois rode de novo só com os ids que interessam.
- `adCountIsExact` diz se `adCountLow`/`adCountHigh` são número real ou faixa. Filtre por ele antes de plotar volumes.
- `advertiserId` é a chave estável entre regiões e entre runs.

#### Casos de Uso

- **Análise de criativos de concorrentes** — leia `headline`, `body`, `imageUrl` e `destinationUrl` das marcas que você acompanha.
- **Resolução de identidade de anunciante** — entra nome de marca, sai o id `AR…` do Ads Transparency Center, com o status de verificação e a faixa de volume de anúncios.
- **Comparação de volume de anúncios** — confronte `adCountLow`/`adCountHigh` entre um conjunto de concorrentes.

#### Perguntas Frequentes

**P: Inclui anúncios em vídeo do YouTube?**
R: O criativo é classificado como `VIDEO` quando o card tem um elemento `<video>` ou um iframe do YouTube, e `videoUrl` captura esse source. A classificação vem do card renderizado, não de um campo de formato declarado pelo Google.

**P: Por que não existe `targetRegion` nem `lastSeenDate`?**
R: Nenhum dos dois está disponível nos endpoints que este actor lê. Versões anteriores imprimiam esses campos a partir de valores gerados; isso saiu na v3.0.0.

**P: Como sou cobrado?**
R: Um evento `ad-found` por item gravado, incluindo os registros de anunciante. Run de diagnóstico grava uma linha e não cobra nada.

***

### 💰 Pricing

This actor uses **Pay Per Event (PPE)** pricing — you pay only per **item written to the dataset** (`ad-found`), advertiser records included. Platform usage is included. Diagnostic runs charge nothing. See the current price on the **Pricing** panel of this actor's Apify Store page.

***

### 🔗 Related Actors

- [Google Ads Transparency (browser-based creatives)](https://apify.com/viralanalyzer/google-ads-transparency)
- [Facebook Ads Library](https://apify.com/viralanalyzer/facebook-ads-library)
- [Instagram Reels Scraper](https://apify.com/viralanalyzer/instagram-reels-scraper)
- [TikTok Viral Scanner](https://apify.com/viralanalyzer/tiktok-viral-scanner)
- [Google Maps BR Scraper](https://apify.com/viralanalyzer/google-maps-br-scraper)
- [Mercado Livre Scraper](https://apify.com/viralanalyzer/mercadolivre-scraper)

***

### 📝 Changelog

- **v3.0.0** (2026-08-26) — Creatives added by delegating to `viralanalyzer/google-ads-transparency`. Advertiser lookup kept. Fields that earlier builds generated rather than scraped (`adHeadline`, `adDescription`, `adFormat`, `firstSeenDate`, `lastSeenDate`, `targetRegion`) no longer exist.
- **v1.0.0** (2026-08-20) — Initial release: Pay-Per-Event pricing and automated proxy support

***

### License

ISC © 2026 Viral Analyzer Platform

***

💡 **Need AI analysis on top of this data — sentiment, trend detection and a dashboard, with no API keys to manage?**\
[ViralAnalyzer](https://viralanalyzer.com.br) runs this actor + 42 more data sources with built-in AI. JSON + insights in one call.

# Actor input Schema

## `advertisers` (type: `array`):

Brand or company names to resolve (e.g. "nike", "shopify"). Brand names match better than full domains.

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

Two-letter country code for regional ads (e.g., 'US', 'GB', 'BR', 'DE', 'ALL').

## `maxAds` (type: `integer`):

Maximum advertiser records to return.

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

Select Apify Proxy (Residential or Datacenter recommended).

## `includeCreatives` (type: `boolean`):

Além dos anunciantes, buscar os criativos reais (headline, corpo, imagem, URL de destino). Usa o scraper de navegador da conta, portanto o run demora mais.

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

Limite de criativos buscados por termo.

## Actor input object example

```json
{
  "advertisers": [
    "nike",
    "shopify"
  ],
  "region": "US",
  "maxAds": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "includeCreatives": true,
  "maxCreativesPerAdvertiser": 10
}
```

# Actor output Schema

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

Advertiser records and ad creatives resolved from the Google Ads Transparency Center

# 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 = {
    "advertisers": [
        "nike",
        "shopify"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("viralanalyzer/google-ads-transparency-scraper-pro").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 = { "advertisers": [
        "nike",
        "shopify",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("viralanalyzer/google-ads-transparency-scraper-pro").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 '{
  "advertisers": [
    "nike",
    "shopify"
  ]
}' |
apify call viralanalyzer/google-ads-transparency-scraper-pro --silent --output-dataset

```

## MCP server setup

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

```

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/UdgHgefERlyHNZndX/builds/AHKAgQiLwGPMBaaho/openapi.json
