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

Scrape Google Ads Transparency Center ads by advertiser name, domain or ID: creatives, ad text, image/video URLs, first/last shown, regions, impressions, topic. No login.

- **URL**: https://apify.com/romajure/google-ads-transparency.md
- **Developed by:** [Romas Jurevicius](https://apify.com/romajure) (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 $1.50 / 1,000 ad creative scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/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

### Google Ads Transparency Scraper

Google Ads Transparency Scraper exports ads from the [Google Ads Transparency Center](https://adstransparency.google.com) as clean JSON. Give it an advertiser name, a website domain or an advertiser ID (`AR...`) and it returns one record per ad creative: the advertiser and whether Google verified its identity, the ad format (text, image, video), the preview, image and YouTube URLs, the ad text where Google renders it, the landing domain, first and last shown dates, every region the ad ran in, impression ranges where Google publishes them, the topic Google labelled the ad with, and a link back to the ad's Transparency Center page. No Google account, cookie or API key is needed.

Typical uses: competitor ad research (what is Walmart, Nike or your rival running on Search, Shopping and YouTube right now), creative inspiration libraries, monitoring brand impersonation (who else points ads at your domain), agency reporting, ad-spend estimation from impression ranges in the EU, and feeding AI agents that analyze ad copy.

### How to scrape the Google Ads Transparency Center

1. Open the Actor in Apify Console and click **Try for free**.
2. Add **Advertisers**, one per line. Each entry can be:
   - a **website domain** such as `walmart.com` (or a full URL) - every ad that lands on that site, from all advertiser accounts. This is the most complete option for big brands, which often run several accounts.
   - an **advertiser ID** such as `AR07091023166411112449`, or an `adstransparency.google.com/advertiser/...` URL.
   - an **advertiser name** such as `Walmart Inc.` - matched against the Center's own advertiser search; all accounts with exactly that name are included.
3. Pick **Regions** (ISO codes, default `US`; `anywhere` for no filter), optionally **Shown from / until** dates and an **Ad format**.
4. Set **Max creatives per advertiser** (default 20) and turn on **Include creative details** for regions, impressions, topic and ad text (off by default for speed).
5. Click **Start**. Results land in the **Output** tab and can be downloaded as JSON, CSV or Excel or read through the API.

#### How it works

The Actor talks to the same JSON endpoints the Transparency Center web app uses, over plain HTTPS (no headless browser, so runs are fast and cheap): `SearchService/SearchSuggestions` to match advertiser names, `LookupService/GetAdvertiserById` for verification status and country, `SearchService/SearchCreatives` for the paginated ad list (up to 100 per page, filtered by region, date range and format), and `LookupService/GetCreativeById` for the per-creative detail page. Ad text, product images and YouTube IDs are read from Google's own ad preview script. Requests go through Apify Proxy with a concurrency cap and retries on rate limits.

### Google Ads Transparency Scraper pricing

Pay per event, no subscription:

- **Ad creative scraped**: **$0.002 per creative** ($2 per 1,000 ads), with or without creative details.
- **Advertiser lookup**: **$0.001** per Advertisers entry that resolved to an advertiser or a domain search.
- **Actor start**: Apify's small synthetic start fee.

Entries that match nothing produce a free `not_found` record. The default run (one domain, 20 ads) costs about $0.04; 1,000 ads cost about $2. Set **Maximum cost per run** to cap spending; the Actor stops cleanly at the limit and keeps everything scraped so far.

### Input example

```json
{
    "advertisers": ["walmart.com", "AR07828854790737100801", "Nike, Inc."],
    "regions": ["US", "GB"],
    "dateFrom": "2026-09-01",
    "dateTo": "2026-10-12",
    "format": "all",
    "maxCreativesPerAdvertiser": 200,
    "includeCreativeDetails": true,
    "proxyConfiguration": { "useApifyProxy": true }
}
```

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `advertisers` | array of strings | `["walmart.com"]` | Domains, advertiser IDs, Transparency Center URLs or advertiser names. |
| `regions` | array of ISO codes | `["US"]` | Ads shown in any of these countries; `anywhere` disables the filter. |
| `dateFrom` / `dateTo` | `YYYY-MM-DD` | none | Ads shown at some point in this window (inclusive). |
| `format` | `all` / `text` / `image` / `video` | `all` | Google's format classification. |
| `maxCreativesPerAdvertiser` | integer | `20` | Cap per Advertisers entry (max 10,000). Most recently shown ads come first. |
| `includeCreativeDetails` | boolean | `false` | Regions, per-region dates and impressions, topic, audience flags, ad text, video ID. |
| `proxyConfiguration` | object | Apify Proxy | Standard Apify proxy settings. |

### Output example

One record per creative (captured 2026-10-12, trimmed):

```json
{
    "recordType": "creative",
    "query": "AR07828854790737100801",
    "queryType": "advertiserId",
    "advertiserId": "AR07828854790737100801",
    "advertiserName": "Eastern RED Tech Limited",
    "advertiserVerified": true,
    "advertiserCountry": "HK",
    "creativeId": "CR05831720218145062913",
    "format": "text",
    "previewUrl": null,
    "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/9066546823614426027",
    "html5Url": "https://tpc.googlesyndication.com/archive/sadbundle/$csp%3Darchive$/10475215587204032752/index.html",
    "videoUrl": null,
    "adText": null,
    "landingDomain": null,
    "firstShown": "2025-01-22T11:21:12.487Z",
    "lastShown": "2026-10-12T07:33:51.268Z",
    "daysShown": 610,
    "searchedRegions": [],
    "regions": [
        { "region": "FR", "criterionId": 2250, "firstShown": "2025-03-17", "lastShown": "2026-03-05",
          "impressionsMin": 0, "impressionsMax": 1000,
          "impressionsByPlatform": [{ "platform": "Google Search", "impressionsMin": 0, "impressionsMax": 1000 }] }
    ],
    "regionCount": 75,
    "impressionsMin": 600000,
    "impressionsMax": 700000,
    "impressionsSince": "2025-03-01",
    "topic": "Internet & Telecom",
    "audienceSelection": { "demographics": { "included": true, "excluded": true }, "geographicLocations": { "included": true, "excluded": true }, "contextualSignals": { "included": true, "excluded": true } },
    "variationCount": 1,
    "detailsFetched": true,
    "transparencyUrl": "https://adstransparency.google.com/advertiser/AR07828854790737100801/creative/CR05831720218145062913?region=anywhere",
    "scrapedAt": "2026-10-12T08:49:15.389Z"
}
```

Field notes:

- **`adText`** comes from Google's ad preview: Search ads give advertiser, headline and description lines, Shopping ads the product title and merchant, Maps ads the business lines. Many Search ads are archived only as a screenshot (`imageUrl` on `tpc.googlesyndication.com/archive/simgad/...`); those have no machine-readable text and `adText` is `null`.
- **`landingDomain`** is exact for domain searches; for ID and name searches it is the display domain read from the preview, when there is one.
- **Impressions and topic** are only published by Google for some regions, mainly EU/EEA countries (Digital Services Act) and political ads. US commercial ads show region and last-shown date only. Ranges are Google's buckets (`0 - 1K`, `10K - 15K`, ...).
- **`daysShown`** is the Center's per-creative day counter as returned by its listing endpoint.
- **`audienceSelection`** mirrors the Center's "Audience selection" panel: whether demographic, location and contextual criteria were included and/or excluded.
- Per-advertiser summaries (resolved accounts, verification, approximate total ads) are saved in the `ADVERTISERS` key-value record. Entries that matched nothing, matched no ads or failed are also pushed to the dataset as free `recordType: "advertiser"` records with a `status` and a `message`.

### Integrations

- **API**: run with the [Apify API](https://docs.apify.com/api/v2) or the JavaScript/Python clients; `run-sync-get-dataset-items` returns the ads in one call.
- **MCP / AI agents**: available through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) at `https://mcp.apify.com`, so Claude, ChatGPT, Cursor or any MCP client can call it with the same input.
- **n8n, Make, Zapier**: use the Apify node, pass the input JSON and map the dataset items.
- **Schedules and webhooks**: run weekly per competitor and push new creatives to Slack, Google Sheets or a database.

### Limitations

- Only data the Transparency Center shows publicly is returned. Spend, clicks, targeting details and exact impressions are not published by Google.
- Advertiser-name matching uses Google's suggestion list (top 10). Brands with many similarly named accounts are best searched by domain or ID.
- The date filter selects ads shown at some point in the window; `firstShown` / `lastShown` remain the ad's overall dates.
- Policy-removal notices are not mapped to fields yet.
- The endpoints are internal to Google's web app and can change without notice; the Actor is tested against captured responses and reports failures as `error` records instead of returning bad data.

### Google Ads Transparency Scraper FAQ

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

No. The Transparency Center is public and the Actor uses only its unauthenticated endpoints.

#### Why is `adText` empty for some ads?

Google archives many Search text ads as screenshots. The image URL is returned, but there is no text to read without OCR. Shopping, Maps, video and many Search ads have a rendered preview and do return text.

#### How do I get every ad for a brand?

Search by domain (`nike.com`). It covers every advertiser account whose ads land on that site, including resellers and agencies, and each record names the account that ran it.

#### Can I get impression numbers for US ads?

Not for commercial ads: Google only publishes impression ranges for EU/EEA regions and for political ads. Set `regions` to EU countries (`DE`, `FR`, `IT`) to see them.

#### How many ads can one run return?

Up to 10,000 per Advertisers entry. The default 20-ad run without details finishes in seconds; with creative details on, expect roughly two minutes per 50 ads.

### Related actors

Same author, same pay-per-event model, no login:

- [Telegram Channel Scraper](https://apify.com/romajure/telegram-channel-scraper) - posts, views, media and links from public Telegram channels.
- [Substack Scraper](https://apify.com/romajure/substack-scraper) - posts, authors, likes and comments from Substack publications.
- [Economic Calendar Scraper](https://apify.com/romajure/economic-calendar) - macro events with actual, forecast and previous values.
- [Prediction Market Odds Scraper](https://apify.com/romajure/prediction-market-odds) - Polymarket and Kalshi odds, volume and orderbooks.
- [Product Hunt Scraper](https://apify.com/romajure/product-hunt-scraper) - leaderboards, launches, votes and makers.
- [Bilibili Scraper](https://apify.com/romajure/bilibili-scraper) - Bilibili videos by keyword, BV id, uploader or trending list with views, likes, coins and danmaku.

### Legal and compliance

This Actor only reads information Google publishes on the public Ads Transparency Center for transparency purposes; it does not log in, bypass access controls or collect personal data of end users. Ad creatives are the property of their advertisers, and the Center is subject to [Google's Terms of Service](https://policies.google.com/terms). You are responsible for how you use the data, including copyright in ad creatives, data-protection law and any rules on redistribution. Read Apify's article on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) if unsure. This Actor is independent and not affiliated with or endorsed by Google.

### Support

Missing a field, wrong parsing, or need political-ad or platform filters? Open an issue on the Actor's **Issues** tab with the input JSON and the creative ID; fixes usually ship within days.

# Actor input Schema

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

One per line. Each entry can be a website domain (`walmart.com`, also full URLs) to get every ad that lands on that site, an advertiser ID (`AR07091023166411112449`, or an adstransparency.google.com advertiser URL), or an advertiser name (`Nike, Inc.`), which is matched against the Center's advertiser search. Domains give the most complete results for brands with several advertiser accounts.

## `regions` (type: `array`):

ISO 3166-1 alpha-2 country codes the ads were shown in, e.g. `US`, `GB`, `DE`. Several codes are combined (ads shown in any of them). Use `anywhere` for no region filter. Impression ranges are only published for some regions, mainly EU/EEA countries.

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

Only ads shown on or after this date (YYYY-MM-DD). Leave empty for any time.

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

Only ads shown on or before this date (YYYY-MM-DD). Leave empty for up to today.

## `format` (type: `string`):

Restrict to one ad format as classified by Google: text (Search and many Shopping/Maps ads), image (display, Shopping, Discover) or video (YouTube).

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

Stop each Advertisers entry after this many creatives. The Center lists the most recently shown ads first.

## `includeCreativeDetails` (type: `boolean`):

Open every creative's detail page: all regions it was shown in with first/last shown dates, impression ranges (where Google publishes them) split by platform, the topic labelled by Google, audience-selection flags, and the ad text / video ID read from Google's ad preview. Two extra requests per creative; no extra charge. Off by default for speed; turn it on for the full detail set.

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

Proxy settings. Apify Proxy is recommended so requests are spread across IPs and Google's rate limits are not hit.

## Actor input object example

```json
{
  "advertisers": [
    "walmart.com"
  ],
  "regions": [
    "US"
  ],
  "format": "all",
  "maxCreativesPerAdvertiser": 20,
  "includeCreativeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `advertisers` (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 = {
    "advertisers": [
        "walmart.com"
    ],
    "regions": [
        "US"
    ],
    "format": "all",
    "maxCreativesPerAdvertiser": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("romajure/google-ads-transparency").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "advertisers": ["walmart.com"],
    "regions": ["US"],
    "format": "all",
    "maxCreativesPerAdvertiser": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("romajure/google-ads-transparency").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": [
    "walmart.com"
  ],
  "regions": [
    "US"
  ],
  "format": "all",
  "maxCreativesPerAdvertiser": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call romajure/google-ads-transparency --silent --output-dataset

```

## MCP server setup

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

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/YXksqFpAXP5ww4KSq/builds/PdVdXp27jebihErSX/openapi.json
