# Google News Scraper & Keyword News Alerts Monitor (`mosaicked_sponge/google-news-monitor`) Actor

Google News scraper for any keyword or topic. Get headlines, real publisher URLs, dates, snippets and images in any language or country, from the last hour to the last year. Monitor mode returns only new articles for scheduled news alerts.

- **URL**: https://apify.com/mosaicked_sponge/google-news-monitor.md
- **Developed by:** [Jason](https://apify.com/mosaicked_sponge) (community)
- **Categories:** News, Automation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 news articles

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 News Scraper & Keyword News Alerts Monitor

Track any keyword, brand, person or topic on **Google News** and get one clean row per article: headline, **real publisher URL** (not a news.google.com redirect), source, publish time, snippet, image and author. Run it once for research, or schedule it as a **news alert** that returns only articles you have not seen before.

![Google News Scraper & Keyword News Alerts Monitor - sample output](https://api.apify.com/v2/key-value-stores/QpfrAb6wndEDB0tDd/records/output-aJAUhjHZVJADxF9Ab.png)

- **Many searches per run.** Up to 500 keywords and 8 Google News topics in one run, with no 5-query cap.
- **Google search operators work:** `"exact phrase"`, `OR`, `-exclude`, `site:reuters.com`, `intitle:`.
- **Any language and country edition:** `en-US`, `en-GB`, `de-DE`, `es-419/MX`, `fr-FR`, `pt-BR`, `ja-JP` and more.
- **Strict time windows** from the last hour to the last year, or a custom date range. Articles outside the window are dropped, even when Google returns them, and you are never charged for them.
- **More than 100 articles per keyword.** Google gives about 100 per search; above that, the Actor walks your time window day by day (up to 5,000 per keyword).
- **"New articles only" monitor mode** remembers what earlier runs returned, so a scheduled daily or hourly run gives you just the fresh news. Perfect for Slack, email, Zapier, Make or n8n alerts.
- **Duplicates merged across keywords:** one row per article, with every keyword that matched.
- **Fast and light.** Pure HTTP (RSS), no browser and no proxy needed. 100 articles with real URLs usually take a few seconds.

### What you get for each article

| Field | Example |
|---|---|
| `title` | `Nvidia beats estimates as data center sales jump` (the " - Source" suffix is removed) |
| `url` | `https://www.reuters.com/technology/...` (the real publisher URL) |
| `urlResolved` | `true` (`false` means the Google News link was kept) |
| `source` / `sourceDomain` | `Reuters` / `reuters.com` |
| `publishedAt` | `2026-10-20T15:32:07Z` (ISO 8601, UTC) |
| `snippet` | the article's description from the publisher page |
| `imageUrl` / `author` | preview image and author, when the publisher provides them |
| `query` / `matchedQueries` | the keyword(s) that found the article |
| `isNew` | `true` if no earlier run of this monitor returned it |
| `rank` | position in the Google News feed |
| `googleNewsUrl`, `articleId` | the original Google News link and ID |
| `relatedCoverage` | for topic feeds: other outlets covering the same story |
| `language`, `country`, `scrapedAt`, `detailsStatus` | context |

### Pricing

Pay per article saved. No subscription, and no charge for runs that find nothing.

| Apify plan | Price per 1,000 articles |
|---|---|
| Free / Starter | **$3.00** ($0.003 per article) |
| Scale | **$2.80** |
| Business and up | **$0.75** |

Plus a tiny $0.00005 start fee per run. Articles outside your time window, excluded sources, duplicates and (in monitor mode) articles you already received are **not charged**. Example: a daily alert for 10 keywords that finds 40 new articles a day costs about **$3.60 a month** on the free plan. You can set a maximum cost per run; the Actor stops cleanly when it is reached.

### Input example

```json
{
  "queries": ["\"OpenAI\" OR \"Anthropic\"", "electric vehicles -tesla", "site:reuters.com inflation"],
  "topics": ["TECHNOLOGY"],
  "timeWindow": "24h",
  "language": "en",
  "country": "US",
  "maxArticlesPerQuery": 100,
  "mode": "newOnly"
}
```

### Set up a news alert in 2 minutes

1. Enter your keywords and pick a time window a bit longer than your schedule (for example, run daily with "Last 2 days").
2. Set **Mode** to **New articles only**.
3. Click **Schedule** and choose daily or hourly.
4. Add an integration (Slack, email, Google Sheets, Zapier, Make, n8n or a webhook) to receive each run's new articles.

The memory is kept per set of keywords + language + country in a named key-value store, so different monitors never mix. Set a **Monitor ID** if you want to edit keywords without starting fresh.

### Output summary

Every run also writes an `OUTPUT` record with a status for each keyword (`ok`, `no_results`, `no_results_in_window`, `rate_limited`, `invalid_query`), how many articles were found, dropped as out-of-window or excluded, skipped as already seen, and how many URLs were resolved. If a run finds nothing, the status message explains why, and no rows (and no article charges) are created.

### Good to know

- Google News search returns up to about 100 articles per keyword per request. For very niche keywords, there may simply be fewer articles.
- `snippet`, `imageUrl` and `author` come from the publisher's page meta tags. A few publishers block automated requests; those rows still have the title, real URL, source and date, with `detailsStatus` showing the reason. Turn off "Add snippet, image and author" for maximum speed.
- Only public headline metadata is collected; the Actor does not copy article text. Respect the publishers' terms when you reuse content.

### FAQ

**Can I use it from n8n, Make, Zapier or my own code?** Yes. Call the Actor through the Apify API or an integration and read the dataset. API calls that don't set `mode` run as a monitor (new articles only).

**Why did my run return 0 articles?** Either there is no news for your keywords in that window, or (in monitor mode) everything was already returned by an earlier run. The status message and `OUTPUT` record say which. You are only charged the start fee.

**Can I get articles older than a year?** Use "Published after/before" with a custom date range.

# Actor input Schema

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

One Google News search per line. Google operators work: "exact phrase", OR, -exclude, site:reuters.com, intitle:word. Up to 500 queries per run. Leave empty if you only want topics.

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

Google News top stories for a section, in the chosen language and country. Can be combined with queries.

## `timeWindow` (type: `string`):

Only articles published within this period. Filtering is strict: anything older is dropped, even if Google returns it. Ignored when 'Published after/before' is set.

## `maxArticlesPerQuery` (type: `integer`):

Google News gives up to about 100 articles per search. Above 100, the Actor walks the time window day by day to collect more (up to 5,000 per query).

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

'New articles only' (monitor) returns only articles not returned by an earlier run with the same queries, language and country; perfect for scheduled alerts. 'All articles' returns everything that matches every time. The form opens on 'All articles' so a test run always shows results. API calls that omit this field use 'New articles only'.

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

Google News edition language code, e.g. en, es, de, fr, it, pt-BR, ja, zh-CN, es-419.

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

2-letter country code of the Google News edition, e.g. US, GB, IN, CA, AU, DE, FR, BR, MX.

## `resolvePublisherUrls` (type: `boolean`):

Turn news.google.com redirect links into the real article URL (e.g. https://www.reuters.com/...). If a link cannot be resolved, the Google News link is kept and urlResolved is false.

## `fetchArticleDetails` (type: `boolean`):

Reads the top of each article page (meta tags only) to add a description snippet, the preview image and the author. Needs 'Resolve real publisher URLs'. Turn off for maximum speed.

## `dedupeAcrossQueries` (type: `boolean`):

If the same article matches several queries, return it once and list every matching query in matchedQueries.

## `excludeSources` (type: `array`):

Publisher names or domains to skip, e.g. 'Yahoo Finance' or 'msn.com'. Excluded articles are not charged.

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

Hard cap on rows for the whole run, newest first.

## `publishedAfter` (type: `string`):

Custom range start: YYYY-MM-DD, an ISO datetime, or relative like '3 days' / '12 hours'. Overrides the time window.

## `publishedBefore` (type: `string`):

Custom range end: YYYY-MM-DD or an ISO datetime.

## `stateStoreName` (type: `string`):

Named key-value store that remembers which articles were already returned (for 'New articles only'). Leave as is unless you want separate memory.

## `monitorId` (type: `string`):

By default, memory is keyed by your queries + language + country, so editing the queries starts fresh. Set an ID to keep one memory even when you edit the queries.

## Actor input object example

```json
{
  "queries": [
    "artificial intelligence"
  ],
  "timeWindow": "7d",
  "maxArticlesPerQuery": 25,
  "mode": "all",
  "language": "en",
  "country": "US",
  "resolvePublisherUrls": true,
  "fetchArticleDetails": true,
  "dedupeAcrossQueries": true,
  "maxArticles": 0,
  "stateStoreName": "google-news-monitor-state"
}
```

# Actor output Schema

## `articles` (type: `string`):

One row per news article.

## `summary` (type: `string`):

OUTPUT record: status per query, counts, skipped duplicates.

# 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": [
        "artificial intelligence"
    ],
    "maxArticlesPerQuery": 25,
    "mode": "all"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mosaicked_sponge/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": ["artificial intelligence"],
    "maxArticlesPerQuery": 25,
    "mode": "all",
}

# Run the Actor and wait for it to finish
run = client.actor("mosaicked_sponge/google-news-monitor").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 '{
  "queries": [
    "artificial intelligence"
  ],
  "maxArticlesPerQuery": 25,
  "mode": "all"
}' |
apify call mosaicked_sponge/google-news-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mosaicked_sponge/google-news-monitor"
        }
    }
}
```

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/aJAUhjHZVJADxF9Ab/builds/131bDEhJizUdDGszw/openapi.json
