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

Scrape Google Ads Transparency Center creatives from domains, keywords, advertiser IDs, or URLs. Export dates, formats, media URLs, copy, targeting, impressions, and platform filters for competitor research.

- **URL**: https://apify.com/maximedupre/google-ads-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Marketing, Business, Lead generation
- **Features:** Limited permissions
- **Stats:** 108 total users, 20 monthly users, 99.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.65 / 1,000 scraped 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 library scraper for Transparency Center creatives

Google Ads Scraper extracts public ad creatives from the Google Ads Transparency Center. It is for marketers, PPC teams, and analysts who want to see what ads a brand runs. Add a domain, keyword, advertiser ID, creative ID, or Transparency Center URL. You get one row per ad with advertiser IDs, creative IDs, formats, shown dates, ad copy, media URLs, targeting, impressions, and variants when Google shows them.

- Run **[Google Ads library research](https://apify.com/maximedupre/google-ads-scraper/examples/google-ads-library-research)** to build an archive of public ad creatives by brand, domain, keyword, or advertiser ID.
- Use the **[Google Ads Transparency data exporter](https://apify.com/maximedupre/google-ads-scraper/examples/google-ads-transparency-data-exporter)** to send ad IDs, dates, formats, and links to CSV, JSON, Excel, or your BI tool.
- Set up **[competitor ad monitoring](https://apify.com/maximedupre/google-ads-scraper/examples/competitor-ad-monitoring)** to see when brands start new Search, YouTube, Shopping, Maps, or Play ads.
- Start a **[PPC creative analysis](https://apify.com/maximedupre/google-ads-scraper/examples/ppc-creative-analysis)** to compare ad copy, images, videos, targeting, and impression ranges.
- Do a **[known creative refresh](https://apify.com/maximedupre/google-ads-scraper/examples/known-creative-refresh)** to update shown dates and details for ads you already saved.

#### 📦 Google ad data you get

Each dataset row is one Google Ads Transparency Center creative. Every row has the same fields, so your tools can read one stable shape.

- **Ad identity:** advertiser ID, advertiser name, legal name, region, verified status, and creative ID.
- **Ad copy:** headline, body text, display URL, landing page URL, and call-to-action label.
- **Media:** image URLs, video URLs, a preview URL, and a saved HTML preview file.
- **Timing:** first shown date, last shown date, and number of days shown.
- **Reach and targeting:** impression ranges, targeting flags, and stats by region and Google platform.
- **Variants:** each creative version with its own copy, links, images, and videos.

Google does not show every field for every ad. When a value is missing, the field is `null` or an empty array. The Actor does not guess values.

#### 🚀 How to scrape Google ads

1. Add one or more values in **Targets**. You can use domains such as `nike.com`, keywords, advertiser IDs, creative IDs, or Google Ads Transparency Center URLs.
2. Set **Maximum ads** to cap the number of ads for the whole run.
3. Choose a **Region**, or pick **Worldwide**.
4. If you want, choose a **Platform**, **Ad format**, **Start date**, or **End date**.
5. Run the Actor. Then export the dataset or read it through the Apify API.

For a first run, keep the `nike.com` target, region `US`, and **Maximum ads** set to `10`.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `targets` | array of strings | Required. Domains, keywords, advertiser IDs, creative IDs, or Google Ads Transparency Center URLs. Duplicate and empty values are skipped. The form starts with `nike.com`. |
| `maxResults` | integer | Most ads to save across all targets. Use `0` or leave it empty to get all available ads. The form starts with `10`. |
| `region` | string | Two-letter country code, such as `US` or `SE`. Use an empty value for Worldwide. Default: `US`. |
| `platform` | string | `google_search`, `youtube`, `google_shopping`, `google_maps`, or `google_play`. Empty means all platforms. Default: empty. |
| `adFormat` | string | `text`, `image`, or `video`. Empty means all formats. For Shopping ads, choose `google_shopping` in `platform`. Default: empty. |
| `dateFrom` | string | Optional. Keep ads shown on or after this date, in `YYYY-MM-DD` form. |
| `dateTo` | string | Optional. Keep ads shown on or before this date, in `YYYY-MM-DD` form. It must not be before `dateFrom`. |

**Example input**

```json
{
  "targets": [
    "nike.com"
  ],
  "maxResults": 10,
  "region": "US",
  "platform": "",
  "adFormat": ""
}
```

#### 🧾 Output

**Output fields**

| Field | Type | What it does |
| --- | --- | --- |
| `submittedTarget` | string | The input target that found this ad. |
| `advertiserId` | string | Google Ads Transparency Center advertiser ID. |
| `advertiserName` | string | Advertiser name shown by Google. |
| `advertiserLegalName` | string or null | Legal advertiser name, when Google shows it. |
| `advertiserRegionCode` | string or null | Advertiser region code, when Google shows it. |
| `advertiserVerified` | boolean or null | Whether Google marks the advertiser as verified. |
| `creativeId` | string | Google creative ID for the ad. |
| `format` | string | `text`, `image`, `video`, or `unknown`. |
| `adUrl` | string | Google Ads Transparency Center page for this ad. |
| `creativePreviewUrl` | string or null | Google-hosted preview link for the creative. |
| `previewDownloadUrl` | string or null | Link to download the ad preview as an HTML file. |
| `firstShown` | string | First date Google reports the ad was shown, in `YYYY-MM-DD` form. |
| `lastShown` | string | Last date Google reports the ad was shown, in `YYYY-MM-DD` form. |
| `totalDaysShown` | integer | About how many days the ad was shown. |
| `headline` | string or null | Ad headline or product title, when available. |
| `body` | string or null | Ad body or description text, when available. |
| `cta` | string or null | Call-to-action label, when available. |
| `displayUrl` | string or null | Website address shown in the ad, when available. |
| `destinationUrl` | string or null | Landing page link, when available. |
| `imageUrls` | array of strings | Image file URLs for the creative. |
| `videoUrls` | array of strings | Video file or playback links for the creative. |
| `impressions` | object or null | Overall impression range, when Google shows it. |
| `impressions.lowerBound` | integer or null | Lowest impression count reported. |
| `impressions.upperBound` | integer or null | Highest impression count reported. |
| `targeting` | object or null | Targeting flags, when Google shows them. |
| `targeting.demographics` | object | `included` and `excluded` flags (boolean or null) for demographic targeting. |
| `targeting.geography` | object | `included` and `excluded` flags for location targeting. |
| `targeting.contextual` | object | `included` and `excluded` flags for context targeting. |
| `targeting.customerLists` | object | `included` and `excluded` flags for customer-list targeting. |
| `targeting.topicsOfInterest` | object | `included` and `excluded` flags for interest targeting. |
| `regionStats` | array of objects | Stats for each country or region where the ad was shown. |
| `regionStats.regionCode` | string | Country or region code. |
| `regionStats.regionName` | string | Country or region name. |
| `regionStats.firstShown` | string or null | First shown date in this region. |
| `regionStats.lastShown` | string or null | Last shown date in this region. |
| `regionStats.impressions` | object or null | Impression range in this region, with `lowerBound` and `upperBound`. |
| `regionStats.platformStats` | array of objects | Impression ranges by Google platform in this region. Each item has the same fields as `platformStats`. |
| `platformStats` | array of objects | Overall impression ranges by Google platform. Left out when Google gives no overall ranges. |
| `platformStats.platform` | string | `google_search`, `youtube`, `google_shopping`, `google_maps`, `google_play`, or `unknown`. |
| `platformStats.platformName` | string | Platform name reported by Google. |
| `platformStats.impressions` | object or null | Impression range, with `lowerBound` and `upperBound`. |
| `variants` | array of objects | Each version of the creative. |
| `variants.headline` | string or null | Headline or product title for this version. |
| `variants.body` | string or null | Body or description text for this version. |
| `variants.displayUrl` | string or null | Website address shown in this version. |
| `variants.destinationUrl` | string or null | Landing page link for this version. |
| `variants.cta` | string or null | Call-to-action label for this version. |
| `variants.imageUrls` | array of strings | Image file URLs for this version. |
| `variants.videoUrls` | array of strings | Video file or playback links for this version. |

**Example ad**

```json
{
  "submittedTarget": "nike.com",
  "advertiserId": "AR16735076323512287233",
  "advertiserName": "Nike, Inc.",
  "advertiserLegalName": "Nike, Inc.",
  "advertiserRegionCode": "US",
  "advertiserVerified": true,
  "creativeId": "CR13798212767800360961",
  "format": "text",
  "adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR13798212767800360961",
  "creativePreviewUrl": "https://displayads-formats.googleusercontent.com/ads/preview/content.js?client=ads-integrity-transparency&obfuscatedCustomerId=9975158271&creativeId=681045306684&uiFeatures=12&adGroupId=145820412956&versionId=4&assets=%3DH4sIAAAAAAAAAONS4OLkOHpg28G1TALMXBwcN66eWSspwMjFybF6N1iQUYqd49_SpXOX8Uixc1x9_2h_B5MUO0dD46yHmzil2DnO9b079odJio3j2eSDbb5S7Bwz_txbDVZy9PfUpadBmp70gJWwc8yGSc2DMRq7Xj-fBGKc6ACpAQDxWbZvjQAAAA&allowedVariations=39&sig=ACiVB_z2Hyrb2YHR8mN2wXCHboy0IG26TQ&htmlParentId=fletch-render-12062201132597990860&responseCallback=fletchCallback12062201132597990860",
  "previewDownloadUrl": "https://api.apify.com/v2/key-value-stores/shctdJCS6pQyRAD9y/records/preview-CR13798212767800360961.html?signature=1iPNotShmCTquPSjposGW",
  "firstShown": "2023-11-17",
  "lastShown": "2026-10-30",
  "totalDaysShown": 1079,
  "headline": "Nike® Official Site",
  "body": "Nike® basketball shoes for your young athletes. Designed with comfort and mobility.",
  "cta": null,
  "displayUrl": "nike.com",
  "destinationUrl": null,
  "imageUrls": [
    "https://tpc.googlesyndication.com/archive/simgad/13127716173736170281",
    "https://tpc.googlesyndication.com/archive/simgad/9030713188503643279",
    "https://tpc.googlesyndication.com/archive/simgad/15393350721185562867",
    "https://tpc.googlesyndication.com/archive/simgad/10965413325068165946"
  ],
  "videoUrls": [],
  "impressions": null,
  "targeting": null,
  "regionStats": [
    {
      "regionCode": "US",
      "regionName": "United States",
      "firstShown": null,
      "lastShown": "2026-10-29",
      "impressions": null,
      "platformStats": []
    }
  ],
  "variants": [
    {
      "headline": null,
      "body": null,
      "displayUrl": null,
      "destinationUrl": null,
      "cta": null,
      "imageUrls": [
        "https://tpc.googlesyndication.com/archive/simgad/13127716173736170281"
      ],
      "videoUrls": []
    },
    {
      "headline": null,
      "body": null,
      "displayUrl": null,
      "destinationUrl": null,
      "cta": null,
      "imageUrls": [
        "https://tpc.googlesyndication.com/archive/simgad/9030713188503643279"
      ],
      "videoUrls": []
    },
    {
      "headline": null,
      "body": null,
      "displayUrl": null,
      "destinationUrl": null,
      "cta": null,
      "imageUrls": [
        "https://tpc.googlesyndication.com/archive/simgad/15393350721185562867"
      ],
      "videoUrls": []
    },
    {
      "headline": null,
      "body": null,
      "displayUrl": null,
      "destinationUrl": null,
      "cta": null,
      "imageUrls": [
        "https://tpc.googlesyndication.com/archive/simgad/10965413325068165946"
      ],
      "videoUrls": []
    },
    {
      "headline": "Nike® Official Site",
      "body": "Nike® basketball shoes for your young athletes. Designed with comfort and mobility.",
      "displayUrl": "nike.com",
      "destinationUrl": null,
      "cta": null,
      "imageUrls": [],
      "videoUrls": []
    }
  ]
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. You pay only for ads saved to your dataset.

- **Scraped ad**: one Google ad saved to your dataset, with all the details the Actor could get for it.

The price per ad depends on your Apify plan. It is $0.0009 on the Free and Bronze plans, $0.0008 on Silver, and $0.00065 on Gold and higher plans. For example, 1,000 ads on the Free plan cost $0.90. A target that finds no ads adds no ad charge. When your spending limit is reached, the Actor stops saving new ads.

These plan prices start on November 13, 2026. Until then, each saved ad has two charges: $0.0007 for the **Scraped ad** event and $0.0001 for the **Added ad detail** event. That is $0.0008 per ad, so 1,000 ads cost $0.80.

#### 🔌 Integrations

https://www.youtube.com/watch?v=bNACk1_S_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

- Use the Apify API to send Google Ads creative rows to your own app or data warehouse.
- Schedule recurring runs to monitor brands, domains, or advertiser IDs.
- Export results as JSON, CSV, Excel, XML, RSS, or HTML.
- Connect webhooks to alert your team when a run finishes.
- Send rows to BI tools, spreadsheets, CRM workflows, or internal reporting systems.

#### ❓ FAQ

##### Why do some ads have no headline or body text?

Google does not share readable text for every ad. When the Actor cannot read the text, `headline` and `body` stay `null`. It does not guess missing text.

##### Can I search by advertiser ID or creative ID?

Yes. Add an advertiser ID such as `AR16735076323512287233`. For one ad, add its Google Ads Transparency Center creative URL.

##### How do I get every ad from a domain?

Add the domain in **Targets** and set **Maximum ads** to `0`. The Actor then saves all ads it can find for that domain and your filters.

##### Why are some fields empty?

Google Ads Transparency Center does not show every field for every ad. Copy, landing page links, impression ranges, targeting, region stats, platform stats, and media links can be missing on some ads.

##### Do I need a Google Ads account?

No. The Actor reads public Google Ads Transparency Center data. You do not need a Google Ads account, Google cookies, or a Google API key.

##### Is this a Google Ads library scraper?

Yes. It scrapes the public Google Ads Transparency Center, which many people call the Google Ads library. It does not read private Google Ads account data.

##### Can it scrape live Google Search ads?

No. This Actor reads the Google Ads Transparency Center archive. For live paid Shopping ads on Google Search pages, use Google Shopping Ads Scraper from the related Actors below.

##### Why not use the Google Ads API?

The Google Ads API is for account and campaign data you are allowed to access. This Actor is for public ad research across domains, advertisers, keywords, and Google Ads Transparency Center URLs.

##### What are Google Ads Transparency Center alternatives?

For live Shopping ads, use a Google Shopping ads scraper. For other ad libraries, use tools made for that platform, such as LinkedIn, TikTok, Pinterest, or Snapchat ad scrapers.

### 📝 Changelog

**v1.0** (30-10-2026)

- Every row now has full ad details, so the `detailLevel` input is removed. Remove it from saved inputs. The separate details charge ends when the new prices start on November 13, 2026.
- The `downloadMedia` input and the `storedMedia` output field are removed. The Actor no longer saves its own copies of ad images and videos. Use `imageUrls` and `videoUrls` for links to the ad media. The new `previewDownloadUrl` field links to a saved HTML copy of the ad preview when one is available.
- The `shopping` choice is removed from the `adFormat` input and from the `format` output field. Shopping is a place where ads show, not an ad format. To find Shopping ads, set `platform` to `google_shopping`.
- Ad rows now fill `headline` and `body` from the ad preview when Google has that text, so fewer rows have empty ad copy.
- New `cta` and `advertiserVerified` output fields show the call to action and whether Google marks the advertiser as verified.

**v0.1**

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~google-ads-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Google Shopping Ads Scraper](https://apify.com/maximedupre/google-shopping-ads-scraper): see live paid Shopping ads on Google Search, with prices and merchants.
- [LinkedIn Ads Library Scraper](https://apify.com/maximedupre/linkedin-ads-library): research the same brands' B2B ads in the LinkedIn Ads Library.
- [TikTok Creative Center Scraper for Top Ads](https://apify.com/maximedupre/tiktok-creative-center-scraper): compare Google creatives with top TikTok ads.
- [Pinterest Ads Scraper](https://apify.com/maximedupre/pinterest-ads): collect public Pinterest ads with targeting and reach data.
- [Snapchat Ads Scraper](https://apify.com/maximedupre/snapchat-ads): check a brand's ads in the Snapchat Ads Gallery.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Enter domains, keywords, advertiser IDs, creative IDs, or Google Ads Transparency Center URLs.

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

Stop after this many ad rows across all targets. Leave blank or use 0 to get all available ads.

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

Choose a country or Worldwide. For another country, enter its two-letter country code, such as SE for Sweden.

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

Collect ads from all Google platforms or one platform.

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

Collect all formats or choose Text, Image, or Video. To find Shopping ads, choose Google Shopping under Platform.

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

Return ads shown on or after this date.

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

Return ads shown on or before this date.

## Actor input object example

```json
{
  "targets": [
    "nike.com"
  ],
  "maxResults": 10,
  "region": "US",
  "platform": "",
  "adFormat": ""
}
```

# Actor output Schema

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

Google Ads creative rows with advertiser IDs, creative IDs, dates, formats, source URLs, copy, media arrays, variants, targeting, and impression data when available.

# 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": [
        "nike.com"
    ],
    "maxResults": 10,
    "region": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/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 = {
    "targets": ["nike.com"],
    "maxResults": 10,
    "region": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/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 '{
  "targets": [
    "nike.com"
  ],
  "maxResults": 10,
  "region": "US"
}' |
apify call maximedupre/google-ads-scraper --silent --output-dataset

```

## MCP server setup

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