# Google Ads Transparency Scraper (Cheap) — Ads by Advertiser (`istmobot/google-ads-transparency-cheap`) Actor

Low-cost Google Ads Transparency Center scraper with the same input and output fields as the most popular Google Ads scraper: ads by advertiser name, domain, ID or URL, with region, date, format and platform filters, impressions per region, targeting and ad variations. $1.00 per 1,000 ads.

- **URL**: https://apify.com/istmobot/google-ads-transparency-cheap.md
- **Developed by:** [Istmobot](https://apify.com/istmobot) (community)
- **Categories:** Marketing, SEO tools, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 ad scrapeds

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 (Cheap): Ads by Advertiser or Domain

**A cheaper drop-in alternative to the most popular Google Ads scraper on Apify, with the same input and output fields.** Paste the input JSON you already use (`queries`, `domains`, `advertiserIds`, `startUrls`, `resultsLimit`, `region`, `startDate`, `endDate`, `adFormat`, `platforms`) and get ads with the same field names, types and formats (`advertiserId`, `advertiserName`, `creativeId`, `format`, `firstShown`, `lastShown`, `numServedDays`, `previewUrl`, `regionStats`, `targeting`, `variations`...). Your Google Sheets, Make, Zapier, n8n, Clay or code integrations keep working. You pay **$1.00 per 1,000 ads instead of $1.90**.

The data comes from Google's public ad library, the [Google Ads Transparency Center](https://adstransparency.google.com/).

### Price comparison

| | This Actor | Popular Google Ads scraper (free plan price) |
|---|---|---|
| 1,000 ads with details | **$1.00** | $1.90 |
| 10,000 ads | **$10** | $19 |
| 100,000 ads | **$100** | $190 |
| Region, date, format and platform filters | **free** | free |
| Actor start | $0.005 | $0.00005 |

The Apify free plan's $5 monthly credit covers about **4,800 ads**.

### What data do you get?

One record per ad:

- `adLibraryUrl`, `advertiserId`, `advertiserName`, `creativeId`
- `format`: `TEXT`, `IMAGE` or `VIDEO`
- `firstShown`, `lastShown` (ISO timestamps), `numServedDays`
- `previewUrl`: image of the ad (archived text/image ad, or product image for Shopping ads)
- `creativeRegions`: countries where the ad ran
- `regionStats`: per country, `firstShown`, `lastShown`, `impressions` (`lowerBound`/`upperBound`) and `surfaceServingStats` (impressions per Google Search, YouTube, Shopping, Maps, Play). Google publishes impressions only for EU/EEA countries.
- `targeting.targetingCategory`: whether the advertiser used `demographics`, `geography`, `contextual` and `advertiserList` (customer lists) targeting (`included`/`excluded`). EU/EEA only.
- `variations`: each version of the ad with `imageUrl`, or `headline` and `body` text, and `clickUrl` / `videoUrl` when the preview has them
- `startUrl`: the Transparency Center page the ad was found on

```json
{
    "adLibraryUrl": "https://adstransparency.google.com/advertiser/AR18378488041124659201/creative/CR08777538248093204481",
    "advertiserId": "AR18378488041124659201",
    "advertiserName": "Nike Retail BV",
    "creativeId": "CR08777538248093204481",
    "creativeRegions": ["Germany", "Spain"],
    "firstShown": "2021-10-25T07:00:00.000Z",
    "format": "IMAGE",
    "lastShown": "2026-10-31T06:20:41.168Z",
    "numServedDays": 1651,
    "previewUrl": "https://encrypted-tbn0.gstatic.com/shopping?q=tbn:ANd9GcS617UrNDle0BtfwtmBK2EA3sKbLplcIvDvz-HUkeJZ4Tfc-m0n",
    "regionStats": [
        {
            "regionCode": "ES",
            "regionName": "Spain",
            "firstShown": "2023-03-31",
            "lastShown": "2023-12-10",
            "impressions": { "lowerBound": 0, "upperBound": 1000 },
            "surfaceServingStats": [{ "surfaceCode": "SHOPPING", "surfaceName": "Google Shopping", "impressions": { "lowerBound": 0, "upperBound": 1000 } }]
        }
    ],
    "startUrl": "https://adstransparency.google.com/?domain=nike.com&region=DE",
    "targeting": { "targetingCategory": { "demographics": { "included": true, "excluded": false }, "geography": { "included": true, "excluded": false }, "contextual": { "included": true, "excluded": true } } },
    "variations": [
        { "headline": "Nike Women's Therma-FIT Jacket - Brown - Size: XL", "body": "[Price]\nNike Official", "imageUrl": "https://encrypted-tbn0.gstatic.com/shopping?q=tbn:ANd9GcS617UrNDle0BtfwtmBK2EA3sKbLplcIvDvz-HUkeJZ4Tfc-m0n" }
    ]
}
```

### How to use

```json
{
    "domains": ["nike.com"],
    "resultsLimit": 100,
    "region": "DE",
    "platforms": ["SEARCH", "YOUTUBE"]
}
```

| Input | Example | What it does |
|---|---|---|
| `queries` | `["Nike, Inc."]` | Finds matching advertiser accounts (exact name first, then the ones with the most ads; up to `maxAdvertisersPerQuery`, default 5) and collects their ads. A domain typed here is also searched as a domain. |
| `domains` | `["nike.com"]` | Ads pointing to that website, across all advertiser accounts. |
| `advertiserIds` | `["AR16735076323512287233"]` | One advertiser account. |
| `startUrls` | `[{"url": "https://adstransparency.google.com/advertiser/AR16735076323512287233?region=US"}]` | Advertiser, domain-search or single-ad URLs copied from the Transparency Center. Each URL uses its own filters (`region`, `platform`, `format`, `start-date`, `end-date`). |

Filters for `queries`, `domains` and `advertiserIds`:

| Option | Values |
|---|---|
| `region` | Country code (`US`, `GB`, `DE`...) or `ANYWHERE` (default) |
| `startDate`, `endDate` | `YYYY-MM-DD`, both inclusive (when the ad was shown) |
| `adFormat` | `ALL` (default), `TEXT`, `IMAGE`, `VIDEO` |
| `platforms` | Any of `SEARCH`, `YOUTUBE`, `SHOPPING`, `MAPS`, `PLAY` |
| `resultsLimit` | Maximum ads per input line; empty = all |
| `skipDetails` | `true` lists ads only (no region stats, targeting or variations), faster |
| `onlyNew` | `true` returns only ads not returned by earlier runs with the same input line and filters. Skipped ads are free. Made for scheduled monitoring. |

### Monitoring competitors on a schedule

Create a [schedule](https://docs.apify.com/platform/schedules) with `onlyNew: true` and your competitors' domains. Each run returns only the ads that appeared since the previous run, and you only pay for those.

### Differences from the popular scraper

- Same input fields, same output fields and formats. On a side-by-side test (20 ads for `nike.com` in Germany) both returned the same 20 ads with the same keys, region stats, impressions and targeting.
- `variations[].headline` / `body` are read from Google's ad preview HTML. For some local (Maps) ads the first line can differ (for example the "Sponsored" label instead of the domain).
- Not supported: political-ads topic, OCR of text-ad images, downloading video/preview files to the key-value store. Image and video URLs are returned as links.

### Errors

Invalid inputs (not a domain, wrong advertiser ID, non-Transparency-Center URL) or searches that fail produce a free row with `errorType` and `error`, and the rest of the run continues.

### Is it legal?

The Ads Transparency Center is a public library that Google publishes so anyone can inspect ads. Scrape it responsibly and follow the laws that apply to you.

# Actor input Schema

## `queries` (type: `array`):

Search advertiser names (Nike) or domains (nike.com). The best-matching advertiser accounts are used (exact name first, then the ones with the most ads).

## `domains` (type: `array`):

Find ads for websites, such as nike.com or https://nike.com.

## `advertiserIds` (type: `array`):

Google advertiser IDs, such as AR16735076323512287233.

## `startUrls` (type: `array`):

Advertiser, domain-search or individual-ad URLs. Each URL uses the filters in the URL (region, platform, format, start-date, end-date).

## `resultsLimit` (type: `integer`):

Maximum ads per query, domain, advertiser ID or URL. Empty means unlimited.

## `maxAdvertisersPerQuery` (type: `integer`):

Maximum advertiser accounts per query (1-20). Empty uses 5.

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

A 2-letter country code such as US, DE or ES, or ANYWHERE. Empty means anywhere. Impressions, platforms and targeting are only published by Google for EU/EEA countries.

## `startDate` (type: `string`):

Include ads shown on or after this date (YYYY-MM-DD).

## `endDate` (type: `string`):

Include ads shown on or before this date (YYYY-MM-DD).

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

ALL (default), TEXT, IMAGE or VIDEO.

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

Ads shown on any of the selected platforms. Empty means all.

## `onlyNew` (type: `boolean`):

Skip ads already returned by earlier runs with the same input line and filters. Skipped ads are not charged. Good for daily or weekly monitoring.

## `skipDetails` (type: `boolean`):

Only list the ads (IDs, advertiser, format, dates, preview). Skips impressions per region, targeting and variations (headline, description, click URL, image, video).

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

Apify datacenter proxy works and keeps the price low. The Actor switches IP on every rate-limited request.

## Actor input object example

```json
{
  "queries": [
    "Nike",
    "nike.com"
  ],
  "domains": [
    "nike.com"
  ],
  "resultsLimit": 100,
  "maxAdvertisersPerQuery": 5,
  "region": "ANYWHERE",
  "onlyNew": false,
  "skipDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "queries": [
        "Nike, Inc."
    ],
    "resultsLimit": 100,
    "region": "ANYWHERE",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("istmobot/google-ads-transparency-cheap").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 = {
    "queries": ["Nike, Inc."],
    "resultsLimit": 100,
    "region": "ANYWHERE",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("istmobot/google-ads-transparency-cheap").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 '{
  "queries": [
    "Nike, Inc."
  ],
  "resultsLimit": 100,
  "region": "ANYWHERE",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call istmobot/google-ads-transparency-cheap --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,istmobot/google-ads-transparency-cheap"
        }
    }
}
```

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/CKSt4QbHZVCKLnhj4/builds/5a7bHTxoSYqzFdt26/openapi.json
