# Google Ads Transparency Scraper · Ad Text, Images, Regions (`thequietstack/google-ads-transparency`) Actor

Scrape the Google Ads Transparency Center by advertiser name, advertiser ID or domain: every ad with the ad text (headline, description), image or YouTube video, first/last shown, regions, paid by. Filter by country, format and date; only-new mode for competitor ad monitoring. No login.

- **URL**: https://apify.com/thequietstack/google-ads-transparency.md
- **Developed by:** [TheQuietStack](https://apify.com/thequietstack) (community)
- **Categories:** Marketing, SEO tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 32.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.19 / 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 · Ad Text, Images, Regions

**Scrape the Google Ads Transparency Center** for any advertiser: every Google ad (Search, Display, YouTube, Shopping) with the **ad text** (headline, display URL, description), the **image or YouTube video**, **first and last shown**, the **countries** where it ran and **who paid for it**. Search by advertiser name, advertiser ID (`AR…`) or domain. No login, no API key, no browser.

### What does Google Ads Transparency Scraper do?

Google publishes every ad of every verified advertiser in the [Ads Transparency Center](https://adstransparency.google.com/). This Actor reads that public library and gives you one flat row per ad:

- **The ad itself, not just metadata:** text ads come with their headline, display URL and description; image ads with the image; video ads with the YouTube link.
- **When and where:** first shown, last shown, number of days shown, and the list of countries with the last day the ad ran there.
- **Who:** advertiser name and ID, the domain, and the *paid by* entity (often the agency or the local subsidiary).
- **Monitoring:** switch on *Only new ads* and run it daily — you get only ads that were first shown since the previous run.

### Who is it for?

- **Marketers and PPC managers** watching competitors' ad copy, offers and landing domains.
- **Agencies** building ad-research reports or swipe files.
- **Brand protection** teams looking for advertisers bidding on their brand.
- **Researchers** studying advertising in a country or industry.

### Which input should I use?

| You have | Put into *Advertisers* | Notes |
|---|---|---|
| A website | `nike.com` | All advertisers whose ads lead to this domain (agencies and resellers included). |
| An advertiser name | `Nike, Inc.` | Matched exactly (case and punctuation ignored). The search is a prefix search: if nothing matches, the run summary lists the real advertiser names to pick from. |
| An advertiser ID or Transparency URL | `AR16735076323512287233` | The most precise option. |

### Input example

```json
{
    "advertisers": ["nike.com", "Spotify USA Inc", "AR16735076323512287233"],
    "region": "US",
    "formats": ["TEXT", "VIDEO"],
    "lastDays": 30,
    "maxAdsPerAdvertiser": 50,
    "includeAdText": true,
    "includeDetails": true
}
```

`region` is a 2-letter country code (`US`, `DE`, `GB`, …) or `anywhere`. `formats`: `TEXT`, `IMAGE`, `VIDEO` (empty = all).

### Output example

Real rows (30 Oct 2026):

```json
{
    "advertiserId": "AR16735076323512287233",
    "advertiserName": "Nike, Inc.",
    "domain": "nike.com",
    "creativeId": "CR13820127804068462593",
    "format": "IMAGE",
    "adText": "Nike Men's Air Max Torch 4 Shoes in Black, Size: 11 | 343846-002 | Nike",
    "adTexts": ["Nike Men's Air Max Torch 4 Shoes in Black, Size: 11 | 343846-002", "Nike"],
    "imageUrl": null,
    "videoUrl": null,
    "firstShown": "2024-09-20T17:04:17.000Z",
    "lastShown": "2026-10-30T10:44:37.000Z",
    "daysShown": 686,
    "regionsShown": "US",
    "regions": [{ "region": "US", "lastShown": "2026-10-30" }],
    "paidBy": "Nike, Inc.",
    "adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR13820127804068462593?region=US",
    "region": "US",
    "input": "nike.com",
    "scrapedAt": "2026-10-30T11:26:14.350Z"
}
```

```json
{
    "advertiserName": "Spotify USA Inc",
    "format": "VIDEO",
    "videoUrl": "https://www.youtube.com/watch?v=LVfi_daCWiA",
    "adText": "Spotify | Her Ana ve Her Ruh Haline Uygun Müziklerin | Tadını Çıkar. Spotify®'da Ücretsiz Dinle | Yükle | Spotify: Müzik ve | Podcast'ler",
    "firstShown": "2025-05-14T23:03:43.000Z",
    "lastShown": "2026-10-30T10:48:03.000Z",
    "regionsShown": "TR",
    "paidBy": "Spotify USA Inc"
}
```

| Field | Meaning |
|---|---|
| `format` | `TEXT`, `IMAGE` or `VIDEO`, as the Transparency Center classifies the ad |
| `adText` / `adTexts` | Visible text of the ad preview (headline, display URL, description, call to action), in order |
| `imageUrl` | Image of image ads, and of text ads that Google archives as a picture |
| `videoUrl` | YouTube video of video ads |
| `firstShown`, `lastShown`, `daysShown` | As published by Google (UTC) |
| `regions`, `regionsShown` | Countries where the ad ran, with the last day per country |
| `paidBy` | The entity that paid for the ad |
| `adUrl` | The ad's page in the Transparency Center |

The `SUMMARY` record in the key-value store lists per advertiser how many ads the library holds (Google gives a range, e.g. 8,000–9,000), how many were scanned, written, filtered and already delivered, plus `notFound` with name suggestions.

### How much does it cost?

Pay per event: **$0.0017 per ad row** on the Free plan (lower on paid Apify plans), plus a tiny start fee. **100 ads = $0.17, 1,000 ads = $1.70.**
Never charged: the free status row of an empty run, filtered ads, ads already delivered in only-new mode, advertisers that are not found. `maxAds` and `maxAdsPerAdvertiser` cap every run.

### Monitoring competitors

1. Put the competitors' domains or advertiser IDs into *Advertisers*, set *Country*.
2. Switch on **Only new ads** (and use your own *Memory name* per watch list).
3. Schedule the Actor daily. The first run returns the current ads as a baseline; later runs return only ads first shown since the previous run. A run without new ads returns one free status row.

### Honest limits

- **Some text ads have no text.** Google archives many search ads as a picture of the ad; for those you get `imageUrl`, and `adText` stays empty. We do not run OCR on them.
- Video and display previews can contain short UI words ("Install", "Learn more"); they are part of the ad as rendered.
- Google publishes ranges, not exact numbers, for library size, and no impressions or spend for commercial ads (only for political ads in some regions).
- Google rate-limits fast access per IP. The Actor waits between requests. If Google limits a run, the Actor waits once and then stops: rows so far are kept, and a run without any row ends as FAILED with nothing charged. It does not switch IPs. Many runs in a row raise the chance of this, so leave some minutes between runs.
- `lastShown` is when Google last saw the ad, which can lag a day or two behind reality.

### Is it legal?

The Ads Transparency Center is a public library Google runs for every verified advertiser (it is also Google's ad repository under the EU Digital Services Act). It has no robots.txt that restricts access, and the data describes advertisers and their ads, not private persons. You are responsible for how you use the data and the ad creatives (copyright stays with the advertiser).

### Feedback

Missing a field or found a bug? Open an issue on the Actor's **Issues** tab. If the Actor saved you time, a short review on the Store page helps others find it.

# Actor input Schema

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

Advertiser names (e.g. "Nike, Inc."), advertiser IDs (AR...), domains (e.g. nike.com) or Ads Transparency Center URLs. A name is matched exactly (case and punctuation ignored); the advertiser with the most ads wins unless 'All name matches' is on.

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

2-letter country code where the ads were shown (US, DE, GB, FR ...) or "anywhere".

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

Empty = all formats.

## `lastDays` (type: `integer`):

Keep only ads whose last-shown date is within the last N days.

## `shownSince` (type: `string`):

Keep only ads last shown on or after this date.

## `maxAdsPerAdvertiser` (type: `integer`):

Hard cap per advertiser/domain.

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

Hard cap for the whole run (and therefore the bill).

## `maxScanPerAdvertiser` (type: `integer`):

How deep to look into the library per advertiser when filters or only-new skip ads. The library is sorted by last shown, so new ads are near the top. Scanning is free; only delivered ads are charged.

## `includeAdText` (type: `boolean`):

Read headline, display URL and description from the ad preview (text ads) and the YouTube video of video ads. One extra request per ad.

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

Countries where each ad was shown (with last-shown day) and the 'paid by' entity. One extra request per ad.

## `allNameMatches` (type: `boolean`):

For a name: take every advertiser with exactly this name (several legal entities), not only the biggest.

## `onlyNew` (type: `boolean`):

Remember delivered ads and return only ads that were not delivered before. Run it on a schedule to watch competitors.

## `stateStoreName` (type: `string`):

Named key-value store for the only-new memory. Use different names for different watch lists.

## `resetMemory` (type: `boolean`):

Forget earlier runs once (deliver everything again).

## `delayMs` (type: `integer`):

Pause between requests in milliseconds. Raise it if you see rate-limit errors.

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

No longer used. Kept so that saved inputs stay valid.

## Actor input object example

```json
{
  "advertisers": [
    "nike.com"
  ],
  "region": "US",
  "maxAdsPerAdvertiser": 20,
  "maxAds": 1000,
  "maxScanPerAdvertiser": 400,
  "includeAdText": true,
  "includeDetails": true,
  "allNameMatches": false,
  "onlyNew": false,
  "stateStoreName": "google-ads-transparency-state",
  "resetMemory": false,
  "delayMs": 500
}
```

# Actor output Schema

## `ads` (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 = {
    "advertisers": [
        "nike.com"
    ],
    "region": "US",
    "maxAdsPerAdvertiser": 20
};

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

# Run the Actor and wait for it to finish
run = client.actor("thequietstack/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": [
    "nike.com"
  ],
  "region": "US",
  "maxAdsPerAdvertiser": 20
}' |
apify call thequietstack/google-ads-transparency --silent --output-dataset

```

## MCP server setup

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