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

Extract up to 400 ads per minute along with text, image and video ads from Google Ads, scraped from the ad library provided by the Google Ads Transparency Center. Gain access to ad details, ad copy, locations and more for a faster competitive edge.

- **URL**: https://apify.com/silva95gustavo/google-ads-scraper.md
- **Developed by:** [Gustavo Silva (Coherent Paradox)](https://apify.com/silva95gustavo) (community)
- **Categories:** Lead generation, Agents, Integrations
- **Stats:** 4,529 total users, 378 monthly users, 99.4% runs succeeded, 226 bookmarks
- **User rating**: 4.90 out of 5 stars

## Pricing

from $0.90 / 1,000 ads

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?

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

**⚡ Fetch up to 400 ads per minute** with this powerful and efficient Google Ads scraper.

### 🔎 What is Google Ads Scraper?

It's a simple and powerful tool that allows you to extract data from Google Ads by reading data from its official public ad library, the [Google Ads Transparency Center](https://adstransparency.google.com/).

To get that data, just insert the intended URL from the [Google Ads Transparency Center](https://adstransparency.google.com/) and click the "Save & Start" button.

### 📊 What Google Ads data can I extract?

All ad formats are supported by this Google Ads API, meaning that it can extract text, image, and video ads.
With this API, you will be able to extract the following data:

🔐 **Core ad details**

- Ad format (text, image, video)
- Full ad URL
- Preview image URL
- Headline and description
- Call-to-action label
- Ad variations

🌍 **Reach & targeting (when available)**

- Geo-regions where the ad is displayed
- Number of impressions (with breakdown by region and platform)
- First seen and last seen dates
- Audience selections

🖼 **Media assets**

- Image URL (for image ads)
- Video URL (for video ads)

### 📖 How to use

#### ⬇️ Input

The input for the Google Ads Scraper should be a Google Ads Transparency Center URL after a specific advertiser has been selected.
It is important to ensure that the input URL starts with `https://adstransparency.google.com/advertiser/AR<advertiser_id>/...`.

**Example start URL:** `https://adstransparency.google.com/advertiser/AR08888592736429539329?authuser=0&region=CH&preset-date=Last+30+days`

You can obtain an input start URL in one of two ways:

**Option 1 - Selecting an advertiser from the list of ads:**

1. Start at the [Google Ads Transparency Center](https://adstransparency.google.com/).
2. Search for ads from the advertiser you are interested in.
3. In the list view, click the intended advertiser's name, which should be displayed at the bottom of the card corresponding to each ad.
4. Copy the current browser URL and use it as input in this scraper.

![selecting an advertiser from the list of ads](https://i.postimg.cc/9fc4S7cV/selecting-an-advertiser-from-the-list-of-ads.png)

**Option 2 - Searching for an advertiser or domain:**

1. Start at the [Google Ads Transparency Center](https://adstransparency.google.com/).
2. Using the search feature of the Google Ads Transparency Center, type the name of your advertiser.
3. From the search dropdown, choose a result that corresponds to a single advertiser or a domain name. If you see an entry mentioning that "multiple advertiser accounts have a similar name", do not select it — instead use Option 1 above (selecting an advertiser from the list of ads).
4. Copy the current browser URL and use it as input in this scraper.

![searching for an advertiser or domain directly](https://i.postimg.cc/q7Qtdv7r/searching-for-an-advertiser-or-domain-directly.png)

#### ⬆️ Output

The extracted ad data is stored in a dataset, accessible in the **Storage** tab. It’s available in **JSON, JSONL, Excel, HTML, CSV, or XML** and allows seamless integration with tools like **Clay, ChatGPT, n8n, or your automation workflows**.

Each item will contain an ad, as shown in the following example:

```json
{
    "adLibraryUrl": "https://adstransparency.google.com/advertiser/AR08888592736429539329/creative/CR08436770543486631937",
    "advertiserId": "AR08888592736429539329",
    "advertiserName": "Niantic, Inc.",
    "creativeId": "CR08436770543486631937",
    "firstShown": "2023-07-04",
    "format": "IMAGE",
    "lastShown": "2024-05-17",
    "numServedDays": 191,
    "previewUrl": "https://tpc.googlesyndication.com/archive/simgad/12683072185372151324",
    "regionStats": [
        {
            "regionCode": "DE",
            "regionName": "Germany",
            "firstShown": "2023-07-04",
            "lastShown": "2024-05-17",
            "impressions": {
                "lowerBound": 1000,
                "upperBound": 2000
            },
            "surfaceServingStats": [
                {
                    "surfaceCode": "YOUTUBE",
                    "surfaceName": "YouTube",
                    "impressions": {
                        "lowerBound": 1000,
                        "upperBound": 2000
                    }
                },
                {
                    "surfaceCode": "SEARCH",
                    "surfaceName": "Google Search",
                    "impressions": {
                        "lowerBound": 0,
                        "upperBound": 1000
                    }
                }
            ]
        }
    ],
    "startUrl": "https://adstransparency.google.com/advertiser/AR08888592736429539329region=DE",
    "targeting": {
        "targetingCategory": {
            "demographics": {
                "1": true,
                "2": false
            },
            "geography": {
                "1": true,
                "2": true
            },
            "contextual": {
                "1": true,
                "2": true
            },
            "advertiserList": {
                "1": false,
                "2": true
            }
        }
    },
    "variations": [
        {
            "clickUrl": "https://play.google.com/store/apps/details?id=com.nianticlabs.pokemongo",
            "cta": "INSTALL",
            "description": "Catch Pokémon, battle other Trainers, raid with friends, and more in Pokémon GO",
            "imageUrl": "https://tpc.googlesyndication.com/simgad/16977068568541754968"
        },
        {
            "clickUrl": "https://play.google.com/store/apps/details?id=com.nianticlabs.pokemongo",
            "cta": "INSTALL",
            "description": "Catch Pokémon, battle other Trainers, raid with friends, and more in Pokémon GO",
            "imageUrl": "https://tpc.googlesyndication.com/simgad/678465867037824019"
        }
    ]
}
```

### ❓ Frequently Asked Questions (FAQs)

#### How many ads can you scrape with Google Ads Scraper?

This scraper has an unlimited appetite for ads and will automatically scroll down the list of results until it reaches the end. You can fetch up to **400 ads per minute** when the "Skip details" input option is active, providing exceptional speed for large-scale data collection. Without this optimization, the scraper will still extract all ads with full details at a more comprehensive pace.

Happy scraping and may your data flow freely! 🚀😄

#### Why am I missing some ads in the results?

If you notice that some ads are missing, try running a search in an incognito/private browsing window. If the missing ads are age-restricted, they won’t appear unless you’re logged in. Since the scraper runs without authentication by default, these ads won’t be included.

If the issue persists and isn’t related to age restrictions, please report it via the [Issues](https://apify.com/silva95gustavo/google-ads-scraper/issues) tab. Most issues are resolved within 24 hours.

#### What types of ads and data does the scraper extract?

Google Ads Scraper extracts all types of ads—text, image, and video — along with all relevant data, including ad copy, advertiser details, locations, and more. If you notice that something is missing, please report it via the [Issues](https://apify.com/silva95gustavo/google-ads-scraper/issues) tab, and we’ll look into it.

#### Can I integrate this scraper with Clay?

Yes! You can integrate Google Ads Scraper with Clay to automatically pull ad data into your Clay workflows. Clay users can connect the scraper via Apify’s API and retrieve ad insights directly into their automation.

To set up Google Ads Scraper with Clay, follow [this official Clay guide on integrating Apify](https://www.clay.com/university/guide/apify-integration-overview).

Watch our step-by-step video tutorial to learn how to:

- Connect Google Ads Scraper to your Clay workspace
- Set up automated data collection
- Transform and analyze your ad data in Clay
- Create powerful automations with your ad insights

https://youtu.be/b-O50P8UKW4

If you need help integrating Google Ads Scraper with Clay, feel free to open an issue via the [Issues](https://apify.com/silva95gustavo/google-ads-scraper/issues) tab, and we'll be happy to assist!

#### Can I integrate this scraper with n8n?

Yes! You can integrate Google Ads Scraper with n8n using the dedicated n8n node for seamless automation.

The n8n node for Google Ads Scraper is available on npm: [n8n-nodes-google-ads-scraper](https://www.npmjs.com/package/n8n-nodes-google-ads-scraper).

If you need help integrating Google Ads Scraper with n8n, feel free to open an issue via the [Issues](https://apify.com/silva95gustavo/google-ads-scraper/issues) tab, and we'll be happy to assist!

#### Is this the best Google Ads Scraper for you?

This is the fastest, most cost-effective, and most complete Google Ads Scraper available. It provides more data per ad at a lower cost per result than any alternative. With performance reaching up to 400 ads per minute (when "Skip details" is enabled), you can collect large datasets in minutes instead of hours.

If you have any concerns or questions before subscribing, feel free to [reach out through any contact method listed in our profile](https://apify.com/silva95gustavo) — we'll be happy to clarify anything! Most questions, issues, and feature requests are handled in less than 24 hours.

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

Scraping Google Ads is legal as long as you adhere to regulations concerning scraping, copyright, and personal data.

If you're unsure whether your reason is legitimate, consult your lawyers. You should not scrape data unless you have a legitimate reason to do so. You can also read [Apify's blog post on the legality of web scraping and ethical scraping](https://blog.apify.com/is-web-scraping-legal/).

</details>

### 👥 Scrape LinkedIn Ads

If you are also interested in scraping ads from LinkedIn, please check out our [LinkedIn Ads Scraper](https://apify.com/silva95gustavo/linkedin-ad-library-scraper).

### 🎵 Scrape TikTok Ads

Looking to extract ads from TikTok as well? Try our [TikTok Ads Scraper](https://apify.com/silva95gustavo/tiktok-ads-scraper).

### 💬 Your feedback

Let us know if you have any feedback or feature requests through the [Issues](https://apify.com/silva95gustavo/google-ads-scraper/issues) tab. Your input helps drive future improvements.

By using this Actor, you agree to the [Coherent Paradox Apify Actor Terms](https://coherentparadox.com/apify-actor-terms/).

# Actor input Schema

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

A list of Google Ads Transparency Center URLs after a specific advertiser or domain is selected. Each URL must start with "https://adstransparency.google.com/..."

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

Maximum number of results per input URL. Due to the concurrent nature of the actor, the actual number of requests may exceed the configured maximum.

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

If true, the actor will not open the details page for each individual ad. Instead, it will only scroll through the list of ads. All ads will be included, but the information for each ad may be less complete. Enabling this option results in much faster scraping.

## `shouldDownloadAssets` (type: `boolean`):

Defines if the scraper should download creative assets (such as video ads) when the original URLs scraped have short expiry dates. This allows for more permanent storage of the files. Disclaimer: use this option with caution to avoid downloading excessive data from Google, which could be considered abusive. This option is ignored if "Skip details" is enabled.

## `shouldDownloadPreviews` (type: `boolean`):

Defines if the scraper should download creative previews as an HTML file, ensuring that the output field `previewUrl` is always populated. Enabling this option may slightly increase costs due to writes to a key-value store.

## `ocr` (type: `boolean`):

Enables OCR (Optical Character Recognition) using AI for text ads, allowing the scraper to extract text from images in text ads. This is useful for ads that do not have text content directly available as copyable text. Note: Enabling OCR will significantly slow down the scraping speed. OCR is not perfect and may miss or misread some text. This option is ignored if "Skip details" is enabled.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://adstransparency.google.com/advertiser/AR08888592736429539329?authuser=0&region=CH&preset-date=Last+30+days"
    }
  ],
  "skipDetails": false,
  "shouldDownloadAssets": false,
  "shouldDownloadPreviews": false,
  "ocr": false
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://adstransparency.google.com/advertiser/AR08888592736429539329?authuser=0&region=CH&preset-date=Last+30+days"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("silva95gustavo/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/AR08888592736429539329?authuser=0&region=CH&preset-date=Last+30+days" }] }

# Run the Actor and wait for it to finish
run = client.actor("silva95gustavo/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/AR08888592736429539329?authuser=0&region=CH&preset-date=Last+30+days"
    }
  ]
}' |
apify call silva95gustavo/google-ads-scraper --silent --output-dataset

```

## MCP server setup

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