# Google Ads Transparency Scraper — Ads — $2/1K until 11-24 (`architekture/google-ads-transparency-scraper`) Actor

Google Ads Transparency: $2/1K ads and $1.50/1K advertisers until 2026-11-24, then $5/$2.50. Collect available creative text, formats, dates and regions; discover advertisers and track new ad IDs. Pay per result.

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

## Pricing

from $2.00 / 1,000 delivered ads

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 — Ads, Dates, Advertisers

**Recorded run: 3 ads from 1 advertiser in 24.9 seconds** (2026-10-25, build 0.1.2, run `VSvWzGFXqwv7aki0R`). A bounded canary sample, not a full-catalogue benchmark. Advertiser discovery launches at $1.50 / 1,000 advertisers, half the field leader's $3.00 rate.

architek.earth — an independent data studio. Pay-per-result scrapers with recorded runs, published canaries and stable schemas, built for people and AI agents.

**What's new**

- **2026-10-25** — Launch prices are $2.00 / 1,000 ads and $1.50 / 1,000 advertisers; scheduled return on 2026-11-24 to $5.00 and $2.50 respectively, following Apify notice.
- **2026-10-25** — Import the published n8n workflow or Make blueprint to collect ads using the three-ad example.
- **2026-10-25** — Collect Google ad dates, formats and available text, or discover advertisers by name.

Google Ads Transparency Center inputs produce ad rows or advertiser rows.

| Source | Market | From | Standout fields |
|---|---|---|---|
| Google Ads Transparency Center | Public advertiser data | $2.00 / 1,000 ads | creativeText, firstShown, lastShown |

### ✅ Why choose this scraper

- **Available copy.** `creativeText` holds native preview text when Google exposes it.
- **Dates and formats.** `firstShown`, `lastShown`, `format` and regional date entries come from public source records.
- **Repeat collection.** `incrementalMode` skips already delivered IDs under the same `stateKey`.

#### Tested head-to-head (2026-10-25)

| | This actor | Field (15 priced listings) |
|---|---|---|
| Runs that did not succeed | 0% of 6 recorded canary runs on 2026-10-25 | median 0.20%, range 0–50% (public 30-day statistics) |
| Rows per run | 3 ads; 5 advertisers | not published |
| Ad price | $2.00 / 1,000 ads | median $2.00 / 1,000 primary results |

The six-run sample is too small to infer comparative reliability. Advertiser discovery costs $1.50 / 1,000 versus the leader's advertised $3.00. See PRICING.md for the dated event-level comparison.

### ⚠️ Worth knowing up front

- Image-only and video creatives can have `creativeText=null`. There is no OCR or video transcription. Google's text format label is not a text-availability guarantee.
- Copy can contain literal Google placeholders such as ratings, distance or dynamic keywords. These are preserved, not filled with invented values.
- Keyword input searches advertiser names, not the text inside ads. Domain lookup follows Google's domain filter. Name matches resolve at most `maxAdvertisers` accounts.
- Advertiser discovery returns the first source page, at most 100 advertisers per keyword. Ad pagination is supported. User caps produce LIMITED; blocks, source errors and deadlines produce PARTIAL.
- Invalid input, empty results after retry, blocks, deadlines, budget limits and state problems emit free `recordType="status"` rows when storage is available. No source request is charged. Inspect RUN_SUMMARY, not only platform SUCCEEDED.
- The recorded access market is US. Other offered region filters use Google's region identifiers; availability varies. Ads and advertiser discovery are separate modes.

### ⚡ Try the example

This actor has no free preview; the three-ad example costs $0.006 at the launch price. Free-plan accounts can pay with their included credit.

```json
{"targets":["AR16735076323512287233"],"region":"US","format":"text","maxItems":3,"maxResultsPerTarget":3}
```

Change targets to your advertiser ID, advertiser page URL, domain or name.

### ⚙️ Input

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | string | ads | ads or advertisers; name keywords only in advertisers mode. |
| `targets` | array | nike.com / google | 1–20 IDs, advertiser URLs, domains or names; google is the advertisers-mode default. |
| `region` | string | US | US, GB, DE, FR, NL, CA, AU or anywhere. |
| `format` | string | all | all, text, image or video. |
| `maxItems` | integer | 20 | Maximum delivered rows per run, 1–5,000. |
| `maxResultsPerTarget` | integer | 100 | Maximum scanned rows per target, 1–5,000. |
| `maxAdvertisers` | integer | 5 | Maximum matched advertisers per name, 1–20. |
| `incrementalMode` | boolean | false | Only previously unseen ad/advertiser IDs; requires stateKey. |
| `continuePreviousRun` | boolean | false | Resume an unfinished checkpoint; requires stateKey. |
| `stateKey` | string | empty | 1–60 letters, digits, underscores or hyphens. |
| `feedback` | string | empty | Logged note; never changes output. |

#### Input recipes

Two public examples are linked below; the other inputs are paste-ready recipes. They are paid runs, with no automatic switch from a free mode:

- [Three Nike text ads](https://console.apify.com/actors/tasks/0kqF0gAtNWQyAm1G5): `{"targets":["AR16735076323512287233"],"region":"US","format":"text","maxItems":3,"maxResultsPerTarget":3}`
- Domain: `{"targets":["nike.com"],"maxItems":5,"maxResultsPerTarget":5}`
- [Name discovery](https://console.apify.com/actors/tasks/WwYE3DB3OtJTa2ZkU): `{"mode":"advertisers","targets":["google"],"maxItems":5,"maxResultsPerTarget":5}`
- New IDs: `{"targets":["nike.com"],"maxItems":5,"maxResultsPerTarget":5,"incrementalMode":true,"stateKey":"nike-daily"}`
- Continuation: `{"targets":["nike.com"],"stateKey":"nike-batch","continuePreviousRun":true,"maxItems":100}`

### 🧱 Stable fields

Stable data-row fields are add-only. Status rows use recordType, status, inputRef and message and may omit every data field.

| Field | Type | Meaning |
|---|---|---|
| `recordType` | string | ad, advertiser or free status. |
| `advertiserId` | string | Public AR identifier. |
| `advertiserName`, `advertiserCountry` | string, nullable | Source name and country; country may be absent on ads. |
| `creativeId`, `creativeText` | string, nullable | CR identifier and native visible copy; null on advertiser rows. |
| `creativeTextStatus` | string | extracted, image_only, video_or_image, not_available or not_applicable. |
| `format` | string, nullable | Source classification: text, image, video or unknown. |
| `firstShown`, `lastShown` | string, nullable | Source UTC dates, YYYY-MM-DD. |
| `regions` | array | Source region IDs and available dates; not audience targeting claims. |
| `imageUrl` | string, nullable | Public source image; may expire. |
| `sourceUrl`, `inputRef`, `scrapedAt` | string | Public source page, original input and UTC collection timestamp. |
| `adCountLower`, `adCountUpper` | integer, nullable | Advertiser discovery's source count interval. |
| `deliveryId` | string | Unique delivery receipt for joining saved rows to a run. |

### 📦 Output example

Abridged real row from run `vb3llKX2e0hB7CRYe` on 2026-10-25; values are a historical snapshot.

```json
{
  "recordType": "ad",
  "advertiserId": "AR16735076323512287233",
  "advertiserName": "Nike, Inc.",
  "creativeId": "CR01211230049336819713",
  "creativeText": "Sponsored Nike <dynamically generated based on landing page content> <dynamically generated based on landing page content> <Rating (Reviews)> · <Distance> · Philadelphia <Open Hours> 901 Market Street Space 1095 Discover Nike Clearance Featuring Footwear, Apparel And Accessories On Sale. website call directions Pottstown · 18 West Lightcap Road",
  "creativeTextStatus": "extracted",
  "format": "text",
  "firstShown": "2022-11-30",
  "lastShown": "2026-10-25",
  "sourceUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR01211230049336819713"
}
```

Recorded free status row from `KMgdseHg1RAz563vI`:

```json
{
  "recordType": "status",
  "inputRef": "input",
  "status": "INVALID_INPUT",
  "message": "Invalid advertiser ID, domain or advertiser name"
}
```

### 🧠 Advanced usage

**Daily monitoring.** Reuse the same filters and stateKey with incrementalMode=true. The baseline keeps at most 25,000 delivered IDs. New means unseen IDs, not edits to an existing ad.

**Continuation.** An incomplete checkpoint resumes automatically in incremental mode, or explicitly with continuePreviousRun=true. Change maxItems to raise the per-run delivery cap. Different filters require a new stateKey. Prior delivered rows are never recharged; uncertain dataset acknowledgements stop for manual reconciliation.

**Interrupted runs.** After a forced abort, wait until the prior platform timeout plus 60 seconds before resuming. Concurrent stateKey owners are refused. timeoutSecs=0 still has a 30-minute actor bound; use at least a 180-second timeout to leave delivery completion time.

### 🔌 Integrations

Export the dataset as JSON, CSV or Excel; schedule daily runs or connect a completion webhook to Google Sheets, Make, Zapier or n8n.

#### n8n and Make

- n8n: import [n8n-workflow.json](https://github.com/architek-earth/examples/blob/main/google-ads-transparency-scraper/n8n-workflow.json), then select an Apify Header Auth credential.
- Make: import [make-blueprint.json](https://github.com/architek-earth/examples/blob/main/google-ads-transparency-scraper/make-blueprint.json) and set the APIFY_TOKEN custom variable.

Both call this actor with the three-ad example and return its dataset rows. Tokens are supplied by your integration, never stored in the template.

### 💸 Pricing

Pay per result; status rows and failed requests are free. Platform and proxy costs are included for buyers. Already delivered IDs in an incremental baseline or unfinished checkpoint are skipped without a second charge.

| Event | Price | What it covers |
|---|---|---|
| `ad` | $2.00 / 1,000 ads | One delivered ad, including metadata even when copy is unavailable. |
| `advertiser` | $1.50 / 1,000 advertisers | One delivered advertiser discovery row. |

Launch pricing ends on 2026-11-24: the planned return prices are $5.00 / 1,000 ads and $2.50 / 1,000 advertisers, subject to the required notice. Three ads cost $0.006 today. The Apify free plan's $5 monthly credit covers about 2,500 ads at $2.00 / 1,000. No startup fee.

### ❓ FAQ

**Does every ad include text?** No. Image/video-only previews produce null and an explicit creativeTextStatus.

**Does keyword search search ad copy?** No, it searches advertiser names.

**Can I get spend, impressions or conversions?** These are not part of this actor's contract.

**Are output dates live?** They are source-reported dates at collection time, not a real-time ad delivery guarantee.

**Can I repeat a run without paying for old ads?** Use incrementalMode and a stable stateKey with identical filters.

**Why did a successful run say PARTIAL?** Platform success includes clean source/budget/time stops; inspect RUN_SUMMARY for completion and free status rows for reasons.

### 🤖 For AI agents & LLM apps

Use `architekture/google-ads-transparency-scraper` with a small maxItems and a run spending cap. Read only recordType=ad or advertiser as data; status rows explain clean stops. README and input schema: `GET https://api.apify.com/v2/acts/architekture~google-ads-transparency-scraper/builds/default`. Feedback never changes output.

#### MCP config for Claude Desktop and Cursor

Claude Desktop: add custom connector `https://mcp.apify.com?tools=architekture/google-ads-transparency-scraper` and sign in with Apify OAuth. Cursor mcp.json:

```json
{"mcpServers":{"google-ads-transparency":{"type":"http","url":"https://mcp.apify.com?tools=architekture/google-ads-transparency-scraper","headers":{"Authorization":"Bearer ${env:APIFY_TOKEN}"}}}}
```

Use get-dataset-items to page the results.

### 🧰 More from architek.earth

**Search, travel and trends**

- Google Ads Transparency Scraper — you are here.
- [Google Trends Scraper](https://apify.com/architekture/google-trends-scraper) — Trending Now topics.

**Video, social and newsletters**

- [Ad Intelligence Watchlist](https://apify.com/architekture/ad-intelligence-watchlist) — separate Meta-focused monitoring product.

Full catalogue: [architek-earth](https://github.com/architek-earth).

architek.earth · code like concrete

### 🙋 Support & legal

Open an issue on the actor's Issues tab or email north@architek.earth for help.

This actor collects publicly available information from adstransparency.google.com and public ad previews without logging in. It does not bypass authentication. You are responsible for your use of the output, including applicable terms, copyright and privacy law.

### 📝 Changelog

- **2026-10-25** — Launch prices are $2.00 / 1,000 ads and $1.50 / 1,000 advertisers; scheduled return on 2026-11-24 to $5.00 and $2.50 respectively, following Apify notice.
- **2026-10-25** — Import the published n8n workflow or Make blueprint to collect ads using the three-ad example.
- **2026-10-25** — Collect Google ad dates, formats and available text, or discover advertisers by name.

# Actor input Schema

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

Ads by advertiser name, ID or domain, or advertiser discovery by name keyword.

## `targets` (type: `array`):

1–20 advertiser IDs, advertiser URLs, domains or names. Advertisers mode accepts name keywords only.

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

Source region filter. US is the recorded validation market.

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

Google format classification. Text classification does not guarantee machine-readable text.

## `maxItems` (type: `integer`):

Stops at this cap and reports LIMITED if further results exist.

## `maxResultsPerTarget` (type: `integer`):

Stops at this cap and reports LIMITED if further results exist.

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

Stops at this cap and reports LIMITED if further results exist.

## `incrementalMode` (type: `boolean`):

Requires stateKey. Incomplete progress is retained; already delivered rows are never recharged.

## `continuePreviousRun` (type: `boolean`):

Requires stateKey. Incomplete progress is retained; already delivered rows are never recharged.

## `stateKey` (type: `string`):

1–60 letters, digits, underscores or hyphens. Reuse only with the same filters. Required for incremental or continuation.

## `feedback` (type: `string`):

Optional note for the maintainers; logged, never changes output.

## Actor input object example

```json
{
  "mode": "ads",
  "targets": [
    "AR16735076323512287233"
  ],
  "region": "US",
  "format": "text",
  "maxItems": 3,
  "maxResultsPerTarget": 3,
  "maxAdvertisers": 5,
  "incrementalMode": false,
  "continuePreviousRun": false
}
```

# Actor output Schema

## `results` (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 = {
    "targets": [
        "AR16735076323512287233"
    ],
    "format": "text",
    "maxItems": 3,
    "maxResultsPerTarget": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("architekture/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 = {
    "targets": ["AR16735076323512287233"],
    "format": "text",
    "maxItems": 3,
    "maxResultsPerTarget": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("architekture/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 '{
  "targets": [
    "AR16735076323512287233"
  ],
  "format": "text",
  "maxItems": 3,
  "maxResultsPerTarget": 3
}' |
apify call architekture/google-ads-transparency-scraper --silent --output-dataset

```

## MCP server setup

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