# Google News Scraper: Articles, Publisher URLs & Top Stories (`hirethomas/google-news-scraper`) Actor

Google News scraper: search by keyword, topic section or Top stories for any country. Get real decoded publisher article URLs, source and publish time, go past the 100-result cap with date ranges, use search operators. Validated rows, JSON or CSV.

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

## Pricing

from $3.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

## Google News Scraper

Scrape Google News search results, topic sections and Top stories for any country edition. Every article comes with the **real publisher URL** (decoded from the Google News redirect link), the source, and the publish time.

### What you get

- **Decoded publisher URLs.** Google News links point to `news.google.com/rss/articles/...`. This actor resolves each one to the article on the publisher's site, for example `https://www.axios.com/2026/10/04/reflection-open-weight-ai`.
- **More than 100 results per search.** A single Google News search returns at most about 100 articles. Set a date range and the actor searches one day at a time, so a week can return several hundred articles for a busy topic. Articles outside your range are filtered out.
- **Search operators work.** `site:reuters.com tariffs`, `"climate tech" funding`, `intitle:nvidia`, `-crypto`.
- **Topic sections and Top stories** (World, Nation, Business, Technology, Entertainment, Sports, Science, Health) for any edition, such as US, UK, France, Germany, India or Brazil.
- **Checked output.** Every row is validated before it is saved (title, source, valid publish date, Google News link, publisher URL not on google.com). A `STATUS` record lists counts, decoding results, rate limits and any errors, so you can trust a run or see exactly why it fell short.

### Input example

```json
{
  "queries": ["nvidia"],
  "dateFrom": "2026-09-28",
  "dateTo": "2026-10-04",
  "maxItemsPerQuery": 300,
  "decodeUrls": true
}
```

Other options: `topics`, `includeTopHeadlines`, `language` (hl, e.g. `en-US`, `fr`), `country` (gl, e.g. `US`, `FR`), `ceid` (advanced), `timeframe` (`1h`, `1d`, `7d`, `30d`, `1y`), `proxyConfiguration`.

### Output example

A real row from a test run:

```json
{
  "query": "nvidia",
  "feedType": "search",
  "topic": null,
  "dateSlice": "2026-10-04",
  "position": 2,
  "title": "Scoop: A powerful new model from startup Reflection is set to shake up the AI race",
  "source": "Axios",
  "sourceUrl": "https://www.axios.com",
  "publishedAt": "2026-10-04T12:50:25.000Z",
  "articleUrl": "https://www.axios.com/2026/10/04/reflection-open-weight-ai",
  "urlDecoded": true,
  "googleNewsUrl": "https://news.google.com/rss/articles/CBMiakFVX3lxTE5meUx1aTFnUHltcTFXRmNIWVhPbW9Nd0lZMXdQVlRuVFVNMW5xRG1QaFpnanA4YnpicU9VTnMwQlZuNzJ4M0lYV0haWnNsZjZGZzFnRkNfZkItbkg2a3BCZ1FEbHdqbEZHc0E?oc=5",
  "guid": "CBMiakFVX3lxTE5meUx1aTFnUHltcTFXRmNIWVhPbW9Nd0lZMXdQVlRuVFVNMW5xRG1QaFpnanA4YnpicU9VTnMwQlZuNzJ4M0lYV0haWnNsZjZGZzFnRkNfZkItbkg2a3BCZ1FEbHdqbEZHc0E",
  "edition": "US:en",
  "scrapedAt": "2026-10-08T01:38:41.815Z"
}
```

| Field | Meaning |
|---|---|
| `title` | Headline, with the trailing " - Source" Google adds removed |
| `source`, `sourceUrl` | Publisher name and homepage |
| `publishedAt` | Publish time, ISO 8601 UTC |
| `articleUrl` | Real article URL on the publisher's site (null if decoding is off or failed) |
| `urlDecoded` | Whether `articleUrl` was resolved |
| `googleNewsUrl`, `guid` | Google News link and article ID |
| `feedType`, `query`, `topic` | Which search or feed returned the row |
| `dateSlice` | The daily search that returned it, when a date range is used. Google matches days loosely, so `publishedAt` can be a day off; it is always inside your overall range |
| `position` | Order within that query or feed |
| `edition` | Google News edition (ceid) |

### Test runs

Results from our own test runs on Apify, October 2026:

- `nvidia`, 7-day range, max 500: 500 unique articles from 155 publisher domains, all 500 URLs decoded, 0 invalid rows, about 3.3 minutes.
- `openai` + `tesla`, 40 each: 80 articles, all decoded, 41 s.
- France edition (`fr`/`FR`), Technology + Business topics + Top stories, 25 each: 75 articles, all decoded, 28 s.
- `site:reuters.com tariffs` and `"climate tech" funding`, past 30 days, decoding off: 153 articles in 5.5 s.

Speed depends on the proxy and on Google; decoding is the slow part.

### Tips and limits

- Without a date range, Google returns at most about 100 articles per search. Each day in a date range also returns at most about 100, so very busy topics can still be capped per day.
- Decoding adds two requests per article. Turn it off for faster runs when the Google link is enough.
- Topic sections and Top stories come back as Google serves them for that edition, and the same story can appear in more than one feed. Rows are de-duplicated within each query or feed.
- If Google rate limits a run, the actor backs off and switches proxy sessions a limited number of times, then stops and reports it in `STATUS`. It does not solve CAPTCHAs.
- Only the headline and metadata Google News shows are collected, not full article text.

### Pricing

Pay per result: $3.00 per 1,000 articles, plus $0.00005 per run start. No monthly rental.

#### FAQ

##### How do I get the real article URL from a Google News link?

Google News RSS links point to news.google.com/rss/articles/... redirects. This Actor decodes them and returns the original publisher URL in `url`, so you can fetch the article directly.

##### Is there a Google News API?

Google closed its News API years ago. This Actor works as a Google News API alternative: search by keyword, topic or country and export JSON or CSV.

##### How do I get more than 100 results for a query?

Google News returns about 100 items per search. Set a date range and the Actor splits it into smaller windows to collect more articles for the same query.

##### Can I monitor news about my brand or competitors?

Yes. Save the input as an Apify task and schedule it daily or hourly, then send new rows to Google Sheets, Slack or a webhook.

# Actor input Schema

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

One per line. Google News search syntax works, for example "openai", ""climate tech" funding", "site:reuters.com tariffs" or "intitle:nvidia".

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

Optional. Also scrape these Google News topic sections for the chosen edition.

## `includeTopHeadlines` (type: `boolean`):

Also scrape the Top stories feed for the chosen edition.

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

Google News interface language, for example en-US, en-GB, fr, de, es-419, pt-BR, ja.

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

Two-letter country code of the edition, for example US, GB, FR, DE, IN, BR.

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

Optional. Defaults to COUNTRY:language, for example US:en or FR:fr. Set it only for editions that use a different ID, such as BR:pt-419.

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

Only articles from the last hour, day, week, month or year. Ignored when a date range is set.

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

Optional, YYYY-MM-DD. With a date range the search runs one day at a time, which returns far more than the ~100 articles Google gives per search.

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

Optional, YYYY-MM-DD, inclusive. Defaults to today when From date is set.

## `maxItemsPerQuery` (type: `integer`):

Without a date range Google returns at most about 100 articles per search.

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

Turn Google News redirect links into the real article URL on the publisher's site. Adds two requests per article.

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

Apify Proxy is used to spread requests and recover from Google rate limits.

## Actor input object example

```json
{
  "queries": [
    "openai"
  ],
  "includeTopHeadlines": false,
  "language": "en-US",
  "country": "US",
  "timeframe": "",
  "maxItemsPerQuery": 100,
  "decodeUrls": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per Google News article, with the decoded publisher URL.

## `status` (type: `string`):

Per-feed counts, URL decoding results, request status and validation results.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hirethomas/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"] }

# Run the Actor and wait for it to finish
run = client.actor("hirethomas/google-news-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 '{
  "queries": [
    "openai"
  ]
}' |
apify call hirethomas/google-news-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hirethomas/google-news-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/PsAMJucVWAa7nbFDd/builds/cqdnXi1nNsOcTuI3c/openapi.json
