# Google Ads Scraper (`anyxsolutions/google-ads-scraper`) Actor

\[$1/1000 items] Fast and cheap google ads scraper. Get advertiser data, ad creatives, impressions, audience targeting, and ad media from the Google Ads Transparency Center.

- **URL**: https://apify.com/anyxsolutions/google-ads-scraper.md
- **Developed by:** [Anyx Solutions](https://apify.com/anyxsolutions) (community)
- **Categories:** Developer tools, Lead generation, Automation
- **Stats:** 53 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Google Ads Transparency Center Scraper

**Turn Google's public ad disclosures into clean, structured JSON — by advertiser, creative, or domain.**

The Google Ads Transparency Center Scraper extracts structured ad data from
[Google Ads Transparency Center](https://adstransparency.google.com/): advertisers, ad creatives,
impression ranges, audience targeting signals, regional breakdowns, and the creative media itself.
It is built for competitive intelligence, brand monitoring, ad-spend research, and political-ad
transparency analysis.

### ⚡ Quick start

```json
{
  "startUrls": [
    {
      "url": "https://adstransparency.google.com/advertiser/AR10852394170916536321?region=anywhere"
    }
  ],
  "maxItems": 5
}
```

Or scrape every advertiser running ads for a domain:

```json
{
  "startUrls": [
    { "url": "https://adstransparency.google.com/?region=anywhere&domain=binance.com" }
  ],
  "maxItems": 5
}
```

### ✨ Features

- Scrape ads by **advertiser ID**, **creative ID**, or **domain**.
- Filter by **region**, **platform** (YouTube, Search, Display, Maps, Shopping, Play), **format** (Image, Video, Text), and **date range** — all via URL query parameters.
- Extract **audience targeting signals** (demographic, geographic, contextual, topics, customer lists).
- Retrieve **impression ranges** per country and platform.
- Collect **ad creatives**: preview URLs, headlines, body text, images, and video links.
- Optionally **download media** (images and videos) into the Key-Value Store.
- Optionally use **cookies** to access age-restricted ad creatives.
- Optionally **mirror every ad into Notion or Airtable** for a living, queryable catalog.

### 🧩 Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `startUrls` | array | yes | — | Google Ads Transparency Center URLs: advertiser search, creative detail, or domain search. |
| `maxItems` | integer | no | `3` | Maximum ad creatives to scrape per advertiser/domain search URL. Detail URLs always return one item. |
| `cookies` | array | no | — | Cookies (JSON) for accessing age-restricted creatives. |
| `downloadMedia` | boolean | no | `false` | Download previews and variant media into the Key-Value Store and add storage keys to each item. |
| `proxyConfiguration` | object | no | `{"useApifyProxy":false}` | Apify proxy settings. Enable if you hit rate limits or need geo-specific data. |
| `notionConnector` | string | no | — | Apify MCP Connector authorized to Notion. Every scraped ad becomes a page in the chosen database. |
| `notionDatabaseId` | string | no | — | Target Notion database ID. Required when `notionConnector` is set. |
| `airtableConnector` | string | no | — | Apify MCP Connector authorized to Airtable. Every scraped ad becomes a record in the chosen table. |
| `airtableBaseId` | string | no | — | Target Airtable base ID (starts with `app…`). Required when `airtableConnector` is set. |
| `airtableTableId` | string | no | — | Target Airtable table ID (starts with `tbl…`). Required when `airtableConnector` is set. |

#### Supported start URL formats

- **Advertiser search:** `https://adstransparency.google.com/advertiser/<advertiserId>?region=<region>`
- **Creative detail:** `https://adstransparency.google.com/advertiser/<advertiserId>/creative/<creativeId>?region=<region>`
- **Domain search:** `https://adstransparency.google.com/?region=anywhere&domain=<domain>`

Optional URL query parameters: `region`, `platform`, `format`, `topic`, `start-date`, `end-date`.

### 📤 Output

Each ad creative is pushed to the dataset as one record.

#### Fields

| Field | Type | Description |
|---|---|---|
| `id` / `adId` | string | Creative ID. |
| `advertiserId` | string | Advertiser ID. |
| `advertiserName` | string | Advertiser display name. |
| `url` | string | Public creative URL on the Transparency Center. |
| `sourceUrl` | string | The start URL this creative was discovered from. |
| `mediaType` | string | null | Creative format: `IMAGE`, `VIDEO`, or `TEXT`. |
| `thumbnail` | object | `{ url, key }` — preview URL and Key-Value Store key (when media is downloaded). |
| `firstShownAt` / `lastShownAt` | string | null | First / last shown date (`YYYYMMDD`). |
| `daysActive` | number | null | Inclusive number of days the creative was active. |
| `impressionsRange` | string | null | Upper bound of the reported impression bucket. |
| `regions` | string\[] | Countries where the creative was shown. |
| `regionBreakdown` | array | Per-country dates, impression bounds, and platform stats. |
| `targeting` | array | Audience selection signals used by the ad. |
| `variants` | array | Creative variants: `textContent`, `images`, and `imageStoreKeys` (when media is downloaded). |

<details><summary>Example output</summary>

```json
{
  "id": "CR01003845904182018049",
  "adId": "CR01003845904182018049",
  "advertiserId": "AR16735076323512287233",
  "advertiserName": "Nike, Inc.",
  "url": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR01003845904182018049?region=anywhere",
  "sourceUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233?region=anywhere",
  "mediaType": "IMAGE",
  "thumbnail": { "url": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?...", "key": null },
  "firstShownAt": "20211025",
  "lastShownAt": "20240602",
  "daysActive": 952,
  "impressionsRange": "4000",
  "regions": ["Finland", "Canada", "Portugal", "Mexico"],
  "regionBreakdown": [
    {
      "code": "FI",
      "name": "Finland",
      "firstShownAt": "2025-09-19T00:00:00.000Z",
      "lastShownAt": "2023-12-30T00:00:00.000Z",
      "impressions": { "lowerBound": null, "upperBound": "1000" },
      "platformStats": [
        { "name": "Google Shopping", "code": "SHOPPING", "impressions": { "lowerBound": null, "upperBound": "1000" } }
      ]
    }
  ],
  "targeting": [
    { "name": "Demographic info", "hasIncludedCriteria": true, "hasExcludedCriteria": false }
  ],
  "variants": [
    { "textContent": "Nike Men's Dri-FIT Soccer Replica Jersey", "images": ["https://encrypted-tbn3.gstatic.com/shopping?q=..."] }
  ]
}
```

</details>

When `downloadMedia` is enabled, `thumbnail.key` and `variants[].imageStoreKeys` contain Key-Value Store keys pointing at the downloaded files.

### Using Cookies (Optional)

Some ad creatives — for example age-restricted content — are only visible to logged-in users. To scrape these:

1. Install the [Cookie-Editor](https://chromewebstore.google.com/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm) browser extension for Chrome or any Chromium-based browser.
2. Navigate to the [Google Ads Transparency Center](https://adstransparency.google.com) and make sure you are signed into your Google account.
3. Open the Cookie-Editor extension from your browser toolbar and click **Export → JSON** to copy the cookies to your clipboard.
4. Paste the copied JSON array directly into the `cookies` input field in the actor configuration.

[Watch How to export Cookies using Cookie Editor on Youtube](https://youtu.be/LK7EnP6YFPA)

***

### Notion Output (Optional)

Push every scraped ad creative into a Notion database as a new, fully-formed page — perfect for building a living competitor catalog, a research log your team actually opens, or a knowledge base your AI agents can query later (more on that below).

**Step-by-step setup guide:** [`Notion-connector-setup`](https://noble-water-eac.notion.site/Connect-Notion-to-the-Google-Ads-Scraper-3735e4da0b9680fa93afe0d3c907240e?pvs=73)

#### Turn it into an AI knowledge base

Notion's MCP server is **bidirectional** — the same workspace this actor writes to can be **read** by any AI agent that also connects to Notion via MCP (Claude Desktop, ChatGPT with the Notion connector, custom Anthropic API agents, etc.). That means once your scrape is running on a schedule, you can:

- Ask Claude: *"Which advertisers ran the most YouTube ads in Germany last week?"*
- Ask ChatGPT: *"Summarize the messaging trends across all video ads we've collected this month."*
- Have an agent triage: *"Tag any new ad mentioning crypto for compliance review."*

Your scraper becomes the data pipeline; Notion becomes the queryable memory; the AI becomes the analyst.

Notion writes are best-effort — if a page fails to create, the scrape keeps running and the issue is recorded in the run log so you can fix and re-run only the missing items.

***

### Airtable Output (Optional)

Push every scraped ad creative as a new record in an Airtable base — perfect for tracking competitor ads in a spreadsheet-style view with native filtering, grouping, and team sharing.

> **One-click base template:** [Duplicate this Airtable base into your workspace](https://airtable.com/appr7WMd1eNnFvUxi/shr5Pf1KkLcnJApIj/tbl3JipnEyUciX6NT/viwVlcTH5JxZMsMbW) — already wired with all the columns the actor populates.
>
> **Step-by-step setup guide:** [`Airtable-connector-setup`](https://noble-water-eac.notion.site/Connect-Airtable-to-the-Google-Ads-Scraper-3735e4da0b968034a333f388c6c07c9a?pvs=73)

#### How to enable

1. In your Apify account, open **Settings → API & Integrations** and connect Airtable.
2. In Airtable, open the base and table you want to use:
   - The **Base ID** starts with `app...` — it's the second path segment of the URL.
   - The **Table ID** starts with `tbl...` — it's the third path segment.
3. In this actor's input, select your connection under **Airtable Connector** and enter the IDs under **Airtable Base ID** and **Airtable Table ID**.
4. Run the actor — each ad creative becomes a new record with these fields:

   - **Name** — `<Advertiser> — <MediaType> (<AdId>)`
   - **Advertiser**, **Advertiser ID**, **Ad ID**, **Media Type**
   - **Regions**, **Impressions Range**, **First Shown**, **Last Shown**, **Days Active**
   - **Ad URL**, **Source URL**

   If your table doesn't yet have these columns, Airtable will skip the unknown ones. Add columns with these exact names to capture all data.

Records are written in batches at the end of the run, and the run log reports how many were saved vs. failed.

***

### Frequently Asked Questions (FAQ)

##### Where do I find an advertiser ID?

Open any advertiser page on [adstransparency.google.com](https://adstransparency.google.com/) — the URL contains it, e.g. `…/advertiser/AR10303883279069085697`. The string starting with `AR` is the advertiser ID.

##### Where do I find a creative ID?

Click into a specific ad creative on the transparency site — the URL becomes `…/advertiser/<advertiserId>/creative/<creativeId>`. The string starting with `CR` is the creative ID.

##### How do I scrape all ads from a brand or website?

Use the domain search URL format: `https://adstransparency.google.com/?region=anywhere&domain=<your-domain.com>`. This returns advertisers running ads for that domain across regions.

##### Why do some ads return no results or fail with "restricted"?

Certain creatives (for example age-restricted content) are only visible to signed-in users. Provide cookies via the `cookies` input to scrape them. See the [Using Cookies](#-using-cookies-optional) section above.

##### Why are impressions returned as ranges instead of exact numbers?

Google only publishes impression buckets (e.g. 9,000–10,000). The actor returns the upper bound on the top-level `impressionsRange` field, and the per-region lower/upper bounds inside `regionBreakdown[].impressions` — exact impression counts are not available from the source.

##### Do I need a proxy?

No, the actor works without proxies by default. If you experience rate limiting or want to scrape region-specific data from a particular country, enable Apify Proxy in the input.

##### Can I download the ad images and videos?

Yes — set `downloadMedia` to `true`. Thumbnails and variant media are saved to the run's Key-Value Store, and the storage keys are added to each output item under `thumbnail.key` and `variants[].imageStoreKeys`.

##### How many ads can I scrape per run?

Use `maxItems` to cap the number of creatives returned per advertiser search URL. There is no hard upper limit — the actor paginates until the limit or the end of results is reached.

##### Does `maxItems` apply globally or per URL?

Per **start URL**. If you pass three advertiser search URLs with `maxItems: 50`, you can get up to 150 creatives in total.

##### Can I filter by platform, format, or date range?

Yes — add query parameters directly to your start URL: `region`, `platform` (`YOUTUBE`, `SEARCH`, `DISPLAY`, `MAPS`, `SHOPPING`, `PLAY`), `format` (`IMAGE`, `VIDEO`, `TEXT`), `topic`, `start-date`, `end-date`.

##### Can I send the scraped ads directly into Notion?

Yes. Connect Notion in your Apify account settings, pick a database, and set `notionConnector` and `notionDatabaseId` in the input. Every scraped ad becomes a new page in that database. See [Notion Output](#-notion-output-optional) above for the full column contract and AI-agent integration tips.

##### Can my AI agent (Claude / ChatGPT) read the Notion database I'm filling?

Yes — Notion's MCP server exposes read tools (`notion-search`, `notion-fetch`) alongside the write tools this actor uses. Connect Claude Desktop or ChatGPT to the same Notion workspace via its MCP integration, and your agent can query your collected ad data in natural language. The scraper feeds the knowledge base; the agent does the analysis.

##### Can I push the ads into Airtable?

Yes. Duplicate the [pre-built Airtable base template](https://airtable.com/appr7WMd1eNnFvUxi/shr5Pf1KkLcnJApIj/tbl3JipnEyUciX6NT/viwVlcTH5JxZMsMbW), connect Airtable in your Apify account settings, then set `airtableConnector`, `airtableBaseId`, and `airtableTableId` in the input. Each ad creative is appended as a new record in the chosen table. See [Airtable Output](#-airtable-output-optional) above.

### 🔗 More scrapers by Anyx

- [TikTok Trending Hashtags Scraper](https://apify.com/anyxsolutions/tiktok-trending-hashtags-scraper)
- [TikTok Ad Library Scraper](https://apify.com/anyxsolutions/tiktok-ads-scraper)
- [Youtube Scraper](https://apify.com/anyxsolutions/youtube-search-scraper)

### 🤝 Anyx Solutions

We build custom scrapers and data-extraction pipelines.

- Email: tantosthor@gmail.com

**Legal Notice**

This actor is an independent tool for collecting publicly available data from the Google Ads
Transparency Center. It is not affiliated with, endorsed by, or in any way officially connected with
Google LLC or its affiliates.

# Actor input Schema

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

List of Google Ads Transparency Center URLs to scrape. Supported formats:

- Advertiser search: `https://adstransparency.google.com/advertiser/<advertiserId>?region=<region>`
- Creative detail: `https://adstransparency.google.com/advertiser/<advertiserId>/creative/<creativeId>?region=<region>`
- Domain search: `https://adstransparency.google.com/?region=anywhere&domain=<domain>`

Each URL is scraped independently.

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

Maximum number of ad creatives to scrape per advertiser search URL. Detail URLs always return a single item.

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

Proxy configuration. Defaults to no proxy. Enable Apify Proxy if you experience rate limiting or geo-restrictions.

## `cookies` (type: `array`):

Provide cookies to access additional data such as age-restricted ad creatives.

1. Install the Cookie-Editor Chrome extension.
2. Open https://adstransparency.google.com and log in to your Google account.
3. Open Cookie-Editor and export cookies as JSON.
4. Paste the exported JSON here.

## `notionConnector` (type: `string`):

Optional Notion connection, chosen from your saved Apify integrations, for example a connector named "Ad research". When set, every scraped ad creative is added as a new page in the selected Notion database.

## `notionDatabaseId` (type: `string`):

ID of the Notion database that will receive the new pages, for example 5c0b1a2d3e4f5678901234567890abcd. The database must have a title property named `Name`. Required when a Notion Connector is selected.

## `airtableConnector` (type: `string`):

Optional Airtable connection, chosen from your saved Apify integrations, for example a connector named "Creative library". When set, every scraped ad creative is appended as a new record in the selected Airtable table.

## `airtableBaseId` (type: `string`):

ID of the target Airtable base, for example appXY12ab34CD56ef (starts with `app`). Open the base in Airtable — the ID is the second path segment of the URL. Required when an Airtable Connector is selected.

## `airtableTableId` (type: `string`):

ID of the target Airtable table, for example tblXY12ab34CD56ef (starts with `tbl`). Open the table in Airtable — the ID is the third path segment of the URL. Required when an Airtable Connector is selected.

## `downloadMedia` (type: `boolean`):

When enabled, the actor downloads each ad's preview image and variant media (images and videos) and includes references to the saved files in the output. Leave disabled to capture media URLs only.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://adstransparency.google.com/advertiser/AR10852394170916536321?region=anywhere&platform=YOUTUBE&start-date=2022-01-01&end-date=2024-12-31&format=IMAGE"
    }
  ],
  "maxItems": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "downloadMedia": false
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        {
            "url": "https://adstransparency.google.com/advertiser/AR10852394170916536321?region=anywhere&platform=YOUTUBE&start-date=2022-01-01&end-date=2024-12-31&format=IMAGE"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("anyxsolutions/google-ads-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 = { "startUrls": [{ "url": "https://adstransparency.google.com/advertiser/AR10852394170916536321?region=anywhere&platform=YOUTUBE&start-date=2022-01-01&end-date=2024-12-31&format=IMAGE" }] }

# Run the Actor and wait for it to finish
run = client.actor("anyxsolutions/google-ads-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 '{
  "startUrls": [
    {
      "url": "https://adstransparency.google.com/advertiser/AR10852394170916536321?region=anywhere&platform=YOUTUBE&start-date=2022-01-01&end-date=2024-12-31&format=IMAGE"
    }
  ]
}' |
apify call anyxsolutions/google-ads-scraper --silent --output-dataset

```

## MCP server setup

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