# Google News Scraper (`kitcunemia/google-news-scraper`) Actor

\[💰 $0.70 / 1K] Production-grade Google News scraper. Search by keywords, topics or any Google News topic/section URL. HD thumbnails, decoded publisher URLs, descriptions, full metadata. Up to 50,000 articles per run.

- **URL**: https://apify.com/kitcunemia/google-news-scraper.md
- **Developed by:** [Kitcune Mia](https://apify.com/kitcunemia) (community)
- **Categories:** News, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.70 / 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

## 📰 Google News Scraper

> **Production-grade Google News scraper.** Browser-grade TLS fingerprinting, Apify Residential US proxies, three independent retry budgets, HD thumbnails — all without a single line of headless-browser code.

Pull clean, structured news data from Google News by **keywords**, **predefined topics**, or **any topic/section URL** you paste from your browser. Works for any country and language. Scales from a 5-article spot check to 50,000-article archives.

---

### ⚡ Why This Scraper

#### 🧬 Real browser fingerprint, no headless browser
Built on **`curl_cffi` with Chrome TLS impersonation**. Google sees a real Chrome handshake — JA3, ALPN, HTTP/2 frames — without paying the cost of Selenium, Playwright, or a JS engine. Result: ~10× lower latency and CPU than a headless setup, the same survival rate against bot defenses.

#### 🌎 Residential US IPs that rotate per request
Every HTTP call gets a fresh exit IP from Apify's residential pool. No session pinning, no shared rate limits between requests. You can ramp parallelism without tripping Google's 429 wall.

#### 🛡️ Three independent retry budgets
The scraper runs three separate I/O stages — **RSS fetch · URL decode · publisher page fetch** — and each has its own retry counter, exponential backoff with jitter, and 15-second hard timeout. A single flaky publisher can't drain the budget you need to keep ingesting RSS feeds.

#### 🖼️ HD images without visiting publisher pages
Most scrapers that want article thumbnails have to follow every link to the publisher and parse `<meta og:image>`. This one fetches Google News' **HTML index in parallel with the RSS feed** and pulls the HD thumbnail straight from `news.google.com/api/attachments/...`. **Free images, zero extra requests per article.**

#### 🔓 Smart URL decoder
Optional `decodeUrls` resolves `news.google.com/rss/articles/CBMi...` redirects to the actual publisher URL via Google's `Fbv4je` batchexecute endpoint — so you can store, deduplicate, and re-crawl real source URLs.

#### 📊 50,000-article archives, day-by-day
Google News RSS caps each feed at ~100 results. When you ask for `maxItems > 100`, the scraper automatically splits the date range one day at a time and parallelizes across days — no manual chunking, no coordination on your side.

---

### 🚀 Quick Start

Drop this into the Actor input:

```json
{
  "keywords": ["Elon Musk"],
  "maxArticles": 10,
  "timeframe": "1d",
  "region_language": "US:en",
  "extractImages": true
}
````

You get back HD-illustrated, ISO-timestamped, source-attributed news in seconds.

***

### 🧭 Two Ways to Search (Mix and Match)

#### 🔍 Mode 1 — Keyword search

Full Google search operator support (`site:`, `intitle:`, `inurl:`, `OR`, `AND`, `-`, `"…"`).

```json
{
  "keywords": ["bitcoin", "ethereum -dogecoin", "intitle:\"AI\" site:bbc.com"],
  "timeframe": "1h",
  "maxArticles": 50
}
```

Perfect for **brand monitoring · competitor tracking · trend detection · SEO research.**

#### 📰 Mode 2 — Topics & sections

**Predefined Google News topics:** `WORLD · NATION · BUSINESS · TECHNOLOGY · ENTERTAINMENT · SPORTS · SCIENCE · HEALTH`

```json
{
  "topics": ["TECHNOLOGY", "BUSINESS"],
  "maxArticles": 100,
  "region_language": "FR:fr"
}
```

**Custom topic/section URLs** — browse Google News, navigate to anything (e.g. *Sports → F1*, *Tech → Artificial Intelligence*), and paste the URL straight from your address bar:

```json
{
  "topicUrls": [
    "https://news.google.com/topics/CAAq.../sections/CAQi...?hl=en-US&gl=US&ceid=US:en"
  ]
}
```

You can combine all three modes (`keywords + topics + topicUrls`) in a single run.

***

### 📦 Output Schema

Every article is one clean JSON record:

```json
{
  "title": "Elon Musk tells his side of OpenAI's beginnings - PBS",
  "source": "PBS",
  "sourceUrl": "https://www.pbs.org",
  "url": "https://www.pbs.org/newshour/show/elon-musk-...",
  "rssLink": "https://news.google.com/rss/articles/CBMi...",
  "guid": "CBMi...",
  "articleId": "CBMi...",
  "publishedAt": "2026-04-30T00:46:35.000Z",
  "publishedTimestamp": 1777509995000,
  "image": "https://news.google.com/api/attachments/CC8i...-w400-h224-p-df-rw",
  "description": "Tesla and SpaceX CEO Elon Musk took the witness stand...",
  "loadedUrl": "https://www.pbs.org/newshour/show/elon-musk-...",
  "metadata": {
    "scrapeTimestamp": "2026-04-30T13:57:26.461Z",
    "sourceType": "keyword",
    "timeframe": "1d",
    "region": "US",
    "language": "en",
    "keyword": "Elon Musk"
  }
}
```

| Field | Always? | Notes |
|---|---|---|
| `title`, `source`, `sourceUrl` | ✅ | From RSS |
| `url` | ✅ | Resolved publisher URL when `decodeUrls=true`, else Google News redirect |
| `rssLink`, `guid`, `articleId` | ✅ | The CBMi… identifier extracted in three forms |
| `publishedAt`, `publishedTimestamp` | ✅ | ISO-8601 UTC + Unix epoch ms |
| `image` | when `extractImages=true` (default) | Google News HD thumbnail; upgraded to publisher's `og:image` if `extractDescriptions=true` |
| `description` | when `extractDescriptions=true` | `og:description` from publisher page |
| `loadedUrl` | when publisher page was fetched | Final URL after redirects |
| `metadata.sourceType` | ✅ | `keyword` / `topic` / `topic_url` |

Pipe this directly into BigQuery, Snowflake, Airtable, Google Sheets, Slack, your CRM, or anything that speaks JSON / CSV / XLSX.

***

### 📋 Input Reference

#### Sources (at least one required)

| Field | Type | Description |
|---|---|---|
| `keywords` | `string[]` | Multiple search queries |
| `query` | `string` | Single query (added to `keywords` if both are set) |
| `topics` | `string[]` | One or more of `WORLD · NATION · BUSINESS · TECHNOLOGY · ENTERTAINMENT · SPORTS · SCIENCE · HEALTH` |
| `topicUrls` | `string[]` | Full Google News topic/section URLs (or bare `{TOPIC_ID}[/sections/{SECTION_ID}]`) |

#### Volume

| Field | Type | Default | Description |
|---|---|---|---|
| `maxItems` | `int` 1–50,000 | — | Global cap. `>100` triggers automatic day-by-day splitting |
| `maxArticles` | `int` | `10` | Per-source cap (used when `maxItems` is not set) |

#### Time window

| Field | Type | Description |
|---|---|---|
| `timeframe` | `1h` / `1d` / `7d` / `1m` / `1y` / `all` | Window for keyword searches |
| `time_period` | `last_hour` / `last_day` / `last_week` / `last_month` / `last_year` / `custom` | Alias for `timeframe` |
| `time_period_min`, `time_period_max` | `MM/DD/YYYY` | Used with `time_period=custom` |

#### Locale & filters

| Field | Type | Description |
|---|---|---|
| `region_language` | `"US:en"`, `"FR:fr"`, … | Combined region:language |
| `gl` | ISO country (lowercase) | Overrides region |
| `hl` | ISO language (lowercase) | Overrides language |
| `lr` | `lang_en`, `lang_fr`, … | Restrict results to a language |
| `cr` | ISO country (lowercase) | Restrict results to a country |
| `nfpr` | `0` / `1` | `1` = disable auto-correct |
| `filter` | `0` / `1` | `1` = enable Similar/Omitted Results filter |

#### Extraction

| Field | Type | Default | Description |
|---|---|---|---|
| `decodeUrls` | `bool` | `false` | Resolve to publisher URLs |
| `extractDescriptions` | `bool` | `false` | Fetch `og:description` (implies `decodeUrls`) |
| `extractImages` | `bool` | `true` | Include HD thumbnails |

#### Advanced

| Field | Type | Default | Description |
|---|---|---|---|
| `proxyConfiguration` | `object` | Apify Residential US | Standard Apify proxy input |
| `concurrency` | `int` 1–128 | `32` | In-flight requests for decode + article stages |
| `retryBudgetRss` | `int` 1–10 | `4` | Independent retry attempts per RSS feed |
| `retryBudgetDecode` | `int` 1–10 | `3` | Independent retry attempts per URL decode |
| `retryBudgetArticle` | `int` 1–10 | `2` | Independent retry attempts per publisher page fetch |

***

### 💡 Recipes

#### 🔔 Brand monitoring — last hour, multi-keyword

```json
{
  "keywords": ["Acme Corp", "Acme CEO", "Acme product line"],
  "timeframe": "1h",
  "maxArticles": 100,
  "extractImages": true
}
```

#### 📊 Daily SEO digest with full content

```json
{
  "topics": ["TECHNOLOGY", "BUSINESS"],
  "maxArticles": 50,
  "decodeUrls": true,
  "extractDescriptions": true,
  "extractImages": true
}
```

#### 📚 Historical archive (5,000 articles, full year)

```json
{
  "query": "climate change",
  "time_period": "custom",
  "time_period_min": "01/01/2025",
  "time_period_max": "12/31/2025",
  "maxItems": 5000,
  "lr": "lang_en"
}
```

#### 🌍 Cross-language coverage

```json
{
  "keywords": ["Olympics 2028"],
  "gl": "fr",
  "hl": "fr",
  "lr": "lang_fr"
}
```

#### 🧪 Specific section (e.g. Tech → AI)

```json
{
  "topicUrls": [
    "https://news.google.com/topics/CAAq.../sections/CAQi...?hl=en-US&gl=US&ceid=US:en"
  ],
  "maxArticles": 50
}
```

***

### 🔌 No-Code Integrations

Wires up to **Make**, **n8n**, **Zapier**, **Pipedream** out of the box. Common flows:

- **Schedule**: run every 15 min / hourly / daily via Apify Schedules
- **Push**: send new articles to Google Sheets, Airtable, Notion, Slack, Discord, or your CRM
- **Alert**: trigger when a brand or keyword crosses a threshold

***

### 🏗️ Architecture

```
                    ┌──────────────────────────────────────────┐
                    │  curl_cffi  ·  Chrome TLS impersonation  │
                    │  Apify Residential US (rotating IP)      │
                    └──────────────────────────────────────────┘
                                       │
                ┌──────────────────────┼─────────────────────┐
                ▼                      ▼                     ▼
        ┌──────────────┐      ┌──────────────┐      ┌──────────────┐
        │  RSS feed    │      │  HTML index  │      │  URL decode  │
        │  (lxml)      │      │  (regex)     │      │  (Fbv4je)    │
        │  retry: 4×   │      │  retry: 4×   │      │  retry: 3×   │
        └──────┬───────┘      └──────┬───────┘      └──────┬───────┘
               │                     │                     │
               └─────────┬───────────┘                     │
                         ▼                                 ▼
                ┌──────────────────┐              ┌────────────────┐
                │  merged item +   │              │  publisher     │
                │  HD thumbnail    │              │  og:* fetch    │
                └────────┬─────────┘              │  retry: 2×     │
                         │                        └────────┬───────┘
                         └────────────┬───────────────────┘
                                      ▼
                              ┌──────────────┐
                              │  Apify       │
                              │  Dataset     │
                              └──────────────┘
```

Each retry budget is independent: a 5xx storm in one stage never burns the others.

***

### 🛠️ Local Development

```bash
git clone <this-repo>
cd google_news

pip install -r requirements.txt

## Drop a test input
mkdir -p storage/key_value_stores/default
cat > storage/key_value_stores/default/INPUT.json <<'JSON'
{
  "keywords": ["bitcoin"],
  "maxArticles": 5,
  "extractImages": true
}
JSON

python -m src
```

Output appears under `storage/datasets/default/*.json`.

> ℹ️ **Note:** locally without `APIFY_PROXY_PASSWORD`, the scraper falls back to direct connections — RSS + image extraction work, but URL decoding requires residential US proxies (Google's `Fbv4je` rejects non-residential IPs).

#### Deploy to Apify

```bash
deploy.bat        ## Windows
## or
apify push --force
```

***

### 🧰 Tech Stack

- **Python 3.12** · async/await throughout
- **`curl_cffi` 0.7+** — Chrome TLS impersonation, HTTP/2
- **`apify` SDK 3.x** — platform integration, proxy, dataset
- **`lxml`** — fast XML/HTML parsing
- **Custom regex parsers** — for Google News HTML index and `Fbv4je` batchexecute responses

***

### 📄 License

MIT.

# Actor input Schema

## `keywords` (type: `array`):

Search queries on Google News. Supports operators: site:, -, OR, AND, intitle:, inurl:, "".

## `query` (type: `string`):

Convenience input — adds one search query (alongside `keywords`).

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

Predefined Google News topics.

## `topicUrls` (type: `array`):

Custom Google News topic or section URLs (paste from your browser). Bare {TOPIC\_ID}\[/sections/{SECTION\_ID}] is also accepted.

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

Per-source cap (per keyword / per topic). Ignored when `maxItems` is set.

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

Global cap across all feeds. Above 100 the scraper splits the date range day-by-day to bypass Google's ~100-per-feed limit.

## `timeframe` (type: `string`):

Time window for keyword searches. Ignored for topics / topic URLs.

## `time_period` (type: `string`):

Alternative to `timeframe`. last\_hour|last\_day|last\_week|last\_month|last\_year|custom. With `custom`, set time\_period\_min/time\_period\_max.

## `time_period_min` (type: `string`):

Lower bound, MM/DD/YYYY (used when time\_period=custom).

## `time_period_max` (type: `string`):

Upper bound, MM/DD/YYYY (used when time\_period=custom).

## `region_language` (type: `string`):

Region:language combination, e.g. US:en, FR:fr. Overridden by `gl` and `hl` if set.

## `gl` (type: `string`):

ISO country code (lowercase). Overrides region from region\_language.

## `hl` (type: `string`):

Language code (lowercase). Overrides language from region\_language.

## `lr` (type: `string`):

Limit results to a specific language.

## `cr` (type: `string`):

Limit results to a specific country (lowercase ISO; converted to country<UPPER>).

## `nfpr` (type: `integer`):

1 to exclude auto-corrected query results, 0 to allow.

## `filter` (type: `integer`):

1 to enable Similar/Omitted Results filter, 0 to disable.

## `decodeUrls` (type: `boolean`):

Resolve Google News redirect URLs to publisher source URLs.

## `extractDescriptions` (type: `boolean`):

Extract og:description / meta description from publisher pages. Implies decodeUrls.

## `extractImages` (type: `boolean`):

Include article images. Pulls Google News HD thumbnail by default; falls back to og:image when extractDescriptions is on.

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

Apify proxy configuration. Defaults to Residential proxies in US.

## `concurrency` (type: `integer`):

Concurrent in-flight requests for decoding and article fetching.

## `retryBudgetRss` (type: `integer`):

Independent retry attempts per RSS feed request.

## `retryBudgetDecode` (type: `integer`):

Independent retry attempts per article-link decode.

## `retryBudgetArticle` (type: `integer`):

Independent retry attempts per article HTML fetch.

## Actor input object example

```json
{
  "keywords": [],
  "topics": [],
  "topicUrls": [],
  "maxArticles": 10,
  "timeframe": "1d",
  "region_language": "US:en",
  "decodeUrls": false,
  "extractDescriptions": false,
  "extractImages": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "concurrency": 32,
  "retryBudgetRss": 4,
  "retryBudgetDecode": 3,
  "retryBudgetArticle": 2
}
```

# Actor output Schema

## `dataset` (type: `string`):

All scraped articles. Apify renders the items as a table; use the format dropdown to download in JSON / CSV / XLSX / RSS.

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kitcunemia/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 = { "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    } }

# Run the Actor and wait for it to finish
run = client.actor("kitcunemia/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 '{
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call kitcunemia/google-news-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google News Scraper",
        "description": "[💰 $0.70 / 1K] Production-grade Google News scraper. Search by keywords, topics or any Google News topic/section URL. HD thumbnails, decoded publisher URLs, descriptions, full metadata. Up to 50,000 articles per run.",
        "version": "0.1",
        "x-build-id": "5GWqM4LzpOyGL2t4r"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kitcunemia~google-news-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kitcunemia-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/kitcunemia~google-news-scraper/runs": {
            "post": {
                "operationId": "runs-sync-kitcunemia-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/kitcunemia~google-news-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-kitcunemia-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": {
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Search queries on Google News. Supports operators: site:, -, OR, AND, intitle:, inurl:, \"\".",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "query": {
                        "title": "Query (single)",
                        "type": "string",
                        "description": "Convenience input — adds one search query (alongside `keywords`)."
                    },
                    "topics": {
                        "title": "Topics",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Predefined Google News topics.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "WORLD",
                                "NATION",
                                "BUSINESS",
                                "TECHNOLOGY",
                                "ENTERTAINMENT",
                                "SPORTS",
                                "SCIENCE",
                                "HEALTH"
                            ]
                        },
                        "default": []
                    },
                    "topicUrls": {
                        "title": "Topic / section URLs",
                        "type": "array",
                        "description": "Custom Google News topic or section URLs (paste from your browser). Bare {TOPIC_ID}[/sections/{SECTION_ID}] is also accepted.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxArticles": {
                        "title": "Max articles per source",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Per-source cap (per keyword / per topic). Ignored when `maxItems` is set.",
                        "default": 10
                    },
                    "maxItems": {
                        "title": "Max items (global)",
                        "minimum": 1,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Global cap across all feeds. Above 100 the scraper splits the date range day-by-day to bypass Google's ~100-per-feed limit."
                    },
                    "timeframe": {
                        "title": "Timeframe",
                        "enum": [
                            "1h",
                            "1d",
                            "7d",
                            "1m",
                            "1y",
                            "all"
                        ],
                        "type": "string",
                        "description": "Time window for keyword searches. Ignored for topics / topic URLs.",
                        "default": "1d"
                    },
                    "time_period": {
                        "title": "Time period (alias)",
                        "enum": [
                            "last_hour",
                            "last_day",
                            "last_week",
                            "last_month",
                            "last_year",
                            "custom"
                        ],
                        "type": "string",
                        "description": "Alternative to `timeframe`. last_hour|last_day|last_week|last_month|last_year|custom. With `custom`, set time_period_min/time_period_max."
                    },
                    "time_period_min": {
                        "title": "Custom range — min",
                        "type": "string",
                        "description": "Lower bound, MM/DD/YYYY (used when time_period=custom)."
                    },
                    "time_period_max": {
                        "title": "Custom range — max",
                        "type": "string",
                        "description": "Upper bound, MM/DD/YYYY (used when time_period=custom)."
                    },
                    "region_language": {
                        "title": "Region : Language",
                        "type": "string",
                        "description": "Region:language combination, e.g. US:en, FR:fr. Overridden by `gl` and `hl` if set.",
                        "default": "US:en"
                    },
                    "gl": {
                        "title": "Country (gl)",
                        "enum": [
                            "af",
                            "al",
                            "dz",
                            "as",
                            "ad",
                            "ao",
                            "ai",
                            "aq",
                            "ag",
                            "ar",
                            "am",
                            "aw",
                            "ac",
                            "au",
                            "at",
                            "az",
                            "bs",
                            "bh",
                            "bd",
                            "bb",
                            "by",
                            "be",
                            "bz",
                            "bj",
                            "bm",
                            "bt",
                            "bo",
                            "ba",
                            "bw",
                            "bv",
                            "br",
                            "io",
                            "bn",
                            "bg",
                            "bf",
                            "bi",
                            "kh",
                            "cm",
                            "ca",
                            "cv",
                            "cat",
                            "ky",
                            "cf",
                            "td",
                            "cl",
                            "cn",
                            "cx",
                            "cc",
                            "co",
                            "km",
                            "cg",
                            "cd",
                            "ck",
                            "cr",
                            "ci",
                            "hr",
                            "cy",
                            "cz",
                            "dk",
                            "dj",
                            "dm",
                            "do",
                            "tl",
                            "ec",
                            "eg",
                            "sv",
                            "gq",
                            "er",
                            "ee",
                            "et",
                            "fk",
                            "fo",
                            "fj",
                            "fi",
                            "fr",
                            "gf",
                            "pf",
                            "tf",
                            "ga",
                            "gm",
                            "ge",
                            "de",
                            "gh",
                            "gi",
                            "gr",
                            "gl",
                            "gd",
                            "gp",
                            "gu",
                            "gt",
                            "gn",
                            "gw",
                            "gy",
                            "ht",
                            "hm",
                            "hn",
                            "hk",
                            "hu",
                            "is",
                            "in",
                            "id",
                            "iq",
                            "ie",
                            "il",
                            "it",
                            "jm",
                            "jp",
                            "jo",
                            "kz",
                            "ke",
                            "ki",
                            "kw",
                            "kg",
                            "la",
                            "lv",
                            "lb",
                            "ls",
                            "lr",
                            "ly",
                            "li",
                            "lt",
                            "lu",
                            "mo",
                            "mk",
                            "mg",
                            "mw",
                            "my",
                            "mv",
                            "ml",
                            "mt",
                            "mh",
                            "mq",
                            "mr",
                            "mu",
                            "yt",
                            "mx",
                            "fm",
                            "md",
                            "mc",
                            "mn",
                            "ms",
                            "ma",
                            "mz",
                            "na",
                            "nr",
                            "np",
                            "nl",
                            "an",
                            "nc",
                            "nz",
                            "ni",
                            "ne",
                            "ng",
                            "nu",
                            "nf",
                            "mp",
                            "no",
                            "om",
                            "pk",
                            "pw",
                            "ps",
                            "pa",
                            "pg",
                            "py",
                            "pe",
                            "ph",
                            "pn",
                            "pl",
                            "pt",
                            "pr",
                            "qa",
                            "re",
                            "ro",
                            "ru",
                            "rw",
                            "kn",
                            "lc",
                            "vc",
                            "ws",
                            "sm",
                            "st",
                            "sa",
                            "sn",
                            "cs",
                            "sc",
                            "sl",
                            "sg",
                            "sk",
                            "si",
                            "sb",
                            "so",
                            "za",
                            "gs",
                            "kr",
                            "es",
                            "lk",
                            "sh",
                            "pm",
                            "sr",
                            "sj",
                            "sz",
                            "se",
                            "ch",
                            "tw",
                            "tj",
                            "tz",
                            "th",
                            "tg",
                            "tk",
                            "to",
                            "tt",
                            "tn",
                            "tr",
                            "tm",
                            "tc",
                            "tv",
                            "ug",
                            "ua",
                            "ae",
                            "gb",
                            "us",
                            "um",
                            "uy",
                            "uz",
                            "vu",
                            "va",
                            "ve",
                            "vn",
                            "vg",
                            "vi",
                            "wf",
                            "eh",
                            "ye",
                            "zm",
                            "zw"
                        ],
                        "type": "string",
                        "description": "ISO country code (lowercase). Overrides region from region_language."
                    },
                    "hl": {
                        "title": "UI language (hl)",
                        "enum": [
                            "af",
                            "ak",
                            "sq",
                            "am",
                            "ar",
                            "hy",
                            "az",
                            "eu",
                            "be",
                            "bem",
                            "bn",
                            "bh",
                            "bs",
                            "br",
                            "bg",
                            "km",
                            "ca",
                            "chr",
                            "ny",
                            "zh-cn",
                            "zh-tw",
                            "co",
                            "hr",
                            "cs",
                            "da",
                            "nl",
                            "en",
                            "eo",
                            "et",
                            "ee",
                            "fo",
                            "tl",
                            "fi",
                            "fr",
                            "fy",
                            "gaa",
                            "gl",
                            "ka",
                            "de",
                            "el",
                            "gn",
                            "gu",
                            "ht",
                            "ha",
                            "haw",
                            "he",
                            "iw",
                            "hi",
                            "hu",
                            "is",
                            "ig",
                            "id",
                            "ia",
                            "ga",
                            "it",
                            "ja",
                            "jw",
                            "kn",
                            "kk",
                            "rw",
                            "rn",
                            "kg",
                            "ko",
                            "kri",
                            "ku",
                            "ckb",
                            "ky",
                            "lo",
                            "la",
                            "lv",
                            "ln",
                            "lt",
                            "loz",
                            "lg",
                            "ach",
                            "mk",
                            "mg",
                            "ms",
                            "ml",
                            "mt",
                            "mi",
                            "mr",
                            "mfe",
                            "mo",
                            "mn",
                            "sr-ME",
                            "ne",
                            "pcm",
                            "nso",
                            "no",
                            "nn",
                            "oc",
                            "or",
                            "om",
                            "ps",
                            "fa",
                            "pl",
                            "pt",
                            "pt-br",
                            "pt-pt",
                            "pa",
                            "qu",
                            "ro",
                            "rm",
                            "nyn",
                            "ru",
                            "gd",
                            "sr",
                            "sh",
                            "st",
                            "tn",
                            "crs",
                            "sn",
                            "sd",
                            "si",
                            "sk",
                            "sl",
                            "so",
                            "es",
                            "es-419",
                            "su",
                            "sw",
                            "sv",
                            "tg",
                            "ta",
                            "tt",
                            "te",
                            "th",
                            "ti",
                            "to",
                            "lua",
                            "tum",
                            "tr",
                            "tk",
                            "tw",
                            "ug",
                            "uk",
                            "ur",
                            "uz",
                            "vi",
                            "cy",
                            "wo",
                            "xh",
                            "yi",
                            "yo",
                            "zu"
                        ],
                        "type": "string",
                        "description": "Language code (lowercase). Overrides language from region_language."
                    },
                    "lr": {
                        "title": "Language results (lr)",
                        "enum": [
                            "lang_ar",
                            "lang_hy",
                            "lang_be",
                            "lang_bg",
                            "lang_ca",
                            "lang_zh-cn",
                            "lang_zh-tw",
                            "lang_hr",
                            "lang_cs",
                            "lang_da",
                            "lang_nl",
                            "lang_en",
                            "lang_eo",
                            "lang_et",
                            "lang_tl",
                            "lang_fi",
                            "lang_fr",
                            "lang_de",
                            "lang_el",
                            "lang_iw",
                            "lang_hu",
                            "lang_is",
                            "lang_id",
                            "lang_it",
                            "lang_ja",
                            "lang_ko",
                            "lang_lv",
                            "lang_lt",
                            "lang_no",
                            "lang_fa",
                            "lang_pl",
                            "lang_pt",
                            "lang_ro",
                            "lang_ru",
                            "lang_sr",
                            "lang_sk",
                            "lang_sl",
                            "lang_es",
                            "lang_sv",
                            "lang_th",
                            "lang_tr",
                            "lang_uk",
                            "lang_vi"
                        ],
                        "type": "string",
                        "description": "Limit results to a specific language."
                    },
                    "cr": {
                        "title": "Country results (cr)",
                        "enum": [
                            "af",
                            "al",
                            "dz",
                            "as",
                            "ad",
                            "ao",
                            "ai",
                            "aq",
                            "ag",
                            "ar",
                            "am",
                            "aw",
                            "ac",
                            "au",
                            "at",
                            "az",
                            "bs",
                            "bh",
                            "bd",
                            "bb",
                            "by",
                            "be",
                            "bz",
                            "bj",
                            "bm",
                            "bt",
                            "bo",
                            "ba",
                            "bw",
                            "bv",
                            "br",
                            "io",
                            "bn",
                            "bg",
                            "bf",
                            "bi",
                            "kh",
                            "cm",
                            "ca",
                            "cv",
                            "cat",
                            "ky",
                            "cf",
                            "td",
                            "cl",
                            "cn",
                            "cx",
                            "cc",
                            "co",
                            "km",
                            "cg",
                            "cd",
                            "ck",
                            "cr",
                            "ci",
                            "hr",
                            "cy",
                            "cz",
                            "dk",
                            "dj",
                            "dm",
                            "do",
                            "tl",
                            "ec",
                            "eg",
                            "sv",
                            "gq",
                            "er",
                            "ee",
                            "et",
                            "fk",
                            "fo",
                            "fj",
                            "fi",
                            "fr",
                            "gf",
                            "pf",
                            "tf",
                            "ga",
                            "gm",
                            "ge",
                            "de",
                            "gh",
                            "gi",
                            "gr",
                            "gl",
                            "gd",
                            "gp",
                            "gu",
                            "gt",
                            "gn",
                            "gw",
                            "gy",
                            "ht",
                            "hm",
                            "hn",
                            "hk",
                            "hu",
                            "is",
                            "in",
                            "id",
                            "iq",
                            "ie",
                            "il",
                            "it",
                            "jm",
                            "jp",
                            "jo",
                            "kz",
                            "ke",
                            "ki",
                            "kw",
                            "kg",
                            "la",
                            "lv",
                            "lb",
                            "ls",
                            "lr",
                            "ly",
                            "li",
                            "lt",
                            "lu",
                            "mo",
                            "mk",
                            "mg",
                            "mw",
                            "my",
                            "mv",
                            "ml",
                            "mt",
                            "mh",
                            "mq",
                            "mr",
                            "mu",
                            "yt",
                            "mx",
                            "fm",
                            "md",
                            "mc",
                            "mn",
                            "ms",
                            "ma",
                            "mz",
                            "na",
                            "nr",
                            "np",
                            "nl",
                            "an",
                            "nc",
                            "nz",
                            "ni",
                            "ne",
                            "ng",
                            "nu",
                            "nf",
                            "mp",
                            "no",
                            "om",
                            "pk",
                            "pw",
                            "ps",
                            "pa",
                            "pg",
                            "py",
                            "pe",
                            "ph",
                            "pn",
                            "pl",
                            "pt",
                            "pr",
                            "qa",
                            "re",
                            "ro",
                            "ru",
                            "rw",
                            "kn",
                            "lc",
                            "vc",
                            "ws",
                            "sm",
                            "st",
                            "sa",
                            "sn",
                            "cs",
                            "sc",
                            "sl",
                            "sg",
                            "sk",
                            "si",
                            "sb",
                            "so",
                            "za",
                            "gs",
                            "kr",
                            "es",
                            "lk",
                            "sh",
                            "pm",
                            "sr",
                            "sj",
                            "sz",
                            "se",
                            "ch",
                            "tw",
                            "tj",
                            "tz",
                            "th",
                            "tg",
                            "tk",
                            "to",
                            "tt",
                            "tn",
                            "tr",
                            "tm",
                            "tc",
                            "tv",
                            "ug",
                            "ua",
                            "ae",
                            "gb",
                            "us",
                            "um",
                            "uy",
                            "uz",
                            "vu",
                            "va",
                            "ve",
                            "vn",
                            "vg",
                            "vi",
                            "wf",
                            "eh",
                            "ye",
                            "zm",
                            "zw"
                        ],
                        "type": "string",
                        "description": "Limit results to a specific country (lowercase ISO; converted to country<UPPER>)."
                    },
                    "nfpr": {
                        "title": "No autocorrect (nfpr)",
                        "minimum": 0,
                        "maximum": 1,
                        "type": "integer",
                        "description": "1 to exclude auto-corrected query results, 0 to allow."
                    },
                    "filter": {
                        "title": "Similar/Omitted Results filter",
                        "minimum": 0,
                        "maximum": 1,
                        "type": "integer",
                        "description": "1 to enable Similar/Omitted Results filter, 0 to disable."
                    },
                    "decodeUrls": {
                        "title": "Decode URLs",
                        "type": "boolean",
                        "description": "Resolve Google News redirect URLs to publisher source URLs.",
                        "default": false
                    },
                    "extractDescriptions": {
                        "title": "Extract descriptions",
                        "type": "boolean",
                        "description": "Extract og:description / meta description from publisher pages. Implies decodeUrls.",
                        "default": false
                    },
                    "extractImages": {
                        "title": "Extract images",
                        "type": "boolean",
                        "description": "Include article images. Pulls Google News HD thumbnail by default; falls back to og:image when extractDescriptions is on.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. Defaults to Residential proxies in US.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 128,
                        "type": "integer",
                        "description": "Concurrent in-flight requests for decoding and article fetching.",
                        "default": 32
                    },
                    "retryBudgetRss": {
                        "title": "RSS retry budget",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Independent retry attempts per RSS feed request.",
                        "default": 4
                    },
                    "retryBudgetDecode": {
                        "title": "Decode retry budget",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Independent retry attempts per article-link decode.",
                        "default": 3
                    },
                    "retryBudgetArticle": {
                        "title": "Article retry budget",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Independent retry attempts per article HTML fetch.",
                        "default": 2
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
