# Google News Scraper: Headlines, Sources, Real Article URLs (`fernandosord/google-news-rss-scraper`) Actor

Scrape Google News by keyword, topic, location or top stories in any country and language. Get title, source, publish date, rank and the real publisher URL decoded from every Google News link. Date windows, search operators and day-by-day splitting past the 100-result feed limit.

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

## Pricing

from $2.00 / 1,000 articles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

This Google News scraper collects articles from Google News search results, topic sections, local news and top stories, for any country and language Google News publishes. Every row has the headline, publisher, publish time, rank and the real article URL on the publisher's site, decoded from the Google News redirect link.

- **Search, topics, local news and top stories** in one run, with Google's own operators like `when:7d`, `site:`, `intitle:` and `"exact phrase"`.
- **Real publisher URLs.** Google News hides each article behind an encoded link. The scraper decodes it to the original URL, for example `https://www.reuters.com/world/...`. If one link cannot be decoded, the row is still saved with the reason.
- **More than 100 results.** A Google News feed stops at about 100 articles. Turn on **Split the date window by day** and the scraper searches each day separately.
- **No duplicates.** An article that appears under several queries is saved once.

### What data you get

| Field | What it holds |
|---|---|
| `title` | Headline, with the trailing " - Source" removed |
| `sourceName`, `sourceUrl` | Publisher name and home page |
| `publishedAt` | Publish time in ISO 8601 (UTC) |
| `articleUrl`, `articleDomain` | The article's own URL on the publisher's site, and its domain |
| `articleUrlError` | Why `articleUrl` is empty, when it is |
| `rank` | Position in Google's feed, starting at 1 |
| `query`, `topic`, `feedType` | Which search, topic, location or top stories feed the row came from |
| `country`, `language` | The Google News edition that served the row |
| `relatedArticles` | Other outlets' coverage that Google groups with the story (topics and top stories) |
| `googleNewsUrl`, `googleNewsId` | The Google News link and its stable ID |

### How to use it

1. Add one or more **Search queries**, pick **Topics**, add **Local news** places, or turn on **Top stories**.
2. Set **Country** and **Language**, for example `US` and `en`, `CA` and `fr`, `DE` and `de`, `BR` and `pt-419`.
3. Optional: pick a **Time range**, or set **Published from** and **Published to**.
4. Set **Max articles per query**.
5. Run it and export to JSON, CSV or Excel, or call it from the API, Make, Zapier, n8n or an AI agent through the Apify MCP server.

#### Search operators

These go straight into a search query:

- `when:1h`, `when:1d`, `when:7d`: only recent articles
- `site:reuters.com`: one publisher only
- `intitle:earnings`: the word must be in the headline
- `"interest rates"`: exact phrase
- `tesla OR rivian`, `apple -iphone`: either word, or exclude a word

#### Getting more than 100 articles

Google returns about 100 articles per feed. To go further, set **Published from** (and optionally **Published to**), turn on **Split the date window by day**, and raise **Max articles per query**. In our test, `bitcoin` over five days returned 473 unique articles instead of 100.

#### Example input

```json
{
  "searchQueries": ["nvidia", "nvidia stock", "site:reuters.com tariffs", "intitle:earnings apple"],
  "includeTopStories": true,
  "country": "US",
  "language": "en",
  "maxArticlesPerQuery": 30
}
```

This run saved 150 articles, decoded all 150 publisher URLs and skipped 12 articles that `nvidia` and `nvidia stock` had in common.

#### Example output (one article)

```json
{
  "feedType": "search",
  "query": "nvidia",
  "topic": null,
  "country": "US",
  "language": "en",
  "rank": 1,
  "title": "EXCLUSIVE: US DOJ is inquiring about Nvidia's purchase of Hugging Face, sources say",
  "sourceName": "Reuters",
  "sourceUrl": "https://www.reuters.com",
  "publishedAt": "2026-10-28T20:41:13.000Z",
  "articleUrl": "https://www.reuters.com/world/us-doj-is-inquiring-about-nvidias-purchase-hugging-face-sources-say-2026-10-28/",
  "articleDomain": "reuters.com",
  "articleUrlError": null,
  "googleNewsUrl": "https://news.google.com/rss/articles/CBMirgFBVV95cUxNQi1pQlpX...?oc=5",
  "googleNewsId": "CBMirgFBVV95cUxNQi1pQlpX...",
  "relatedArticles": [],
  "scrapedAt": "2026-10-28T22:05:02.642Z"
}
```

### How much does it cost?

You pay per result: each article saved to the dataset is one result. A result costs $0.002 ($2.00 per 1,000), plus $0.0005 once per run, and the decoded publisher URL is included at no extra cost. A search that fills Google's 100-article feed costs about $0.20, and Apify's free plan credit of $5 a month covers about 2,500 articles.

Feeds that fail and searches with no matches add no rows, so they cost nothing. Failed feeds are listed in the `PROBLEMS` record of the run's key-value store.

### Use cases

- **Brand and competitor monitoring:** run your company and product names every hour with `when:1h` on a schedule.
- **Market and trading signals:** collect headlines for tickers and sectors with exact publish times.
- **Media research:** see which outlets cover a story, using `relatedArticles` from top stories.
- **AI and RAG pipelines:** feed the decoded `articleUrl` to a content extractor to get the article text.

### FAQ

**Why decode the Google News links?**
A Google News link like `news.google.com/rss/articles/CBMi...` only redirects in a browser. Most tools that fetch it get a Google page instead of the article. The decoded `articleUrl` is the publisher's own address, which you can store, deduplicate by domain or pass to another scraper.

**What if a link cannot be decoded?**
The article is still saved, with `articleUrl` set to null and the reason in `articleUrlError`. The run does not fail.

**Can I make runs faster?**
Turn off **Decode real article URLs** if headlines and Google links are enough. Decoding takes one extra round trip to Google per article. You can also raise **Decoding concurrency**.

**Do I need a proxy?**
No. Proxy is off by default because the feeds and the decoding work without one, and decoding is much faster direct. If Google starts refusing direct requests during a run, the scraper switches to Apify Proxy on its own. You can also turn a proxy on from the start in the input.

**Why did a country fail?**
Google News only has certain country and language pairs. If you ask for one it does not have, Google quietly sends another country's news. The scraper catches this, skips the feed and explains it in `PROBLEMS` rather than giving you the wrong country's articles.

**Does it get article text or images?**
No. It returns what Google News lists plus the decoded URL. Pass `articleUrl` to a content extractor if you need the full text.

**Is this legal?**
It reads the same public feeds anyone can open. You are responsible for how you use the data and for respecting publishers' terms and copyright.

### Other Actors by this developer

- [Google Trends Scraper](https://apify.com/fernandosord/google-trends-reliable): interest over time, by region and related searches, built to survive Google's rate limits.
- [Google Trending Searches Now](https://apify.com/fernandosord/google-trending-now): today's trending searches for any list of countries.

# Actor input Schema

## `searchQueries` (type: `array`):

Words or phrases to search Google News for. Google's search operators work: "exact phrase", OR, -exclude, site:reuters.com, intitle:earnings, when:7d.

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

Google News topic sections for the chosen country.

## `locations` (type: `array`):

City, region or country names for Google News local sections, for example Toronto or Texas.

## `includeTopStories` (type: `boolean`):

Also scrape the Google News front page (top stories) for the chosen country. Each story includes its related coverage from other outlets.

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

Two-letter country code of the Google News edition, for example US, GB, CA, IN, DE, BR, JP.

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

Language code of the edition, for example en, fr, de, es-419, pt-419, ja, zh-Hant. It must be a language Google News offers in that country (CA with fr works, US with de does not).

## `timeRange` (type: `string`):

Only news from this recent period. Applies to search queries (Google's when: operator). Ignored if you set a date window.

## `dateFrom` (type: `string`):

Optional. A date (2026-10-01) or a relative period (7 days, 3 months). Searches ask Google for this window, and every feed is also filtered by publish date.

## `dateTo` (type: `string`):

Optional. Last day to include, as a date or relative period. Leave empty for up to today.

## `splitByDay` (type: `boolean`):

Each Google News feed stops at about 100 articles. Turn this on to run a search once per day of the date window, newest day first, to collect more than 100. Needs Published from. Raise Max articles per query too.

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

Limit for each search query, topic or location. A single feed holds up to about 100 articles.

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

Google News links are redirects. With this on, each one is turned into the publisher's own article URL. Turn it off for faster runs that only need headlines.

## `decodeConcurrency` (type: `integer`):

How many links to decode at the same time. Higher is faster but more likely to be slowed down by Google.

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

Off by default. Google News feeds and link decoding work without a proxy, and decoding is much faster without one. If Google refuses direct requests during a run on Apify, the run switches to Apify Proxy by itself. Turn a proxy on here to use it from the start.

## Actor input object example

```json
{
  "searchQueries": [
    "nvidia"
  ],
  "includeTopStories": false,
  "country": "US",
  "language": "en",
  "timeRange": "",
  "splitByDay": false,
  "maxArticlesPerQuery": 20,
  "decodeUrls": true,
  "decodeConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One item per article, in Google's order for each query or topic.

# 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 = {
    "searchQueries": [
        "nvidia"
    ],
    "country": "US",
    "language": "en",
    "maxArticlesPerQuery": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fernandosord/google-news-rss-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 = {
    "searchQueries": ["nvidia"],
    "country": "US",
    "language": "en",
    "maxArticlesPerQuery": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "nvidia"
  ],
  "country": "US",
  "language": "en",
  "maxArticlesPerQuery": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call fernandosord/google-news-rss-scraper --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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