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

Scrape Google Ads Transparency Center at 1,000+ ads/min. Get creatives, headlines, targeting, impression stats, regional breakdowns by platform. Search by advertiser URL or keyword. Pay per result from $0.40/1k.

- **URL**: https://apify.com/scrapesmith/google-ads-scraper.md
- **Developed by:** [Scrape Smith](https://apify.com/scrapesmith) (community)
- **Categories:** Developer tools, Automation, Lead generation
- **Stats:** 16 total users, 10 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 results

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?

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 Scraper — See Every Ad Your Competitors Are Running

**Every ad running on Google is public. This turns that archive into a spreadsheet.**

Google is legally required to publish every ad it serves — the creative, when it ran, where it ran, and who paid for it. This scraper pulls that data for any advertiser: ad creatives, impression estimates, audience targeting, country-by-country breakdowns and platform splits across Search, YouTube, Display, Shopping, Maps and Gmail.

No login. No cookies. No Google account. No API key. 🔓

***

### 🎯 What People Use It For

#### 🕵️ Competitive intelligence

See exactly what your competitors are advertising right now — every headline, every image, every video, in every country. Not an estimate, not a sample: the actual creatives Google is serving.

#### 📈 Creative research at scale

Pull thousands of ads across an industry and find the patterns. Which formats dominate, which headlines repeat, how long the winners stay live before they're rotated out.

#### 🌍 Market entry and expansion

Check whether a competitor is already advertising in a market before you enter it. Regional stats show which countries they're spending in and roughly how heavily.

#### 📊 Brand and agency monitoring

Track a brand's advertising over time. Re-run weekly and you have a spend-and-creative timeline nobody else is building.

#### ⚖️ Transparency and compliance

Political advertising, disclosure checks, and ad-archive research — straight from Google's own public record.

***

### ✨ Why This One

| | |
|---|---|
| 🧾 **The deepest field set available** | Impression ranges, audience targeting, per-country stats, platform splits and creative variants — not just a list of image URLs. |
| 💸 **A fraction of the price** | Pay-per-result, and cheaper per result than every comparable scraper on the Store. |
| 🪶 **Runs light** | Built to run in a small memory footprint, so runs stay cheap and start fast. |
| 🎯 **Filter before you pay** | Narrow by country and ad format so you only collect — and only pay for — what you actually need. |
| ♻️ **Interruption-safe** | Long runs resume where they stopped. The same ad is never billed twice. |
| 🚫 **No silent gaps** | If a run can't finish, it says so loudly instead of handing you a partial dataset that looks complete. |

***

### 🚀 Getting Started

**Search by keyword** — type a brand and it finds the advertiser:

```json
{
  "searchQueries": ["Nike", "Booking.com"],
  "maxResults": 500
}
```

**Or paste an advertiser URL** straight from the Transparency Center:

```json
{
  "urls": [
    { "url": "https://adstransparency.google.com/advertiser/AR16735076323512287233" }
  ],
  "maxResults": 1000
}
```

Results stream into your dataset as they're scraped — download as **JSON, CSV, Excel, XML or HTML**, or pull them live from the API.

#### ⚙️ Options

| Setting | What it does |
|---|---|
| **Advertiser URLs** | Transparency Center links. Mix as many advertisers as you like. |
| **Search queries** | Brand or advertiser names — no URL needed. |
| **Max results** | Hard ceiling on how many ads get collected and billed. |
| **Region** | Only ads shown in one country (e.g. `2840` US, `2826` UK, `2276` Germany). |
| **Ad format** | `TEXT`, `IMAGE` or `VIDEO` only. |
| **Skip details** | Faster, cheaper list-only mode — identity, dates and creative link, without targeting or impressions. |

***

### 📦 What You Get For Every Ad

#### 🆔 Identity and creative

| Field | Description |
|---|---|
| `advertiser_id` · `advertiser_name` | Who is paying for the ad |
| `legal_name` | The advertiser's registered legal entity |
| `creative_id` · `ad_url` | Ad identifier and a direct link to view it |
| `format` | TEXT, IMAGE or VIDEO |
| `preview_url` | The creative itself |
| `width` · `height` | Creative dimensions |
| `variations` · `variant_count` | Every variant — headlines, body copy, images, click-through URLs |

#### 📅 Timing

| Field | Description |
|---|---|
| `first_shown` · `last_shown` | When the ad started and last appeared |
| `days_served` | How long it has been running |

#### 📊 Reach and placement

| Field | Description |
|---|---|
| `aggregate_stats` | Overall impression range and platform split |
| `region_stats` | Per-country impressions, dates and platform breakdown |
| `platforms` | Google Search, YouTube, Display, Shopping, Maps, Gmail |
| `targeting` | Gender, age, parental status, household income — with include/exclude flags |
| `topic_id` | The advertiser's category |

#### 🔗 Advanced identifiers

| Field | Description |
|---|---|
| `google_customer_id` · `google_creative_id` · `ad_group_id` | Google's internal account and creative references, where exposed |

***

### 📄 Example Output

```json
{
  "advertiser_id": "AR02934798844673654785",
  "advertiser_name": "Booking.com",
  "legal_name": "Booking.com B.V.",
  "creative_id": "CR11891324709456838657",
  "format": "TEXT",
  "first_shown": "2025-07-08T10:14:29Z",
  "last_shown": "2026-07-28T16:16:53Z",
  "days_served": 385,
  "width": 348,
  "height": 133,
  "variant_count": 1,
  "targeting": {
    "gender": { "included": true, "excluded": false },
    "age": { "included": true, "excluded": false }
  },
  "region_stats": [
    {
      "region_code": "US",
      "region_id": 2840,
      "impressions_lower": 100000,
      "impressions_upper": 125000,
      "first_shown": "2025-07-08",
      "last_shown": "2026-07-28",
      "platforms": [
        { "platform": "YouTube", "impressions_lower": 7000, "impressions_upper": 8000 }
      ]
    }
  ],
  "aggregate_stats": {
    "impressions_lower": 150000,
    "impressions_upper": 200000,
    "first_shown": "2025-07-08",
    "last_shown": "2026-07-28"
  },
  "ad_url": "https://adstransparency.google.com/advertiser/AR02934798844673654785/creative/CR11891324709456838657"
}
```

***

### ❓ Frequently Asked Questions

**Do I need a Google account or login?**
No. The Ads Transparency Center is a public archive — this collects only what any visitor can already see.

**Is this legal?**
Yes. Google publishes this archive to satisfy advertising transparency regulations; it is public by design. How you use the data is still subject to normal data-protection rules.

**How far back does the data go?**
As far as Google's archive does — commonly several years. Ads running since 2022 and earlier appear regularly.

**Are impression numbers exact?**
No — Google publishes them as ranges, so you get a lower and upper bound rather than a precise count. That's a limit of the source, not the scraper.

**Why do some ads have fewer fields than others?**
Google exposes different information depending on the ad type. Image ads carry creative dimensions; some formats instead expose internal campaign identifiers. Every field that exists for a given ad is returned.

**Can I get ads for a specific country only?**
Yes — set the region filter and you'll only collect ads shown there.

**What if an advertiser has millions of ads?**
Large advertisers can have millions archived. Use `maxResults` to cap the run, and the region and format filters to narrow it before you start.

**What happens if I search a brand that doesn't advertise?**
The run finishes cleanly with zero results and you aren't charged for it.

***

### 💡 Tips

- **Start with 10–20 ads** to confirm the fields match what you need, then scale.
- **Use skip-details** when you only need the ad list — it's much faster and cheaper.
- **Filter by region** rather than collecting globally and discarding later; you pay for what you collect.
- **Schedule a weekly run** on key competitors to build a creative timeline.
- **Search by keyword first** to find the advertiser ID, then use the URL for repeat runs.

***

### 🆘 Support

Found an advertiser that should work but doesn't? Open an issue on the Actor page with the advertiser URL.

# Actor input Schema

## `urls` (type: `array`):

Google Ads Transparency Center advertiser URLs (e.g. https://adstransparency.google.com/advertiser/AR...)

## `searchQueries` (type: `array`):

Search for advertisers by name, keyword, or domain (e.g. 'Nike', 'Amazon', 'nike.com'). Returns ads from the top matching advertiser.

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

Maximum number of ads to scrape per run.

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

Skip fetching detailed info (targeting, impressions, regional stats) for each ad. Much faster but fewer fields.

## `region` (type: `integer`):

Filter ads by region (Google Geo Target ID). Examples: 2840=US, 2826=GB, 2276=DE, 2250=FR, 2380=IT, 2724=ES, 2036=AU, 2124=CA, 2356=IN, 2392=JP, 2076=BR.

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

Filter by ad format.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://adstransparency.google.com/advertiser/AR16735076323512287233"
    }
  ],
  "maxResults": 10,
  "skipDetails": false
}
```

# 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 = {
    "urls": [
        {
            "url": "https://adstransparency.google.com/advertiser/AR16735076323512287233"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesmith/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 = { "urls": [{ "url": "https://adstransparency.google.com/advertiser/AR16735076323512287233" }] }

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

```

## MCP server setup

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