# Google Ads Transparency Center Scraper (`ivanvs/google-ads-transparency-center-scraper`) Actor

Extract details about ads from Google Ads Transparency Centar. Scrape ad details like when it was run, ad targeting, advertiser and content of ad. Download ad data in JSON, XML, Excel format.

- **URL**: https://apify.com/ivanvs/google-ads-transparency-center-scraper.md
- **Developed by:** [Gen First](https://apify.com/ivanvs) (community)
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.30 / 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 Center Scraper

Google Ads Transparency Center Scraper downloads ads from the [Google Ads Transparency Center](https://adstransparency.google.com), Google's public ad library. You give it URLs from that site. It saves one dataset item per ad. Each item has the ad's advertiser, targeting, regions, impressions, and images or videos. No login or cookies are needed.

### What does Google Ads Transparency Center Scraper do?

Google Ads Transparency Center Scraper turns Transparency Center pages into structured data you can download or use through the API. It can scrape:

- **All ads of an advertiser**, for example every ad Booking.com ran in Serbia.
- **All ads shown for a domain**, for example every ad that links to `kurir.rs`.
- **A single ad**, using its creative URL.

For each ad, you get:

- **Ad creative**: the ad type (text, image, or video), image URLs with sizes, YouTube video URLs, and variations.
- **Advertiser**: the advertiser ID, name, legal name, country, and who paid for the ad.
- **Topic**: the ad category, for example "Travel and Tourism".
- **Targeting**: whether the advertiser targeted or excluded by demographics, locations, contextual signals, customer lists, and topics of interest.
- **Reach**: impression ranges per country and per platform (Google Search, YouTube, Google Play, Maps, Shopping), with first and last shown dates.
- **EEA data**: totals for the European Economic Area, where Google publishes them.

#### Use cases

- **Competitor research**: see which ads your competitors run, in which countries, and for how long.
- **Creative inspiration**: collect image, video, and text ads in your industry.
- **Brand protection**: find ads that use your domain or brand.
- **Market and academic research**: analyze advertising activity by country, platform, or topic.
- **Agency reporting**: track client and competitor ads over time.

### About Google Ads Transparency Center

Google Ads Transparency Center is a public library of ads that Google launched in 2023. It shows ads from verified advertisers across Google Search, YouTube, Google Display Network, Google Shopping, Google Maps, and Google Play. Anyone can search it by advertiser name or website domain and filter by country, date, platform, and ad format.

The site does not have an export or an official public API. Google Ads Transparency Center Scraper fills that gap. It reads the same data the website shows and saves it as JSON, CSV, Excel, or other formats.

### Which URLs the Actor accepts

| URL type                 | Example                                                                                                                  |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------ |
| One ad                   | https://adstransparency.google.com/advertiser/AR12734898815157403649/creative/CR07213446604978651137?region=BG           |
| All ads of an advertiser | https://adstransparency.google.com/advertiser/AR02934798844673654785?region=RS\&start-date=2020-05-31\&end-date=2024-06-19 |
| Ads by domain            | https://adstransparency.google.com/?region=BG\&domain=kurir.rs                                                            |

The URL must start with `https://adstransparency.google.com`. The Actor ignores other URLs.

### How to scrape Google Ads Transparency Center

1. Open the [Google Ads Transparency Center](https://adstransparency.google.com).
2. Search for an advertiser or a domain.
3. Set the filters you want.
4. Copy the address from the browser bar.
5. Paste it into `urls`.
6. Click **Start** and download the results when the run finishes.

### URL parameters the Actor reads

- `region`: a two-letter country code, for example `BG`. Use one region per URL. If the region is `anywhere` or missing, the Actor uses the United States.
- `start-date` and `end-date`: dates in `YYYY-MM-DD` format. The end date is included.
- `preset-date`: `today`, `yesterday`, `last 7 days`, or `last 30 days`. It overrides `start-date` and `end-date`.
- `platform`: `play`, `maps`, `search`, `shopping`, or `youtube`.
- `format`: `text`, `image`, or `video`.

### Input fields

#### urls (required)

A list of entries. Each entry is `{ "url": "..." }` or `{ "requestsFromUrl": "..." }`. Use `requestsFromUrl` to point to a text file with one URL per line.

#### maxRecords

The maximum number of items the Actor saves. It is an integer of at least 1. The default is 100.

### Input example

```json
{
  "urls": [
    {
      "url": "https://adstransparency.google.com/advertiser/AR02934798844673654785?region=RS"
    }
  ],
  "maxRecords": 10
}
```

### Output example

```json
{
  "inputUrl": "https://adstransparency.google.com/advertiser/AR02934798844673654785?region=RS",
  "url": "https://adstransparency.google.com/advertiser/AR02934798844673654785/creative/CR14615499723734253569?region=anywhere",
  "advertiserId": "AR02934798844673654785",
  "creativeId": "CR14615499723734253569",
  "type": "TEXT",
  "lastShown": "2026-11-04T16:01:30.000Z",
  "topic": "Travel and Tourism",
  "targeting": {
    "demographics": { "including": true, "excluding": false },
    "locations": { "including": true, "excluding": false },
    "contextualSignals": { "including": true, "excluding": true },
    "customerLists": { "including": true, "excluding": false },
    "topicsOfInterest": { "including": false, "excluding": false }
  },
  "stats": {
    "byRegion": [
      {
        "name": "Bulgaria",
        "shortCode": "BG",
        "firstShown": "2023-03-01",
        "lastShown": "2026-11-03",
        "impression": { "min": 2000, "max": 3000 },
        "byPlatform": [{ "name": "Google Search", "impression": { "min": 2000, "max": 3000 } }]
      }
    ],
    "byPlatform": [{ "name": "Google Search", "impression": { "min": 100000, "max": 125000 } }],
    "eea": {
      "firstShown": "2023-03-01",
      "lastShown": "2026-11-04",
      "impression": { "min": 125000, "max": 150000 },
      "byPlatform": [{ "name": "Google Search", "impression": { "min": 100000, "max": 125000 } }]
    }
  },
  "advertiser": {
    "id": "AR02934798844673654785",
    "name": "Booking.com",
    "regionCode": "NL",
    "legalName": "Booking.com B.V."
  },
  "paidBy": "Booking.com B.V.",
  "variants": ["https://tpc.googlesyndication.com/archive/simgad/9340398137048680215"],
  "content": [
    {
      "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/9340398137048680215",
      "width": 348,
      "height": 236,
      "isVariation": true
    }
  ]
}
```

### Output fields explained

- Each `targeting` group says only whether the advertiser used that targeting (`including`) or excluded with it (`excluding`). It does not give the targeted values.
- `impression` is a range. `max` is `null` when the range has no upper bound. The site shows this as "Over" and the lower number.
- `stats.byRegion` lists the countries Google reports for the ad. It can include countries other than the region in the input URL.
- `stats.eea` holds totals for the European Economic Area. It is `null` when the ad has no EEA data. `stats.byPlatform` has the same EEA platform data.
- In video ads, `content` has `videoUrl`, which is the YouTube URL. `imageUrl` is the video thumbnail.

### Items with no ads

When a search finds no ads, the Actor saves this item:

```json
{ "inputUrl": "...", "title": "No ads found", "type": "NO_ADS" }
```

When no input URL is valid, the Actor saves this item and the run stops:

```json
{ "title": "No valid links found", "type": "NO_VALID_LINKS" }
```

### FAQ

#### Do I need a Google account, cookies, or a proxy?

No. The Actor does not log in and uses Apify Proxy automatically. You do not need to set anything.

#### Does the output include ad spend?

No. Google Ads Transparency Center does not publish spend for regular ads, so the Actor cannot return it. It returns impression ranges instead.

#### Why are impressions a range and not an exact number?

Google publishes impressions only as ranges, for example 2,000–3,000. The Actor returns the same range as `min` and `max`.

#### Can I scrape ads from several countries?

Yes. Add one URL per country, each with its own `region`. Each ad also includes `stats.byRegion`, which lists the countries Google reports for that ad.

#### Will the same ad appear more than once?

The Actor saves each ad once per region in a run, even if several input URLs find it.

#### How many ads can I scrape?

As many as the search returns. Use `maxRecords` to set a limit.

#### How do I download the data?

The Actor stores items in a dataset. You can download them as JSON, CSV, Excel, XML, RSS, or an HTML table.

#### Can I use Google Ads Transparency Center Scraper through an API or with other tools?

Yes. You can start runs and read results with the [Apify API](https://docs.apify.com/api/v2). You can also connect the Actor to Make, Zapier, Google Sheets, Slack, webhooks, and other [integrations](https://docs.apify.com/platform/integrations).

### Is it legal to scrape Google Ads Transparency Center?

Google Ads Transparency Center is a public website. Google built it so anyone can see who runs ads on Google. The Actor collects only data that the site shows to every visitor without logging in.

Ads data is mostly about businesses, but some advertisers are individuals, and their names can count as personal data under laws like the GDPR. You are responsible for how you use and store the data. If you are not sure whether your use is legal, ask a lawyer. To learn more, read Apify's article [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

### Support

Need a custom output format or found a bug? Email support (at) getmediumdata.com or open an issue on the Actor's **Issues** tab.

# Changelog

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

# Actor input Schema

## `maxRecords` (type: `integer`):

Maximum number of records to be scraped

## `urls` (type: `array`):

List of URLs from Google Ads Transparency Center (https://adstransparency.google.com) that needs to be scraped

## Actor input object example

```json
{
  "maxRecords": 10,
  "urls": [
    {
      "url": "https://adstransparency.google.com/?region=anywhere&domain=kurir.rs"
    }
  ]
}
```

# 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 = {
    "maxRecords": 10,
    "urls": [
        {
            "url": "https://adstransparency.google.com/?region=anywhere&domain=kurir.rs"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ivanvs/google-ads-transparency-center-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 = {
    "maxRecords": 10,
    "urls": [{ "url": "https://adstransparency.google.com/?region=anywhere&domain=kurir.rs" }],
}

# Run the Actor and wait for it to finish
run = client.actor("ivanvs/google-ads-transparency-center-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 '{
  "maxRecords": 10,
  "urls": [
    {
      "url": "https://adstransparency.google.com/?region=anywhere&domain=kurir.rs"
    }
  ]
}' |
apify call ivanvs/google-ads-transparency-center-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ivanvs/google-ads-transparency-center-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/tXGoejOlNqgLp4eXr/builds/feo9xtDQxLK1REgxX/openapi.json
