# Google Ads Transparency Scraper – Bulk Advertiser & Ads Check (`perceptr0n/google-ads-transparency-scraper`) Actor

Check a list of companies against the Google Ads Transparency Center: is each one advertising, about how many ads, who runs them, when last shown, which formats and countries. Or export every ad of a competitor — with a monitoring mode that returns only new ads. No login, no proxy.

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

## Pricing

from $0.70 / 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 — Bulk Advertiser & Ads Check

Check **a whole list of companies** against the **Google Ads Transparency
Center** in one run: is each company advertising on Google, roughly how many
ads, who actually runs them, when they were last shown, which formats and in
which countries. Or export every ad of a competitor — with a **monitoring mode**
that returns only ads first shown since your last run.

No login, no API key, no proxy. Every company check costs one request and takes
well under a second.

### Two ways to use it

**Check companies** — paste domains or company names, get one row per company:

| Company | Advertising | Ads | Main advertiser | Other advertisers | Last shown |
|---|---|---|---|---|---|
| check24.de | ✅ | 400,000–500,000 | CHECK24 GmbH | 0 | today |
| otto.de | ✅ | 60,000–70,000 | Otto GmbH & Co. KGaA | 0 | today |
| aldi-sued.de | ✅ | 1,000–2,000 | ALDI SÜD Dienstleistungs-SE & Co. oHG | 2 (incl. Publicis Media) | today |
| hornbach.de | ✅ | 2,000–3,000 | HORNBACH Baumarkt AG | 2 | today |
| frischpack.de | ❌ | 0 | – | – | – |

*Measured 5 October 2026.*

**Export ads** — every ad of a domain, company or advertiser ID, newest first:
advertiser, format (text / image / video), first and last time shown, preview
image and a direct link to the ad in the Transparency Center. Optionally the
countries each ad ran in, with first and last day per country.

### Why this one

- **Company lists, not one advertiser at a time.** Most Transparency scrapers
  take one advertiser and return its ads. This actor takes 10 or 10,000
  companies and answers the question sales and agency teams actually ask:
  *who here is spending money on Google Ads right now?*
- **It tells you who really runs the ads.** A domain search also finds agencies
  and resellers that link to the domain. On aldi-sued.de the media agency
  Publicis runs more ads than ALDI itself; on mediamarkt.de a US agency and two
  marketplace sellers show up. Every row lists all advertisers with their share,
  picks the company's own advertiser as the main one and says whether that name
  matches the domain (`mainAdvertiserMatchesDomain`).
- **One company, many advertiser IDs, one row.** Lidl advertises under two IDs
  with the same legal name — they are merged (87 of 100 recent ads).
- **Ad counts per country.** `region_breakdown: ["DE", "AT", "CH"]` adds the
  number of ads per country — mediamarkt.de: Germany 10,000–20,000, Austria
  400–500, Switzerland 32.
- **Monitoring that means what it says.** With `only_new_ads` a scheduled run
  returns only ads **first shown since the previous run** — not merely ads it
  happened not to deliver before.
- **It never dies at its timeout.** When time runs short, the run stops cleanly,
  keeps every record it finished and says so.

### Use cases

- **Lead qualification for agencies and SaaS** — which prospects already pay for
  Google Ads, and which don't advertise at all
- **Competitor monitoring** — a daily feed of every new ad a competitor launches
- **Market mapping** — how actively a whole sector advertises, country by country
- **Brand protection** — who else runs ads that link to your domain
- **Sales intelligence** — combine with company data from imprints (see below)
- **AI agents** — clean, flat records, callable via MCP

### Input examples

Check a list of companies, with ad counts for the DACH countries:

```json
{
    "mode": "companies",
    "domains": ["check24.de", "otto.de", "hornbach.de", "frischpack.de"],
    "region_breakdown": ["DE", "AT", "CH"]
}
```

Check by company name (every word must appear in Google's verified advertiser name):

```json
{ "mode": "companies", "company_names": ["Zalando", "HORNBACH"] }
```

Export a competitor's newest 500 ads shown in Germany, with countries per ad:

```json
{ "mode": "ads", "domains": ["lidl.de"], "region": "DE", "max_ads": 500, "include_details": true }
```

Daily monitoring — schedule this and get only new ads:

```json
{ "mode": "ads", "domains": ["competitor.com"], "only_new_ads": true, "max_ads": 200 }
```

### Output

A company check (shortened):

```json
{
    "recordType": "company",
    "input": "aldi-sued.de",
    "domain": "aldi-sued.de",
    "isAdvertising": true,
    "adCountMin": 1000,
    "adCountMax": 2000,
    "adCount": "1,000–2,000",
    "mainAdvertiser": "ALDI SÜD Dienstleistungs-SE & Co. oHG",
    "mainAdvertiserId": "AR17200848072016396289",
    "mainAdvertiserMatchesDomain": true,
    "advertisers": [
        { "name": "Publicis Media GmbH", "advertiserIds": ["AR07559607517198680065"], "adsInSample": 54 },
        { "name": "ALDI SÜD Dienstleistungs-SE & Co. oHG", "advertiserIds": ["AR17200848072016396289", "AR14903555861652701185"], "adsInSample": 44 }
    ],
    "otherAdvertiserCount": 2,
    "lastShown": "2026-10-05T12:16:02Z",
    "activeLast30Days": true,
    "formatsInSample": { "text": 29, "image": 23, "video": 48 },
    "sampleSize": 100,
    "transparencyUrl": "https://adstransparency.google.com/?region=anywhere&domain=aldi-sued.de"
}
```

An exported ad:

```json
{
    "recordType": "ad",
    "query": "lidl.de",
    "advertiserName": "Lidl Dienstleistung GmbH & Co. KG",
    "advertiserId": "AR04975787833676529665",
    "creativeId": "CR07411571023981576193",
    "format": "text",
    "firstShown": "2023-04-27T13:28:15Z",
    "lastShown": "2026-10-05T12:36:38Z",
    "previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/17333875822616234804",
    "adUrl": "https://adstransparency.google.com/advertiser/AR04975787833676529665/creative/CR07411571023981576193?region=anywhere",
    "regions": [{ "country": "DE", "firstShown": "2023-04-27", "lastShown": "2026-10-05" }]
}
```

Two table views are built in: **Companies** and **Ads**.

### What does a run cost?

$0.01 per run start, then per result — and the price drops with your Apify plan:

| Your Apify plan | Company check | Ad | Countries per ad (option) |
|---|---|---|---|
| Free | $0.004 | $0.001 | +$0.001 |
| Starter | $0.0035 | $0.0009 | +$0.0009 |
| Scale | $0.003 | $0.0008 | +$0.0008 |
| Business & Enterprise | $0.0025 | $0.0007 | +$0.0007 |

Checking 1,000 companies costs **$4.01** on the Free plan; exporting 1,000 ads
**$1.01**. You pay only for records delivered — a company check that finds no
ads still counts as a check, because "not advertising" is the answer.

### Honest limits

- **Ad counts are ranges**, exactly as Google publishes them (e.g. 400,000–500,000).
  Small advertisers get exact numbers.
- **Formats, advertisers and dates in a company check come from the 100 most
  recently shown ads** (`sampleSize`). The total count covers all ads.
- **There is no list of "all advertisers in a country".** Google only searches
  by domain or advertiser, so you bring the company list — or build one with the
  [Imprint & Impressum Scraper](https://apify.com/perceptr0n/imprint-impressum-website-contact-scraper),
  which can find businesses by trade and city.
- **Text ads are archived by Google as images.** You get the preview image, not
  the headline as text.
- **Company names must match the verified legal name.** "Bäckerei Müller" finds
  nothing if the advertiser is registered as "Müller Backwaren GmbH" — use the
  domain for small businesses.
- **Google only** in this version. Meta and LinkedIn block automated access to
  their libraries; Microsoft's library is planned.

### Data source and legal

All data comes from the **Google Ads Transparency Center**
(adstransparency.google.com), where Google publishes every ad it serves and the
verified identity of the advertiser — in the EU as required by the Digital
Services Act (Art. 39). No login, no paywall and no access control is involved;
requests are paced well below what the service handles.

Advertisers are almost always companies. Where a verified advertiser is a
private person, only the name and country Google itself displays are returned.
Not affiliated with or endorsed by Google.

### FAQ

**Is there an official Google Ads Transparency API?**
No public one. This actor reads the same data the Transparency Center website
shows and returns it as structured records.

**How fast is it?**
About 2–3 company checks per second. 1,000 companies take roughly 7 minutes;
each country in `region_breakdown` adds one request per advertising company.

**Can I find out how much a company spends?**
Google publishes no spend figures. The number of ads and how recently they ran
are the best public proxy — and they separate active advertisers from inactive
ones very clearly.

**How does monitoring work?**
The first run with `only_new_ads` returns the current ads as a baseline and
remembers the date. Every later run with the same domain, name or advertiser ID
returns only ads first shown since then. The memory lives in a key-value store
called `google-ads-transparency-monitor` in your own Apify account.

**Do I need a proxy?**
No. Measured from Apify's data centres: 50 requests in 25 seconds, all
answered. A proxy option is there if that ever changes.

**Which countries can I filter by?**
Any country — the region filter and `region_breakdown` take two-letter codes
(`DE`, `AT`, `CH`, `FR`, `US`, …).

### Auf Deutsch: Wer schaltet Google-Werbung? Firmenlisten prüfen

Dieser Actor prüft **ganze Firmenlisten gegen das Google Ads Transparency
Center**: Wirbt die Firma bei Google, mit wie vielen Anzeigen ungefähr, wer
schaltet sie (die Firma selbst oder eine Agentur), wann zuletzt, in welchen
Formaten und in welchen Ländern. Alternativ exportiert er alle Anzeigen eines
Wettbewerbers — mit einem **Überwachungsmodus**, der nur Anzeigen liefert, die
seit dem letzten Lauf erstmals geschaltet wurden.

Typische Anwendungsfälle: Lead-Qualifizierung für Agenturen und Software-Anbieter
(wer gibt bereits Geld für Google Ads aus?), Wettbewerbsbeobachtung, Marktanalysen
nach Ländern, Markenschutz. Ohne Login, ohne API-Schlüssel, ohne Proxy. Die Daten
veröffentlicht Google nach dem Digital Services Act.

### Related actors

| Actor | What it does |
|---|---|
| [Imprint & Impressum Scraper](https://apify.com/perceptr0n/imprint-impressum-website-contact-scraper) | Company data from the Impressum of any DACH website — and finds businesses by trade and city |
| [Free Website Contact & Imprint Scraper](https://apify.com/perceptr0n/free-website-contact-imprint-scraper) | Free edition: up to 10 websites per run |
| [PDF & DOCX to Markdown Converter](https://apify.com/perceptr0n/pdf-to-markdown-converter) | PDF, Word, Excel and PowerPoint to Markdown for AI — tables as JSON, OCR for scans |
| [Arbeitsagentur Jobs Scraper](https://apify.com/perceptr0n/arbeitsagentur-jobs-scraper) | Jobs from the Bundesagentur für Arbeit Jobbörse via the official API |
| [kununu Scraper](https://apify.com/perceptr0n/kununu-employer-data-scraper) | Employer reviews, ratings, salaries and benefits for DACH companies |
| [TED Tenders API](https://apify.com/perceptr0n/eu-tenders-ted-scraper) | EU public tenders from TED — all 27 member states |
| [Marktstammdatenregister (MaStR) Scraper](https://apify.com/perceptr0n/german-energy-assets-mastr) | Solar, wind and battery storage plants in Germany |
| [EUDAMED Scraper](https://apify.com/perceptr0n/eudamed-medical-device-scraper) | EU medical devices, manufacturers and certificates |
| [Messe München Exhibitor List Scraper](https://apify.com/perceptr0n/messe-muenchen-exhibitor-list-scraper) | Exhibitor lists of bauma, IFAT, BAU and more |
| [Koelnmesse Exhibitor List Scraper](https://apify.com/perceptr0n/anuga-ism-koelnmesse-exhibitor-scraper) | Exhibitor lists of Anuga, ISM, imm cologne and more |
| [App Store & Google Play Scraper](https://apify.com/perceptr0n/appstore-google-play-intelligence) | Ratings, reviews and keyword rankings from both app stores |
| [DACH & EU Data Source Finder](https://apify.com/perceptr0n/dach-eu-data-source-finder) | Free: tells you which ready-made scraper covers your data source |

### Support

Bug reports are welcome in the **Issues** tab.

# Actor input Schema

## `mode` (type: `string`):

**Check companies**: one row per company — is it advertising on Google, roughly how many ads, who runs them, when last shown, which formats. **Export ads**: one row per ad with format, first and last shown date, preview image and link.

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

Domains or website addresses, e.g. `check24.de`, `https://www.otto.de`. The Transparency Center is searched for ads that point to this domain — including ads by resellers or agencies that link to it.

## `company_names` (type: `array`):

Verified advertiser names, e.g. `Zalando`, `HORNBACH`. Every word must appear in the advertiser's legal name as Google lists it. For small businesses the domain is usually more reliable.

## `advertiser_ids` (type: `array`):

Google advertiser IDs such as `AR15589870916631265281` — from a previous run or from the Transparency Center URL.

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

Only count and export ads shown in this country. 'Anywhere' covers all regions.

## `region_breakdown` (type: `array`):

Optional: two-letter country codes, e.g. `DE`, `AT`, `CH`. Each advertising company gets its ad count per country — one extra lookup per country, up to 10.

## `max_ads` (type: `integer`):

Stop after this many ads per domain, name or advertiser ID. Large advertisers run hundreds of thousands of ads; the newest come first.

## `include_details` (type: `boolean`):

Adds, for every ad, the countries it ran in with first and last day shown there. One extra lookup per ad, charged as 'ad details'.

## `only_new_ads` (type: `boolean`):

Remembers which ads were already delivered for the same domain, name or advertiser ID and returns only ads you have not seen before. Schedule the run daily or weekly to get a feed of new competitor ads. The memory is kept in a key-value store named `google-ads-transparency-monitor` in your account.

## `proxy` (type: `object`):

Not needed — the Transparency Center answers Apify's data centres directly (measured). Switch on Apify Proxy only if you see repeated errors.

## Actor input object example

```json
{
  "mode": "companies",
  "domains": [
    "check24.de",
    "zalando.de",
    "frischpack.de"
  ],
  "region": "anywhere",
  "max_ads": 40,
  "include_details": false,
  "only_new_ads": false,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "domains": [
        "check24.de",
        "zalando.de",
        "frischpack.de"
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("perceptr0n/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 = {
    "domains": [
        "check24.de",
        "zalando.de",
        "frischpack.de",
    ],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("perceptr0n/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 '{
  "domains": [
    "check24.de",
    "zalando.de",
    "frischpack.de"
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call perceptr0n/google-ads-transparency-scraper --silent --output-dataset

```

## MCP server setup

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