# Google Ads Transparency Center Scraper: Ad Copy & Video (`s_actors/google-ads-transparency-scraper`) Actor

Scrape the Google Ads Transparency Center by domain, advertiser or link: every ad with headline and description (OCR for search ads), image, YouTube video link, first and last shown, countries, EU impressions and targeting. Ad check mode. New-ads alerts. $0.99/1K.

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

## Pricing

from $0.79 / 1,000 ad (default mode)s

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 & API: Ad Copy, Videos, EU Reach

Export **every Google ad** of any advertiser or website from the **Google Ads Transparency Center** to Excel, CSV or JSON: Search, YouTube, Display, Shopping, Maps and Play ads, with the **ad copy**, image, **YouTube video link**, first and last shown dates and the countries each ad ran in. Type a domain (`nike.com`), a brand name (`Nike`), an advertiser ID or paste a Transparency Center link. What sets it apart:

- **The ad copy, not just a picture.** Google shows search text ads in the Transparency Center as images. This Actor reads them (OCR) and returns the **headline**, **description** and **display URL** as text; responsive, app and local ads come with headline, description, call to action and landing URL from the ad itself. Other scrapers return an image link and leave the reading to you.
- **Keyword insertion revealed.** Ads that use `{KeyWord:Nike Shoes}` show the default keywords in `keywordInsertion`: the search terms the advertiser builds its ads around.
- **YouTube video links.** Video ads come with `videoUrl` and a thumbnail, ready to watch or download.
- **Countries and EU reach included.** Every country an ad ran in with its first and last day; for ads shown in the EU, **impressions by country and platform** and the **targeting** used (demographics, location, contextual, customer lists), from Google's EU Digital Services Act data.
- **All in one price: $0.99 per 1,000 ads.** The best-known Transparency Center scraper charges $2 per 1,000 ads plus $3 per 1,000 for details; another $1.60 plus $4 per 1,000 video downloads.
- **Ad check mode (a second mode) for lead lists**: paste 500 companies or domains and get one row per company instead of ads: do they run Google ads, how many, still running, verified advertiser.
- **New ads alerts.** Schedule it with **Only new ads** and get only the ads a competitor launched since the last run.

```json
{ "searchTerms": ["nike.com"], "region": "anywhere", "maxAdsPerTarget": 100 }
```

#### What you get

**One row per ad.** Real examples, nike.com and hellofresh.com, October 2026:

| format | headline | description | display URL | shown | text from |
|---|---|---|---|---|---|
| TEXT | Nike® Official Site - Shop Nike® Online | Embrace past and future of signature Nike Air technology with a pair of Air Max shoes.… | www.nike.com/shop/air-max | 2024-03-27 → 2026-10-03 | ocr |
| TEXT | Nike® Training & Gym Shoes - Browse Women's Training Shoes | Meet your most demanding workouts head first with Nike® training shoes. Shoes with… | www.nike.com/shop/training-shoes | 2026-06-05 → 2026-10-03 | ocr |
| TEXT | Nike taschen | Entdecke Nike Zubehör online auf Nike.com – der offiziellen Nike Website. | nike.com | 2025-10-22 → 2026-10-03 | preview |
| IMAGE | Chaussure de foot montante à crampons multi-surfaces Nike… | Nike Officiel | nike.com | 2021-10-25 → 2026-10-03 | preview |
| VIDEO | America's #1 Meal Kit ([video](https://www.youtube.com/watch?v=tYabo_3_SVc)) | Enjoy easy homemade meals in under 30 minutes. Get $170 off plus free breakfast for life! | hellofresh.com | 2026-08-03 → 2026-08-14 | preview |

| Field | Description |
|---|---|
| `headline`, `description`, `displayUrl`, `callToAction`, `clickUrl` | The ad copy, the URL shown in the ad, its button and landing page (where Google shows it) |
| `adText`, `textSource` | All text read from the ad; `preview` = from the ad's own preview, `ocr` = read from the picture of a search text ad |
| `keywordInsertion` | Default keywords of `{KeyWord:...}` keyword insertion |
| `appName`, `appId` | App install ads: the app and its store ID |
| `format`, `imageUrl`, `width`, `height` | `TEXT`, `IMAGE` or `VIDEO`; the ad picture |
| `videoId`, `videoUrl`, `thumbnailUrl` | YouTube video of video ads |
| `firstShown`, `lastShown`, `shownDays`, `activeNow` | When the ad ran; `activeNow` = shown in the last two days |
| `countries`, `countriesCount`, `regionStats` | Every country the ad ran in, first and last day in each; in the EU also impressions by platform |
| `impressionsMin`, `impressionsMax`, `platformsShown`, `targeting` | EU ads: total impressions (Google's range), platforms (Search, YouTube, Maps, Shopping, Play) and targeting criteria used |
| `variationsCount`, `variations` | All versions of the ad (A/B variants, sizes) |
| `advertiserName`, `advertiserId`, `advertiserLegalName`, `advertiserCountry`, `advertiserVerified` | Who pays for the ad, where it is based, verified by Google or not |
| `domain`, `adUrl`, `advertiserUrl` | The advertised website; links to the ad and the advertiser in the Transparency Center |
| `creativeId`, `searchTerm`, `searchType`, `region`, `isNew`, `scrapedAt` | Google's ad ID, which input found it, new ads in alert runs |

**Ad check mode** has its own rows: see below.

Five table views: **Ads**, **Ad copy**, **Video ads**, **Countries and EU reach** and **Ad check**.

#### Ad check mode: does a company run Google ads?

A separate mode for **lead lists and market research**, not an add-on to ads. Set **What to get** to **Ad check** and paste company names or domains (hundreds at once): the Actor returns **one row per company** instead of its ads, and charges per company row only.

```json
{ "searchTerms": ["Nike", "hellofresh.com", "Unknown Corp"], "mode": "advertisers", "region": "US" }
```

Real rows, United States, October 2026:

| input | advertiser | country | verified | runs ads | ads (Google's range) | last ad shown | running now |
|---|---|---|---|---|---|---|---|
| Nike | Nike, Inc. | US | ✅ | ✅ | 7,000–8,000 | 2026-10-03 | ✅ |
| hellofresh.com | Grocery Delivery E-Services USA Inc. | US | ✅ | ✅ | 1,000–2,000 | 2026-10-03 | ✅ |
| hellofresh.com | HelloFresh SE | DE | ✅ | ✅ | 55 | 2026-10-03 | ✅ |
| Unknown Corp (example) | — | — | — | ❌ | 0 | — | ❌ |

| Who uses it | How |
|---|---|
| Agencies selling Google Ads, SEO or web services | Check a prospect list: `runsAds` ✅ + `activeNow` ✅ = already spends on ads (pitch better ads), ❌ = not advertising (pitch starting) |
| Sales teams and lead enrichment | Add "advertises on Google, ~1,000 ads" to CRM records; filter for active advertisers |
| Market research | Who in a niche advertises, how big each advertiser's ad library is, who stopped |

A name is matched to the advertiser account with the most ads (raise **Advertisers per name** for more); a domain returns every advertiser whose ads lead to it (the brand, its regional companies, resellers). A company with no ads still gets a row with `runsAds: false`, so every input line has an answer. Fields: `advertiserName`, `advertiserLegalName`, `advertiserCountry`, `advertiserVerified`, `runsAds`, `adsCountMin`, `adsCountMax`, `latestAdLastShown`, `activeNow`, `latestAdUrl`, `advertiserUrl`, `domain`, `searchTerm`, `region`.

#### How it works

| Step | What happens |
|---|---|
| 1. Input | A domain lists every advertiser whose ads lead there; a name is matched to the advertiser account with the most ads (Nike = "Nike, Inc."); IDs and links go straight to the advertiser or ad |
| 2. Filters | Region, format, platforms and dates are applied by Google, so you get (and pay for) only matching ads; the most recently shown come first |
| 3. Ad copy | The ad's own preview is read for headline, description, call to action, landing URL, app and YouTube video; search text ads, which Google shows as a picture, are read by OCR |
| 4. Details | Each ad's page in the Transparency Center: all countries with dates, variations, EU impressions and targeting |
| 5. Alerts | With **Only new ads** the Actor remembers every ad it returned: the next run returns and charges only new ones |

#### Why this Actor

| | This Actor | Typical Google Ads Transparency scraper |
|---|---|---|
| Price per 1,000 ads | **$0.99, everything included** | $1-$2, details $3 extra, video $4 extra |
| Search ad copy as text | ✅ Headline, description, display URL (OCR) | ❌ Image link only |
| Keyword insertion defaults | ✅ | ❌ |
| YouTube video link | ✅ | ⚠️ Some, paid add-on |
| Countries with first and last day | ✅ Included | ⚠️ Paid "details" |
| EU impressions and targeting | ✅ Included | ⚠️ One scraper, link input only |
| Domain, name, ID or link input | ✅ All, mixed in one list | ⚠️ Often one type |
| Ad check (who advertises, how many) | ✅ | ⚠️ Rare |
| Only new ads (alerts) | ✅ Seen ads free | ⚠️ Some |

#### Pricing

Pay per event, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Ad (default mode, all fields) | $0.00099 | $0.00089 | $0.00079 |
| Ad check mode: company row (instead of ads) | $0.00099 | $0.00089 | $0.00079 |

A run is charged either per ad or per company, never both: **Ad check** is a separate mode chosen in the input (one row per company, no ads collected). **1,000 ads = $0.99.** Free: ads already seen with **Only new ads**. Platform usage is included. Set a maximum cost per run in the run options: the Actor stops there.

#### Ready-made tasks

| Task | What it does |
|---|---|
| [See Your Competitors' Google Ads](https://apify.com/s_actors/google-ads-transparency-scraper/examples/see-competitors-google-ads) | Ad copy, videos and dates of the ads your competitors run now |

#### Competitor ad research in three steps

1. **Advertisers, domains or links** = your competitors' websites (`hellofresh.com`) or names.
2. Pick the **Region** you sell in and, if you like, **Only ads running now**.
3. Open the **Ad copy** view: every headline and description they test, how long each ran (`shownDays`: ads that run for months are the ones that work), and export to Excel or Google Sheets.

For a weekly report, schedule the same input with **Only new ads** on and connect Slack, email, Make, Zapier or **n8n**.

#### FAQ

**Which ads are in the Transparency Center?** Ads from verified Google advertisers shown on Search, YouTube, Display (Google partner sites), Shopping, Maps and Play, since 2018. Google adds platform data since September 2023.

**Why are impressions and targeting missing on some ads?** Google publishes them only for ads shown in the EU (Digital Services Act). For other countries you get the countries and dates.

**How accurate is the OCR of search ads?** Search text ads are clean computer-rendered text: headlines and descriptions read near word-perfect in English and other Latin-script languages (some accents can be off). Pictures in non-Latin scripts (Chinese, Thai...) are left without text rather than filled with garbage; `imageUrl` always has the picture.

**Why do I get ads from several advertisers for one domain?** A domain search lists every advertiser account whose ads lead to that website: the brand itself, its regional companies, resellers and agencies.

**How many ads can I get?** All Google lists: big brands have thousands (Nike ~9,000 in one account). Set **Max ads per advertiser / domain**.

**Do I need a Google account or API key?** No. The Actor reads the public Transparency Center pages anyone can open.

#### Use with the API and AI agents

Run it from the Apify API, the JavaScript or Python client, **n8n**, Make or Zapier, or from AI agents through the [Apify MCP server](https://mcp.apify.com) (Claude, ChatGPT, Cursor). One call: `POST https://api.apify.com/v2/acts/s_actors~google-ads-transparency-scraper/run-sync-get-dataset-items` with the input above returns the ads as JSON.

#### Other Google tools

| Actor | What it does |
|---|---|
| [Google Jobs Scraper](https://apify.com/s_actors/google-jobs-scraper) | Jobs from every board in Google Jobs with all apply links, salary per year, job alerts |
| [Google Search Results Scraper](https://apify.com/s_actors/google-search-scraper) | Real Google results with AI Overview, People also ask, rank tracker |
| [Google AI Overview Scraper & Tracker](https://apify.com/s_actors/google-ai-overview-scraper) | Full Google AI Overview answers with real source URLs; is your brand mentioned or cited |
| [Google Maps Scraper](https://apify.com/s_actors/google-maps-scraper) | Every Google Maps place with phone, website, rating, hours: $0.89 per 1,000 |
| [Google Maps Email Extractor](https://apify.com/s_actors/google-maps-email-extractor) | Business emails from Google Maps websites, pay only for leads with an email |
| [Google Shopping Price Tracker](https://apify.com/s_actors/google-shopping-price-tracker) | Google Shopping prices and sellers, price changes |
| [Google Hotels Scraper](https://apify.com/s_actors/google-hotels-scraper) | Hotel prices from every booking site |
| [Google Flights Scraper](https://apify.com/s_actors/google-flights-scraper) | Flight prices, cheapest dates, price alerts |
| [Google Play Scraper](https://apify.com/s_actors/google-play-scraper) | Apps, ratings, reviews, keyword rankings |
| [Bulk Image Downloader](https://apify.com/s_actors/bulk-image-downloader) | Google Images and image links to a ZIP file |

#### Is it legal?

The Actor reads the public Google Ads Transparency Center, which Google publishes so that anyone can see who advertises and what. Ads are the advertisers' public communication; use the data according to the laws that apply to you and Google's terms. This Actor is not affiliated with Google.

# Actor input Schema

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

One per line, mix freely: a domain ("nike.com", "hellofresh.com": every advertiser whose ads lead there), an advertiser name ("Nike": the matching advertiser account with the most ads), an advertiser ID (AR16735076323512287233) or a link copied from adstransparency.google.com (advertiser, single ad or domain search; its region / format / platform are used).

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

Ad check is a cheap pass over a list of companies or domains: does each run Google ads, how many (Google's range), last shown, verified advertiser, country. One request per advertiser.

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

Only ads shown in this country. Anywhere = all countries. Ads shown in the EU also come with impressions by country and platform and the targeting used (EU Digital Services Act data).

## `adFormat` (type: `string`):

Text = search ads (headline, description, display URL), Image = display banners, Video = YouTube ads (with the video link).

## `platforms` (type: `array`):

Only ads shown on these Google platforms. Empty = all. Google records platforms since 2023-09-04.

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

Only ads shown on or after this day: 2026-01-31 or relative: "30 days", "2 weeks", "6 months". Empty = all time (Google keeps ads since 2018).

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

Only ads shown on or before this day (same formats). Empty = today.

## `onlyActiveAds` (type: `boolean`):

Only ads shown in the last day or two (= "Shown since" yesterday). Every row has activeNow.

## `maxAdsPerTarget` (type: `integer`):

Ads per input line (per advertiser for a name). Google lists the most recently shown ads first. Big brands run thousands: Nike ~9 000.

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

A name such as "Nike" matches several advertiser accounts (Nike, Inc.; NIKE SRL; Nike Retail BV). 1 = only the one with the most ads. Domains always cover every advertiser.

## `extractAdText` (type: `boolean`):

Read the text of each ad: headline, description, display URL, call to action, landing URL where shown, keyword insertion ({KeyWord:...}). Search text ads are pictures on Google: read by OCR. Video ads get the YouTube link. Off = faster, no text.

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

Open each ad: every country it ran in (first and last day each), all variations, and for ads shown in the EU impressions by country and platform plus targeting (demographics, location, contextual, customer lists). One more request per ad.

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

Remember every ad returned and next time return only ads not seen before (each row isNew: true). First run = everything. Ads seen before are free.

## `monitorName` (type: `string`):

Separate memory for each list you track: "competitors-us", "brand-x". Same name = same list.

## `maxConcurrency` (type: `integer`):

Ads read at once (details, previews, OCR).

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

The Actor reads Google directly and switches to Apify Proxy (datacenter, then residential) when Google starts refusing.

## `debugLog` (type: `boolean`):

Log every retry.

## Actor input object example

```json
{
  "searchTerms": [
    "nike.com"
  ],
  "mode": "ads",
  "region": "anywhere",
  "adFormat": "all",
  "onlyActiveAds": false,
  "maxAdsPerTarget": 100,
  "maxAdvertisersPerName": 1,
  "extractAdText": true,
  "includeDetails": true,
  "onlyNewAds": false,
  "monitorName": "default",
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debugLog": false
}
```

# Actor output Schema

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

Preview, advertiser, ad copy and dates of each ad.

## `copy` (type: `string`):

Headline, description, display and landing URL, call to action, keyword insertion.

## `video` (type: `string`):

YouTube video link and thumbnail of video ads.

## `reach` (type: `string`):

Countries each ad ran in; EU impressions by country and platform, targeting.

## `advertisers` (type: `string`):

Ad check mode: does each advertiser run ads, how many, last shown.

## `all` (type: `string`):

Every field of every row.

# 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"
    ]
};

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

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

```

## MCP server setup

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