# Political Ad Spend Tracker: Google Election Ads Spend & Surges (`clearfeedlabs/political-ad-spend-tracker`) Actor

Who is spending on political ads, where and how fast. Official Google Political Ads transparency data: advertiser spend, weekly trends, surge alerts, state breakdown. No scraping, no login.

- **URL**: https://apify.com/clearfeedlabs/political-ad-spend-tracker.md
- **Developed by:** [Clearfeed Labs](https://apify.com/clearfeedlabs) (community)
- **Categories:** Marketing, News, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 advertiser rows

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?

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

### Political Ad Spend Tracker: Google Election Ads Spend, Trends & Surge Alerts

**Political Ad Spend Tracker** turns Google's official **Political Advertising transparency dataset** into a clean, ranked feed of **who is spending on election ads, where, and how fast it's changing**. Instead of scraping ad pages one at a time, it reads the complete public dataset Google publishes for researchers and journalists, so every run covers **every verified election advertiser** in the regions Google covers (e.g. US, UK, India, Brazil, Australia), refreshed by Google daily.

Built for **campaigns and consultants, PACs and advocacy groups, political journalists and newsrooms, media buyers and ad-sales teams, researchers and prediction-market / policy analysts**.

- **Leaderboards**: top spenders by country, by state (e.g. all advertisers spending in PA), or by name ("for Senate", "PAC").
- **Trends**: spend in the last N weeks vs. the N weeks before, change %, and a plain label: `surging`, `rising`, `steady`, `falling`, `stopped`, `new-spending`.
- **Surge filter**: return only advertisers that just doubled their spend or just started spending.
- **Change mode** (`changesSinceLastRun`): schedule it daily and get only advertisers whose lifetime spend grew since your last run, with the increase.
- **Add-ons (off by default)**: 52 weeks of weekly spend history; spend by state / region.
- One flat row per advertiser, with the official Google Ads Transparency Center link.

No login, no API key, no cookies, no proxies and no page scraping: one documented public dataset, downloaded politely with an identifying User-Agent.

#### Why this one

| | Political Ad Spend Tracker | Typical "Google Ads Transparency scraper" |
|---|---|---|
| Coverage | Every verified election advertiser in the dataset, each run | Only the advertisers/pages you feed it |
| Spend numbers | Lifetime, weekly, recent vs. prior window, by state | Usually none, or a single range per ad |
| Trend / surge detection | Built in (`trend`, `changePct`, surge filter) | None |
| Change alerts | Only advertisers whose spend grew since last run | Full re-scrape every time |
| Method | Official bulk dataset Google publishes for public download | Automated browsing of the Transparency Center UI |
| Speed | ~15 seconds for a full country | Minutes to hours |

#### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| Advertiser row | **$0.003** ($3 per 1,000) | Each advertiser returned |
| Spend alert | $0.005 | Change mode only, only for an advertiser whose spend grew (replaces the row charge). The first change-mode run is a baseline billed as normal rows. |
| Weekly history add-on | +$0.002 per row | Only if `addWeeklyHistory` is on |
| State breakdown add-on | +$0.002 per row | Only if `addStateBreakdown` is on |
| Actor start | $0.00005 | Apify's standard start event |

**How that compares:** Google Ads Transparency scrapers on the Store charge roughly **$1 to $5 per 1,000 ads**, and you still have to aggregate ads into spend yourself. One of our rows already *is* the aggregate (lifetime + weekly + trend), so a "top 100 US political spenders this month" report costs about **$0.30**. In change mode you pay only for advertisers that actually moved.

**Billing examples (change mode, 100 advertisers):** baseline run = 100 advertiser rows = $0.30; next run with no spend changes = start event only; a run where 8 advertisers increased spend = 8 alerts = $0.04. Use **Max charge per run** in Apify to cap any run.

#### Input examples

Top 100 US spenders over the last 4 weeks:

```json
{ "regions": ["US"], "sortBy": "recentSpend", "maxItems": 100 }
```

Who is surging in Pennsylvania, with state breakdown:

```json
{ "regions": ["US"], "states": ["PA"], "trendFilter": "surging", "addStateBreakdown": true, "maxItems": 50 }
```

Daily alert on Senate campaigns (schedule this):

```json
{ "regions": ["US"], "advertiserSearch": ["for Senate"], "mode": "changesSinceLastRun", "stateKey": "senate-watch", "maxItems": 500 }
```

#### Output (one row)

`rowType` (`advertiser` or `spend-alert`), `advertiserId`, `advertiserName`, `regions`, `elections`, `totalCreatives`, `spendCurrency`, `totalSpend`, `totalSpendUsd`, `recentWeeks`, `recentSpend`, `priorPeriodSpend`, `changePct`, `trend`, `firstWeek`, `lastActiveWeek`, `transparencyUrl`, `dataUpdated` (Google's dataset publication timestamp), `latestIncludedWeek` (newest week in the weekly-spend file), plus `isNew`, `previousTotalSpend`, `spendIncreaseSinceLastRun` in change mode, `weeklySpend[]` and `topStates[]` with the add-ons. A `SUMMARY` record shows totals and any warnings.

#### Notes on the numbers

- Google reports spend **rounded (typically to the nearest $100)** and in the advertiser's reporting currency; `spendCurrency` tells you which. `minTotalSpendUsd` applies to USD spend.
- The most recent week may still be filling in. Trend windows end at the latest week in Google's data (`latestIncludedWeek`); check `dataUpdated` for when Google last published the file.
- **Currencies are never mixed.** Each row is in its own `spendCurrency`; no cross-currency totals or conversions are made, and ranking happens within each currency (USD rows first, then other currencies grouped).
- **EU:** Google retired its EU Political Ads Transparency Report in September 2025 and restricted political ads in the EU, so EU data is historical, not continuous current coverage. Coverage and history vary by country.
- Coverage is Google's **election ads** program (Search, YouTube, Display) only: not Meta, TV or issue ads outside Google's definition.
- Filters by state use Google's own subdivision codes (e.g. `TX`, `CA`).

#### Data source and legal notes

- **Source:** Google's "Political advertising on Google" transparency report dataset, which Google publishes as a public download (`storage.googleapis.com/political-csv/`) for researchers, journalists and the public. We read only the files we need with standard HTTP range requests and an identifying User-Agent; no Google pages are scraped and no access controls are bypassed.
- Advertiser names are those of **verified election advertisers** that Google publishes for transparency. No personal contact data is collected.
- This Actor is not affiliated with or endorsed by Google. Google, YouTube and Google Ads are trademarks of Google LLC.

#### Disclaimer

This Actor reorganizes public transparency data **as is**. It is **not legal, campaign-finance, compliance or investment advice**, and it isn't an official record of campaign expenditures (for that, see the FEC or your state election authority). Google's figures are rounded, can be revised, and may lag. Verify important numbers on the linked Transparency Center page before you publish or act on them. Don't use the output to harass or target individuals.

#### Support

Found a problem or want a field added? Open an issue on this Actor's **Issues** tab; we fix things fast. More Clearfeed Labs data feeds: [clearfeedlabs.com](https://clearfeedlabs.com).

### Related Clearfeed Labs Actors

- [Congress Voting Record Tracker: Votes, Bills & Cited Flags](https://apify.com/clearfeedlabs/legislator-record-tracker): U.S. House roll-call voting records
- [USAspending Scraper: Federal Contract & Grant Award Alerts](https://apify.com/clearfeedlabs/money-trail-federal-awards): federal contract and grant awards with recompete details
- [311 Complaints by District: Pain-Point & Spike Tracker](https://apify.com/clearfeedlabs/district-pain-point-tracker): 311 complaint spikes by council district
- [All Clearfeed Labs Actors](https://apify.com/clearfeedlabs)

# Actor input Schema

## `regions` (type: `array`):

Two-letter country codes the advertiser is verified for (e.g. US, GB, BR, IN, AU). Leave empty for all countries.

## `states` (type: `array`):

Only advertisers that spent in these subdivisions, e.g. TX, CA, PA (codes as in Google's report).

## `advertiserSearch` (type: `array`):

Case-insensitive name matches, e.g. "for Senate", "PAC", "Harris".

## `advertiserIds` (type: `array`):

Google advertiser IDs (start with AR...).

## `minTotalSpendUsd` (type: `integer`):

Skip small advertisers. Applies to USD spend.

## `recentWeeks` (type: `integer`):

Compares spend in the last N weeks with the N weeks before to compute trend and change %.

## `trendFilter` (type: `string`):

Keep only advertisers with this recent spend trend.

## `sortBy` (type: `string`):

Order of results.

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

Maximum advertiser rows (each row is charged).

## `mode` (type: `string`):

Change mode remembers lifetime spend per advertiser (per watchlist name) and returns only new or increased spenders.

## `stateKey` (type: `string`):

Separate histories for different watches.

## `addWeeklyHistory` (type: `boolean`):

Up to 52 most recent weeks of spend per advertiser.

## `addStateBreakdown` (type: `boolean`):

Top 15 subdivisions by lifetime spend per advertiser.

## Actor input object example

```json
{
  "regions": [
    "US"
  ],
  "recentWeeks": 4,
  "trendFilter": "any",
  "sortBy": "recentSpend",
  "maxItems": 100,
  "mode": "all",
  "stateKey": "default",
  "addWeeklyHistory": false,
  "addStateBreakdown": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "regions": [
        "US"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearfeedlabs/political-ad-spend-tracker").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 = { "regions": ["US"] }

# Run the Actor and wait for it to finish
run = client.actor("clearfeedlabs/political-ad-spend-tracker").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 '{
  "regions": [
    "US"
  ]
}' |
apify call clearfeedlabs/political-ad-spend-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clearfeedlabs/political-ad-spend-tracker"
        }
    }
}
```

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/RDBLuUqvz4Q4LahWR/builds/iwZQVj78bR8ZAThBa/openapi.json
