# Google News Scraper — Canonical URLs & Brand Tracking (`logiover/google-news-scraper`) Actor

Scrape Google News by keyword, brand, or topic across 50+ countries. Returns canonical publisher URLs (not Google redirects), source domains, dates, snippets, and thumbnails. Filter by date range or source. 100+ results per query, 3-second cold start, no proxy required.

- **URL**: https://apify.com/logiover/google-news-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** News, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## News Monitor Pro — Brand & Topic Tracking

> **Track news for any keyword, brand, or topic across 50+ countries and 30+ languages. Get real article URLs, source domains, thumbnails — not just Google redirect links.**

The only Google News scraper that gives you **canonical publisher URLs** (not Google redirects), **source domains**, **thumbnails**, **date filters**, **source whitelists/blacklists**, and **100+ results per query** via smart time-window stitching. Pure HTTP — **3-second cold start**, no proxy required.

---

### 🎯 Use cases

- **PR / brand monitoring** — Track every mention of your company or competitors across the global news cycle
- **SEO / content teams** — Discover which publishers cover your industry, monitor backlink opportunities
- **Investment research** — Real-time news signals for stocks, crypto, commodities, geopolitical events
- **Crisis monitoring** — Hourly scheduled runs alert your team when negative coverage breaks
- **Content curation** — Build daily newsletters, briefings, RSS-to-Slack pipelines
- **AI / ML training** — Clean, structured news datasets for NLP, sentiment analysis, summarization models
- **Market research** — Track industry trends across countries, languages, and time windows
- **Compliance / regulatory monitoring** — Watch news for keywords across regulated industries (pharma, finance, etc.)

---

### ✨ Why this scraper beats the rest

| Feature | This actor | Other Google News scrapers |
|---|---|---|
| Canonical publisher URLs (not Google redirects) | ✅ Built-in | ❌ Premium upsell or missing |
| Source domain extraction | ✅ | ❌ Source name only |
| Thumbnail image URLs | ✅ | ❌ |
| Date range filter (from/to) | ✅ | ❌ |
| Source whitelist / blacklist | ✅ | ❌ |
| 100+ articles per query (time-window stitching) | ✅ | ❌ Capped at 100 |
| Top headlines + topic + geo + search (all 4 modes) | ✅ | ⚠️ Search only or topic only |
| Multi-query batch with cross-dedup | ✅ | ⚠️ Some |
| Pure HTTP (no browser, no proxy) | ✅ 3s cold start | ✅ Same |

---

### 📥 Input

#### Quick start — search for a brand

```json
{
  "queries": ["openai", "anthropic claude"],
  "maxArticles": 50,
  "language": "en-US",
  "country": "US"
}
````

#### Search with operators

Google News supports full search operator syntax in queries:

| Operator | Meaning | Example |
|---|---|---|
| `"phrase"` | Exact match | `"climate policy"` |
| `OR` | Boolean OR | `tesla OR spacex` |
| `-word` | Exclude | `apple -fruit` |
| `site:domain.com` | Limit to source | `apify site:techcrunch.com` |
| `intitle:word` | In title only | `intitle:OpenAI` |

```json
{
  "queries": ["\"artificial intelligence\" -hype site:reuters.com"],
  "maxArticles": 100
}
```

#### Browse by topic (curated top stories)

```json
{
  "topic": "TECHNOLOGY",
  "language": "en-US",
  "country": "US",
  "maxArticles": 50
}
```

Available topics: `WORLD`, `NATION`, `BUSINESS`, `TECHNOLOGY`, `ENTERTAINMENT`, `SPORTS`, `SCIENCE`, `HEALTH`.

#### News from a specific location

```json
{
  "geoLocation": "London",
  "language": "en-GB",
  "country": "GB",
  "maxArticles": 30
}
```

#### Top headlines (daily digest)

```json
{
  "topHeadlines": true,
  "language": "en-US",
  "country": "US"
}
```

#### Power features — time range + source filter

```json
{
  "queries": ["climate change"],
  "maxArticles": 200,
  "fromDate": "2026-04-01",
  "toDate": "2026-05-01",
  "includeSources": ["reuters.com", "bloomberg.com", "ft.com", "wsj.com"]
}
```

When `maxArticles > 100`, the actor automatically fetches multiple time-windowed feeds (`when:1h`, `when:1d`, `when:7d`, `when:30d`, `when:1y`), deduplicates by article GUID, and returns up to 500 articles per query.

#### Non-English news

```json
{
  "queries": ["bourse économie"],
  "language": "fr",
  "country": "FR",
  "maxArticles": 50
}
```

```json
{
  "queries": ["半導体 NVIDIA"],
  "language": "ja",
  "country": "JP",
  "maxArticles": 30
}
```

***

### 📤 Output fields

Every dataset row contains:

| Field | Type | Description |
|---|---|---|
| `title` | string | Article headline (source suffix stripped from Google's format) |
| `description` | string | null | Article snippet, HTML stripped, plain text, max 500 chars |
| `source` | string | null | Publisher name (e.g. "Reuters", "TechCrunch", "BBC") |
| `sourceDomain` | string | null | Publisher domain (e.g. "reuters.com") — easy filtering |
| `sourceUrl` | string | null | Publisher homepage URL from the RSS `<source>` tag |
| `link` | string | Google News redirect URL (always set) |
| `originalUrl` | string | null | **Canonical publisher URL** when `resolveUrls=true` (default ON) |
| `thumbnailUrl` | string | null | Article thumbnail image URL when available |
| `publishedAt` | string | null | Publication date in ISO 8601 (UTC) |
| `publishedAtRaw` | string | null | Original RFC 2822 date string from RSS |
| `guid` | string | null | Unique Google News article identifier |
| `query` | string | null | Search query that found this article (search mode) |
| `topic` | string | null | Topic category (topic mode) |
| `geoLocation` | string | null | Geographic location (geo mode) |
| `feedType` | string | `search`, `topic`, `geo`, or `top_headlines` |
| `language` | string | Language code used |
| `country` | string | Country code used |
| `timeWindow` | string | null | Time window used (e.g. `1d`, `7d`) or `null` |
| `scrapedAt` | string | When this article was scraped (ISO 8601) |

#### Example output row

```json
{
  "title": "OpenAI Unveils Next-Generation Reasoning Model",
  "description": "The new model targets regulated industries with improved factual accuracy and audit logs.",
  "source": "Reuters",
  "sourceDomain": "reuters.com",
  "sourceUrl": "https://www.reuters.com",
  "link": "https://news.google.com/rss/articles/CBMiYmh0dHBzOi8vd3d3LnJldXRl...",
  "originalUrl": "https://www.reuters.com/technology/openai-unveils-next-gen-reasoning-model-2026-04-21/",
  "thumbnailUrl": "https://lh3.googleusercontent.com/...",
  "publishedAt": "2026-04-21T15:30:00.000Z",
  "publishedAtRaw": "Mon, 21 Apr 2026 15:30:00 GMT",
  "guid": "CBMiYmh0dHBzOi8vd3d3LnJldXRl...",
  "query": "openai",
  "topic": null,
  "geoLocation": null,
  "feedType": "search",
  "language": "en-US",
  "country": "US",
  "timeWindow": null,
  "scrapedAt": "2026-05-13T08:15:42.310Z"
}
```

***

### 🌍 Languages & countries supported

Any Google News-supported combination works. Common examples:

- 🇺🇸 `language=en-US, country=US`
- 🇬🇧 `language=en-GB, country=GB`
- 🇫🇷 `language=fr, country=FR`
- 🇩🇪 `language=de, country=DE`
- 🇪🇸 `language=es, country=ES`
- 🇮🇹 `language=it, country=IT`
- 🇧🇷 `language=pt-BR, country=BR`
- 🇯🇵 `language=ja, country=JP`
- 🇨🇳 `language=zh-CN, country=CN`
- 🇹🇷 `language=tr, country=TR`
- 🇸🇦 `language=ar, country=SA`
- 🇮🇳 `language=hi, country=IN`

Just supply the right `language` and `country` codes — the actor adapts automatically.

***

### ⚡ Performance

- **Cold start:** ~3 seconds (no browser, no native deps)
- **Throughput:** 100 articles in 5 seconds; 500 articles in 25 seconds
- **Memory:** 256 MB (default)
- **No proxy needed** for typical usage — Google News RSS is generous with rate limits

***

### 💡 Common workflows

#### Daily brand monitoring → Slack

1. Schedule this actor to run every morning at 8:00
2. Input: `{ "queries": ["your brand"], "fromDate": "yesterday", "maxArticles": 50 }`
3. Set up **Integrations → Slack webhook**
4. Every new article gets posted to your team's channel

#### Multi-country campaign tracking

```json
{
  "queries": ["nike sustainability"],
  "maxArticles": 50
}
```

Run with `country=US`, then `country=GB`, then `country=DE`, etc. — merge datasets to see global coverage.

#### AI training dataset

```json
{
  "topic": "TECHNOLOGY",
  "maxArticles": 500,
  "language": "en-US",
  "country": "US",
  "resolveUrls": true
}
```

Schedule daily for one month → ~15,000 deduplicated tech articles with canonical URLs. Pipe `originalUrl` into a content extractor (Trafilatura, Newspaper3k) for full-text training data.

#### Stock signal monitoring

```json
{
  "queries": ["NVDA earnings", "NVDA layoffs", "NVDA lawsuit"],
  "timeWindow": "1h",
  "maxArticles": 30,
  "includeSources": ["reuters.com", "bloomberg.com", "wsj.com", "ft.com"]
}
```

Schedule hourly. Pipe to a webhook that triggers an alert when count > 0.

***

### ❓ FAQ

**Q: Why are some `originalUrl` fields null?**
A: A few percent of Google News redirects fail or time out. Try increasing the actor's timeout in Apify Console settings, or use the raw `link` field as fallback.

**Q: Can I get full article text?**
A: This actor returns headlines, snippets, and URLs. For full article text, pipe `originalUrl` into a content-extraction actor (e.g. Mozilla Readability, Trafilatura).

**Q: Does Google rate-limit me?**
A: Google News RSS is generous — most users never hit rate limits even at high volumes. If you do see rate limit errors, enable Apify Proxy in the input config.

**Q: Why does maxArticles cap below 100 per query without stitching?**
A: Google News RSS itself caps single-feed responses at ~100 items. We work around this by requesting multiple time-windowed feeds and deduplicating — that's what triggers when you set `maxArticles > 100`.

**Q: Can I search by URL substring or specific publisher?**
A: Use the `site:domain.com` operator inside your query, or use `includeSources` for post-filter whitelisting. Both work — `site:` filters at Google's side (cheaper), `includeSources` filters after fetching.

**Q: Does this work for languages with non-Latin scripts (Chinese, Japanese, Arabic, etc.)?**
A: Yes — queries are URL-encoded properly and Google News supports all major scripts. Just set the right `language` and `country` codes.

***

### 📜 Legal & ethical

This actor accesses publicly available Google News RSS feeds — the same data accessible to any RSS reader. No login required, no terms-of-service violation. Use the data responsibly:

- ✅ Respect publisher copyrights — don't republish full article text without permission
- ✅ Aggregate data and link to original sources
- ✅ Comply with GDPR / privacy laws for any downstream use of personal data in articles
- ❌ Don't use this to mass-scrape and republish news content

# Actor input Schema

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

List of search queries. Each query becomes a separate Google News RSS feed. Supports Google's search operators: "exact phrase" for exact match, OR for boolean OR (default is AND between words), -word to exclude, site:domain.com to filter by source, intitle:word to match in title only.

Leave empty if using 'topic' or 'geoLocation' mode instead.

## `topic` (type: `string`):

Browse top stories by topic instead of searching keywords. Use this OR queries, not both. Returns curated top headlines from Google News in that category.

## `geoLocation` (type: `string`):

Get news for a specific city, state, or region instead of search/topic. Use city or country name in English (e.g. 'New York', 'London', 'Berlin', 'Tokyo'). Leave empty if using queries or topic.

## `topHeadlines` (type: `boolean`):

If true, fetches the main Google News top headlines feed for the selected language/country and ignores queries/topic/geoLocation. Useful for daily news digests.

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

Google News interface language. Common values: en (English), en-US, en-GB, fr (French), de (German), es (Spanish), it (Italian), pt (Portuguese), nl (Dutch), pl (Polish), ja (Japanese), zh-CN (Chinese Simplified), ar (Arabic), tr (Turkish), ru (Russian).

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

Geographic region for news. Examples: US, GB, FR, DE, ES, IT, NL, PL, JP, BR, MX, AU, CA, IN, TR, AR, ZA. Google News news selection adjusts to this region.

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

Maximum articles to return per query (or per topic/geo feed). Google News RSS caps at ~100 per single feed; if set higher than 100, the actor automatically stitches multiple time-windowed feeds (when:1h, when:1d, when:7d, when:30d) and deduplicates to deliver more results.

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

Restrict results to a recent time window using Google's 'when:' operator. Ignored when maxArticles > 100 (the actor stitches multiple windows automatically in that case).

## `fromDate` (type: `string`):

Filter out articles published BEFORE this date. Format: YYYY-MM-DD or full ISO (2026-05-01T00:00:00Z). Applied post-fetch on the publication date in the RSS feed.

## `toDate` (type: `string`):

Filter out articles published AFTER this date. Format: YYYY-MM-DD or full ISO. Applied post-fetch.

## `includeSources` (type: `array`):

Whitelist of publisher domains. If set, only articles from these sources are returned. Example: \['reuters.com', 'bloomberg.com', 'ft.com']. Matched against the source URL host.

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

Blacklist of publisher domains. Articles from these sources are filtered out. Example: \['clickbait.com', 'spam-news.net'].

## `resolveUrls` (type: `boolean`):

Google News links go through a redirect (news.google.com/articles/CBMi...). When enabled, the actor follows the redirect once per article via a fast HEAD request and returns the canonical publisher URL. Adds ~50ms per article but gives clean URLs for downstream use (CRM, content extraction, SEO analysis).

## `extractThumbnails` (type: `boolean`):

Include the thumbnail image URL from each article's media:content tag when available. No extra cost.

## `proxyConfiguration` (type: `object`):

Google News RSS rarely rate-limits, so most users don't need a proxy. If your account hits rate limits with very high volumes, enable Apify Proxy here.

## Actor input object example

```json
{
  "queries": [
    "openai",
    "anthropic",
    "claude ai"
  ],
  "topic": "",
  "geoLocation": "",
  "topHeadlines": false,
  "language": "en-US",
  "country": "US",
  "timeWindow": "",
  "fromDate": "",
  "toDate": "",
  "includeSources": [],
  "excludeSources": [],
  "resolveUrls": true,
  "extractThumbnails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

The full dataset of scraped news articles. Switch between Overview, By query, and By source views to slice the data.

# 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": [
        "openai",
        "anthropic",
        "claude ai"
    ],
    "language": "en-US",
    "country": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/google-news-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 = {
    "queries": [
        "openai",
        "anthropic",
        "claude ai",
    ],
    "language": "en-US",
    "country": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/google-news-scraper").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": [
    "openai",
    "anthropic",
    "claude ai"
  ],
  "language": "en-US",
  "country": "US"
}' |
apify call logiover/google-news-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google News Scraper — Canonical URLs & Brand Tracking",
        "description": "Scrape Google News by keyword, brand, or topic across 50+ countries. Returns canonical publisher URLs (not Google redirects), source domains, dates, snippets, and thumbnails. Filter by date range or source. 100+ results per query, 3-second cold start, no proxy required.",
        "version": "1.0",
        "x-build-id": "CHUngxMqQwCMe1GUc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~google-news-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-google-news-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/logiover~google-news-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-google-news-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/logiover~google-news-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-google-news-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "queries": {
                        "title": "Search keywords / topics to monitor",
                        "type": "array",
                        "description": "List of search queries. Each query becomes a separate Google News RSS feed. Supports Google's search operators: \"exact phrase\" for exact match, OR for boolean OR (default is AND between words), -word to exclude, site:domain.com to filter by source, intitle:word to match in title only.\n\nLeave empty if using 'topic' or 'geoLocation' mode instead.",
                        "default": [
                            "openai",
                            "claude ai"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "topic": {
                        "title": "Topic category (optional, instead of queries)",
                        "enum": [
                            "",
                            "WORLD",
                            "NATION",
                            "BUSINESS",
                            "TECHNOLOGY",
                            "ENTERTAINMENT",
                            "SPORTS",
                            "SCIENCE",
                            "HEALTH"
                        ],
                        "type": "string",
                        "description": "Browse top stories by topic instead of searching keywords. Use this OR queries, not both. Returns curated top headlines from Google News in that category.",
                        "default": ""
                    },
                    "geoLocation": {
                        "title": "Location-based news (optional)",
                        "type": "string",
                        "description": "Get news for a specific city, state, or region instead of search/topic. Use city or country name in English (e.g. 'New York', 'London', 'Berlin', 'Tokyo'). Leave empty if using queries or topic.",
                        "default": ""
                    },
                    "topHeadlines": {
                        "title": "Or get top headlines (overrides everything)",
                        "type": "boolean",
                        "description": "If true, fetches the main Google News top headlines feed for the selected language/country and ignores queries/topic/geoLocation. Useful for daily news digests.",
                        "default": false
                    },
                    "language": {
                        "title": "Language code",
                        "type": "string",
                        "description": "Google News interface language. Common values: en (English), en-US, en-GB, fr (French), de (German), es (Spanish), it (Italian), pt (Portuguese), nl (Dutch), pl (Polish), ja (Japanese), zh-CN (Chinese Simplified), ar (Arabic), tr (Turkish), ru (Russian).",
                        "default": "en-US"
                    },
                    "country": {
                        "title": "Country code (ISO 2-letter)",
                        "type": "string",
                        "description": "Geographic region for news. Examples: US, GB, FR, DE, ES, IT, NL, PL, JP, BR, MX, AU, CA, IN, TR, AR, ZA. Google News news selection adjusts to this region.",
                        "default": "US"
                    },
                    "maxArticles": {
                        "title": "Max articles per query/feed",
                        "minimum": 0,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum articles to return per query (or per topic/geo feed). Google News RSS caps at ~100 per single feed; if set higher than 100, the actor automatically stitches multiple time-windowed feeds (when:1h, when:1d, when:7d, when:30d) and deduplicates to deliver more results."
                    },
                    "timeWindow": {
                        "title": "Time window",
                        "enum": [
                            "",
                            "1h",
                            "12h",
                            "1d",
                            "7d",
                            "30d",
                            "1y"
                        ],
                        "type": "string",
                        "description": "Restrict results to a recent time window using Google's 'when:' operator. Ignored when maxArticles > 100 (the actor stitches multiple windows automatically in that case).",
                        "default": ""
                    },
                    "fromDate": {
                        "title": "From date (ISO 8601, optional)",
                        "type": "string",
                        "description": "Filter out articles published BEFORE this date. Format: YYYY-MM-DD or full ISO (2026-05-01T00:00:00Z). Applied post-fetch on the publication date in the RSS feed.",
                        "default": ""
                    },
                    "toDate": {
                        "title": "To date (ISO 8601, optional)",
                        "type": "string",
                        "description": "Filter out articles published AFTER this date. Format: YYYY-MM-DD or full ISO. Applied post-fetch.",
                        "default": ""
                    },
                    "includeSources": {
                        "title": "Include only these sources (optional)",
                        "type": "array",
                        "description": "Whitelist of publisher domains. If set, only articles from these sources are returned. Example: ['reuters.com', 'bloomberg.com', 'ft.com']. Matched against the source URL host.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "excludeSources": {
                        "title": "Exclude these sources (optional)",
                        "type": "array",
                        "description": "Blacklist of publisher domains. Articles from these sources are filtered out. Example: ['clickbait.com', 'spam-news.net'].",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "resolveUrls": {
                        "title": "Resolve final article URLs (recommended)",
                        "type": "boolean",
                        "description": "Google News links go through a redirect (news.google.com/articles/CBMi...). When enabled, the actor follows the redirect once per article via a fast HEAD request and returns the canonical publisher URL. Adds ~50ms per article but gives clean URLs for downstream use (CRM, content extraction, SEO analysis).",
                        "default": true
                    },
                    "extractThumbnails": {
                        "title": "Extract thumbnail images",
                        "type": "boolean",
                        "description": "Include the thumbnail image URL from each article's media:content tag when available. No extra cost.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy (optional, usually not needed)",
                        "type": "object",
                        "description": "Google News RSS rarely rate-limits, so most users don't need a proxy. If your account hits rate limits with very high volumes, enable Apify Proxy here.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
