# Google Ads Transparency Scraper · $1.50/1K · Ad Text & New Ads (`featherscrape/google-ads-transparency-scraper`) Actor

Get every Google ad of a competitor from the Ads Transparency Center: ad text, images, YouTube videos, countries, first and last shown dates, impressions and who paid. Search by domain, brand name or advertiser ID, filter by country, platform, format or date, and monitor new ads.

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

## Pricing

from $1.00 / 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

Get **every Google ad of any advertiser** from the [Google Ads Transparency Center](https://adstransparency.google.com): Search, YouTube, Display, Shopping, Maps and Play ads, with their **ad text**, images, **YouTube videos**, **countries where they ran**, first and last shown dates, **impressions** (EU and political ads) and **who paid for them**.

- 🔎 **Search by domain, brand name or advertiser ID**: `nike.com` returns the ads of every Nike entity worldwide; `Nike` finds the matching advertiser accounts for you
- 📝 **Ad text included**: headline, description and display URL of Search ads, even when Google only publishes them as a screenshot (read automatically)
- 🌍 **Countries, dates and impressions** for each ad, with impression ranges per country and per platform where Google discloses them
- 🎯 **Filters**: country, platform (Search, YouTube, Shopping, Maps, Play), format (text, image, video) and date range
- 🔔 **Monitoring mode**: schedule it daily and get only your competitors' **new ads**, paying only for them
- 🧾 Pay per ad returned, no subscription

### Use cases

- **Competitive intelligence**: see every ad your competitors run, in which countries, since when, and with which messages
- **Agencies and PPC teams**: build swipe files of winning ad copy by market, and pitch prospects with their competitors' ads
- **Brand protection**: spot advertisers bidding on your brand or using your domain
- **Market research**: track which brands advertise in a country or on YouTube, and how their messaging changes over time
- **Political and compliance research**: collect political and EU ads with their impression ranges

### Output

One item per ad, most recently shown first:

```json
{
    "advertiserId": "AR16735076323512287233",
    "advertiserName": "Nike, Inc.",
    "creativeId": "CR12383625087968870401",
    "format": "text",
    "domain": "nike.com",
    "firstShown": "2023-11-16T21:47:33Z",
    "lastShown": "2026-10-22T17:30:10Z",
    "headline": "Nike® Official Site - Shop Nike® Online",
    "description": "Get geared up & take on any activity in style. Available now at Nike®. Express your style with latest ACG tops & more at Nike®.",
    "displayUrl": "www.nike.com/shop/acg-tops",
    "textSource": "ocr",
    "imageUrl": "https://tpc.googlesyndication.com/archive/simgad/13631437083717739103",
    "paidBy": "Nike, Inc.",
    "countries": ["US"],
    "regions": [{"countryCode": "US", "country": "United States", "firstShown": null, "lastShown": "2026-10-22", "impressionsMin": null, "impressionsMax": null, "platforms": []}],
    "impressionsMin": null,
    "impressionsMax": null,
    "variations": 4,
    "youtubeUrl": null,
    "adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR12383625087968870401?region=US",
    "searchTerm": "nike.com"
}
```

| Field | Description |
|---|---|
| `format` | `text`, `image` or `video` |
| `headline`, `description`, `displayUrl`, `businessName` | Text of Search ads. `textSource` tells whether it was read from Google's data (`preview`) or from the ad screenshot (`ocr`) |
| `imageUrl`, `previewUrl` | Static image of the ad, or link to Google's rendered preview (dynamic and HTML5 ads) |
| `youtubeVideoId`, `youtubeUrl` | Video of YouTube ads |
| `countries`, `regions` | Countries where the ad ran, with first/last shown dates and impression ranges per country and platform when available |
| `impressionsMin`, `impressionsMax` | Total impression range, published by Google for ads shown in the EU and for political ads |
| `paidBy` | Name of the entity that paid for the ad, when Google discloses it |
| `locations` | Store addresses attached to the ad (location extensions) |

### How to use it

1. Enter one or more **domains**, **advertiser names** or **advertiser IDs** (one per line).
2. Optionally choose a **country**, **platform**, **format** and **date range**.
3. Set **Max ads per advertiser or domain** (large brands can have tens of thousands of ads).
4. Run, then export as JSON, CSV or Excel, or schedule the Actor with **Only new ads** turned on to monitor competitors.

#### Input example

```json
{
    "searchTerms": ["nike.com", "adidas.com"],
    "region": "US",
    "platform": "search",
    "maxAdsPerSearch": 200
}
```

### FAQ

**Domain or name: which one should I use?** A domain gives the most complete result: Google returns the ads of every advertiser account that sends traffic to it (brands often advertise through several legal entities and agencies). A name is matched to the closest advertiser accounts; the run log shows which ones were used.

**Why is the text of some ads missing?** Image and video ads have no text fields (use `imageUrl`, `previewUrl` or `youtubeUrl`). For Search ads, Google often publishes only a screenshot: the Actor reads it automatically (`textSource: "ocr"`), which is accurate for standard ads but may miss parts of unusual layouts. `ocrText` keeps the raw text read on the screenshot.

**Why are impressions empty for most ads?** Google publishes impression ranges only for ads shown in the European Union (Digital Services Act) and for political ads.

**Does it show ad spend or targeting?** No. Google doesn't publish spend, clicks or conversions for commercial ads.

**Is it legal?** The Actor only collects ads that Google publishes publicly in its Transparency Center. You are responsible for using the data in line with applicable laws and Google's terms.

### Support

Found a bug or need a field? Open an issue on the Issues tab or email **FeatherScrape@protonmail.com**. Issues are answered within 48 hours.

# Actor input Schema

## `searchTerms` (type: `array`):

One per line: a domain ("nike.com", returns every advertiser account running ads to it), an advertiser name ("Nike"), an advertiser ID ("AR16735076323512287233") or an Ads Transparency Center advertiser URL.

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

Two-letter country code where the ads were shown (US, GB, FR, DE…). Leave empty for all countries.

## `platform` (type: `string`):

Google product where the ads were shown.

## `format` (type: `string`):

Keep only ads of this format.

## `dateFrom` (type: `string`):

Optional: only ads shown on or after this date (YYYY-MM-DD).

## `dateTo` (type: `string`):

Optional: only ads shown on or before this date (YYYY-MM-DD).

## `maxAdsPerSearch` (type: `integer`):

Maximum number of ads to return for each line, most recently shown first. Large brands can have tens of thousands of ads.

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

For each ad: headline, description and display URL of text ads, YouTube video of video ads, countries where it ran with dates, impression ranges (EU and political ads), and who paid for it. Turn off for a faster list of ads with dates and preview links only. Same price either way.

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

Return only ads not returned by your previous runs with this option on, for each advertiser or domain. Schedule the Actor (e.g. daily) to get a feed of your competitors' new ads and pay only for them.

## `maxAdvertisersPerName` (type: `integer`):

When you enter a name, how many matching advertiser accounts to include (most active first). Brands often run ads from several legal entities; a domain covers them all.

## `maxResultsTotal` (type: `integer`):

Optional cap on the total number of ads across all lines, to control your spending.

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

Proxy used to reach Google. The default Apify Proxy works in most cases.

## Actor input object example

```json
{
  "searchTerms": [
    "nike.com"
  ],
  "region": "",
  "platform": "any",
  "format": "any",
  "maxAdsPerSearch": 100,
  "includeDetails": true,
  "onlyNewAds": false,
  "maxAdvertisersPerName": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `ads` (type: `string`):

Ads with advertiser, format, text, dates, countries, impressions and preview links.

# 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 = {
    "searchTerms": [
        "nike.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("featherscrape/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 = {
    "searchTerms": ["nike.com"],
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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