# Google Ads Transparency Scraper: by website, with ad text (`reachlens/google-ads-transparency-scraper`) Actor

Type a website and get its Google ads (Search, YouTube, Display) from the Ads Transparency Center: dates, countries, EU impressions, the words inside image ads, and one honest row per company. Agency ads for other sites left out.

- **URL**: https://apify.com/reachlens/google-ads-transparency-scraper.md
- **Developed by:** [Reachlens Tomi](https://apify.com/reachlens) (community)
- **Categories:** Marketing, 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 ads

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: by website, with ad text

![Type a website, see its Google ads, words and all](https://api.apify.com/v2/key-value-stores/BP3X8AWW1qET6sR0h/records/google-hero-v1?signature=v5yUW1SSpujKFSN62ZsB)

**Type a website. Get the Google ads it's running: Search, YouTube and Display.** Includes the words inside image ads.

Only that website's own ads: when an agency's account also runs ads for its other clients, those stay out.

👀 **See it on real brands first:** the free [European Ad Watch](https://api.apify.com/v2/key-value-stores/U4yOehVsIM3TPcJxA/records/index?signature=1I5OAEbynn6hyQYUgIK1A) shows what 29 European brands are advertising this week, made with this tool and updated every Monday.

### What you get

**For every ad**

- 📝 **The words, even when Google shows only a picture** (optional): Google publishes most search ads as images. This reads the headline, description and address from the image.
- 📅 **When it ran**: first and last shown dates and days running, plus whether it's running now
- 🌍 **Where it ran** (included): the countries, and in the EU and UK how many times it was shown
- 📺 **Where it appeared**: Google Search, YouTube, Display, Shopping, Maps
- 🖼️ **The creative**: image, every variation's picture, and the YouTube video

**For every company, one summary row**

- ✅ **Advertising or not**, never a silent "no": a lookup Google refused says so, and costs nothing
- 🏢 **Who pays for the ads**: the company's own account, or an agency's ("Dentsu Norge AS" for elixia.fi)
- 📊 Ads running now, shown in the last 30 days, new this month, formats, top countries
- 🔄 What's new and what stopped since your last run, if you run it on a schedule

### How to use it

1. Add **websites** (or advertiser IDs, Transparency Center links or advertiser names), one per line.
2. Choose **Every ad**, or **One row per company** to check a list of companies cheaply.
3. Click **Start**. Download as Excel, CSV or JSON, or send it to Google Sheets, Clay, Make, n8n, Zapier or your AI agent.

**Tip:** for monitoring, schedule it weekly with **Only return ads new since my last run**, so you only get (and pay for) what's new.

### Pricing

You pay only for results:

| What | Price |
|---|---|
| Each company that is advertising | $0.01 |
| Each ad (countries, dates and EU impressions included) | $0.0015 ($1.50 per 1,000 ads) |
| Words read from an ad's image (optional) | $0.001 |
| Saved copy of an ad's image (optional) | $0.001 |

- Companies with no ads, and lookups Google refused, cost nothing.
- No start fee, and a run never goes over the spending limit you set.

**Examples:** 10 competitors with 50 ads each costs **$0.85**. Checking whether 1,000 companies run Google ads costs **at most $10**.

### Example: one ad

```json
{
  "advertiserName": "Hubspot, Inc.",
  "format": "text",
  "headline": "HubSpot Customer Platform - One Platform. Real Results",
  "description": "No more data gaps. One platform, one trusted view of every customer. Get a demo today.",
  "textFrom": "picture",
  "displayUrl": "www.hubspot.com/",
  "firstShown": "2026-05-12",
  "lastShown": "2026-10-09",
  "daysRunning": 151,
  "isActive": true,
  "platforms": ["Google Search"],
  "countries": ["Ireland", "United Kingdom"],
  "impressions": "3K–4K",
  "regions": [{ "country": "Ireland", "firstShown": "2026-05-11", "lastShown": "2026-10-09", "impressionsLow": 3000, "impressionsHigh": 4000 }],
  "adLibraryUrl": "https://adstransparency.google.com/advertiser/AR10072600183532683265/creative/CR17810107127327358977"
}
```

### Example: one company

```json
{
  "input": "elixia.fi",
  "status": "advertising",
  "advertisers": [{ "advertiserId": "AR15952352687396225025", "name": "Dentsu Norge AS", "ads": 30, "namedAfterBrand": false }],
  "adsFound": 30,
  "activeAds": 30,
  "formats": { "text": 29, "video": 1 },
  "platforms": { "Google Search": 29, "Google Maps": 29, "YouTube": 16 },
  "topCountries": [{ "country": "Finland", "ads": 30 }, { "country": "Sweden", "ads": 6 }],
  "longestRunningDays": 857,
  "adsWithText": 27
}
```

`namedAfterBrand: false` means someone else pays: an agency, a parent company or a reseller. In **Every ad** mode, these company rows are saved in the run's storage under `OVERVIEW`.

### Good to know

- **No click URL.** Google doesn't publish where an ad links to. You get the address the ad shows (`displayUrl`) and the website it's for.
- **Impressions only for the EU and UK**, as ranges. That's all Google publishes. Elsewhere you get countries and dates.
- **Words read from images are marked** `textFrom: "picture"`. They are usually exact; small text in busy images can come out imperfect.
- **Age-restricted ads** (alcohol, gambling) appear only to signed-in users, so they can be missing here as they are on Google's site.
- **Up to 400 ads per company, in the order Google lists them** (not by date). The summary says when there were more.

### For AI agents and automations

- **Clay, n8n, Make, Zapier:** one run per company with the website as input. **One row per company** gives a clear yes/no, and companies with no ads cost nothing.
- **AI agents** (Claude, ChatGPT, Cursor) can run it through Apify's MCP server; start with one row per company.
- It keeps small stores in your account so later runs can say what changed (`reachlens-google-lookups`, `-history`, `-images`). Delete them to start fresh.

Also by Reachlens: [Facebook & Meta Ad Library Scraper](https://apify.com/reachlens/meta-ad-library-scraper).

# Actor input Schema

## `searches` (type: `array`):

One per line. A website (hubspot.com) gives only that website's ads, even when an agency's account also runs ads for other clients. You can also give an advertiser ID (AR…), a Transparency Center link, or an advertiser name.

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

Ads to read for each input, in the order Google lists them (not by date), up to 400. When empty: 100 (40 in one-row-per-company mode).

## `onlyRecentAds` (type: `boolean`):

Google also lists ads that stopped long ago. Leave on to get what the company runs now.

## `output` (type: `string`):

Every ad, or one row per company: is it advertising, how many ads, under which advertiser accounts (its own or an agency's), formats, countries. Companies with no ads, or a lookup Google refused, get a row too, free.

## `details` (type: `boolean`):

Where each ad ran with first and last shown dates, times shown per EU and UK country, the Google surfaces it ran on and every variation's picture. Included in the ad price.

## `adText` (type: `boolean`):

Google publishes most search ads and image ads only as pictures. This reads their headline, description and display URL from the picture (OCR). Charged only for ads where words were read.

## `trackChanges` (type: `boolean`):

Remembers what each input showed last time (in your own storage), so a scheduled run flags new ads and counts stopped ones.

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

For scheduled monitoring: after the first run, only new ads come out, and only they are paid for.

## `saveImages` (type: `boolean`):

Saves each ad's picture in your Apify storage with a lasting link (savedImageUrl). Charged per picture saved; pictures saved before are reused for free.

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

Apify's datacenter proxies keep runs fast and cheap; when Google limits a read, the retry goes through residential proxies automatically, unless you pick proxy groups yourself.

## Actor input object example

```json
{
  "searches": [
    "gymshark.com"
  ],
  "maxAdsPerAdvertiser": 20,
  "onlyRecentAds": true,
  "output": "ads",
  "details": true,
  "adText": false,
  "trackChanges": true,
  "onlyNewAds": false,
  "saveImages": false,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per ad (dates, countries, EU impressions, text, media), or one row per company in 'One row per company' mode.

## `overview` (type: `string`):

One row per website, advertiser or name searched: ads found, running now, advertiser accounts (own or agency), formats, countries, new and stopped since the last run, and notes on anything the run couldn't read.

# 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 = {
    "searches": [
        "gymshark.com"
    ],
    "maxAdsPerAdvertiser": 20,
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("reachlens/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 = {
    "searches": ["gymshark.com"],
    "maxAdsPerAdvertiser": 20,
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("reachlens/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 '{
  "searches": [
    "gymshark.com"
  ],
  "maxAdsPerAdvertiser": 20,
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call reachlens/google-ads-transparency-scraper --silent --output-dataset

```

## MCP server setup

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