# Google Ads Transparency Scraper — Ads, Text, Regions & Reach (`griffie/google-ads-transparency-scraper`) Actor

Scrape the Google Ads Transparency Center: every Search, YouTube, Shopping, Maps & Play ad of any advertiser or website — text, image/video, first/last shown, regions, reach, targeting, landing page and political ad spend. Filter by region, platform, format and dates. Monitor new ads.

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

## Pricing

from $0.80 / 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

## Google Ads Transparency Scraper — Ads, Text, Regions & Reach

Scrape the **Google Ads Transparency Center** (Google's public ads library) for any advertiser, website or region. Get every Search, YouTube, Display, Shopping, Maps and Play ad an advertiser has run: the format, the first and last date it was shown, images, video IDs, headlines, landing pages and a direct Transparency Center link. Add **full ad details** for country-by-country reach, impressions, audience targeting and political ad spend.

No login, no Google account and no API key needed. You pay only for ads that are saved.

### What you can do

- **Spy on competitors' ads.** Enter a brand name (`Coca-Cola`), a website (`nike.com`), an advertiser ID (`AR…`) or a Transparency Center URL, and get all of their ads.
- **Filter like the Transparency Center itself:** region (240+ countries or "anywhere"), date range, format (text, image, video), platform (Search, YouTube, Shopping, Maps, Play) and max ads.
- **Political ads:** browse every election ad in a region, or one candidate's ads, with **spend ranges, impression ranges, who paid** and targeting.
- **Full ad details (optional):** all variations of the ad, the regions where it ran with dates and impressions, EU/EEA and US reach, the platforms, audience targeting (age, gender, locations, contextual, customer lists), ad text, landing URL, video ID and thumbnail, Shopping product and merchant, local business name and address.
- **Monitor new ads:** turn on *Only new ads* and schedule the Actor. Each run returns (and charges) only ads that weren't returned before for the same search and filters.

### How to scrape Google Ads Transparency

1. Type one or more advertisers, websites, advertiser IDs or Transparency Center URLs into **What to search**.
2. Pick a **region** and any other filters.
3. Turn on **Full ad details** if you need reach, targeting, text or landing pages.
4. Click **Start**, then download the results as JSON, CSV, Excel or HTML, or get them through the API.

### Input

| Field | What it does |
|---|---|
| `queries` | Advertiser names, websites, advertiser IDs (`AR…`) or Transparency Center URLs (advertiser, creative or search links). The Actor detects the type. |
| `advertiserIds`, `domains`, `startUrls` | Optional explicit lists, if you prefer them over `queries`. |
| `maxAdvertisersPerQuery` | A name like "Coca-Cola" can match several advertiser accounts (one per country). The default is 1: the best match with ads in your region. |
| `region` | `anywhere` or a country. Results and dates reflect that region. |
| `format` / `platforms` | TEXT, IMAGE or VIDEO / SEARCH, YOUTUBE, SHOPPING, MAPS, PLAY. |
| `dateFrom` / `dateTo` | Only ads shown in this window. |
| `politicalAds` | Political ads only. With no search terms, the Actor browses all political ads in the region. |
| `maxAdsPerTarget` / `maxAdsTotal` | Limits per search term and per run. |
| `includeDetails` | Full ad details (an extra request per ad; charged as `ad-details`). |
| `onlyNewAds` / `monitorStoreName` | Monitoring mode. |

Example:

```json
{
  "queries": ["nike.com", "Coca-Cola"],
  "region": "US",
  "maxAdsPerTarget": 100,
  "includeDetails": false
}
```

### Output

One row per ad (`recordType: "ad"`), plus a free status row (`recordType: "status"`) for every search term that was invalid, not found, had no ads, or failed.

```json
{
  "recordType": "ad",
  "searchQuery": "adidas.com",
  "region": "US",
  "advertiserId": "AR14017378248766259201",
  "advertiserName": "Adidas America, Inc",
  "advertiserCountry": "US",
  "advertiserVerified": true,
  "creativeId": "CR10842856526020870145",
  "format": "TEXT",
  "firstShown": "2022-08-30T00:45:49.208Z",
  "lastShown": "2026-10-24T05:57:32.301Z",
  "shownForDays": 1493,
  "headline": "adidas Tracksuits",
  "description": "Free Shipping For Members On All Orders. Shop adidas Tracksuits Today.",
  "displayUrl": "adidas.com",
  "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/11431216072135427807",
  "adUrl": "https://adstransparency.google.com/advertiser/AR14017378248766259201/creative/CR10842856526020870145?region=US",
  "platforms": ["SEARCH"],
  "regionCount": 2,
  "regionsShown": [{ "region": "DE", "regionName": "Germany", "firstShownDate": "2023-03-01", "lastShownDate": "2026-09-05", "impressionsMin": 0, "impressionsMax": 1000 }],
  "audienceTargeting": { "demographics": "included", "geographicLocations": "included and excluded" },
  "detailsStatus": "ok"
}
```

**Always present:** advertiser name and ID, creative ID, format, first/last shown, shown for days, image or preview URL, the Transparency Center ad and advertiser links, and (with *Advertiser info*) the advertiser's country, legal name and verification.

**Political ads:** `spendMin`/`spendMax` + `spendCurrency`, `impressionsMin`/`impressionsMax`, `politicalRegions`, and with details `paidBy`.

**With full ad details:** `variations`, `regionsShown`, `regionCount`, `eeaReach`, `usReach`, `platforms`, `audienceTargeting`, `category`, `headline`, `description`, `displayUrl`, `callToAction`, `businessName`, `businessAddress`, `landingUrl`, `landingDomain`, `videoId`, `videoUrl`, `videoThumbnailUrl`, `productTitle`, `productImageUrl`, `merchantName`, `previewTexts`, `previewImageUrls`.

The dataset has ready-made views: **Overview**, **Details**, **Political ads** and **Statuses**.

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

Pay per event. You pay only for ads that are saved.

| Event | Free | Bronze | Silver | Gold and up |
|---|---|---|---|---|
| `ad`: one ad row saved to the dataset | $0.0015 | $0.001 | $0.0009 | $0.0008 |
| `ad-details`: one ad whose full-details lookup **succeeded** | $0.002 | $0.0015 | $0.0013 | $0.0012 |
| Actor start | $0.00005 | $0.00005 | $0.00005 | $0.00005 |

Example: 1,000 ads cost $1.50 on the Free plan; adding full details to all of them costs $2.00 more.

Status rows, duplicates, ads already seen in monitoring mode and failed detail lookups are free. The Actor respects your **Max cost per run**: it reserves budget before it starts each batch, so it stops cleanly at the limit and never saves work it can't charge for.

### Tips & limits

- **Text ads:** Google stores most Search ads as an archived image of the ad. The headline and description are filled when Google provides them as text (often with full details on); otherwise use `imageUrl`.
- **Date filter:** Google's own date filter only works for windows that overlap roughly the last 12 months. For older windows the Actor automatically scans the advertiser's ads and keeps those whose first/last shown dates overlap your window (slower, and it stops after 30 pages with no match).
- **Names vs. websites vs. IDs:** a website or advertiser ID is exact. A name uses Google's suggestions; the Actor picks the account with ads in your region and the closest name. Check `advertiserName` and raise `maxAdvertisersPerQuery` for brands with many country accounts.
- **Impressions and spend** are ranges, exactly as Google publishes them. Spend is only published for political ads.
- **Regions:** `region` controls which ads are listed and which dates you see. Ads that ran only outside the region won't appear.
- Google shows at most the ads it keeps in the Transparency Center. Very old or removed ads may be missing.

### Legal & disclaimer

This Actor reads the publicly available Google Ads Transparency Center, the same data any visitor can see without signing in. It is **not affiliated with, endorsed by or sponsored by Google**. "Google" and "Google Ads" are trademarks of Google LLC and are used only to describe the data source.

You are responsible for using the data lawfully and in line with Google's Terms of Service and the laws that apply to you (for example GDPR/CCPA for any personal data, such as names of individual political advertisers). Don't use it to harass anyone, re-identify individuals, or resell Google's data as your own. Ad creatives belong to their advertisers. If in doubt, ask a lawyer.

### FAQ

**Do I need a proxy?** No setup is needed. The Actor uses Apify's datacenter proxy and switches to residential automatically if Google starts blocking (keep *Fall back to residential* on).

**Can I get ads from all countries at once?** Yes. Set `region` to `anywhere`. Use full details to see each ad's per-country dates and impressions.

**How do I monitor a competitor?** Save a task with their website, turn on *Only new ads*, and schedule it daily or weekly. Each run returns only new ads.

# Actor input Schema

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

One per line. Each entry is auto-detected: an advertiser name (e.g. <code>Nike</code>), a website domain (<code>nike.com</code>), an advertiser ID (<code>AR16735076323512287233</code>), or any Ads Transparency Center URL (advertiser page, single ad, or a website search — filters in the URL such as region/format/platform are applied).

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

Advertiser IDs (start with AR…). Same as putting them in the list above.

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

Find every advertiser that runs ads pointing to these websites, e.g. <code>example.com</code>.

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

Paste adstransparency.google.com URLs (advertiser, ad or website search), or upload a file of them.

## `maxAdvertisersPerQuery` (type: `integer`):

For advertiser <b>names</b>: how many matching advertiser accounts to scrape (big brands often have several, e.g. one per country). Best match first.

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

Only ads shown in this country. Also sets the region in the Transparency Center links.

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

Only ads shown on these Google platforms. Empty = all.

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

Only ads of this format.

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

Only ads shown on or after this date (YYYY-MM-DD). Google's own date filter covers about the last 12 months; for older dates the Actor filters by each ad's first/last shown dates instead.

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

Only ads shown on or before this date. Defaults to today when only “Shown from” is set.

## `politicalAds` (type: `boolean`):

Search Google's <b>political ads</b> report instead (needs a Region, e.g. US, GB, IN, BR). Political ads include <b>spend and impression ranges</b>. With no advertiser/website given, returns all political ads in the region.

## `maxAdsPerTarget` (type: `integer`):

Stop after this many ads for each entry. 0 = all (up to 50,000).

## `maxAdsTotal` (type: `integer`):

Stop the whole run after this many ads. 0 = no limit (the run's max cost still applies).

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

For every ad also fetch: <b>all variations with their text</b>, <b>landing page URL</b>, <b>YouTube video ID</b>, product title/image (Shopping), <b>regions shown with first/last dates</b>, EU impressions per platform, audience targeting (age, gender, location, interests) and who paid. Charged as an extra <code>ad-details</code> event only when it succeeds.

## `includePreviewData` (type: `boolean`):

With full details on: also open the ad's rendered preview to get the landing page, YouTube video and Shopping product. Turn off for faster runs if you only need regions/reach/targeting.

## `detailConcurrency` (type: `integer`):

How many ads are enriched at the same time.

## `includeAdvertiserInfo` (type: `boolean`):

Adds the advertiser's country, legal name and verification status to every ad (one free lookup per advertiser).

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

Return only ads not seen in earlier runs with the same queries and filters. Use with a schedule to get alerts for new competitor ads. You pay only for new ads.

## `monitorStoreName` (type: `string`):

Named key-value store that remembers ads already seen. Use different names for separate monitors.

## `maxConcurrency` (type: `integer`):

How many advertisers/websites are scraped at the same time.

## `maxRetries` (type: `integer`):

Retries (on a new IP) when Google rate-limits or errors.

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

The default Apify datacenter proxy works well; the Actor switches to RESIDENTIAL automatically if Google starts blocking.

## `fallbackToResidential` (type: `boolean`):

Switch to Apify RESIDENTIAL proxy automatically if Google blocks the datacenter IPs.

## `debugLog` (type: `boolean`):

Verbose logging.

## Actor input object example

```json
{
  "queries": [
    "nike.com",
    "Coca-Cola"
  ],
  "maxAdvertisersPerQuery": 1,
  "region": "US",
  "format": "all",
  "politicalAds": false,
  "maxAdsPerTarget": 100,
  "maxAdsTotal": 0,
  "includeDetails": false,
  "includePreviewData": true,
  "detailConcurrency": 4,
  "includeAdvertiserInfo": true,
  "onlyNewAds": false,
  "monitorStoreName": "ads-transparency-monitor",
  "maxConcurrency": 3,
  "maxRetries": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "fallbackToResidential": true,
  "debugLog": false
}
```

# Actor output Schema

## `results` (type: `string`):

Ads with advertiser, format, text, dates, image and links.

## `details` (type: `string`):

Landing pages, videos, regions, reach and targeting (when full details are on).

## `runStats` (type: `string`):

Counts per status, charged events, retries, proxy tier and per-target timings.

# 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",
        "Coca-Cola"
    ],
    "region": "US",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("griffie/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",
        "Coca-Cola",
    ],
    "region": "US",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("griffie/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.com",
    "Coca-Cola"
  ],
  "region": "US",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call griffie/google-ads-transparency-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,griffie/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/fpeqi5JbQyb26W4uj/builds/doIynFUgjD6wkHEB7/openapi.json
