# Google News Feed: search, topics, locations, real article URLs (`longlever/google-news-feed`) Actor

Google News results from the official RSS feeds for any search query, topic, location or language edition, with optional decoding of Google redirect links to the publisher's article URL and a new-articles-since-last-run mode for scheduled monitoring.

- **URL**: https://apify.com/longlever/google-news-feed.md
- **Developed by:** [Todd Handler](https://apify.com/longlever) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 article returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Feed: search, topics and locations with real article URLs

Pull Google News results for any search query, topic, location or language edition, with the option to decode every Google redirect link **to the publisher's real article URL**. Schedule it in **new-articles mode** and each run returns only the articles you have not seen yet.

- **Real publisher URLs.** Google News links point to news.google.com. This Actor turns each one into the article's own URL (reuters.com/..., nytimes.com/...).
- **Searches, topics, locations, top stories.** Any Google News search operator works: `site:`, `intitle:`, `"exact phrase"`, `-exclude`, `OR`.
- **Every edition.** Run the same queries in US, UK, India, Germany, France, Mexico, Brazil, Japan and dozens of other country and language editions.
- **New articles only, per query.** No diffing on your side. Each feed remembers what it already returned.
- **Past the 100-article cap.** Split a date range by day to collect up to about 100 articles per query per day.
- **Cheap.** $1.00 per 1,000 articles, URL decoding included.

### Who uses it

- **PR and comms teams** tracking brand, competitor and executive mentions
- **Investors and analysts** following tickers, sectors and deals
- **Newsletter and media teams** sourcing stories by topic and region
- **Researchers** building news datasets by query, country and date
- **AI agents and RAG pipelines** that need fresh headlines with fetchable URLs

### Quick start

1. Enter **Search queries**, **Topics** or **Locations** (one per line). Leave **Editions** on `US:en` or add others.
2. Click **Start**. Articles appear in the **Articles** table and export as JSON, CSV or Excel.

#### Monitor news on a schedule (recommended)

1. Set **Mode** to **New articles since last run**.
2. Create a schedule (hourly or daily) under **Schedules** in Apify Console.
3. Send results to Slack, Google Sheets, a webhook, Make, Zapier or n8n with Apify integrations.

The first run returns everything currently in each feed as `new` and saves a baseline. After that each run returns only articles that were not in that feed before.

### Input

| Field | What it does |
|---|---|
| Search queries | Google News searches. Operators work, for example `tesla recall`, `site:reuters.com inflation`, `intitle:"rate cut"` |
| Topics | `WORLD`, `NATION`, `BUSINESS`, `TECHNOLOGY`, `ENTERTAINMENT`, `SPORTS`, `SCIENCE`, `HEALTH`, a `CAAq...` topic ID, or a `news.google.com/topics/...` URL |
| Locations | Local headlines for a city, region or country, for example `Chicago` or `Bavaria` |
| Include top stories | Adds the edition's front page |
| Editions | `COUNTRY:language`, for example `US:en`, `GB:en`, `IN:en`, `DE:de`, `FR:fr`, `MX:es-419`, `BR:pt-419`, `JP:ja`. Each feed runs once per edition |
| Mode | Full snapshot, or new articles since last run |
| Decode publisher URLs | Off by default, so runs read only the RSS feeds and finish in seconds. Turn on to fill `url` with the publisher's article link |
| Published within hours | Keeps recent articles. Search queries also get Google's `when:` operator |
| Search from / to date | `YYYY-MM-DD`. Adds `after:` and `before:` to search queries |
| Split search date range by day | One feed per day in the range, up to 92 days, to get past the 100-article cap |
| Exclude publishers | Drops articles whose publisher name or domain contains any of these |
| Max articles per feed | Snapshot mode only. Keeps Google's order |
| Remove duplicates across feeds | On by default. An article that shows up in several feeds is returned once |

Example:

```json
{
    "queries": ["openai", "site:reuters.com electric vehicles"],
    "topics": ["BUSINESS"],
    "locations": ["London"],
    "editions": ["US:en", "GB:en"],
    "mode": "new",
    "postedWithinHours": 24,
    "decodeUrls": true
}
```

### Output

One row per article (this one with decoding on):

```json
{
    "article_id": "CBMimAFBVV95cUxN...",
    "title": "A Once-in-a-Generation Opportunity: 1 Artificial Intelligence (AI) Stock to Buy ...",
    "publisher": "The Motley Fool",
    "publisher_domain": "fool.com",
    "publisher_url": "https://www.fool.com",
    "url": "https://www.fool.com/investing/2026/10/21/1-artificial-intelligence-ai-stock-to-buy-before-i/",
    "google_news_url": "https://news.google.com/rss/articles/CBMimAFBVV95cUxN...?oc=5",
    "published_at": "2026-10-21T19:15:00Z",
    "related_articles": [],
    "rank": 1,
    "feed_type": "search",
    "feed_value": "artificial intelligence",
    "edition": "US:en",
    "language": "en",
    "country": "US",
    "feed_url": "https://news.google.com/rss/search?q=artificial%20intelligence&hl=en-US&gl=US&ceid=US:en",
    "change_type": null,
    "fetched_at": "2026-10-22T00:59:39Z"
}
```

- `related_articles` lists other coverage of the same story when Google groups it (top stories and topic feeds), each with title, publisher and Google link.
- `change_type` is `new` in new-articles mode and `null` in snapshot mode.
- `url` is `null` when decoding is off (the default) or Google did not return a URL for that article. The run **SUMMARY** in the key-value store counts decoded and failed URLs, lists every feed read, and records any errors.

### Pricing

You pay per event:

| Event | Price |
|---|---|
| Article returned | $0.001 ($1.00 per 1,000), URL decoding included. With decoding on, an article whose URL could not be decoded is delivered free |
| Feed checked | $0.0005 per feed read (each query x edition, or each day when split by day) |

A daily new-articles run over 10 queries that finds 150 new articles costs about $0.155. Set a maximum cost per run in Console and the Actor stops cleanly at that limit, without saving state for unfinished feeds so the next run picks them up.

### Limits and good to know

- **About 100 articles per feed.** That is Google's cap per RSS feed. Use date splitting for more.
- **Order is Google's.** Search feeds are ordered by relevance, not strictly by date. Sort by `published_at` after export if you need time order.
- **Requests are rate limited** to stay polite to Google. Decoding runs at about 3 articles per second. If Google pushes back, the Actor pauses decoding (up to 7 minutes in total) and carries on more slowly. Articles still left without a URL are not charged and are counted in SUMMARY. For big decode runs, turning on Apify Proxy can help.
- **Headlines and links only.** Google News feeds carry title, publisher, time and link, not article text. Use a page scraper on `url` if you need full text, and respect each publisher's terms.
- This Actor reads Google News RSS feeds. It is not affiliated with or endorsed by Google.

### For AI agents

Call the Actor with a JSON input like the example above and read the default dataset. Every row has a stable `article_id`, an ISO 8601 `published_at`, and a fetchable publisher `url`. In new-articles mode, repeated calls with the same input return only articles not returned before.

### FAQ

**Why are some `url` fields empty?** Decoding is off by default. With it on, Google occasionally returns no URL for an article or rate-limits a large run; those articles are not charged, and their `google_news_url` still works in a browser.

**Does new-articles mode share state between different inputs?** Each feed (query, edition, date window) keeps its own history, keyed by your filters. Set **State key** to keep separate baselines for the same feeds, for example one per client.

**Can I get articles older than a few weeks?** Use **Search from / to date**. Google's coverage of older dates varies by query.

# Actor input Schema

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

One per line. Google News search operators work, for example "tesla recall", "site:reuters.com inflation", "intitle:openai", ""exact phrase"". Each query is one feed of up to about 100 articles.

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

Section names (WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH), a topic ID starting with CAAq, or a news.google.com/topics/... URL.

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

Local headlines for a city, region or country, for example "Chicago", "Bavaria", "Kenya".

## `topStories` (type: `boolean`):

Add the edition's Top stories front page as a feed.

## `editions` (type: `array`):

Google News editions as COUNTRY:language, for example US:en, GB:en, IN:en, DE:de, FR:fr, MX:es-419, BR:pt-419, JP:ja. Every query, topic and location runs once per edition.

## `mode` (type: `string`):

Snapshot returns every article in the feeds. New articles returns only articles not seen in earlier runs of the same feed (schedule this mode).

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

Turn each news.google.com redirect link into the publisher's real article URL. Off by default: runs then read only the RSS feeds and are much faster. Turn on when you need the publisher link.

## `postedWithinHours` (type: `integer`):

Keep articles published within this many hours. Search queries also get a when: operator so Google returns recent results.

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

YYYY-MM-DD. Search queries only: adds after: to the query.

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

YYYY-MM-DD, inclusive. Search queries only: adds before: to the query.

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

Google caps each feed at about 100 articles. With both dates set, run each query once per day in the range to get past the cap (up to 92 days).

## `excludePublishers` (type: `array`):

Drop articles whose publisher name or domain contains any of these, for example "msn.com" or "Yahoo".

## `maxArticlesPerFeed` (type: `integer`):

0 means no limit. Feeds keep Google's order. Ignored in new-articles mode so no article is skipped.

## `dedupe` (type: `boolean`):

Return each article once even if several feeds contain it. The row keeps the first feed that found it.

## `stateKey` (type: `string`):

Optional name for the saved state. By default it is derived from your filters, so changing them starts a fresh baseline. Each feed keeps its own history either way.

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

Optional. Use Apify Proxy if Google rate-limits your runs.

## Actor input object example

```json
{
  "queries": [
    "artificial intelligence",
    "site:reuters.com electric vehicles"
  ],
  "topics": [
    "TECHNOLOGY"
  ],
  "topStories": false,
  "editions": [
    "US:en"
  ],
  "mode": "snapshot",
  "decodeUrls": false,
  "splitByDay": false,
  "maxArticlesPerFeed": 20,
  "dedupe": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per article. In new-articles mode, only articles not seen before.

## `summary` (type: `string`):

Every feed read with its article count, decode results, and any errors.

# 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",
        "site:reuters.com electric vehicles"
    ],
    "topics": [
        "TECHNOLOGY"
    ],
    "editions": [
        "US:en"
    ],
    "maxArticlesPerFeed": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("longlever/google-news-feed").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",
        "site:reuters.com electric vehicles",
    ],
    "topics": ["TECHNOLOGY"],
    "editions": ["US:en"],
    "maxArticlesPerFeed": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("longlever/google-news-feed").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",
    "site:reuters.com electric vehicles"
  ],
  "topics": [
    "TECHNOLOGY"
  ],
  "editions": [
    "US:en"
  ],
  "maxArticlesPerFeed": 20
}' |
apify call longlever/google-news-feed --silent --output-dataset

```

## MCP server setup

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

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/lso5GisL10y89d8eg/builds/E18kJ2pWevHklBfAw/openapi.json
