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

Scrape public Google Ads Transparency Center creatives by domain, advertiser name, or advertiser ID. Filter by platform, format, country, and dates, then export deduplicated ad records with IDs, media references, and active dates.

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

## Pricing

from $0.75 / 1,000 google ad results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Scrape public **Google Ads Transparency Center creatives** by domain, advertiser name, or advertiser ID. Filter by platform, format, country, and dates, then export deduplicated ad records with IDs, media references, active dates, and optional preview enrichment.

### What this Actor does

Search Google Ads Transparency Center and retrieve its public creative listings. Filter by country, Google platform, creative format, and inclusive date range. Each Dataset row represents one unique advertiser/creative pair. Results are delivered incrementally, so completed pages remain available if a later request fails.

### Use cases

- Monitor the creative formats and publication dates used by competing advertisers.
- Compare advertising activity across Google platforms and countries.
- Build a dated creative reference library for campaign research.
- Find advertisers matching a company name and examine their public ads.

### How to use

1. Open the Actor in Apify Console.
2. Enter a website domain, advertiser name, or advertiser ID in `searchQuery`.
3. Choose a small `maxResults` value for your first run and optionally add filters.
4. Optionally enable `includeDetails` to fetch the public preview render and extract observable preview text and image assets.
5. Click **Start**, then open the Dataset to inspect or export the creatives.

### Input

The following input produced the complete Dataset item shown below:

```json
{
  "searchQuery": "nike.com",
  "maxResults": 1,
  "includeDetails": true,
  "maxDetails": 1
}
```

| Field | Default | Behavior |
|---|---|---|
| `searchQuery` | `nike.com` | Website domain/URL, advertiser name, or AR advertiser ID. Website URLs are reduced to their hostname, with a leading www removed. |
| `maxResults` | 100 | Global unique creative limit, up to 1,000,000. Zero removes this limit; page and run limits still apply. |
| `platform` | All | `google_search`, `youtube`, `google_shopping`, `google_maps`, or `google_play`. |
| `adFormat` | All | `text`, `image`, or `video`. |
| `region` | Worldwide | Optional two-letter country code from the country selector. |
| `dateFrom`, `dateTo` | No date filter | Inclusive dates in YYYY-MM-DD format; start must not follow end. |
| `maxPages` | 1000 | Pagination safety limit, between 1 and 10,000. |
| `maxAdvertisers` | 10 | Name-search discovery limit, between 1 and 10 matching advertiser suggestions. Does not affect domain or ID searches. |
| `includeDetails` | `false` | Fetch each creative preview and extract observable preview text and image assets. This enables the separate enrichment charge. |
| `maxDetails` | 100 | Maximum creatives to enrich when `includeDetails` is enabled, from 0 to 1,000. |

Unknown input fields and invalid dates are rejected. Name searches discover matching advertisers and then retrieve their ads; they do not search the text of every ad. Discovery is limited to the available suggestions and is not an exhaustive advertiser census. Use a domain or advertiser ID when precision matters.

### Output

One row represents one unique `(advertiserId, creativeId)` pair. Export the Dataset as JSON, CSV, Excel, or another supported Apify format. Empty searches produce an empty Dataset. Errors and run diagnostics are stored in `SUMMARY` in the default Key-value store, rather than being mixed into ad rows.

This is a complete Dataset item from a real successful run:

```json
{
  "advertiserId": "AR16832577870747402241",
  "advertiserName": "NIKE GLOBAL TRADING B.V. SINGAPORE BRANCH",
  "creativeId": "CR05650980632755437569",
  "adFormat": "text",
  "firstShown": "2026-09-03",
  "lastShown": "2026-09-05",
  "approxDaysShown": 3,
  "adUrl": "https://adstransparency.google.com/advertiser/AR16832577870747402241/creative/CR05650980632755437569",
  "imageUrl": null,
  "previewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?client=ads-integrity-transparency&obfuscatedCustomerId=4211775641&creativeId=823308241355&uiFeatures=12,54&adGroupId=141596552840&overlay=%3DH4sIAAAAAAAAAF2NsUoDQRRFWZCwPBsZRWyUR0CwcZOATSAIgtUgsRitrIadt8xjJzPLzqySbr_DnzGl32AlCH6HbCyC1vfcc6SE3JI2jj2Ja1g8NpgCXk3PMVQVJssR58UclXaEl7hb76sKg0dFjsqEKq0dRfkE-4Zi2XKTOHhxB_JB14Tr0LUYbUj4wsli9ycRfw1xa_gXJG8izqaoqCnkGYyeOXatE0cgPNdUlGE1GbjJkmuSCzjWxvBQ1k6Rbkt7Y2510mI8xtf8FA7zvu8_P96-vt-zg012sskuMjGCveH9AwMl_FAHAQAA&sig=ACiVB_wSrwIgz_jCey6yfbqROBbu2jxA0g&htmlParentId=fletch-render-13252428034851688276&responseCallback=fletchCallback13252428034851688276",
  "matchedDomain": "nike.com",
  "searchQuery": "nike.com",
  "scrapedAt": "2026-09-05T19:16:57.991298+00:00",
  "previewText": [
    "⁦Nike⁩",
    "⁦Take your shot with up to 40% off select styles this 9.9 Sale ends 10 Sep.⁩"
  ],
  "previewAssetUrls": [
    "https://tpc.googlesyndication.com/simgad/4728279338824705695?sqp"
  ],
  "previewFetched": true
}
```

`firstShown` and `lastShown` use the America/Los\_Angeles calendar date to match the source's date convention. `scrapedAt` is an ISO timestamp in UTC. `approxDaysShown` is the source's served-day count, which can differ from the number of calendar days between the two dates. When enrichment is disabled, `previewText` and `previewAssetUrls` are empty and `previewFetched` is `false`.

When `includeDetails` is enabled, `previewText` contains conservative text observed in the public render, `previewAssetUrls` contains public image references found in that render, and `previewFetched` shows whether enrichment completed for that creative. Google may publish no text or image assets for a particular format.

An image reference can represent a text ad. `adFormat` is taken from the source's classification. `imageUrl` and `previewUrl` are nullable: some creatives have only a rendering reference. A preview reference is not a downloadable video file. `matchedDomain` can be null for advertiser searches. Missing source values remain null.

`SUMMARY.status` distinguishes `completed`, `max_results`, `max_pages`, `max_charge`, and interrupted or failed work. `SUMMARY.complete` is true only when the source pagination is exhausted. Reaching a requested limit is a successful bounded run, not a claim that all available ads were retrieved. On a failed run, already delivered rows remain available. `SUMMARY.billed` counts confirmed result charges; a failed run with `billingPending` requires recovery to confirm the charge outcome.

### Pricing

Pay for each unique ad creative successfully delivered. Optional preview enrichment is billed separately for each creative whose preview was successfully fetched. The base price is **$1.00 per 1,000 creatives** and enrichment starts at **$1.00 per 1,000 enriched creatives**; your Apify discount tier determines the effective unit price below. Platform usage is included, and there is no Actor-start fee.

| Apify tier | `ad-result` price per creative | `ad-result` equivalent per 1,000 | `ad-enrichment` price per enriched creative | `ad-enrichment` equivalent per 1,000 |
|---|---:|---:|---:|---:|
| Free | $0.00100 | $1.00 | $0.00100 | $1.00 |
| Bronze | $0.00090 | $0.90 | $0.00090 | $0.90 |
| Silver | $0.00080 | $0.80 | $0.00080 | $0.80 |
| Gold | $0.00075 | $0.75 | $0.00075 | $0.75 |
| Platinum | $0.00075 | $0.75 | $0.00075 | $0.75 |
| Diamond | $0.00075 | $0.75 | $0.00075 | $0.75 |

The `ad-enrichment` event uses the same tiered unit prices as `ad-result`: $0.00100, $0.00090, $0.00080, or $0.00075 per enriched creative, depending on the Apify tier. An ad is charged for enrichment only when the preview fetch succeeds. Empty previews, failed enrichment, diagnostics and discarded duplicates are not enrichment charges.

When both features are used successfully, Apify exposes the two billing events in the run metadata under `chargedEventCounts`:

```json
{
  "chargedEventCounts": {
    "ad-result": 1,
    "ad-enrichment": 1
  }
}
```

This billing metadata belongs to the Apify run. It is separate from the Dataset rows shown in the Output section.

Empty searches, failed requests, diagnostics and discarded duplicates have no result charge. A run that fails after delivering some creatives can still charge for those delivered creatives. The same creative returned in separate runs is billable in each run.

Set **Maximum cost per run** to control spending. The Actor uses the highest configured tier price when deciding how many additional creatives fit, so discounted runs may stop with part of the budget unused. This affects the result count, not your tier's unit price. Check the Pricing tab for the effective commercial terms.

### Related Actors

| Actor | Best for |
|---|---|
| [TikTok Commercial Content Library Ads Scraper](https://apify.com/datascraperes/tiktok-ads-commercial-library) | Compare competitor creatives, captions, reach bands, and targeting in TikTok's public ad library. |
| [Keyword Research & SERP Data](https://apify.com/datascraperes/keyword-research-serp) | Investigate keyword demand, related terms, and search competitors alongside creative research. |

### Limits and data quality

Only information available in the public source can be returned. Coverage varies by country and advertiser; ads requiring age verification are outside this anonymous collection. An old selectable date does not guarantee that every historical ad is still available. Platform-filtered coverage starts with ads shown from September 4, 2023 according to the source.

Runs use a fixed 128 MB memory allocation. Increasing memory is not supported or needed for larger exports; results are processed in pages.

The Actor processes pages at a conservative pace. A higher result limit increases runtime; allow sufficient run time for larger exports. Media references can change or expire. Ad copy, direct video downloads, destination-page URLs, spend, and worldwide impression totals are not part of this version's output.

A source block or unexpected response fails the run and preserves delivered output. Resurrecting the same run uses its checkpoint and existing Dataset when delivery can be verified. If a Dataset write has an unresolved outcome, the Actor stops for review rather than risking a duplicate write. If payment confirmation is lost after delivery, resurrecting the same unchanged run retries that pending charge without creating another charge for the same page. Do not manually edit the Dataset of a run you plan to resurrect, and start a new run when changing input.

### Frequently asked questions

#### Does a name search find every advertiser with related ads?

No. It uses matching advertiser suggestions, limited by `maxAdvertisers`. It does not provide semantic search across all creative text.

#### Why does a text ad have an image URL?

The source sometimes provides an image representation of a text creative. The format and rendering reference describe different aspects of the ad.

#### Does maxResults zero mean the entire library is guaranteed?

No. It removes the unique-result cap. Pagination limits, run time, source availability, and the source's own coverage still apply.

#### Can I recover data from a failed run?

Yes. Already delivered rows remain in that run's Dataset. Read its `SUMMARY` record to distinguish source blocking, validation errors, and unresolved delivery before deciding whether to resume.

### Responsible use

Use the public advertising records for lawful research and analysis. You are responsible for complying with applicable terms and privacy requirements and for verifying conclusions drawn from incomplete or changing source data.

### Support

Open an issue in the Actor's **Issues** tab with the run ID, reproducible input, and a description of the expected and observed behavior. Do not include credentials in your report.

For API examples, sample input/output, and a no-code guide, see the [public GitHub examples repository](https://github.com/datacrawler-edu/google-ads-transparency-scraper-examples).

# Actor input Schema

## `searchQuery` (type: `string`):

A website domain/URL, advertiser name or AR advertiser ID. Names discover up to maxAdvertisers matching advertisers.

## `maxResults` (type: `integer`):

Global unique creative limit. Zero removes this limit; maxPages and run timeout still apply.

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

Optional platform filter.

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

Optional creative format. A text creative may be represented by an image.

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

Optional country filter. Availability depends on source coverage.

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

Optional inclusive start date (YYYY-MM-DD).

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

Optional inclusive end date (YYYY-MM-DD).

## `maxPages` (type: `integer`):

Pagination safety limit. SUMMARY reports max\_pages if reached before source exhaustion.

## `maxAdvertisers` (type: `integer`):

Limits matching advertiser suggestions for name searches. Not exhaustive discovery.

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

Fetch each creative preview and extract observable preview text and image assets. Each successfully enriched creative has a separate charge.

## `maxDetails` (type: `integer`):

Maximum number of creatives to enrich when includeDetails is enabled.

## Actor input object example

```json
{
  "searchQuery": "nike.com",
  "maxResults": 100,
  "maxPages": 1000,
  "maxAdvertisers": 10,
  "includeDetails": false,
  "maxDetails": 100
}
```

# Actor output Schema

## `creatives` (type: `string`):

No description

## `summary` (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 = {
    "searchQuery": "nike.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascraperes/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 = { "searchQuery": "nike.com" }

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

```

## MCP server setup

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