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

Google Ads Scraper collects the ad creatives an advertiser runs in the Google Ads Transparency Center from advertiser page URLs or IDs: creative ID and link, format (text, image, video), first and last shown dates, preview link and regions. Export to JSON, CSV or Excel, or use the API.

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

## Pricing

from $1.18 / 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?

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 Scraper — Ad Creatives, Formats, Dates and Regions

Google Ads Scraper extracts the ad creatives any advertiser runs in the Google Ads Transparency Center. Each ad comes back with the advertiser name, creative ID, ad format (text, image or video), first and last shown dates, a preview link and **every region the ad ran in**. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a competitor ad monitoring pipeline. No Google account or cookies needed. Start with one competitor, then add every advertiser in your market.

![Google Ads Scraper output: advertiser, ad format, regions and shown dates as JSON](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/g-google-ads-hero.webp)

***

### What data can I extract with Google Ads Scraper?

Using this Google Ads Transparency Center API, you will be able to extract the following Google Ads Transparency Center ad creative data:

| 🏢 Advertiser name | 🆔 Advertiser ID | 🎨 Creative ID | 🔗 Ad page link |
|---|---|---|---|
| 🧱 Ad format (text, image, video) | 🗓️ First shown date | 📅 Last shown date and time | 👀 Preview link (ad image or preview script) |
| 🌍 Regions the ad ran in | 📍 Region code and name | 🕒 First and last shown date per region | 📈 Impression range (empty: Google hides it from visitors) |

***

### How to use Google Ads Scraper

Marketers, agencies and researchers can scrape Google ads from the public Transparency Center here and get every creative an advertiser runs, with its regions and dates, from one run.

**Copy to your AI assistant:**

```text
Google Ads Scraper (Apify Actor ID: socialdataapi/google-ads-scraper, https://apify.com/socialdataapi/google-ads-scraper) is an Apify Actor that returns the ad creatives an advertiser runs in the Google Ads Transparency Center as structured JSON: advertiser name and ID, creative ID and ad page link, ad format (TEXT, IMAGE or VIDEO), first and last shown dates, a preview link, the regions the ad ran in and per-region first and last shown dates. Use it whenever someone needs Google ads data without cookies, a login, or a browser - competitor Google Ads monitoring, checking which countries a brand advertises in, or collecting ad creatives for research. Inputs: startUrls (string[], required, advertiser page URLs like https://adstransparency.google.com/advertiser/AR04619580580634296321 or advertiser IDs like AR04619580580634296321; the URL's region=XX country code and preset-date=Last+7+days|Last+30+days|Last+90+days|Last+365+days are applied, otherwise the last 365 days across all regions; keywords are skipped), maxItems (integer 1-10000, maximum ad creatives per advertiser, default 10), proxyConfiguration (object, optional Apify Proxy settings for the first attempt, off by default). Each dataset row is one ad creative with the same 10 keys and is billed as one row_result event; there are no summary or error rows. Google does not show impression ranges to logged-out visitors, so the impression bounds are always null, and a region's first shown date is null when Google gives only the last one.
```

#### Google Ads Scraper MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at Apify's MCP server and it can read the Google Ads Transparency Center on its own: the server starts with this Actor already added as a tool, so the agent runs it and reads the rows. No glue code, no scraping logic in your prompts.

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/google-ads-scraper"
```

#### Step by step

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. [Open Google Ads Scraper in the Apify Store](https://apify.com/socialdataapi/google-ads-scraper).
3. Enter the advertiser page URL from the Google Ads Transparency Center, or the advertiser ID (AR…), one per line.
4. Click **Start** (or send your API request).
5. Download or stream your results in JSON, CSV or Excel.

#### How to scale Google Ads Scraper to bulk

Put every advertiser into the same list, one URL or ID per line: one run works through them in order and writes all ad creatives into one dataset. The maximum applies per advertiser, so 50 advertisers at 100 ads each means up to 5,000 rows. To export Google advertiser ads on a regular basis, save the input as an Apify task and run it on a schedule, or start runs through the Apify API with different lists. Each saved ad creative is one `row_result` charge event, so the per-advertiser maximum is also your spend cap.

***

### ✨ Features

This Google Ads transparency scraper fetches clean, structured ad creatives from the Google Ads Transparency Center ⚡. It's ideal for competitor research, agency pitch decks, ad-compliance checks and anyone who has been looking for a Google Ads spy tool that reads Google's own public ad library.

As a Google ads creative extractor, it returns, per ad creative:

- **Regions** – every country the ad ran in, with the first and last shown date in each one when Google lists them
- **Ad format** – text, image or video
- **First and last shown** – when the ad started and the latest time it was shown
- **Preview link** – the archived ad image for text and image ads, or the preview script for video ads
- **Ad page link** – the creative's own page in the Transparency Center
- **Advertiser name and ID** – the verified advertiser behind the ad

⚡ Works as a Google ads library scraper with plain HTTP requests and no browser, so runs stay light and cheap.

***

### Use cases 💡

- **Performance marketer** — list a rival's live ads and the countries they run in.
- **Agency strategist** — export Google advertiser ads into a pitch deck by format and date.
- **Compliance analyst** — check which regions a brand's ads reached and when they last ran.
- **Market researcher** — track how many new ad creatives an advertiser starts each month.
- **AI agent builder** — feed ad formats, regions and dates to an agent as competitor context.

Building an AI agent? [Connect Google Ads Scraper over MCP](#mcp-integration-for-ai-agents) and let it call the actor on its own.

***

### Why choose this actor?

- **A full advertiser in seconds.** A recorded run returned 45 ad creatives from one advertiser in 12.5 seconds, each with its own region list.
- **Where every ad ran.** A recorded text ad came back with 2 regions, Germany and the Netherlands, each with its own first and last shown date.
- **10 fields, three filters.** Every row has the same 10 fields, and the pasted URL can narrow the search by country and by a 7, 30, 90 or 365-day window, on top of the per-advertiser cap.

***

### ⬇️ Input

![Google Ads Scraper input: advertiser URLs or IDs, max ads per advertiser and proxy](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/g-google-ads-input.webp)

The actor takes a list of advertisers: Google Ads Transparency Center advertiser page URLs or advertiser IDs. Only the advertiser list is required.

| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
| `startUrls` | Yes | array of strings | Advertiser page URLs or advertiser IDs (AR…), one per line. A `region=XX` country code and a `preset-date` (Last+7+days, Last+30+days, Last+90+days, Last+365+days) in the URL are applied; without them the last 365 days across all regions are searched. Keywords and other URLs are skipped. | `["https://adstransparency.google.com/advertiser/AR04619580580634296321"]` |
| `maxItems` | No | integer | Maximum ad creatives per advertiser, 1-10000. Default 10. | `50` |
| `proxyConfiguration` | No | object | Optional Apify Proxy settings; off by default. If Google returns nothing or blocks the run, the actor retries through a proxy on its own. | `{"useApifyProxy": false}` |

Accepted entry formats:

- `https://adstransparency.google.com/advertiser/AR04619580580634296321`
- `https://adstransparency.google.com/advertiser/AR14188379519798214657?region=DE&preset-date=Last+30+days`
- `AR04619580580634296321`

#### Free plan limits

Users on the Apify free plan can fetch up to 20 ad creatives per run (all advertisers together) and 200 ad creatives per month. When the limit is reached, the run finishes successfully with a status message explaining the limit. Upgrade to any paid Apify plan to remove these limits.

#### Example input

```json
{
  "startUrls": [
    "https://adstransparency.google.com/advertiser/AR14188379519798214657?region=DE&preset-date=Last+30+days"
  ],
  "maxItems": 45,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

***

### ⬆️ Output

![Google Ads Scraper output: one row per ad creative with 10 keys](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/g-google-ads-output.webp)

Every ad creative is one typed, normalized JSON item with the same 10 keys on every run, and the regions come as a list plus one detail entry per region. You can download the dataset as JSON (default), CSV or Excel, so a Google Ads Transparency to CSV export is one click.

#### Example output

```json
[
  {
    "adLibraryUrl": "https://adstransparency.google.com/advertiser/AR14188379519798214657/creative/CR11282897305843269633",
    "advertiserId": "AR14188379519798214657",
    "advertiserName": "Google LLC",
    "creativeId": "CR11282897305843269633",
    "creativeRegions": [
      "Germany",
      "Netherlands, Kingdom of the"
    ],
    "firstShown": "2026-06-23",
    "format": "TEXT",
    "lastShown": "2026-10-01T08:10:42.961360Z",
    "previewUrl": "https://tpc.googlesyndication.com/archive/simgad/12346452286702390493",
    "regionStats": [
      {
        "regionCode": "NL",
        "regionName": "Netherlands, Kingdom of the",
        "firstShown": "2026-06-23",
        "lastShown": "2026-10-01",
        "impressions": {
          "lowerBound": null,
          "upperBound": null
        }
      },
      {
        "regionCode": "DE",
        "regionName": "Germany",
        "firstShown": "2026-06-23",
        "lastShown": "2026-09-29",
        "impressions": {
          "lowerBound": null,
          "upperBound": null
        }
      }
    ]
  }
]
```

***

### How does it work?

The actor reads the same public ad library any visitor of the Google Ads Transparency Center can browse, so it never needs a Google account. For each advertiser it collects the ad creatives, applying the country and date window from your URL, until your maximum is reached, and adds the regions each ad ran in. There is no browser: requests are plain HTTP, direct by default or through your proxy settings, and when Google blocks or returns nothing the actor retries with a proxy, three attempts per advertiser. It returns only publicly visible data, what any logged-out visitor sees. Every row keeps the same 10 keys; when Google doesn't show a value, the key stays and the value is empty.

***

### How do you integrate Google Ads Scraper into your stack?

It works with what you already use: the Apify REST API from any language, MCP for AI agents, and no-code tools.

#### MCP integration for AI agents

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/google-ads-scraper"
```

This registers Apify's MCP server in your client with this Actor already loaded as a tool; your agent calls it directly, passing the same JSON input you would use in the Console. Sign in with your Apify account when the client asks. Compatible clients include Claude Code, Cursor and Windsurf.

#### No-code tools (n8n, Make, LangChain)

**n8n:** add the Apify node, choose "Run an Actor", pick this Actor and pass the same JSON input; the next node receives the ad creative rows.

**Make:** use the Apify app's "Run an Actor" module, then "Get Dataset Items" to map the advertiser name, ad format and regions into Google Sheets or a CRM.

**LangChain:** the `langchain-apify` package's `ApifyActorsTool` runs an Apify Actor by its ID (`socialdataapi/google-ads-scraper`); the agent then gets the ad creative rows back as tool output.

***

### Is it legal to scrape Google Ads Transparency Center data?

Scraping publicly available Google Ads Transparency Center data is generally legal: Google publishes this ad library so anyone can see who advertises and where. Google Ads Scraper returns only publicly available data, what any user sees without logging in. Under the GDPR, scraping public data is generally permissible, but storing and using it must comply with local data-protection law, and an advertiser name can identify a person when the advertiser is an individual. Consult legal counsel if your use case involves bulk storage of personal data.

***

### Frequently asked questions

#### What fields does Google Ads Scraper return?

Each ad creative comes back with its advertiser name, ad format, first and last shown dates, preview link and the regions it ran in, among 10 fields in total. See [the data fields section](#what-data-can-i-extract-with-google-ads-scraper).

#### Does Google Ads Scraper require a Google Ads Transparency Center account or login?

No. Only public ad creative data is read, so no credentials, cookies or Google API key are needed.

#### How fast does Google Ads Scraper run?

A recorded run returned 45 ad creatives from one advertiser in 12.5 seconds, including the regions of every ad (local run on 2026-10-01). Data is live on every run, not cached.

#### What happens if an ad creative is private or doesn't exist?

An advertiser with no ads in the chosen country and date window adds no rows; the actor tries three times, switching to a proxy, then logs a warning and moves on. Keywords and URLs that are not advertiser pages are skipped with a warning, and a run where no entry is an advertiser URL or ID stops with an error message. If the regions of an ad cannot be read, the row is still saved with empty region fields. In code, group rows by advertiser ID and treat an advertiser with no rows as "nothing found".

#### Can I scrape multiple Google Ads Transparency Center ad creatives at once?

Yes. Put every advertiser URL or ID into one list; each advertiser returns up to your per-advertiser maximum into the same dataset.

#### Does Google Ads Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes — it is available as an MCP tool through Apify's MCP server. Register the server in Claude Code, Cursor or Windsurf:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/google-ads-scraper"
```

The server starts with this Actor already added as a tool, so your agent can call it right away. Any agent that can call an HTTP endpoint can use the Apify REST API directly.

#### Does Google Ads Scraper return data in a format LLMs can use directly?

Yes. Every row is typed, normalized JSON with the same field names on every run. No HTML parsing, no selectors: pass it straight to an LLM, index it into a vector store, or feed it to an agent tool, with no transformation step.

#### What happens when Google Ads Transparency Center changes its layout or updates its anti-bot system?

The output keys stay the same, so your code keeps working; fields hit by a change on Google's side come back empty until the actor is updated. The actor was last checked against the live Transparency Center on 2026-10-01.

#### Can I use Google Ads Scraper without managing proxies or browser infrastructure?

Yes. There is no browser to run and no proxy account to set up: the actor connects directly by default and, when Google returns nothing, retries through a proxy on its own. You start a run and get structured JSON back.

#### Which Google Ads Transparency Center ad creative fields work best for AI training data and RAG indexing?

For RAG indexing: the advertiser name, region names and ad format describe each creative in words, and the preview link points at the ad itself. For training data: the first and last shown dates, the region codes and the per-region dates are consistent, comparable values. Values are typed (strings, lists and nested objects), so no normalization is needed.

***

### Your feedback

Found a bug or missing a field? Let us know on the Issues tab of this Actor's page in Apify Console. Include the advertiser URLs you ran, so the problem can be reproduced quickly.

# Actor input Schema

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

One entry per advertiser:
• 🔗 Advertiser page URL from the Google Ads Transparency Center, e.g. https://adstransparency.google.com/advertiser/AR04619580580634296321
• 🆔 Advertiser ID starting with AR, e.g. AR04619580580634296321

Optional URL filters are applied: region=US (two-letter country code; 'anywhere' = all regions) and preset-date=Last+7+days / Last+30+days / Last+90+days / Last+365+days. Without preset-date the last 365 days are searched.

⏭️ Keywords and other URLs are not supported and are skipped.

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

Maximum number of ad creatives to collect for each advertiser entry (1-10000). Free plan: up to 20 ad creatives per run (all advertisers together) and 200 per month; paid plans have no limit.

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

Optional. Turn on a proxy to send the actor's requests through it; off by default (direct connection). If Google returns nothing or blocks the run, the actor retries through a proxy on its own (3 attempts per advertiser).

## Actor input object example

```json
{
  "startUrls": [
    "https://adstransparency.google.com/advertiser/AR04619580580634296321",
    "AR04619580580634296321",
    "advertising",
    "marketing"
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All ad creatives in the run's default dataset (view: default).

# 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": [
        "https://adstransparency.google.com/advertiser/AR04619580580634296321"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialdataapi/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": ["https://adstransparency.google.com/advertiser/AR04619580580634296321"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("socialdataapi/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": [
    "https://adstransparency.google.com/advertiser/AR04619580580634296321"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call socialdataapi/google-ads-scraper --silent --output-dataset

```

## MCP server setup

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