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

Ads from Google's Ads Transparency Center per advertiser domain or id, per country or anywhere: advertiser name, creative id, preview image or URL, first and last shown dates and a link to the ad. Up to 200 advertisers per run. Pay only for delivered ads.

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

## Pricing

from $0.77 / 1,000 ad listeds

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 per advertiser)

Every ad an advertiser runs on Google, from the Ads Transparency Center, for **up to 200
advertisers per run**: advertiser name and id, creative id, a preview image or preview
URL, the first and last date the ad was shown, and a link to the ad in the Center. Per
country or for ads shown anywhere. **You only pay for ads that are actually delivered.**

### Why this scraper

- **Competitor ads without the clicking.** The Center shows ads one page at a time; this
  actor pages through them for a whole list of advertisers and returns one flat table.
- **By domain or by advertiser id.** Paste `nike.com` or an `AR...` id. A domain can
  resolve to several advertiser accounts (regional entities, agencies); each row carries
  the exact advertiser name and id, so they stay apart.
- **Dates as data.** First shown and last shown come as dates, so "still running" and
  "how long has this been live" are a filter away.
- **Lightweight route.** About 0.5 KB per ad through the Center's own data endpoint, no
  browser: in testing on 13-09-2026, 40 ads came back in 21 KB.
- **Only delivered ads are charged.** An advertiser with no ads in the chosen region
  comes back as a clear error record at no cost.

### Who this is for

Marketing and competitive-intelligence teams tracking what competitors advertise and
since when. Agencies auditing a client's ad footprint per country. Researchers studying
advertising activity over time.

### Who this is not for

This actor lists ads and their previews; it does not return ad spend, impressions or
targeting. Google does not publish those in the Center. The ad format is passed through
as Google's numeric `formatCode` without a label, because Google does not document the
codes; `previewType` tells you whether there is a still image or a rich preview URL. Ad
text is not extracted from the preview.

### Input example

```json
{
    "advertisers": ["nike.com", "booking.com", "AR18378488041124659201"],
    "country": "NL",
    "maxAdsPerAdvertiser": 100
}
```

`country` empty means ads shown anywhere. Supported countries: the 70 largest
advertising markets; an unsupported code returns a free `INVALID_COUNTRY` record.

### Output example

```json
{
    "query": "nike.com",
    "rank": 1,
    "advertiserId": "AR18378488041124659201",
    "advertiserName": "Nike Retail BV",
    "domain": "nike.com",
    "creativeId": "CR15810869670027722753",
    "previewType": "image",
    "previewImageUrl": "https://tpc.googlesyndication.com/archive/simgad/8950235747126220397",
    "previewUrl": null,
    "previewWidth": 364,
    "previewHeight": 439,
    "formatCode": 1,
    "firstShown": "2026-07-20",
    "lastShown": "2026-09-13",
    "adUrl": "https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR15810869670027722753?region=NL",
    "region": "NL",
    "status": "ok"
}
```

An advertiser that yields nothing produces an error record instead, and is **not** charged:

```json
{
    "input": "example.org",
    "status": "error",
    "errorCode": "NO_ADS",
    "error": "No ads for example.org in region NL"
}
```

Error codes: `INVALID_ADVERTISER`, `INVALID_COUNTRY`, `NO_ADS`, `BLOCKED`. `INPUT_TRUNCATED` appears once when your input is longer than this actor accepts.

### Related actors from steadydata

- [website-tech-stack](https://apify.com/steadydata/website-tech-stack): what the advertiser's site runs on
- [google-local](https://apify.com/steadydata/google-local): how the advertiser ranks locally

### Pricing

Pay per event: one `ad-listed` event per delivered ad. No charge for advertisers that
fail or have no ads, no separate platform-usage surcharge. `maxAdsPerAdvertiser` is your
hard cost ceiling.

**Free Apify plan:** this actor delivers up to 25 rows per run for accounts on the Apify free
plan, and then stops with a message. That limit is set by us, not by Apify. It exists so the
actor keeps paying for itself for the people who do pay. Any paid Apify plan runs it at full
size, billed per delivered row, with failed rows never charged.

**Reviews:** if this actor saves you time, a short review on this page is the one thing that
helps most. Ratings are what other buyers look at first, and we have no other way to ask.

### FAQ

**In what order do the ads come?**
The Center's own order, which puts the most recently shown ads first. `rank` records it.

**Why does one domain give several advertiser names?**
Because several Google Ads accounts advertise that domain: country entities, resellers
or agencies. Filter on `advertiserName` or run the `AR...` id you want.

**Can I get the ad text or the video?**
Not from this actor. Image previews come as an image URL; rich and video ads come as a
preview URL you can open in a browser.

**Is personal data collected?**
No. Advertisers in the Center are companies and organisations; the data is what Google
publishes about their ads.

**What happens when Google changes something?**
The Center's data endpoint uses numbered fields that Google may renumber. The actor is
monitored daily and fixed fast, and while it is broken you are not charged, because only
delivered ads cost anything.

# Changelog

This Actor's version history is a separate document: https://apify.com/steadydata/google-ads-transparency/changelog.md

# Actor input Schema

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

Advertiser domains (nike.com) or Transparency Center advertiser ids (AR...), one per row, up to 200. An advertiser without ads in the region comes back as a free error record.

## `country` (type: `string`):

Two-letter country code to see the ads shown in that country (US, GB, NL, DE ...). Leave empty for ads shown anywhere.

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

Cost ceiling per advertiser, newest first as the Transparency Center orders them. One delivered ad is one charged event.

## Actor input object example

```json
{
  "advertisers": [
    "nike.com",
    "booking.com"
  ],
  "country": "",
  "maxAdsPerAdvertiser": 100
}
```

# Actor output Schema

## `results` (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",
        "booking.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadydata/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",
        "booking.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("steadydata/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",
    "booking.com"
  ]
}' |
apify call steadydata/google-ads-transparency --silent --output-dataset

```

## MCP server setup

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