# Google News Scraper – Headlines, Real Article URLs & Full Text (`nourishing_courier/google-news-scraper`) Actor

Scrape Google News headlines by search query, topic or top stories with the real publisher URL decoded (not a news.google.com redirect), optional full article text, source, date and snippet. Any language and country, Google search operators, no API key, no proxy, pay per article.

- **URL**: https://apify.com/nourishing\_courier/google-news-scraper.md
- **Developed by:** [Ani Björkström](https://apify.com/nourishing_courier) (community)
- **Categories:** News, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 article delivereds

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 – Headlines, Real Article URLs & Full Text

Scrape Google News by **search query**, **topic section** or **top stories** and get clean, flat rows with the
headline, publisher, publish time, snippet and — the part most Google News scrapers skip — the **real article
URL**, decoded from Google's `news.google.com/rss/articles/...` redirect. Turn on **full article text** and the
actor also visits each publisher page and extracts the body, author, description and lead image.

Three things set this Google News scraper apart from other ways to scrape Google News:

- **Real publisher URLs, not Google redirects.** Every row carries `url` (the decoded article link) next to
  `googleUrl`, with an honest `urlDecoded` flag. Decoding runs concurrently and is cached across runs.
- **No API key, no proxy, no browser.** It reads Google News' own feeds directly, so it starts in seconds
  and a run of 100 headlines finishes in well under a minute.
- **Pay only for delivered articles.** One event per article row. Failed queries cost nothing.

Works for any Google News edition (`en`/`US`, `en`/`GB`, `sv`/`SE`, `de`/`DE`, `pt-BR`/`BR`…) and supports
Google's search operators — `when:24h`, `site:reuters.com`, `"exact phrase"`, `-exclude`, `allintitle:`,
`after:` / `before:` — so it doubles as a free **Google News API alternative** for news monitoring,
brand-mention tracking and LLM/RAG ingestion.

### What you get

Each Google News scraper run gives one row per article. Flat JSON, stable camelCase names, ISO 8601 UTC dates — ready for spreadsheets,
databases, n8n/Make/Zapier and AI agents alike.

| Field | Description |
|---|---|
| `title` | Headline, with Google's ` - Publisher` suffix removed |
| `source`, `sourceUrl` | Publisher name and homepage, e.g. `Reuters`, `https://www.reuters.com` |
| `url` | **Real article URL** on the publisher's site (decoded) |
| `googleUrl` | The original `news.google.com/rss/articles/...` link |
| `urlDecoded` | `true` when `url` is the real link; `false` means `url` still points at Google |
| `publishedAt` | ISO 8601 UTC, e.g. `2026-09-22T14:33:05Z` |
| `snippet` | Text of Google's item description (Google News snippets are short — usually the headline) |
| `relatedTitles` | Headlines of the related coverage Google groups under this story (top stories / topics) |
| `query`, `topic` | Which search query or topic section produced the row |
| `language`, `country` | The Google News edition used |
| `scrapedAt` | When the run collected it |

With **Fetch full article text** switched on, each row also has:

| Field | Description |
|---|---|
| `articleText` | Main body text, readability-style extraction (navigation, footers and scripts removed) |
| `articleTitle`, `articleDescription` | Publisher's own title and `og:description` |
| `author` | From meta tags or JSON-LD |
| `imageUrl` | `og:image` lead image |
| `wordCount` | Words in `articleText` |
| `articleError` | `null` on success, otherwise why the text is missing (paywall, HTTP 403, timeout…) |

A query that returns nothing produces a single row with an `error` field explaining why, so a monitoring
schedule can tell "no news today" from "something broke".

### Input

Run the Google News scraper with no input at all and it scrapes the past week of "artificial intelligence" news in the US
edition. A realistic input:

```json
{
  "queries": ["NVIDIA earnings", "\"Federal Reserve\" site:reuters.com", "Riksbanken -sport"],
  "topics": ["business", "technology"],
  "language": "en",
  "country": "US",
  "timeRange": "7d",
  "maxItemsPerQuery": 100,
  "decodeUrls": true,
  "fetchArticleContent": false
}
```

| Field | Default | Notes |
|---|---|---|
| `queries` | `["artificial intelligence"]` | One Google News search per entry. Operators below all work. |
| `topics` | `[]` | Any of `top`, `world`, `nation`, `business`, `technology`, `entertainment`, `science`, `sports`, `health`. Clear `queries` to scrape topics only. |
| `language` / `country` | `en` / `US` | The Google News edition. `sv` + `SE` gives Swedish news, `de` + `DE` German, `en` + `IN` Indian English. |
| `timeRange` | `7d` | `any`, `1h`, `24h`, `7d`, `30d` or `custom`. Applies to queries; topic sections always show the current front page. |
| `dateFrom` / `dateTo` | – | `YYYY-MM-DD`, used with `timeRange: "custom"`. |
| `maxItemsPerQuery` | `100` | Google serves about 100 items per feed at most. |
| `decodeUrls` | `true` | Resolve real publisher URLs. Off = fastest headlines-only run. |
| `fetchArticleContent` | `false` | Fetch and extract the article body from each decoded URL. |
| `concurrency` | `5` | Parallel feeds and article fetches. |
| `proxyConfiguration` | off | Not needed for normal volumes. |

#### Search operators that work in `queries`

| Example | What it does |
|---|---|
| `Tesla when:24h` | Only the past 24 hours (`1h`, `7d`, `30d` also work; overrides `timeRange`) |
| `"interest rate decision"` | Exact phrase |
| `Apple -iPhone` | Exclude a word |
| `site:reuters.com Nvidia` | One publisher only |
| `allintitle: earnings call` | All words must be in the headline |
| `ECB after:2026-09-01 before:2026-09-15` | Custom date window |
| `Riksbanken OR Riksbank` | Either term |

#### Locale examples

```json
{ "queries": ["Riksbanken", "Volvo Cars"], "language": "sv", "country": "SE" }
{ "queries": ["Bundesbank", "DAX"], "language": "de", "country": "DE" }
{ "topics": ["top", "business"], "language": "en", "country": "GB" }
```

### Use cases

- **PR and communications teams** — media monitoring for your brand, executives and campaigns; schedule it
  hourly with `when:1h` and push new mentions to Slack.
- **Investors, analysts and FP\&A teams** — a financial news scraper for the companies in your model: earnings,
  guidance, M\&A, central-bank decisions, with the real article link for the audit trail. (If you use AI in
  finance work, the [Ani Björkström | AI for Finance](https://www.youtube.com/@ani-bjorkstrom) YouTube channel
  covers workflows like this.)
- **Competitive intelligence** — competitor news alerts: one query per competitor, deduplicated by real URL.
- **SEO and content teams** — newsjacking: see what is breaking in your niche in the past hour and who is
  covering it.
- **Researchers and journalists** — collect coverage of a topic across languages and countries into one CSV.
- **AI agents, RAG and LLM pipelines** — fetch full text into a vector store or summarise the day's coverage.
  Flat rows and an MCP-ready API make this easy to call from an agent.
- **Automation builders** — a Google News scraper that turns Google News RSS into JSON for n8n, Make and Zapier, without an RSS parser step or
  the redirect-link problem.

### Pricing

Pay per event: you are charged for each **article row** delivered to the dataset. Error rows are free, queries
that return nothing are free, and duplicates across queries are removed before charging. No actor-start fee.
For price, see the Pricing tab; a run of 100 headlines with real URLs costs a fraction of a cent.

### Integrations

The Google News scraper runs on a schedule and connects to Zapier, Make, n8n, Slack, Google Sheets, Airtable, webhooks and the Apify
API. Use it from Python or JavaScript, curl, or as a tool in an AI agent through the Apify MCP server.

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("nourishing_courier/google-news-scraper").call(run_input={
    "queries": ["NVIDIA earnings", "Microsoft Copilot"],
    "timeRange": "24h",
    "fetchArticleContent": True,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["publishedAt"], row["source"], row["title"], row["url"])
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('nourishing_courier/google-news-scraper').call({
    topics: ['business'],
    language: 'en',
    country: 'GB',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((a) => `${a.source}: ${a.title} -> ${a.url}`));
```

**curl**

```bash
curl -X POST "https://api.apify.com/v2/acts/nourishing_courier~google-news-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries": ["Riksbanken"], "language": "sv", "country": "SE", "timeRange": "24h"}'
```

**n8n / Make / Zapier** — add the Apify node, pick this actor, paste the JSON input above and map the dataset
rows to Slack, Google Sheets, Notion or your CRM. Because `url` is the real article link, the "open article"
step in your workflow just works.

**MCP / AI agents** — expose the actor through the Apify MCP server and an agent can call it with a plain
request such as "what did the press write about Riksbanken in the past 24 hours?".

### Limits and fair use

- **About 100 items per feed.** That is Google News' ceiling for any Google News scraper per query or topic, not a setting. To collect
  more, split the topic into several queries or several time windows (`when:24h` runs on a schedule).
- **Snippets are short.** Google News RSS gives the headline and a list of related headlines, not a summary.
  For body text switch on `fetchArticleContent`.
- **Article text depends on the publisher.** Paywalled and bot-protected sites (Bloomberg, the FT, some
  Seeking Alpha pages) return HTTP 403 or an empty body; those rows keep their headline and URL and carry an
  `articleError`. Across mainstream outlets, most rows come back with full text.
- **URL decoding uses Google's own resolver.** Very large runs (thousands of ids in minutes) may get
  rate-limited; the actor retries with backoff and, if an id still cannot be decoded, keeps the Google link
  and sets `urlDecoded: false` rather than dropping the row.
- **Legality.** Headlines, links and metadata are public data published by Google News for syndication.
  Respect the publishers' terms when storing full article text, and do not republish it wholesale.

### FAQ

#### Can I scrape Google News without an API key?

Yes. Google offers no official Google News API; this Google News scraper reads Google News' public feeds directly, so no key,
login, proxy or browser is required.

#### How do I get the real article URL instead of a news.google.com link?

It is on by default (`decodeUrls: true`). The `url` field is the publisher's actual page; `googleUrl` keeps
the redirect and `urlDecoded` tells you which one you are looking at.

#### How many results do I get per query?

Up to about 100 per query or topic — Google's limit. Run several queries, narrower time windows or a schedule
to build a larger archive; duplicates are removed by real URL.

#### Does it return full article text?

Optionally. Set `fetchArticleContent: true` and each row gets `articleText`, `author`, `imageUrl`,
`articleDescription` and `wordCount`. Publishers that block bots or require a subscription return an
`articleError` instead.

#### Can I filter by date or the past hour?

Yes: `timeRange` (`1h`, `24h`, `7d`, `30d`), a custom `dateFrom`/`dateTo` window, or Google's own
`when:` / `after:` / `before:` operators inside the query.

#### Does it work for non-English Google News editions?

Yes. Set `language` and `country` to any Google News edition: `sv`/`SE`, `de`/`DE`, `fr`/`FR`, `ja`/`JP`,
`pt-BR`/`BR`, `en`/`IN` and so on. Topic sections follow the edition too.

#### Can I scrape Google News top stories or a section like Business?

Yes — put `top`, `business`, `technology`, `world`, `nation`, `science`, `sports`, `health` or
`entertainment` in `topics`.

#### Does it work with n8n, Make or Zapier?

Yes. Use the Apify integration in any of them, or call the run-sync endpoint shown above and consume the JSON.

#### How much does a Google News scrape cost?

You pay per article delivered, nothing for failed queries or error rows. A 100-headline run is a fraction of
a cent; see the Pricing tab for the exact per-article rate.

#### Is it legal to scrape Google News?

Collecting public headlines, links and publication metadata is generally fine. Full article text belongs to
the publishers — use it for analysis, summaries and internal search, and respect their terms of use.

# Actor input Schema

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

One Google News search per line. Google's operators work: "exact phrase", -exclude, site:reuters.com, allintitle:, and time operators such as when:24h or after:2026-09-01 before:2026-09-15 (a query with its own time operator ignores the Time range below).

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

Google News front-page sections for the chosen language and country, in addition to (or instead of) the queries above. Clear the queries field if you only want topics.

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

Google News edition language: en, sv, de, fr, es, pt-BR, ja… Combine with a country to pick an edition, e.g. sv + SE for Swedish news.

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

Two-letter country code of the Google News edition: US, GB, SE, DE, IN, BR…

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

Applied to search queries only (topic sections always show the current front page). Pick Custom to use the dates below.

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

YYYY-MM-DD. Used only when Time range is Custom.

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

YYYY-MM-DD. Used only when Time range is Custom.

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

Google News serves at most about 100 items per feed. Use several narrower queries (or a time range) to collect more.

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

Turn the news.google.com redirect into the publisher's actual URL (url field). Switch off for a faster headlines-only run; googleUrl is always included.

## `fetchArticleContent` (type: `boolean`):

Visit each decoded article URL and extract articleText, articleTitle, articleDescription, author, imageUrl and wordCount. Slower; paywalled or bot-protected publishers return articleError instead of text.

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

How many feeds and article pages to fetch at once. Lower it if Google or publishers start rate limiting you.

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

Optional. Google News RSS needs no proxy at normal volumes; turn one on only for very large runs that start seeing HTTP 429.

## Actor input object example

```json
{
  "queries": [
    "artificial intelligence"
  ],
  "topics": [],
  "language": "en",
  "country": "US",
  "timeRange": "7d",
  "maxItemsPerQuery": 100,
  "decodeUrls": true,
  "fetchArticleContent": false,
  "concurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every article with headline, source, decoded URL, date, snippet and optional full text.

## `articlesCsv` (type: `string`):

The same records as a spreadsheet-ready CSV file.

## `consoleView` (type: `string`):

Open the run's dataset in Apify Console.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "artificial intelligence"
    ]
};

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

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

```

## MCP server setup

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