# Google News Monitor: Keyword, Topic & Local Alerts (`antndev/google-news-monitor`) Actor

Track Google News by keyword, topic or place across any language and country. Cross-feed deduplication, include and exclude filters, publisher allow and block lists, monitor mode that returns only new articles, and webhook alerts.

- **URL**: https://apify.com/antndev/google-news-monitor.md
- **Developed by:** [Anton König](https://apify.com/antndev) (community)
- **Categories:** News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#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 News Monitor: Keyword, Topic & Local Alerts

Track **Google News** by keyword, by section topic or by place, in **any language and country edition**, and get a clean deduplicated list back. Run it once for a snapshot, or schedule it in monitor mode so it returns **only articles you have not seen before**, optionally pushed to your webhook.

No API key, no scraping of publisher sites: it reads Google News' own public RSS feeds.

### Why this one

- **Three feed types in one run.** Keyword searches, section topics (BUSINESS, TECHNOLOGY, SCIENCE, ...) and local news by place, combined and deduplicated together.
- **Cross-feed deduplication.** The same story shows up under several queries and locales. You get one row per story, with an `also_matched` list showing which other queries caught it, which is exactly what you want when you monitor a brand and its competitors at once.
- **Real filters.** Include terms, exclude terms, publisher allow list and publisher block list. Cutting the two publishers that flood every query is usually the difference between a usable alert and an ignored one.
- **Monitor mode.** Scheduled runs remember what they already returned and emit only new articles, so a quiet hour costs almost nothing.
- **Any edition.** German-Swiss, French, Italian, US, whatever `hl`/`gl`/`ceid` combination you need. Local coverage by city works too.

### Output

```json
{
  "title": "Example headline about the thing you monitor",
  "source": "Reuters",
  "published": "2026-07-29T19:09:00+00:00",
  "url": "https://news.google.com/rss/articles/...",
  "snippet": "Reuters",
  "feed_kind": "search",
  "feed_value": "\"prediction markets\"",
  "locale": "en-US/US",
  "also_matched": ["topic:BUSINESS"],
  "is_new": true
}
```

### Typical setups

**Brand and competitor monitoring**
`queries: ["\"Your Company\"", "Competitor A", "Competitor B"]`, `monitorMode: true`, plus a `webhookUrl`. Schedule every 15 or 30 minutes.

**Swiss or German local news**
`geoPlaces: ["Zurich","Bern"]`, `language: "de"`, `country: "CH"`, `ceid: "CH:de"`.

**Sector watch with the noise removed**
`topics: ["TECHNOLOGY","SCIENCE"]`, `mustContain: ["AI","semiconductor"]`, `blockSources: ["Example Aggregator"]`.

### Input

| Field | Default | Meaning |
|---|---|---|
| `queries` | none | keyword searches (quotes and OR work) |
| `topics` | none | WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH |
| `geoPlaces` | none | city or region names for local news |
| `language` / `country` / `ceid` | en-US / US / auto | which Google News edition to read |
| `mustContain` / `mustNotContain` | none | keyword filters |
| `onlySources` / `blockSources` | none | publisher allow and block lists |
| `monitorMode` | false | only articles not returned before |
| `webhookUrl` | none | POST new articles as JSON |
| `maxArticles` | 200 | cap per run |

### Honest limitations

- **Headline, publisher, timestamp, link and the feed's own short snippet. No article bodies.** That is a deliberate choice: it is what the feed provides and what can be passed on. If you need full text, fetch it yourself from the publisher under their terms.
- **Article links are Google News redirect links.** Google now serves a JavaScript interstitial on those, so the publisher's direct URL is not recoverable server-side. The links work normally in a browser, and the publisher name is always returned separately.
- Each feed returns roughly 70 to 100 recent items, so this is a monitoring tool for current coverage rather than a historical archive. For history, run it on a schedule and let your dataset accumulate.
- Google decides which stories match a query and which publishers appear per edition. Coverage differs between editions, which is a feature when you compare them and a caveat when you do not.

### Keywords

google news api, google news scraper, news monitoring, brand monitoring, media monitoring, press alerts, keyword news alerts, local news scraper, google news rss, competitor monitoring, news webhook

# Actor input Schema

## `queries` (type: `array`):

Keyword searches, one per line. Quotes and operators work, for example "prediction markets" or tesla OR rivian.

## `topics` (type: `array`):

Google News section topics: WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH.

## `geoPlaces` (type: `array`):

City or region names for local coverage, for example Zurich, Berlin, Chicago. Use the spelling Google News uses for that place.

## `language` (type: `string`):

Interface and content language, for example en-US, de, fr, it.

## `country` (type: `string`):

Two-letter country code that decides which edition is read, for example US, CH, DE.

## `ceid` (type: `string`):

Google News edition id such as US:en or CH:de. Derived from country and language when left empty.

## `mustContain` (type: `array`):

Keep only articles whose headline, snippet or publisher contains at least one of these terms.

## `mustNotContain` (type: `array`):

Drop articles containing any of these terms. Useful for cutting recurring noise.

## `onlySources` (type: `array`):

Keep only articles from publishers whose name contains one of these strings, for example Reuters, Bloomberg.

## `blockSources` (type: `array`):

Drop articles from publishers whose name contains one of these strings.

## `monitorMode` (type: `boolean`):

For scheduled runs: remembers which articles were already returned and emits only new ones. This is how you turn it into an alerting job.

## `webhookUrl` (type: `string`):

POSTs the new articles as JSON, so alerts can drive your own Slack, Discord or internal tool.

## `maxArticles` (type: `integer`):

Cap on returned articles after deduplication and filtering.

## Actor input object example

```json
{
  "queries": [
    "\"prediction markets\""
  ],
  "language": "en-US",
  "country": "US",
  "monitorMode": false,
  "maxArticles": 200
}
```

# 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 = {
    "queries": [
        "\"prediction markets\""
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("antndev/google-news-monitor").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 = { "queries": ["\"prediction markets\""] }

# Run the Actor and wait for it to finish
run = client.actor("antndev/google-news-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "\\"prediction markets\\""
  ]
}' |
apify call antndev/google-news-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=antndev/google-news-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/e2ZqLNHHbciQOLje1/builds/HLYLYdzINWqjIhKel/openapi.json
